diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..73b96bf --- /dev/null +++ b/.dockerignore @@ -0,0 +1,14 @@ +.git/ +__pycache__/ +**/*.pyc +**/*.pyo +.pytest_cache/ +.mypy_cache/ +.coverage +htmlcov/ +dist/ +build/ +**/*.egg-info/ +docs/ +.github/ +*.sh diff --git a/README.md b/README.md index bb8286e..811e01c 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,18 @@ # PhantomKit -**PhantomKit** is a Python toolkit for automated quality assurance (QA) of medical imaging scanners using physical phantoms. It provides pydra-based workflows that register phantom scans to a reference template, extract per-vial signal statistics across multiple contrast types, and generate publication-quality plots — supporting both MRI and PET phantom protocols. +**PhantomKit** is a Python toolkit for automated quality assurance (QA) of MRI scanners using physical phantoms. It provides a high-level processing engine and pydra-based workflows that register phantom scans to a reference template, extract per-vial signal statistics across multiple contrast types, and generate publication-quality plots — with full support for DWI preprocessing and diffusion metric (ADC, FA) extraction. ## Features -- **Template-based registration** — iterative ANTs SyN registration with automatic orientation search across a rotation library -- **Vial metric extraction** — per-vial mean, median, std, min and max across all contrast images, written to CSV -- **Plotting** — scatter plots of vial intensity and parametric map plots (T1/IR, T2/TE) with mrview ROI overlays -- **Protocol support** — extensible `protocols` sub-package for phantom- and project-specific workflow configurations +- **End-to-end pipeline** — single command processes a session directory through DWI preprocessing, phantom QC in DWI space, and native contrast QC +- **Format-agnostic input** — each series sub-directory may contain DICOM, NIfTI (`.nii`/`.nii.gz`), or MRtrix MIF (`.mif`/`.mif.gz`) files; format is detected automatically per sub-directory +- **Automatic series classification** — DWI, reverse phase-encode, T1, IR, and TE series are detected and paired automatically from folder names and sidecar metadata; no manual configuration required +- **DWI preprocessing** — FSL `dwifslpreproc` with automatic phase-encoding correction mode selection (`rpe_none`, `rpe_pair`, `rpe_all`), optional denoising/Gibbs correction, tensor fitting, and T1-to-DWI co-registration via FLIRT +- **Template-based registration** — iterative ANTs rigid registration with automatic orientation search across a rotation library; vial masks propagated to subject space via inverse transform +- **Vial metric extraction** — per-vial mean, median, std, min and max across all contrast images (T1, IR, TE, ADC, FA), written to CSV +- **Plotting** — ADC/FA scatter plots with SPIRIT reference values, T1/IR and T2/TE parametric map plots with mrview ROI overlays and Monte Carlo 95% CI bands +- **Checkpoint-based resumption** — re-running the pipeline skips stages whose outputs already exist - **Parallel batch processing** — pydra-native splitting and combining for multi-session datasets ## Installation @@ -23,37 +27,128 @@ python -m pip install phantomkit ``` +### External dependencies + +The pipeline requires FSL, MRtrix3, ANTs, and dcm2niix to be available on `PATH`: + +- [FSL](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/) — `dwifslpreproc`, `flirt`, `convert_xfm` +- [MRtrix3](https://www.mrtrix.org/) — `mrconvert`, `dwi2tensor`, `tensor2metric`, `dwidenoise`, `mrdegibbs`, `mrstats`, `mrview` +- [ANTs](http://stnava.github.io/ANTs/) — `antsRegistrationSyN.sh`, `antsApplyTransforms` +- [dcm2niix](https://github.com/rordenlab/dcm2niix) — DICOM to NIfTI conversion (required only when input is DICOM) + ## Basic usage +### End-to-end pipeline + +Point the pipeline at a session directory whose sub-directories contain DICOM, NIfTI, or MIF series. The format is detected automatically per sub-directory — no conversion needed beforehand. + +```bash +# SPIRIT phantom (accepts DICOM, NIfTI, or MIF sub-directories) +phantomkit pipeline \ + --input-dir /data/session01 \ + --output-dir /results/session01 \ + --phantom SPIRIT + +# 120E phantom (T1 and T2 mapping supported) +phantomkit pipeline \ + --input-dir /data/session01 \ + --output-dir /results/session01 \ + --phantom 120E +``` + +Supported phantoms and their reference data: + +| Phantom | ADC | T1 mapping | T2 mapping | +|---------|-----|------------|------------| +| SPIRIT | ✓ (vials E–L) | ✓ (12 vials) | ✓ (12 vials) | +| 120E | ✓ (all 24 vials) | ✓ (24 vials) | ✓ (24 vials) | + +### Series naming conventions + +Series sub-directories are classified automatically by **word-boundary token matching** on the folder or file name (case-insensitive). No manual tagging is required. + +| Series type | Radiology term | Token match | +|---|---|---| +| Inversion Recovery | IR / MPRAGE | `ir` | +| Multi-Echo Spin Echo | MESE / T2-SE | `te` | +| T1-weighted | T1 / MPRAGE | `t1` or `mprage` | +| DWI | Diffusion-weighted | auto-detected via bvec/bval | +| Reverse phase-encode | B0 field map | paired with DWI | + +For IR and MESE series, the **numeric suffix** in the filename is interpreted as the physical parameter: inversion time TI (ms) for IR, and echo time TE (ms) for MESE. Example: `se_ir_500.nii.gz` → TI = 500 ms; `t2_se_TE_80.nii.gz` → TE = 80 ms. + +Optional flags: + +``` +--denoise-degibbs Apply dwidenoise + mrdegibbs before preprocessing +--gradcheck Run dwigradcheck to verify gradient orientations +--nocleanup Keep intermediate tmp/ directories after completion +--readout-time Override TotalReadoutTime (seconds) for dwifslpreproc +--eddy-options Override FSL eddy options string +--dry-run Print the planned workflow without executing +``` + +Output structure: + +``` +/results/session01/ + / + DWI_preproc_biascorr.mif.gz + ADC.nii.gz + FA.nii.gz + T1_in_DWI_space.nii.gz + metrics/ ← per-vial CSVs and QA plots + vial_segmentations/ + native_contrasts_staging/ + metrics/ ← per-vial CSVs and parametric map plots + vial_segmentations/ + images_template_space/ +``` + +### Python API + +```python +from phantomkit.phantom_processor import PhantomProcessor + +processor = PhantomProcessor( + template_dir="/templates/SPIRIT", + output_base_dir="/results", + rotation_library_file="/templates/rotations.txt", +) +results = processor.process_session("/data/session01/T1.nii.gz") +``` + +Or via the pydra workflow API: + ```python -from phantomkit.protocols.gsp_spirit import GspSpiritAnalysis +from phantomkit.analyses.vial_signal import VialSignalAnalysis -wf = GspSpiritAnalysis( - input_image="/data/session01/t1_mprage.nii.gz", - template_dir="/templates/gsp_spirit", - rotation_library_file="/templates/gsp_spirit/rotations.txt", +wf = VialSignalAnalysis( + input_image="/data/session01/T1.nii.gz", + template_dir="/templates/SPIRIT", + rotation_library_file="/templates/rotations.txt", ) -outputs = wf(cache_root="/data/cache-root") +outputs = wf(cache_root="/data/pydra-cache") ``` -Or via the command line: +### CLI — run a protocol directly ```bash # Single session -phantom-process run gsp-spirit /data/session01/t1_mprage.nii.gz \ - --template-dir /templates/gsp_spirit \ - --rotation-library-file /templates/gsp_spirit/rotations.txt \ - --output-base-dir /results - -# Batch — process every matching image found under /data/ -phantom-process run gsp-spirit /data/ \ - --template-dir /templates/gsp_spirit \ - --rotation-library-file /templates/gsp_spirit/rotations.txt \ - --output-base-dir /results \ - --pattern "*t1*mprage*.nii.gz" +phantomkit run vial-signal /data/session01/T1.nii.gz \ + --template-dir /templates/SPIRIT \ + --rotation-library-file /templates/rotations.txt \ + --output-base-dir /results + +# Batch mode — process every matching image under /data/ +phantomkit run vial-signal /data/ \ + --template-dir /templates/SPIRIT \ + --rotation-library-file /templates/rotations.txt \ + --output-base-dir /results \ + --pattern "*T1*.nii.gz" # List available protocols -phantom-process list +phantomkit list ``` ### Plotting @@ -61,22 +156,30 @@ phantom-process list Generate QA plots from existing CSV metric files: ```bash -# Vial intensity scatter plot for one contrast -phantom-process plot vial-intensity \ - /results/session01/metrics/session01_t1_mprage_mean_matrix.csv scatter \ - --std_csv /results/session01/metrics/session01_t1_mprage_std_matrix.csv \ - --output /results/session01/metrics/session01_t1_PLOTmeanstd.png +# Generic scatter plot +phantomkit plot vial-intensity \ + /results/session01/metrics/session01_T1_mean_matrix.csv scatter \ + --std-csv /results/session01/metrics/session01_T1_std_matrix.csv \ + --output /results/session01/metrics/session01_T1_PLOTmeanstd.png + +# ADC scatter plot with SPIRIT reference values +phantomkit plot vial-intensity \ + /results/session01/metrics/session01_ADC_mean_matrix.csv scatter \ + --std-csv /results/session01/metrics/session01_ADC_std_matrix.csv \ + --phantom SPIRIT \ + --template-dir /templates \ + --output /results/session01/metrics/session01_ADC_PLOTmeanstd.png # T1 inversion-recovery parametric map plot -phantom-process plot maps-ir \ - /results/session01/images_template_space/ir_*.nii.gz \ - --metric_dir /results/session01/metrics \ +phantomkit plot maps-ir \ + /results/session01/images_template_space/se_ir_*.nii.gz \ + --metric-dir /results/session01/metrics \ --output /results/session01/metrics/session01_T1map_plot.png # T2 spin-echo parametric map plot -phantom-process plot maps-te \ - /results/session01/images_template_space/te_*.nii.gz \ - --metric_dir /results/session01/metrics \ +phantomkit plot maps-te \ + /results/session01/images_template_space/t2_se_*.nii.gz \ + --metric-dir /results/session01/metrics \ --output /results/session01/metrics/session01_T2map_plot.png ``` @@ -84,4 +187,4 @@ See the [CLI documentation](https://australian-imaging-service.github.io/phantom ## License -Copyright 2026 Australian Imaging Service. Released under the [Apache License 2.0](LICENSE). +Copyright 2026 Australian Imaging Service. Released under the [Apache License 2.0](LICENSE). \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..1f1714a --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,80 @@ +FROM ubuntu:24.04 + +LABEL org.opencontainers.image.title="phantomkit" \ + org.opencontainers.image.description="MRI phantom QA processing pipeline" \ + org.opencontainers.image.authors="Arkiev D'Souza " \ + org.opencontainers.image.source="https://github.com/Australian-Imaging-Service/phantomkit" + +ARG DEBIAN_FRONTEND=noninteractive +ARG ANTS_VERSION=2.5.3 + +# ---------- Base system packages ---------- +RUN apt-get update && apt-get install -y --no-install-recommends \ + ca-certificates curl wget unzip \ + python3 python3-pip python3-venv \ + libgomp1 \ + dc bc \ + mrtrix3 \ + && rm -rf /var/lib/apt/lists/* + +# ---------- Python virtual environment ---------- +RUN python3 -m venv /opt/venv +ENV PATH="/opt/venv/bin:${PATH}" + +# ---------- FSL via conda environment spec ---------- +# Bypasses the FSL installer (which requires sudo for system PATH setup). +# Downloads miniforge to get conda/mamba, creates the FSL env from FSL's +# own published yml spec, then removes miniforge to save space. +# Downloads ~7 GB; includes eddy, topup, flirt, and related tools. +ARG FSL_VERSION=6.0.7.22 +RUN curl -fsSL \ + "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh" \ + -o /tmp/miniforge.sh \ + && bash /tmp/miniforge.sh -b -p /opt/conda \ + && rm /tmp/miniforge.sh + +RUN /opt/conda/bin/conda env create -p /opt/fsl \ + -f "https://fsl.fmrib.ox.ac.uk/fsldownloads/fslconda/releases/fsl-${FSL_VERSION}_linux-64.yml" \ + && /opt/conda/bin/conda clean --all -y \ + && rm -rf /opt/conda + +ENV FSLDIR=/opt/fsl \ + FSLOUTPUTTYPE=NIFTI_GZ \ + FSLMULTIFILEQUIT=TRUE +ENV PATH="${FSLDIR}/bin:${PATH}" +ENV LD_LIBRARY_PATH="/opt/fsl/lib" + +# ---------- ANTs pre-compiled binary ---------- +RUN curl -fsSL \ + "https://github.com/ANTsX/ANTs/releases/download/v${ANTS_VERSION}/ants-${ANTS_VERSION}-ubuntu-22.04-X64-gcc.zip" \ + -o /tmp/ants.zip \ + && unzip -q /tmp/ants.zip -d /opt/ \ + && find /opt -maxdepth 3 -name "antsRegistration" 2>/dev/null \ + | head -1 | xargs dirname | xargs -I{} ln -s {} /opt/ants_bin \ + && rm /tmp/ants.zip + +ENV PATH="/opt/ants_bin:${PATH}" + +# ---------- dcm2niix pre-compiled binary ---------- +RUN curl -fsSL \ + "https://github.com/rordenlab/dcm2niix/releases/latest/download/dcm2niix_lnx.zip" \ + -o /tmp/dcm2niix.zip \ + && unzip -q /tmp/dcm2niix.zip -d /tmp/dcm2niix \ + && install -m 755 /tmp/dcm2niix/dcm2niix /usr/local/bin/dcm2niix \ + && rm -rf /tmp/dcm2niix.zip /tmp/dcm2niix + +# Polyfill for imp module removed in Python 3.12 (needed by apt MRtrix3 scripts). +# Placed here so edits to the polyfill don't invalidate the expensive FSL layer. +COPY docker/imp_polyfill.py /usr/lib/python3/dist-packages/imp.py + +# ---------- phantomkit (editable install preserves template_data lookup) ---------- +WORKDIR /opt/phantomkit +COPY . . +RUN /opt/venv/bin/pip install --no-cache-dir -e . + +# ---------- Runtime ---------- +WORKDIR /data +VOLUME ["/data/input", "/data/output"] + +ENTRYPOINT ["phantomkit"] +CMD ["--help"] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..ca26157 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,118 @@ +# phantomkit Docker Image + +A self-contained image for running the phantomkit MRI phantom QA pipeline, bundling all required neuroimaging tools. + +## What's included + +| Tool | Version | Purpose | +|------|---------|---------| +| Ubuntu | 24.04 | Base OS | +| Python | 3.12 | Runtime | +| MRtrix3 | system apt | DWI preprocessing, format conversion | +| FSL | latest (conda installer) | `eddy`, `topup`, `flirt` | +| ANTs | 2.5.3 | Registration (`antsRegistrationSyN.sh`, `antsApplyTransforms`) | +| dcm2niix | latest | DICOM → NIfTI conversion | +| phantomkit | repo source | This package | + +> **Note:** The FSL layer alone is ~7 GB. Expect a final image size of ~10–12 GB and a build time of 30–60 minutes depending on network speed. + +--- + +## Pulling on another machine + +```bash +docker pull arkiev/phantomkit:latest +``` +--- + + +## Running the container + +### Full pipeline + +```bash +docker run --rm \ + -v /path/to/input:/data/input \ + -v /path/to/output:/data/output \ + phantomkit:latest \ + pipeline \ + --input-dir /data/input \ + --output-dir /data/output \ + --phantom SPIRIT +``` + +### Plotting (compare two HTML reports) + +```bash +docker run --rm \ + -v /path/to/plots:/data/plots \ + phantomkit:latest \ + plot compare-plots \ + /data/plots/T1_mapping.html \ + /data/plots/T1_mapping_reduced.html \ + -o /data/plots/comparison.html +``` + +### Interactive shell (debugging) + +```bash +docker run --rm -it \ + -v /path/to/input:/data/input \ + -v /path/to/output:/data/output \ + --entrypoint bash \ + phantomkit:latest +``` + +### List available commands + +```bash +docker run --rm phantomkit:latest --help +``` + +## Building and pushing the image + +The image targets both `linux/amd64` (Linux servers) and `linux/arm64` (Apple Silicon). Use `buildx` to build and push in one step. + +```bash +docker login +docker buildx create --use +docker buildx build \ + --platform linux/amd64,linux/arm64 \ + -f docker/Dockerfile \ + -t arkiev/phantomkit:latest \ + -t arkiev/phantomkit:0.1.8 \ + --push . +``` + +For a local-only build (single platform, no push): + +```bash +docker build -f docker/Dockerfile -t arkiev/phantomkit:latest . +``` + +--- + + +--- + +## Volume mounts + +| Container path | Purpose | +|----------------|---------| +| `/data/input` | Input data (DICOM, NIfTI, or MIF) | +| `/data/output` | Processing outputs | + +Any additional paths can be mounted with `-v`. + +--- + + +--- + +## Troubleshooting + +**`template_data` not found:** The image uses an editable install so that `template_data/` is resolved relative to `/opt/phantomkit/`. If you override `WORKDIR` or move files, this may break. + +**ANTs not found on PATH:** Confirm the symlink exists: `docker run --rm --entrypoint which phantomkit:latest antsRegistration` + +**FSL eddy not found:** Verify `FSLDIR`: `docker run --rm --entrypoint bash phantomkit:latest -c 'echo $FSLDIR && ls $FSLDIR/bin/eddy*'` diff --git a/docker/imp_polyfill.py b/docker/imp_polyfill.py new file mode 100644 index 0000000..003e7f5 --- /dev/null +++ b/docker/imp_polyfill.py @@ -0,0 +1,50 @@ +"""Polyfill for the `imp` module removed in Python 3.12. + +Required by the Ubuntu 24.04 apt package of MRtrix3, whose scripts still +call imp.find_module / imp.load_module / imp.load_source. +""" +import importlib.util +import os +import sys +import types + +PY_SOURCE = 1 +PY_COMPILED = 2 +C_EXTENSION = 3 +PKG_DIRECTORY = 5 +C_BUILTIN = 6 +PY_FROZEN = 7 + + +def find_module(name, path=None): + search = path if path is not None else sys.path + for p in search: + full = os.path.join(p, name) + if os.path.isfile(full + '.py'): + return (None, full + '.py', ('.py', 'r', PY_SOURCE)) + if os.path.isdir(full) and os.path.isfile(os.path.join(full, '__init__.py')): + return (None, full, ('', '', PKG_DIRECTORY)) + raise ImportError('No module named ' + repr(name)) + + +def load_module(name, file, filename, description): + if file is not None: + file.close() + suffix, mode, type_ = description + if type_ == PKG_DIRECTORY: + filename = os.path.join(filename, '__init__.py') + spec = importlib.util.spec_from_file_location(name, filename) + if spec is None: + raise ImportError('Cannot find spec for ' + repr(name) + ' at ' + repr(filename)) + mod = importlib.util.module_from_spec(spec) + sys.modules[name] = mod + spec.loader.exec_module(mod) + return mod + + +def load_source(name, pathname, file=None): + return load_module(name, None, pathname, ('.py', 'r', PY_SOURCE)) + + +def new_module(name): + return types.ModuleType(name) diff --git a/docs/source/api.rst b/docs/source/api.rst index ec8ee58..44ea4b4 100644 --- a/docs/source/api.rst +++ b/docs/source/api.rst @@ -1,19 +1,83 @@ API === +This page documents the public Python API of PhantomKit. The package is +organised into five sub-packages: + +- :mod:`phantomkit.analyses` — top-level pydra workflows (user-facing entry + points) +- :mod:`phantomkit.phantom_processor` — imperative processing engine + (:class:`~phantomkit.phantom_processor.PhantomProcessor`) +- :mod:`phantomkit.registration` — ANTs registration tasks and workflows +- :mod:`phantomkit.metrics` — vial mask transform and metric extraction + workflows +- :mod:`phantomkit.plotting` — QA plot generation functions and pydra tasks + + Analyses --------- +--------- + +The ``analyses`` sub-package contains the pydra workflow classes that serve as +the primary programmatic entry points. + +Vial signal analysis +~~~~~~~~~~~~~~~~~~~~ .. autoclass:: phantomkit.analyses.vial_signal.VialSignalAnalysis -.. autoclass:: phantomkit.protocols.diffusion_metrics.DiffusionMetricsAnalysis +.. autoclass:: phantomkit.analyses.vial_signal.VialSignalAnalysisBatch + +Diffusion metrics analysis +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. autoclass:: phantomkit.analyses.diffusion_metrics.DiffusionMetricsAnalysis + +.. autoclass:: phantomkit.analyses.diffusion_metrics.DiffusionMetricsAnalysisBatch + + +Phantom processor +------------------ + +:class:`~phantomkit.phantom_processor.PhantomProcessor` is the imperative +counterpart to :class:`~phantomkit.analyses.vial_signal.VialSignalAnalysis`. +It is used internally by the pipeline orchestrator (Stages 2 and 3) and can +also be used directly for scripted single-session processing. + +.. autoclass:: phantomkit.phantom_processor.PhantomProcessor + :members: process_session + + +Registration +------------ + +.. autoclass:: phantomkit.registration.IterativeRegistration + +.. autoclass:: phantomkit.registration.CheckRegistration + +.. autoclass:: phantomkit.registration.SaveTemplateInScannerSpace + +.. autoclass:: phantomkit.registration.RegistrationSynN + + +Metrics +------- + +.. autoclass:: phantomkit.metrics.TransformVialsToSubjectSpace + +.. autoclass:: phantomkit.metrics.ExtractMetricsFromContrasts + +.. autoclass:: phantomkit.metrics.TransformContrastsToTemplateSpace Plotting -------- +.. autofunction:: phantomkit.plotting.vial_intensity.plot_vial_intensity + .. autofunction:: phantomkit.plotting.maps_ir.plot_vial_ir_means_std .. autofunction:: phantomkit.plotting.maps_te.plot_vial_te_means_std -.. autofunction:: phantomkit.plotting.vial_intensity.plot_vial_intensity +.. autoclass:: phantomkit.plotting.visualization.GeneratePlots + +.. autoclass:: phantomkit.plotting.visualization.BuildRoiOverlay \ No newline at end of file diff --git a/docs/source/cli.rst b/docs/source/cli.rst index 3608f63..fb5d103 100644 --- a/docs/source/cli.rst +++ b/docs/source/cli.rst @@ -1,34 +1,98 @@ Command-line interface ====================== -PhantomKit installs the ``phantom-process`` command, which groups two -subcommand families: +PhantomKit installs the ``phantomkit`` command, which groups four subcommand +families: -- ``phantom-process run`` — execute a full QA protocol workflow -- ``phantom-process plot`` — generate individual QA plots from existing CSVs +- ``phantomkit pipeline`` — end-to-end phantom QC + DWI orchestrator +- ``phantomkit run`` — execute a single pydra protocol workflow +- ``phantomkit plot`` — generate individual QA plots from existing CSVs +- ``phantomkit list`` — list all available protocol workflows Use ``--help`` at any level for a full option listing:: - phantom-process --help - phantom-process run --help - phantom-process run gsp-spirit --help - phantom-process plot --help - phantom-process plot vial-intensity --help + phantomkit --help + phantomkit pipeline --help + phantomkit run --help + phantomkit run vial-signal --help + phantomkit plot --help + phantomkit plot vial-intensity --help + + +End-to-end pipeline +-------------------- + +The ``pipeline`` command is the primary entry point for processing a complete +scanner session. It scans ``--input-dir`` for acquisition subdirectories, +classifies them automatically, and runs up to three stages: + +- **Stage 1** — DWI preprocessing (runs if DWI acquisitions are found) +- **Stage 2** — Phantom QC in DWI space (runs per DWI series after Stage 1) +- **Stage 3** — Phantom QC on native T1/IR/TE contrasts (runs if those series + are present) + +Stages 1 and 3 execute in parallel where possible. + +.. code-block:: console + + $ phantomkit pipeline \ + --input-dir /data/session01 \ + --output-dir /results/session01 \ + --phantom SPIRIT + +Options: + +.. code-block:: text + + --input-dir PATH Root directory containing acquisition subdirectories + (DICOM folders). [required] + --output-dir PATH Top-level output directory. All results are written + here. [required] + --phantom TEXT Phantom name, e.g. SPIRIT. Used to locate + template_data//. [required] + --denoise-degibbs Apply dwidenoise + mrdegibbs before preprocessing. + --gradcheck Run dwigradcheck to verify gradient orientations. + --nocleanup Keep DWI tmp/ intermediate directories. + --readout-time FLOAT Override TotalReadoutTime (seconds) for dwifslpreproc. + --eddy-options TEXT Override FSL eddy options string. + --dry-run Plan and print commands; do not execute any processing. + +Output structure: + +.. code-block:: text + + /results/session01/ + / + DWI_preproc_biascorr.mif.gz + ADC.nii.gz + FA.nii.gz + T1_in_DWI_space.nii.gz + metrics/ + vial_segmentations/ + native_contrasts_staging/ + metrics/ + vial_segmentations/ + images_template_space/ Discovering available protocols --------------------------------- +--------------------------------- .. code-block:: console - $ phantom-process list + $ phantomkit list Available protocols: - gsp-spirit (batch supported) + vial-signal (batch supported) Pydra workflow for processing a single GSP SPIRIT phantom MRI session. + diffusion-metrics (batch supported) + Full SPIRIT phantom DWI analysis workflow. + +Running a protocol workflow +---------------------------- -Running a protocol ------------------- +The ``run`` subgroup executes pydra protocol workflows directly, bypassing the +pipeline orchestrator. Single session ~~~~~~~~~~~~~~ @@ -37,10 +101,10 @@ Pass a path to a NIfTI file as ``INPUT`` to process one session: .. code-block:: console - $ phantom-process run gsp-spirit /data/session01/t1_mprage.nii.gz \ - --template-dir /templates/gsp_spirit \ - --rotation-library-file /templates/gsp_spirit/rotations.txt \ - --output-base-dir /results + $ phantomkit run vial-signal /data/session01/T1.nii.gz \ + --template-dir /templates/SPIRIT \ + --rotation-library-file /templates/rotations.txt \ + --output-base-dir /results The session name is taken from the parent directory of the image (``session01`` in the example above). All ``*.nii.gz`` files in the same @@ -54,23 +118,23 @@ recursively inside it: .. code-block:: console - $ phantom-process run gsp-spirit /data \ - --template-dir /templates/gsp_spirit \ - --rotation-library-file /templates/gsp_spirit/rotations.txt \ - --output-base-dir /results \ - --pattern "*t1*mprage*.nii.gz" \ - --plugin cf + $ phantomkit run vial-signal /data \ + --template-dir /templates/SPIRIT \ + --rotation-library-file /templates/rotations.txt \ + --output-base-dir /results \ + --pattern "*T1*.nii.gz" \ + --worker cf ``--pattern`` controls which files are selected (default ``*.nii.gz``). -``--plugin`` selects the pydra execution backend: ``cf`` (concurrent -futures, default) for parallel execution or ``serial`` for sequential. +``--worker`` selects the pydra execution backend: ``cf`` (concurrent futures, +default) for parallel execution or ``serial`` for sequential. Protocol options ~~~~~~~~~~~~~~~~ -All parameters of the underlying workflow are exposed as options. Run -``phantom-process run --help`` to see the full list. For -``gsp-spirit``: +All parameters of the underlying workflow are exposed as CLI options. Run +``phantomkit run --help`` to see the full list. For +``vial-signal``: .. code-block:: text @@ -80,55 +144,68 @@ All parameters of the underlying workflow are exposed as options. Run --rotation-library-file PATH Path to the rotation library text file. [required] --output-base-dir PATH Root output directory (default: cwd). - --plugin [cf|serial] Pydra execution plugin. [default: cf] + --worker [cf|serial] Pydra execution backend. [default: cf] --pattern TEXT Glob pattern for batch mode. [default: *.nii.gz] Generating plots ----------------- +----------------- -The ``plot`` subcommands generate standalone QA figures from CSV metric -files already written to disk (e.g. after a completed ``run``). +The ``plot`` subcommands generate standalone QA figures from CSV metric files +already written to disk (e.g. after a completed ``run`` or ``pipeline``). Vial intensity scatter plot ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Plots per-vial mean ± std as a scatter, line, or bar chart for a single -contrast: +contrast. In ADC mode (auto-detected from filename), measured values are +overlaid against SPIRIT reference values: .. code-block:: console - $ phantom-process plot vial-intensity \ - /results/session01/metrics/session01_t1_mprage_mean_matrix.csv \ + $ phantomkit plot vial-intensity \ + /results/session01/metrics/session01_T1_mean_matrix.csv \ + scatter \ + --std-csv /results/session01/metrics/session01_T1_std_matrix.csv \ + --output /results/session01/metrics/session01_T1_PLOTmeanstd.png + + # ADC mode — reference values overlaid automatically + $ phantomkit plot vial-intensity \ + /results/session01/metrics/session01_ADC_mean_matrix.csv \ scatter \ - --std_csv /results/session01/metrics/session01_t1_mprage_std_matrix.csv \ - --output /results/session01/metrics/session01_t1_PLOTmeanstd.png + --std-csv /results/session01/metrics/session01_ADC_std_matrix.csv \ + --phantom SPIRIT \ + --template-dir /templates \ + --output /results/session01/metrics/session01_ADC_PLOTmeanstd.png Options: .. code-block:: text Arguments: - CSV_FILE Mean-value CSV produced by ExtractMetricsFromContrasts. + CSV_FILE Mean-value CSV produced by metric extraction. {line|bar|scatter} Plot style. Options: - --std_csv TEXT CSV file containing standard deviations. - --roi_image TEXT PNG screenshot of the contrast with vial ROI overlay. - --annotate Annotate each point with mean ± std. - --output TEXT Output filename. [default: vial_subplot.png] + --std-csv PATH CSV file containing standard deviations. + --roi-image PATH PNG screenshot of the contrast with vial ROI overlay. + --annotate Annotate each point with mean ± std. + --phantom TEXT Phantom name (required in ADC mode). + --template-dir PATH TemplateData directory (required in ADC mode). + --output PATH Output filename. [default: vial_subplot.png] Inversion-recovery (T1) map plot ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Plots vial mean ± std across multiple IR contrasts with T₁ curve fitting: +Plots vial mean ± std across multiple IR contrasts with T₁ inversion-recovery +curve fitting and 95% Monte Carlo confidence intervals: .. code-block:: console - $ phantom-process plot maps-ir \ - /results/session01/images_template_space/ir_*.nii.gz \ - --metric_dir /results/session01/metrics \ + $ phantomkit plot maps-ir \ + /results/session01/images_template_space/se_ir_*.nii.gz \ + --metric-dir /results/session01/metrics \ --output /results/session01/metrics/session01_T1map_plot.png Options: @@ -136,25 +213,26 @@ Options: .. code-block:: text Arguments: - CONTRAST_FILES... IR NIfTI images in template space. + CONTRAST_FILES... IR NIfTI images in template space (one per TI). Options: - -m, --metric_dir TEXT Directory containing mean/std CSV files. [required] - -o, --output TEXT Output filename. [default: vial_summary_T1.png] + -m, --metric-dir PATH Directory containing mean/std CSV files. [required] + -o, --output PATH Output filename. [default: vial_summary_T1.png] --annotate Annotate each point with mean ± std. - --roi_image TEXT PNG ROI overlay for the extra subplot. + --roi-image PATH PNG ROI overlay for the extra subplot. Spin-echo (T2/TE) map plot ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Plots vial mean ± std across multiple TE contrasts with mono-exponential -T₂ fitting: +Plots vial mean ± std across multiple TE contrasts with mono-exponential T₂ +decay fitting and 95% Monte Carlo confidence intervals: .. code-block:: console - $ phantom-process plot maps-te \ - /results/session01/images_template_space/te_*.nii.gz \ - --metric_dir /results/session01/metrics \ + $ phantomkit plot maps-te \ + /results/session01/images_template_space/t2_se_*.nii.gz \ + --metric-dir /results/session01/metrics \ --output /results/session01/metrics/session01_T2map_plot.png -Options are identical to ``maps-ir``. +Options are identical to ``maps-ir``, except the fitted parameter is T₂ and +the output CSV records T₂ values. \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 94df8c7..1d0c075 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -14,24 +14,36 @@ PhantomKit :target: https://pypi.python.org/pypi/phantomkit/ :alt: Latest Version -*PhantomKit* is a Python toolkit for automated quality assurance (QA) of medical imaging -scanners using physical phantoms. It provides pydra-based workflows that register phantom -scans to a reference template, extract per-vial signal statistics across multiple contrast -types, and generate publication-quality plots — supporting both MRI and PET phantom -protocols. +*PhantomKit* is a Python toolkit for automated quality assurance (QA) of MRI +scanners using physical phantoms. It provides pydra-based workflows and a +high-level processing engine that register phantom scans to a reference +template, extract per-vial signal statistics across multiple contrast types, +and generate publication-quality plots — with full support for DWI +preprocessing and diffusion metric (ADC, FA) extraction. Key features: -- **Template-based registration** — iterative ANTs SyN registration with automatic - orientation search across a rotation library -- **Vial metric extraction** — per-vial mean, median, std, min and max across all - contrast images, written to CSV -- **Plotting** — scatter plots of vial intensity and parametric map plots (T1/IR, T2/TE) - with mrview ROI overlays -- **Protocol support** — extensible ``protocols`` sub-package for phantom- and - project-specific workflow configurations -- **Parallel batch processing** — pydra-native splitting and combining for multi-session - datasets +- **End-to-end pipeline** — single ``phantomkit pipeline`` command processes a + raw DICOM session directory through DWI preprocessing (Stage 1), phantom QC + in DWI space (Stage 2), and native contrast QC (Stage 3) +- **Automatic series classification** — DWI, reverse phase-encode, T1, IR, and + TE series are detected from folder names and DICOM sidecar metadata; no manual + configuration required +- **DWI preprocessing** — FSL ``dwifslpreproc`` with automatic phase-encoding + correction mode selection (``rpe_none``, ``rpe_pair``, ``rpe_all``), optional + denoising/Gibbs correction, tensor fitting, and T1-to-DWI co-registration via + FLIRT +- **Template-based registration** — iterative ANTs rigid registration with + automatic orientation search across a rotation library; vial masks propagated + to subject space via inverse transform +- **Vial metric extraction** — per-vial mean, median, std, min and max across + all contrast images, written to CSV +- **Plotting** — ADC/FA scatter plots with SPIRIT reference values, T1/IR and + T2/TE parametric map plots with mrview ROI overlays +- **Parallel batch processing** — pydra-native splitting and combining for + multi-session datasets +- **Checkpoint-based resumption** — re-running the pipeline skips stages whose + outputs already exist Installation @@ -43,6 +55,17 @@ Installation $ python3 -m pip install phantomkit +External dependencies (must be on ``PATH``): + +- `FSL `_ — ``dwifslpreproc``, + ``flirt``, ``convert_xfm`` +- `MRtrix3 `_ — ``mrconvert``, ``dwi2tensor``, + ``tensor2metric``, ``dwidenoise``, ``mrdegibbs``, ``mrstats``, ``mrview`` +- `ANTs `_ — ``antsRegistrationSyN.sh``, + ``antsApplyTransforms`` +- `dcm2niix `_ — DICOM to NIfTI + conversion + License ------- @@ -59,4 +82,4 @@ Copyright 2026 Australian Imaging Service. quick_start cli - api + api \ No newline at end of file diff --git a/docs/source/quick_start.rst b/docs/source/quick_start.rst index 5130ef4..55ae3ab 100644 --- a/docs/source/quick_start.rst +++ b/docs/source/quick_start.rst @@ -1,18 +1,119 @@ Quick start =========== -PhantomKit analyses are implemented as `Pydra `__ workflows. To -execute them, you first parameterise the workflow by instantiate the Pydra workflow class, -then call the workflow object with execution args:: +PhantomKit can be used through the ``phantomkit`` command-line interface or +directly via its Python API. + + +End-to-end pipeline (CLI) +-------------------------- + +The fastest way to process a session is the ``pipeline`` command. Point it at +a directory of DICOM subdirectories, specify an output location, and name the +phantom: + +.. code-block:: console + + $ phantomkit pipeline \ + --input-dir /data/session01 \ + --output-dir /results/session01 \ + --phantom SPIRIT + +PhantomKit will: + +1. Scan ``--input-dir`` and classify subdirectories into T1, IR, TE, and DWI + series automatically. +2. Run DWI preprocessing (Stage 1) if DWI series are found. +3. Run phantom QC in DWI space (Stage 2) on each preprocessed DWI output. +4. Run phantom QC on native T1/IR/TE contrasts (Stage 3) if those series are + present. + +See :doc:`cli` for the full option reference. + + +Python API — single session +---------------------------- + +The :class:`~phantomkit.phantom_processor.PhantomProcessor` class orchestrates +phantom QC for a single session end-to-end without the pipeline scaffolding: .. code-block:: python - >>> from pydra.utils import get_fields - >>> from phantomkit.analyses.vial_signal import VialSignalAnalysis - >>> vial_signal_wf = VialSignalAnalysis( - input_image="/path/to/input/image.nii.gz", - template_dir="/path/to/template/dir", - rotation_library_file="/path/to/rotation/library/file.txt" - ) - >>> outputs = vial_signal_wf(cache_root="/path/to/cache/root") - >>> print("\n".join(f.name for f in outputs.metrics_dir.contents)) + from phantomkit.phantom_processor import PhantomProcessor + + processor = PhantomProcessor( + template_dir="/templates/SPIRIT", + output_base_dir="/results", + rotation_library_file="/templates/rotations.txt", + ) + results = processor.process_session("/data/session01/T1.nii.gz") + + print(results["metrics_dir"]) + print(results["vial_dir"]) + print(results["images_template_space_dir"]) + +All ``*.nii.gz`` files in the same directory as the input image are treated as +additional contrast images. + + +Python API — pydra workflow +---------------------------- + +For finer-grained control, :class:`~phantomkit.analyses.vial_signal.VialSignalAnalysis` +exposes the same processing as a pydra workflow, enabling lazy execution and +caching: + +.. code-block:: python + + from phantomkit.analyses.vial_signal import VialSignalAnalysis + + wf = VialSignalAnalysis( + input_image="/data/session01/T1.nii.gz", + template_dir="/templates/SPIRIT", + rotation_library_file="/templates/rotations.txt", + output_base_dir="/results", + ) + outputs = wf(cache_root="/data/pydra-cache") + + print(outputs.metrics_dir) + +Run ``phantomkit list`` to discover all available protocol workflows. Batch +processing is available via :class:`~phantomkit.analyses.vial_signal.VialSignalAnalysisBatch`. + + +Output structure +----------------- + +A completed session produces: + +.. code-block:: text + + /results/session01/ + metrics/ + session01__mean_matrix.csv + session01__std_matrix.csv + session01__PLOTmeanstd.png + session01_ir_map_PLOTmeanstd_T1mapping.png (if IR contrasts present) + session01_TE_map_PLOTmeanstd_TEmapping.png (if TE contrasts present) + vial_segmentations/ + A.nii.gz … T.nii.gz + images_template_space/ + .nii.gz … + TemplatePhantom_ScannerSpace.nii.gz + +When called through the pipeline, DWI series each get their own subdirectory: + +.. code-block:: text + + /results/session01/ + / + DWI_preproc_biascorr.mif.gz + ADC.nii.gz + FA.nii.gz + T1_in_DWI_space.nii.gz + metrics/ + vial_segmentations/ + native_contrasts_staging/ + metrics/ + vial_segmentations/ + images_template_space/ \ No newline at end of file diff --git a/phantomkit/analyses/tests/test_vial_signal.py b/phantomkit/analyses/tests/test_vial_signal.py index 09cd50b..f42fbf1 100644 --- a/phantomkit/analyses/tests/test_vial_signal.py +++ b/phantomkit/analyses/tests/test_vial_signal.py @@ -2,7 +2,6 @@ from pathlib import Path -from fileformats.generic import File from fileformats.medimage import NiftiGz from phantomkit.analyses.vial_signal import ( @@ -89,13 +88,11 @@ def test_vial_signal_build(tmp_path: Path) -> None: image = NiftiGz.sample(dest_dir=tmp_path, stem="t1") template_dir = tmp_path / "template" template_dir.mkdir() - rotation_lib = File.sample(dest_dir=tmp_path, stem="rotations") wf = VialSignalAnalysis( input_image=image, template_dir=template_dir, output_base_dir=tmp_path / "output", - rotation_library_file=rotation_lib, ) assert wf is not None @@ -108,12 +105,10 @@ def test_vial_signal_batch_build(tmp_path: Path) -> None: ] template_dir = tmp_path / "template" template_dir.mkdir() - rotation_lib = File.sample(dest_dir=tmp_path, stem="rotations") wf = VialSignalAnalysisBatch( input_images=images, template_dir=template_dir, output_base_dir=tmp_path / "output", - rotation_library_file=rotation_lib, ) assert wf is not None diff --git a/phantomkit/analyses/vial_signal.py b/phantomkit/analyses/vial_signal.py index 377eb28..e54f71b 100644 --- a/phantomkit/analyses/vial_signal.py +++ b/phantomkit/analyses/vial_signal.py @@ -8,12 +8,12 @@ import logging from pathlib import Path -from fileformats.generic import Directory, File +from fileformats.generic import Directory from fileformats.medimage import NiftiGz from pydra.compose import python, workflow from phantomkit.registration import ( - IterativeRegistration, + RegisterToTemplate, SaveTemplateInScannerSpace, ) from phantomkit.metrics import ( @@ -186,15 +186,13 @@ def GetContrastFiles(input_image: NiftiGz) -> list[NiftiGz]: def VialSignalAnalysis( input_image: NiftiGz, template_dir: Directory, - rotation_library_file: File, output_base_dir: Path | None = None, ) -> tuple[Directory, Directory, Directory, NiftiGz]: """ - Pydra workflow for processing a single GSP SPIRIT phantom MRI session. + Pydra workflow for processing a single phantom MRI session. - Registers the phantom scan to the GSP SPIRIT template using iterative ANTs - SyN registration with an orientation search, extracts per-vial signal - statistics for all contrast images, and generates publication-quality plots. + Registers the phantom scan to the template using ANTs rigid SyN, extracts + per-vial signal statistics for all contrast images, and generates plots. Parameters ---------- @@ -202,12 +200,9 @@ def VialSignalAnalysis( Path to the primary NIfTI image for the session (e.g. the T1 MPRAGE). All NIfTI files in the same directory are treated as contrast images. template_dir : Directory - Path to the GSP SPIRIT template directory. Must contain + Path to the phantom template directory. Must contain ``ImageTemplate.nii.gz`` and a ``VialsLabelled/`` sub-directory of per-vial mask files. - rotation_library_file : File - Path to a text file listing quoted ANTs rotation strings, one per line, - used during the iterative orientation search. output_base_dir : Path, optional Root output directory. A sub-directory named after the session (parent folder of *input_image*) is created automatically. @@ -231,18 +226,12 @@ def VialSignalAnalysis( 1. **PrepareSessionPaths** — derive output paths and create directories 2. **GetVialMasks** — list template vial mask files 3. **GetContrastFiles** — list all contrast NIfTI files in the session - 4. **IterativeRegistration** — iterative ANTs registration with orientation - search (RegistrationSynN + CheckRegistration + MrTransform) + 4. **RegisterToTemplate** — ANTs rigid SyN registration 5. **SaveTemplateInScannerSpace** — warp template back to subject space - (MrConvert or MrTransform) 6. **TransformVialsToSubjectSpace** — project vial masks into subject space - (ApplyTransforms + MrTransform/MrConvert) 7. **ExtractMetricsFromContrasts** — compute per-vial statistics; writes CSVs - (MrGrid + MrConvert + MrStats) 8. **TransformContrastsToTemplateSpace** — forward-warp all contrasts - (MrTransform + MrGrid + ApplyTransforms) 9. **GeneratePlots** — scatter and parametric map plots - (MrGrid for ROI overlays, external Python scripts for plots) 10. **Cleanup** — remove temporary directories """ template_phantom = Path(template_dir) / "ImageTemplate.nii.gz" @@ -266,22 +255,18 @@ def VialSignalAnalysis( ) reg = workflow.add( - IterativeRegistration( + RegisterToTemplate( input_image=input_image, template_phantom=template_phantom, - rotation_library_file=rotation_library_file, - vial_masks=vial_masks.out, session_name=paths.session_name, tmp_dir=paths.tmp_dir, ), - name="iterative_registration", + name="registration", ) scanner_template = workflow.add( SaveTemplateInScannerSpace( inverse_warped=reg.inverse_warped, - rotation_matrix_file=reg.rotation_matrix_file, - iteration=reg.iteration, output_path=paths.scanner_space_image, ), name="save_template_scanner_space", @@ -292,8 +277,6 @@ def VialSignalAnalysis( vial_masks=vial_masks.out, reference_image=input_image, transform_matrix=reg.transform, - rotation_matrix_file=reg.rotation_matrix_file, - iteration=reg.iteration, output_vial_dir=paths.vial_dir, ), name="transform_vials", @@ -313,8 +296,6 @@ def VialSignalAnalysis( TransformContrastsToTemplateSpace( contrast_files=contrast_files.out, transform_matrix=reg.transform, - rotation_matrix_file=reg.rotation_matrix_file, - iteration=reg.iteration, template_phantom=template_phantom, tmp_dir=paths.tmp_dir, output_dir=paths.images_template_space_dir, @@ -350,7 +331,6 @@ def VialSignalAnalysisBatch( input_images: list[NiftiGz], template_dir: Directory, output_base_dir: Path, - rotation_library_file: File, ) -> list: """ Pydra workflow for batch-processing multiple phantom sessions in parallel. @@ -364,14 +344,11 @@ def VialSignalAnalysisBatch( One primary NIfTI image per session. All NIfTI files in each image's parent directory are automatically included as contrast images. template_dir : Directory - Path to the shared GSP SPIRIT template directory, passed unchanged to - each :func:`VialSignalAnalysis` invocation. + Path to the phantom template directory, passed unchanged to each + :func:`VialSignalAnalysis` invocation. output_base_dir : Path Shared root output directory. Each session receives its own sub-directory named after its parent folder. - rotation_library_file : File - Path to the rotation library text file, passed unchanged to each - :func:`VialSignalAnalysis` invocation. Returns ------- @@ -392,7 +369,6 @@ def VialSignalAnalysisBatch( input_image=input_images, template_dir=template_dir, output_base_dir=output_base_dir, - rotation_library_file=rotation_library_file, ) .split("input_image") .combine("input_image"), diff --git a/phantomkit/cli.py b/phantomkit/cli.py index 126a236..b1e2703 100644 --- a/phantomkit/cli.py +++ b/phantomkit/cli.py @@ -124,7 +124,7 @@ def _build_command(slug: str, single_cls, batch_cls) -> click.Command: def _callback(**kwargs): input_val: str = kwargs.pop("input") - plugin: str = kwargs.pop("plugin") + worker: str = kwargs.pop("worker") pattern: str = kwargs.pop("pattern") # Convert click tuples (from multiple=True) to lists wf_kwargs = { @@ -161,7 +161,7 @@ def _callback(**kwargs): from pydra.engine import Submitter - with Submitter(plugin=plugin) as sub: + with Submitter(worker=worker) as sub: sub(wf) logger.info("Done.") @@ -189,11 +189,11 @@ def _callback(**kwargs): # Common options click_params += [ click.Option( - ["--plugin"], + ["--worker"], type=click.Choice(["cf", "serial"]), default="cf", show_default=True, - help="Pydra execution plugin.", + help="Pydra worker type.", ), click.Option( ["--pattern"], @@ -301,5 +301,218 @@ def _register_plot_commands() -> None: _register_plot_commands() -if __name__ == "__main__": - main() +# --------------------------------------------------------------------------- +# View command — NiceGUI MRI viewer +# --------------------------------------------------------------------------- + + +@main.command("view") +@click.argument("nifti_image", metavar="NIFTI") +@click.option( + "--vials", + "vials_dir", + default=None, + metavar="DIR", + help="Directory containing vial ROI NIfTI masks (.nii.gz).", +) +@click.option("--title", default="MRI Viewer", show_default=True) +@click.option( + "--port", default=8080, show_default=True, help="TCP port for the NiceGUI server." +) +def view_mri(nifti_image: str, vials_dir: str | None, title: str, port: int) -> None: + """Launch an interactive MRI viewer for a NIfTI image. + + NIFTI is the path to the background .nii or .nii.gz file. + + Use --vials to specify a directory of vial ROI masks that can be + toggled on/off as overlays. + """ + from phantomkit.plotting.viewer import launch_viewer + + vial_niftis: dict[str, str] = {} + if vials_dir: + vials_path = Path(vials_dir) + for p in sorted(vials_path.glob("*.nii.gz")): + name = p.name.replace(".nii.gz", "").replace(".nii", "") + vial_niftis[name] = str(p) + + launch_viewer( + nifti_image=nifti_image, + vial_niftis=vial_niftis or None, + title=title, + port=port, + ) + + +# --------------------------------------------------------------------------- +# Pipeline command — end-to-end phantom QC + DWI orchestrator +# --------------------------------------------------------------------------- + + +@main.command("pipeline") +@click.option( + "--input-dir", + required=True, + help="Root directory containing acquisition subdirectories (DICOM folders).", +) +@click.option( + "--output-dir", + required=True, + help="Top-level output directory. All results are written here.", +) +@click.option( + "--phantom", + required=True, + help="Phantom name, e.g. SPIRIT. Used to locate template_data//.", +) +@click.option( + "--denoise-degibbs", + is_flag=True, + default=False, + help="Apply dwidenoise + mrdegibbs before preprocessing.", +) +@click.option( + "--gradcheck", + is_flag=True, + default=False, + help="Run dwigradcheck to verify gradient orientations.", +) +@click.option( + "--nocleanup", + is_flag=True, + default=False, + help="Keep DWI tmp/ intermediate directories.", +) +@click.option( + "--readout-time", + type=float, + default=None, + help="Override TotalReadoutTime (seconds) for dwifslpreproc.", +) +@click.option( + "--eddy-options", + type=str, + default=None, + help="Override FSL eddy options string.", +) +@click.option( + "--dry-run", + is_flag=True, + default=False, + help="Plan and print commands; do not execute any processing.", +) +def run_pipeline( + input_dir, + output_dir, + phantom, + denoise_degibbs, + gradcheck, + nocleanup, + readout_time, + eddy_options, + dry_run, +): + """Run the end-to-end phantom QC + DWI processing pipeline. + + Orchestrates DWI preprocessing (Stage 1), phantom QC in DWI space + (Stage 2), and phantom QC on native T1/IR/TE contrasts (Stage 3). + Stages 1 and 3 run in parallel; Stage 2 follows Stage 1. + + INPUT_DIR should contain acquisition subdirectories (DICOM folders). + """ + import sys + from pathlib import Path + from phantomkit.pipeline import ( + scan_input_dir, + validate_inputs, + run_stage1, + run_stage2, + run_stage3, + print_header, + TEMPLATE_DATA_ROOT, + ) + import concurrent.futures + import threading + + # Build a minimal args-like namespace so validate_inputs() can be reused + class _Args: + pass + + _args = _Args() + _args.input_dir = input_dir + _args.output_dir = output_dir + _args.phantom = phantom + + validate_inputs(_args) + + input_path = Path(input_dir).resolve() + output_path = Path(output_dir).resolve() + template_dir = TEMPLATE_DATA_ROOT / phantom + + output_path.mkdir(parents=True, exist_ok=True) + + dwi_cfg = { + "denoise_degibbs": denoise_degibbs, + "gradcheck": gradcheck, + "nocleanup": nocleanup, + "readout_time": readout_time, + "eddy_options": eddy_options, + } + + print_header("Input Directory Scan") + scan_info = scan_input_dir(input_path) + + run_stage1_flag = scan_info["has_dwi"] + run_stage3_flag = bool(scan_info["t1_dirs"]) and ( + scan_info["has_native_contrasts"] or not run_stage1_flag + ) + + _print_lock = threading.Lock() + + def _locked_header(title): + with _print_lock: + print_header(title) + + dwi_output_dirs = [] + stage1_error = stage3_error = None + + def _s1(): + nonlocal dwi_output_dirs, stage1_error + try: + if run_stage1_flag: + dwi_output_dirs[:] = run_stage1( + input_path, output_path, dwi_cfg, dry_run + ) + else: + _locked_header("STAGE 1 — DWI Processing") + print(" Skipped: no DWI acquisitions found.\n") + except Exception as exc: + stage1_error = exc + + def _s3(): + nonlocal stage3_error + try: + if run_stage3_flag: + run_stage3(input_path, output_path, template_dir, scan_info, dry_run) + else: + _locked_header("STAGE 3 — Phantom QC on Native Contrasts") + print(" Skipped.\n") + except Exception as exc: + stage3_error = exc + + with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: + concurrent.futures.wait([executor.submit(_s1), executor.submit(_s3)]) + + if stage1_error: + raise click.ClickException(f"Stage 1 failed: {stage1_error}") + if stage3_error: + raise click.ClickException(f"Stage 3 failed: {stage3_error}") + + if run_stage1_flag: + run_stage2(dwi_output_dirs, output_path, template_dir, dry_run) + else: + print_header("STAGE 2 — Phantom QC in DWI Space") + print(" Skipped: Stage 1 did not run.\n") + + print_header("Pipeline Complete") + print(f" All outputs written to: {output_path}\n") diff --git a/phantomkit/dwi_processing.py b/phantomkit/dwi_processing.py new file mode 100644 index 0000000..cb1e8dd --- /dev/null +++ b/phantomkit/dwi_processing.py @@ -0,0 +1,2146 @@ +#!/usr/bin/env python3 +""" +DWI processing and tensor metrics pipeline (Pydra 0.23+) + +Usage: + python Functions/pydra_dwi_processing.py --config pydra_dwi_processing.yaml + python Functions/pydra_dwi_processing.py --scans-dir /path/to/scans --output-dir /path/to/out [options] + +Options: + --nocleanup Keep the tmp/ intermediate file directory after processing + (default: tmp/ is removed once final outputs are copied) + +Output structure: + / + / + ADC.nii.gz + FA.nii.gz + DWI_preproc_biascorr.mif.gz (or DWI_denoise_gibbs_preproc_biascorr.mif.gz) + T1_in_DWI_space.nii.gz + tmp/ (intermediate files — removed unless --nocleanup) +""" + +import argparse +import json +import os +import re +import shutil +import subprocess +from pathlib import Path + +from pydra.compose import python, workflow +from pydra.engine import Submitter +import yaml + + +# ============================================================================= +# Utility helpers +# ============================================================================= + + +def run_cmd(cmd: list, cwd: str = None): + """Run a shell command, raising on failure.""" + print(f" >> {' '.join(str(c) for c in cmd)}") + subprocess.run([str(c) for c in cmd], check=True, cwd=cwd) + + +def sanitise_name(name: str) -> str: + """Convert a folder name to a valid Python identifier for Pydra task names.""" + return re.sub(r"[^a-zA-Z0-9_]", "_", name) + + +def strip_series_number(name: str) -> str: + """Strip leading series number and SEQ prefix, e.g. '87-SEQ5_ep2d_diff_...' -> 'ep2d_diff_...'""" + name = re.sub(r"^\d+-", "", name) + return re.sub(r"^SEQ\d+_", "", name, flags=re.IGNORECASE) + + +def get_series_number(name: str) -> int: + """Extract leading series number from folder name, e.g. '87-ep2d...' -> 87.""" + m = re.match(r"^(\d+)-", name) + return int(m.group(1)) if m else 0 + + +def common_prefix_len(a: str, b: str) -> int: + i = 0 + while i < len(a) and i < len(b) and a[i] == b[i]: + i += 1 + return i + + +def get_nvols(path: str) -> int: + """Return number of volumes using mrinfo.""" + result = subprocess.run( + ["mrinfo", path, "-ndim"], capture_output=True, text=True, check=True + ) + ndim = int(result.stdout.strip()) + if ndim == 3: + return 1 + result2 = subprocess.run( + ["mrinfo", path, "-size"], capture_output=True, text=True, check=True + ) + return int(result2.stdout.strip().split()[-1]) + + +def read_bvals(bval_path: str) -> list: + """Read bval file and return list of float values. Returns [] if missing/empty.""" + try: + with open(bval_path) as f: + content = f.read().strip() + if not content: + return [] + return [float(v) for v in content.split()] + except Exception: + return [] + + +def has_nonzero_bvals(bval_path: str) -> bool: + """Return True if bval file exists, is non-empty, and contains non-zero values.""" + vals = read_bvals(bval_path) + return bool(vals) and any(v > 10 for v in vals) # threshold >10 to ignore rounding + + +def all_zero_bvals(bval_path: str) -> bool: + """Return True if bval file exists and all values are effectively zero.""" + vals = read_bvals(bval_path) + return bool(vals) and all(v <= 10 for v in vals) + + +def get_readout_time(json_path: str, fallback: float = 0.0342002) -> float: + """Extract TotalReadoutTime from dcm2niix JSON sidecar.""" + try: + with open(json_path) as f: + data = json.load(f) + val = data.get("TotalReadoutTime") + if val is not None: + return float(val) + except Exception: + pass + print(f" Warning: TotalReadoutTime not found in {json_path} -- using {fallback}") + return fallback + + +def get_pe_from_json(json_path: str) -> tuple: + """ + (#9) Fallback: read PhaseEncodingDirection from JSON sidecar and map to + MRtrix3-compatible direction string. + Returns (pe_dir, rpe_dir) or raises ValueError if not found/unrecognised. + """ + mapping = { + "j-": ("AP", "PA"), + "j": ("PA", "AP"), + "i": ("LR", "RL"), + "i-": ("RL", "LR"), + "k": ("SI", "IS"), + "k-": ("IS", "SI"), + } + try: + with open(json_path) as f: + data = json.load(f) + ped = data.get("PhaseEncodingDirection", "").strip() + if ped in mapping: + return mapping[ped] + except Exception: + pass + raise ValueError(f"PhaseEncodingDirection not found or unrecognised in {json_path}") + + +def detect_pe_direction(folder_name: str) -> tuple: + """ + Return (pe_dir, rpe_dir) from a folder name. + Raises ValueError if not found — caller should fall back to get_pe_from_json (#9). + """ + pairs = [ + (r"_AP(_|$)", "AP", "PA"), + (r"_A_P(_|$)", "AP", "PA"), + (r"_PA(_|$)", "PA", "AP"), + (r"_P_A(_|$)", "PA", "AP"), + (r"_LR(_|$)", "LR", "RL"), + (r"_L_R(_|$)", "LR", "RL"), + (r"_RL(_|$)", "RL", "LR"), + (r"_R_L(_|$)", "RL", "LR"), + (r"_SI(_|$)", "SI", "IS"), + (r"_S_I(_|$)", "SI", "IS"), + (r"_IS(_|$)", "IS", "SI"), + (r"_I_S(_|$)", "IS", "SI"), + ] + for pattern, pe, rpe in pairs: + if re.search(pattern, folder_name, re.IGNORECASE): + return pe, rpe + raise ValueError( + f"Could not determine phase encoding direction from folder name: {folder_name}" + ) + + +# ============================================================================= +# Directory scanning constants +# ============================================================================= + +FWD_DIRS = ["AP", "LR", "SI", "A_P", "L_R", "S_I"] +RPE_DIRS = ["PA", "RL", "IS", "P_A", "R_L", "I_S"] +ALL_PE_DIRS = FWD_DIRS + RPE_DIRS + + +def has_terminal_pe(name: str, directions: list) -> bool: + """ + Returns True if a PE direction tag appears as the final token in the folder + name (nothing follows, or only a single short alphanumeric token with no + underscores). This identifies dedicated b0 PE images vs full DWI series. + """ + for d_ in directions: + for pat in [rf"_{d_}$", rf"_{d_}_[A-Za-z0-9]{{1,10}}$"]: + if re.search(pat, name, re.IGNORECASE): + return True + # Underscore-separated variant (e.g. A_P, P_A) + if len(d_) == 3 and d_[1] == "_": + for pat in [ + rf"_{d_[0]}_{d_[2]}$", + rf"_{d_[0]}_{d_[2]}_[A-Za-z0-9]{{1,10}}$", + ]: + if re.search(pat, name, re.IGNORECASE): + return True + return False + + +def get_acq_stem_and_suffix(folder_name: str) -> tuple: + """ + Split acquisition name into (prefix, suffix) around the PE direction tag. + Both must match exactly for two series to be considered valid AP/PA partners + (#14 — prevents pairing of MONO/BIPOLAR variants or different parameters). + + e.g. '12-ep2d_diff__FREE30DIR_b1000_x7b0_Ghost_R_AP_ESpt54_BW2264_BIPOLAR' + -> prefix: 'ep2d_diff__FREE30DIR_b1000_x7b0_Ghost_R' + suffix: 'ESpt54_BW2264_BIPOLAR' + + Returns (full_name_no_series, "", "") if no PE direction tag found. + """ + name = strip_series_number(folder_name) + # Try longer variants first (A_P before AP) to avoid partial matches + all_dirs_ordered = [ + "A_P", + "P_A", + "L_R", + "R_L", + "S_I", + "I_S", + "AP", + "PA", + "LR", + "RL", + "SI", + "IS", + ] + for d in all_dirs_ordered: + m = re.search(rf"_({re.escape(d)})(_|$)", name, re.IGNORECASE) + if m: + prefix = name[: m.start()] + # suffix is everything after the direction tag (and the following _) + suffix_start = m.end() + suffix = name[suffix_start:] if suffix_start < len(name) else "" + return prefix, suffix + return name, "" + + +# ============================================================================= +# DICOM conversion helper (used in planning stage) +# ============================================================================= + + +def _detect_series_format(series_dir: str) -> str: + """Return 'nifti', 'mif', or 'dicom' based on file contents of series_dir.""" + p = Path(series_dir) + if any(p.glob("*.nii.gz")) or any(p.glob("*.nii")): + return "nifti" + if any(p.glob("*.mif.gz")) or any(p.glob("*.mif")): + return "mif" + return "dicom" + + +def convert_series_to_nii(series_dir: str, out_dir: str) -> dict: + """ + Stage a series directory to NIfTI, handling DICOM, NIfTI, and MIF inputs. + Returns dict with paths to: nii, json, bvec, bval (empty string if absent). + """ + fmt = _detect_series_format(series_dir) + os.makedirs(out_dir, exist_ok=True) + + if fmt == "nifti": + niis = sorted(Path(series_dir).glob("*.nii.gz")) + if not niis: + niis = [p for p in sorted(Path(series_dir).glob("*.nii")) + if not p.name.endswith(".nii.gz")] + if not niis: + raise FileNotFoundError(f"No NIfTI files in {series_dir}") + nii_src = niis[0] + base_src = str(nii_src) + for _ext in (".nii.gz", ".nii"): + if base_src.endswith(_ext): + base_src = base_src[: -len(_ext)] + break + if str(nii_src).endswith(".nii.gz"): + dst_nii = str(Path(out_dir) / nii_src.name) + shutil.copy2(nii_src, dst_nii) + else: + dst_nii = str(Path(out_dir) / (nii_src.stem + ".nii.gz")) + subprocess.run( + ["mrconvert", str(nii_src), dst_nii], check=True, capture_output=True + ) + base_dst = dst_nii.replace(".nii.gz", "") + + def _copy_sidecar(ext: str) -> str: + src = base_src + ext + if Path(src).exists(): + dst = base_dst + ext + shutil.copy2(src, dst) + return dst + return "" + + return { + "nii": dst_nii, + "json": _copy_sidecar(".json"), + "bvec": _copy_sidecar(".bvec"), + "bval": _copy_sidecar(".bval"), + } + + if fmt == "mif": + mifs = sorted(Path(series_dir).glob("*.mif.gz")) + sorted( + Path(series_dir).glob("*.mif") + ) + if not mifs: + raise FileNotFoundError(f"No MIF files in {series_dir}") + mif_src = mifs[0] + stem = mif_src.name + for _ext in (".mif.gz", ".mif"): + if stem.endswith(_ext): + stem = stem[: -len(_ext)] + break + nii = str(Path(out_dir) / f"{stem}.nii.gz") + bvec = str(Path(out_dir) / f"{stem}.bvec") + bval = str(Path(out_dir) / f"{stem}.bval") + json_out = str(Path(out_dir) / f"{stem}.json") + subprocess.run( + [ + "mrconvert", str(mif_src), nii, + "-export_grad_fsl", bvec, bval, + "-json_export", json_out, + ], + check=True, + capture_output=True, + ) + return { + "nii": nii, + "json": json_out if Path(json_out).exists() else "", + "bvec": bvec if Path(bvec).exists() else "", + "bval": bval if Path(bval).exists() else "", + } + + # DICOM fallback + subprocess.run( + ["dcm2niix", "-o", out_dir, "-f", "%p", "-z", "y", series_dir], + check=True, + capture_output=True, + ) + niis = sorted(Path(out_dir).glob("*.nii.gz")) + if not niis: + raise FileNotFoundError(f"No NIfTI produced from DICOM: {series_dir}") + nii = str(niis[0]) + base = nii.replace(".nii.gz", "") + return { + "nii": nii, + "json": base + ".json" if Path(base + ".json").exists() else "", + "bvec": base + ".bvec" if Path(base + ".bvec").exists() else "", + "bval": base + ".bval" if Path(base + ".bval").exists() else "", + } + + +# ============================================================================= +# Directory scanning and candidate classification +# ============================================================================= + + +def scan_directory(scans_dir: str) -> dict: + """ + First pass: classify subdirectories into t1_dirs, candidate_dwi (all series + containing _diff_ or _DWI_), and ignored. PE classification is PROVISIONAL + at this stage — final assignment happens after series staging in + classify_candidates(). + """ + scans_path = Path(scans_dir) + t1_dirs = [] + candidate_dwi = [] # all _diff_ / _DWI_ series, including PE images + ignored = [] + + for d in sorted(scans_path.iterdir()): + if not d.is_dir(): + continue + name = d.name + + # T1 + if re.search(r"t1", name, re.IGNORECASE): + t1_dirs.append(str(d)) + continue + + # Skip scanner-derived maps + if re.search(r"_(ADC|FA)$", name, re.IGNORECASE): + ignored.append(str(d)) + continue + + # Only consider DWI-like acquisitions + if not re.search(r"(_diff_|_DWI_)", name, re.IGNORECASE): + ignored.append(str(d)) + continue + + candidate_dwi.append(str(d)) + + if not t1_dirs: + raise ValueError(f"Could not identify any T1 directory in {scans_dir}") + if not candidate_dwi: + raise ValueError(f"Could not identify any DWI directories in {scans_dir}") + + return { + "t1_dirs": t1_dirs, + "candidate_dwi": candidate_dwi, + "ignored": ignored, + } + + +def convert_all_candidates(candidate_dwi: list, output_dir: str) -> dict: + """ + (#18 ordering step 2) Stage all candidate DWI series upfront. + Handles DICOM, NIfTI, and MIF inputs. + Returns a dict: {series_dir: {nii, json, bvec, bval}} + """ + conversions = {} + for series_dir in candidate_dwi: + name = Path(series_dir).name + conv_dir = str(Path(output_dir) / name / "tmp" / "dwi_nii") + fmt = _detect_series_format(series_dir) + print(f" Staging ({fmt}): {name}") + try: + result = convert_series_to_nii(series_dir, conv_dir) + conversions[series_dir] = result + except Exception as e: + print(f" WARNING: Series staging failed for {name}: {e}") + conversions[series_dir] = None + return conversions + + +def classify_candidates(candidate_dwi: list, conversions: dict) -> dict: + """ + (#18) Final classification of candidate DWI series into: + - dwi_dirs: full DWI series eligible for tensor processing (non-zero bvals) + - fwd_pe_dirs: forward PE correction images (all b-values zero) + - rpe_dirs: reverse PE correction images (all b-values zero) + - pending_fwd: series with non-zero bvals and a fwd PE direction tag anywhere + in name — reclassified to dwi_dirs or fwd_pe_dirs after pairing + - pending_rpe: same but reverse PE direction tag + - skipped: list of (path, reason) tuples + + Classification rules (applied in order after DICOM conversion): + 1. No bvec/bval files → skip (#16) + 2. Empty bval file → skip (#16) + 3. All b-values zero → PE correction image candidate, classified by PE + direction tag found ANYWHERE in folder name (direction tag position + does not affect classification — only bval content matters) + 4. Has non-zero b-values AND a PE direction tag → pending (reclassified + after rpe_all pairing check) + 5. Has non-zero b-values, no PE direction tag → dwi_dirs + """ + dwi_dirs = [] + fwd_pe_dirs = [] + rpe_dirs = [] + skipped = [] + pending_fwd = [] # non-zero bvals + fwd PE tag — needs pairing check + pending_rpe = [] # non-zero bvals + rpe PE tag — needs pairing check + + for dicom_dir in candidate_dwi: + name = Path(dicom_dir).name + conv = conversions.get(dicom_dir) + + if conv is None: + skipped.append((dicom_dir, "DICOM conversion failed")) + continue + + bvec = conv["bvec"] + bval = conv["bval"] + + # #16 — check bvec/bval exist and are non-empty + if not bvec or not bval or not Path(bvec).exists() or not Path(bval).exists(): + skipped.append( + (dicom_dir, "no bvec/bval files — not a raw DWI acquisition") + ) + continue + if not read_bvals(bval): + skipped.append((dicom_dir, "empty bval file — not a raw DWI acquisition")) + continue + + is_b0_only = all_zero_bvals(bval) + + # Detect PE direction tag anywhere in the folder name (not just terminal) + has_fwd_tag = any( + re.search(rf"_{re.escape(d)}(_|$)", name, re.IGNORECASE) for d in FWD_DIRS + ) + has_rpe_tag = any( + re.search(rf"_{re.escape(d)}(_|$)", name, re.IGNORECASE) for d in RPE_DIRS + ) + + if is_b0_only: + # All b-values zero: classify as PE correction image by direction tag + if has_fwd_tag: + fwd_pe_dirs.append(dicom_dir) + elif has_rpe_tag: + rpe_dirs.append(dicom_dir) + else: + skipped.append( + ( + dicom_dir, + "all b-values zero and no phase encoding direction in folder name — " + "cannot use for correction", + ) + ) + else: + # Has non-zero b-values: pending if PE tag present, dwi_dirs otherwise + if has_fwd_tag: + pending_fwd.append(dicom_dir) + elif has_rpe_tag: + pending_rpe.append(dicom_dir) + else: + dwi_dirs.append(dicom_dir) + + return { + "dwi_dirs": dwi_dirs, + "fwd_pe_dirs": fwd_pe_dirs, + "rpe_dirs": rpe_dirs, + "pending_fwd": pending_fwd, + "pending_rpe": pending_rpe, + "skipped": skipped, + } + + +# ============================================================================= +# AP/PA pairing +# ============================================================================= + + +def match_ap_pa_pairs( + dwi_dirs: list, pending_fwd: list, pending_rpe: list, conversions: dict +) -> tuple: + """ + (#14, #18) Detect AP/PA (rpe_all/rpe_split) pairs across dwi_dirs, + pending_fwd, and pending_rpe. + + Pairing requires: + - Same acquisition prefix (everything before the PE direction tag) + - Same acquisition suffix (everything after the PE direction tag) — #14 + - Opposing PE directions + + Pending series with non-zero bvals that find a partner are moved to dwi_dirs. + Pending series that find no partner are moved to fwd_pe_dirs / rpe_dirs. + + Returns: + (dwi_dirs, fwd_pe_dirs, rpe_dirs, rpe_all_map, tie_warnings) + rpe_all_map: {fwd_path: rpe_path} + tie_warnings: list of (pe_image_path, [matched_dwi_paths]) for #20 + """ + fwd_set = {"AP", "LR", "SI"} + rpe_set = {"PA", "RL", "IS"} + + # Build stem map over all candidates (dwi + pending) + all_candidates = dwi_dirs + pending_fwd + pending_rpe + stem_map = {} # (prefix, suffix) -> list of (path, pe_dir) + for d in all_candidates: + name = Path(d).name + try: + pe, _ = detect_pe_direction(name) + except ValueError: + pe = None + prefix, suffix = get_acq_stem_and_suffix(name) + key = (prefix, suffix) + stem_map.setdefault(key, []).append((d, pe)) + + rpe_all_map = {} + tie_warnings = [] + paired_paths = set() + + for (prefix, suffix), entries in stem_map.items(): + fwds = [(p, pe) for p, pe in entries if pe in fwd_set] + rpes = [(p, pe) for p, pe in entries if pe in rpe_set] + + if not (fwds and rpes): + continue + + for fwd_path, _ in fwds: + fwd_num = get_series_number(Path(fwd_path).name) + # Find closest RPE by series number + best_rpe_path = min( + rpes, key=lambda x: abs(get_series_number(Path(x[0]).name) - fwd_num) + )[0] + rpe_all_map[fwd_path] = best_rpe_path + paired_paths.add(fwd_path) + paired_paths.add(best_rpe_path) + + # #20 — check for tie (multiple equal-prefix matches) + if len(fwds) > 1 or len(rpes) > 1: + tie_warnings.append((fwd_path, [p for p, _ in rpes])) + + # Move paired pending series into dwi_dirs; unpaired pending into PE dirs + final_dwi = list(dwi_dirs) + final_fwd = list(conversions.get("fwd_pe_dirs", [])) + final_rpe = list(conversions.get("rpe_dirs", [])) + + for p in pending_fwd: + if p in paired_paths: + final_dwi.append(p) + else: + final_fwd.append(p) + + for p in pending_rpe: + if p in paired_paths: + # PA partner of a paired series — recorded in rpe_all_map, not in dwi_dirs + pass + else: + final_rpe.append(p) + + return sorted(final_dwi), final_fwd, final_rpe, rpe_all_map, tie_warnings + + +# ============================================================================= +# T1 and PE assignment helpers +# ============================================================================= + + +def assign_t1(dwi_name: str, t1_dirs: list) -> str: + """ + Assign the nearest preceding T1 by series number. + Falls back to the first T1 if none precedes the DWI. + """ + dwi_num = get_series_number(dwi_name) + best = None + best_num = -1 + for t1 in t1_dirs: + t1_num = get_series_number(Path(t1).name) + if t1_num < dwi_num and t1_num > best_num: + best_num = t1_num + best = t1 + return best if best is not None else t1_dirs[0] + + +def build_pe_assignment_map( + dwi_dirs: list, fwd_pe_dirs: list, rpe_dirs: list, rpe_all_map: dict +) -> dict: + """ + Build a map of {dwi_dir: {"rpe": rpe_dir_or_None, "fwd": fwd_dir_or_None}} + for all DWI series not already in rpe_all_map. + + A single b0 PE correction image is assigned to ALL DWI series sharing the + longest common prefix with it — not just the nearest one. This correctly + handles the case where one b0 image is intended to correct an entire block + of acquisitions that vary only in a trailing parameter (e.g. bandwidth sweep). + + If multiple PE images share the same best prefix length against a DWI block, + the one with the nearest series number to the block is chosen, with a warning. + + Priority: rpe_all (already in rpe_all_map) > rpe_pair > rpe_none. + """ + unpaired = [d for d in dwi_dirs if d not in rpe_all_map] + assignment = {d: {"rpe": None, "fwd": None, "tie_warning": False} for d in unpaired} + + def assign_pe_images(pe_dirs, key): + """ + For each PE image, find all DWI series sharing the longest common prefix. + Assign this PE image to that entire group. + """ + # Build prefix lengths: pe_dir -> {dwi_dir: prefix_len} + pe_scores = {} + for pe_dir in pe_dirs: + pe_stem = strip_series_number(Path(pe_dir).name) + scores = {} + for dwi_dir in unpaired: + dwi_stem = strip_series_number(Path(dwi_dir).name) + scores[dwi_dir] = common_prefix_len(dwi_stem, pe_stem) + pe_scores[pe_dir] = scores + + # For each PE image, identify the group of DWI series with max prefix length + # Only assign if prefix length is meaningful (>10 chars) + pe_groups = {} # pe_dir -> set of dwi_dirs it should serve + for pe_dir, scores in pe_scores.items(): + max_len = max(scores.values()) if scores else 0 + if max_len <= 0: + continue # no common prefix at all — skip + group = {d for d, l in scores.items() if l == max_len} + pe_groups[pe_dir] = group + + # For each DWI series, find which PE image has the best (longest) prefix + # If multiple PE images tie for a DWI series, pick nearest by series number + dwi_to_best_pe = {} + for dwi_dir in unpaired: + candidates = [] + best_len = 0 + for pe_dir, group in pe_groups.items(): + if dwi_dir in group: + pe_stem = strip_series_number(Path(pe_dir).name) + dwi_stem = strip_series_number(Path(dwi_dir).name) + length = common_prefix_len(dwi_stem, pe_stem) + if length > best_len: + best_len = length + candidates = [pe_dir] + elif length == best_len: + candidates.append(pe_dir) + if not candidates: + continue + tie = len(candidates) > 1 + dwi_num = get_series_number(Path(dwi_dir).name) + best_pe = min( + candidates, key=lambda p: abs(get_series_number(Path(p).name) - dwi_num) + ) + dwi_to_best_pe[dwi_dir] = (best_pe, tie) + + # Now assign: use the winning PE image for each DWI, extend to whole group + # Group DWI series that share the same winning PE image + pe_to_dwi_group = {} + for dwi_dir, (pe_dir, tie) in dwi_to_best_pe.items(): + pe_to_dwi_group.setdefault(pe_dir, []).append((dwi_dir, tie)) + + for pe_dir, dwi_list in pe_to_dwi_group.items(): + any_tie = any(tie for _, tie in dwi_list) + for dwi_dir, _ in dwi_list: + if assignment[dwi_dir][key] is None: + assignment[dwi_dir][key] = pe_dir + assignment[dwi_dir]["tie_warning"] = any_tie + + assign_pe_images(rpe_dirs, "rpe") + assign_pe_images(fwd_pe_dirs, "fwd") + + return assignment + + +# ============================================================================= +# PE table header-based mode inference +# ============================================================================= + +# Mapping from (i, j, k) unit vector (rounded) to direction string. +# MRtrix convention: j- = AP, j = PA, i = LR, i- = RL, k = SI, k- = IS +_PETABLE_VEC_TO_DIR = { + (0, 1, 0): "PA", + (0, -1, 0): "AP", + (1, 0, 0): "LR", + (-1, 0, 0): "RL", + (0, 0, 1): "SI", + (0, 0, -1): "IS", +} + + +def _petable_vec_to_dir(vec: tuple) -> str: + """ + Map a (i, j, k) unit vector from mrinfo -petable to a direction string. + Returns 'UNKNOWN' if the vector doesn't match any known direction. + """ + rounded = tuple(round(float(v)) for v in vec) + return _PETABLE_VEC_TO_DIR.get(rounded, f"UNKNOWN{rounded}") + + +def get_petable_mode( + nii: str, bvec: str, bval: str, json_path: str, tmp_dir: str, has_rpe: bool +) -> tuple: + """ + Infer the preproc mode for a DWI series by reading the phase encoding table + embedded in the MIF header produced by mrconvert. + + Steps: + 1. mrconvert NIfTI+bvec+bval+JSON → temporary MIF + 2. mrinfo -petable on the MIF + 3. Parse rows to extract PE directions per volume + 4. Apply mode inference rules: + - All same direction, no RPE available → rpe_none + - All same direction, RPE available → rpe_pair + - Mixed directions, equal counts → rpe_all + - Mixed directions, unequal counts → rpe_split + + Returns: + (mode, directions_found, petable_rows) + mode: one of 'rpe_none', 'rpe_pair', 'rpe_all', 'rpe_split' + directions_found: list of direction strings per volume (e.g. ['AP','AP','PA']) + petable_rows: raw petable as list of lists (for diagnostics) + + Raises RuntimeError if mrconvert or mrinfo fails. + """ + os.makedirs(tmp_dir, exist_ok=True) + tmp_mif = str(Path(tmp_dir) / "petable_check.mif") + + # Build mrconvert command — include JSON sidecar if available (embeds PE info) + cmd = ["mrconvert", nii, tmp_mif, "-fslgrad", bvec, bval, "-force", "-quiet"] + if json_path and Path(json_path).exists(): + cmd += ["-json_import", json_path] + + try: + subprocess.run( + [str(c) for c in cmd], check=True, capture_output=True, text=True + ) + except subprocess.CalledProcessError as e: + raise RuntimeError(f"mrconvert failed during petable check: {e.stderr.strip()}") + + # Read petable — columns: i j k readout_time (one row per volume) + try: + result = subprocess.run( + ["mrinfo", tmp_mif, "-petable"], capture_output=True, text=True, check=True + ) + except subprocess.CalledProcessError as e: + raise RuntimeError(f"mrinfo -petable failed: {e.stderr.strip()}") + finally: + # Always clean up the temporary MIF + try: + Path(tmp_mif).unlink(missing_ok=True) + except Exception: + pass + + raw = result.stdout.strip() + if not raw: + raise RuntimeError( + "mrinfo -petable returned no output — PE information " + "may not be embedded in this image." + ) + + petable_rows = [] + directions = [] + for line in raw.splitlines(): + parts = line.split() + if len(parts) < 3: + continue + vec = (parts[0], parts[1], parts[2]) + petable_rows.append(parts) + directions.append(_petable_vec_to_dir(vec)) + + if not directions: + raise RuntimeError("Could not parse any rows from mrinfo -petable output.") + + unique_dirs = set(directions) + + if len(unique_dirs) == 1: + # All volumes have the same PE direction + mode = "rpe_pair" if has_rpe else "rpe_none" + else: + # Mixed PE directions in a single series + counts = {d: directions.count(d) for d in unique_dirs} + if len(set(counts.values())) == 1: + mode = "rpe_all" # equal counts + else: + mode = "rpe_split" # unequal counts + + return mode, directions, petable_rows + + +# ============================================================================= +# Plan construction +# ============================================================================= + + +def resolve_pe_direction(dwi_name: str, dwi_json: str) -> tuple: + """ + (#9) Try to determine PE direction from folder name first. + Fall back to JSON sidecar if not found. Returns (pe_dir, rpe_dir, source) + where source is 'folder_name' or 'json_sidecar'. + Raises ValueError if neither source yields a direction. + """ + try: + pe_dir, rpe_dir = detect_pe_direction(dwi_name) + return pe_dir, rpe_dir, "folder_name" + except ValueError: + pass + + if dwi_json and Path(dwi_json).exists(): + try: + pe_dir, rpe_dir = get_pe_from_json(dwi_json) + return pe_dir, rpe_dir, "json_sidecar" + except ValueError: + pass + + raise ValueError( + f"Could not determine phase encoding direction for {dwi_name} " + f"from folder name or JSON sidecar." + ) + + +def plan_workflow( + dwi_dir: str, + t1_dirs: list, + fwd_pe_dirs: list, + rpe_dirs: list, + rpe_all_map: dict, + pe_assignment_map: dict, + conversions: dict, + cfg: dict, +) -> dict: + """ + Build a complete plan dict for a single DWI series. + All DICOM conversion has already been done — we use results from conversions. + PE correction image assignments come from pe_assignment_map (pre-built so that + one b0 image can be shared across a whole block of DWI series). + """ + dwi_name = Path(dwi_dir).name + conv = conversions[dwi_dir] + dwi_nii = conv["nii"] + dwi_json = conv["json"] + dwi_bvec = conv["bvec"] + dwi_bval = conv["bval"] + dwi_nvols = get_nvols(dwi_nii) + + out_dir = str(Path(cfg["output_dir"]) / dwi_name) + tmp_dir = str(Path(out_dir) / "tmp") + os.makedirs(tmp_dir, exist_ok=True) + + # T1 assignment + t1_dir = assign_t1(dwi_name, t1_dirs) + + # PE direction (#9) + warnings = [] + try: + pe_dir, rpe_dir, pe_source = resolve_pe_direction(dwi_name, dwi_json) + except ValueError as e: + raise ValueError(str(e)) + + if pe_source == "json_sidecar": + warnings.append( + f"Phase encoding direction ({pe_dir}) inferred from JSON sidecar " + f"— not found in folder name. Please verify." + ) + + # RPE assignment — priority: rpe_all > rpe_pair > rpe_none + rpe_all_partner = rpe_all_map.get(dwi_dir) + + rpe_nii = None + rpe_nvols = 0 + fwd_pe_nii = None + fwd_pe_dir_used = None + rpe_dir_path = None + + if rpe_all_partner: + # rpe_all: full-volume PA partner — most preferred + rpe_dir_path = rpe_all_partner + rpe_conv = conversions.get(rpe_all_partner) + if rpe_conv: + rpe_nii = rpe_conv["nii"] + rpe_nvols = get_nvols(rpe_nii) + + if rpe_nvols == dwi_nvols: + warnings.append( + f"{dwi_name} and {Path(rpe_all_partner).name} have equal volumes " + f"({dwi_nvols}). Assuming rpe_all (full repeats). If directions are " + f"split across PE directions, set mode: rpe_split in config YAML." + ) + fwd_pe_dir_used = None # b0 PE images not needed for rpe_all + + else: + # Use pe_assignment_map for b0 PE correction (rpe_pair) + assignment = pe_assignment_map.get(dwi_dir, {}) + rpe_dir_path = assignment.get("rpe") + fwd_pe_dir_used = assignment.get("fwd") + tie_warning = assignment.get("tie_warning", False) + + # #20 — tie warning + if tie_warning: + warnings.append( + f"PE correction image matched equally to multiple DWI series. " + f"Assigned by nearest series number. If incorrect, consider adding " + f"a distinguishing suffix (e.g. _repeat) to the second acquisition " + f"block and its correction pair." + ) + + # Ensure RPE conversion is available + if rpe_dir_path: + rpe_conv = conversions.get(rpe_dir_path) + if rpe_conv is None: + rpe_conv_dir = str(Path(tmp_dir) / "rpe_nii") + rpe_conv = convert_series_to_nii(rpe_dir_path, rpe_conv_dir) + conversions[rpe_dir_path] = rpe_conv + rpe_nii = rpe_conv["nii"] + rpe_nvols = get_nvols(rpe_nii) + + # Ensure FWD PE conversion is available + if fwd_pe_dir_used: + fwd_conv = conversions.get(fwd_pe_dir_used) + if fwd_conv is None: + fwd_conv_dir = str(Path(tmp_dir) / "fwd_pe_nii") + fwd_conv = convert_series_to_nii(fwd_pe_dir_used, fwd_conv_dir) + conversions[fwd_pe_dir_used] = fwd_conv + fwd_pe_nii = fwd_conv["nii"] + + # #17 — orphaned RPE handling (no forward PE partner) + if rpe_dir_path and not fwd_pe_dir_used: + if rpe_nvols == 1: + warnings.append( + f"{Path(rpe_dir_path).name} has no matching forward PE image. " + f"Will use mean b0 from main DWI as forward PE image (rpe_pair)." + ) + elif rpe_nvols > 1: + warnings.append( + f"{Path(rpe_dir_path).name} has no matching forward PE image " + f"and RPE has multiple volumes. Cannot use for correction. " + f"Falling back to rpe_none." + ) + rpe_dir_path = None + rpe_nii = None + rpe_nvols = 0 + + # Determine preproc mode + if rpe_nii is None: + preproc_mode = "rpe_none" + elif rpe_nvols == dwi_nvols: + preproc_mode = "rpe_all" + elif rpe_nvols > 1 and fwd_pe_nii is not None: + preproc_mode = "rpe_split" + else: + preproc_mode = "rpe_pair" + + # ── Header-based mode sanity check ────────────────────────────────────── + # Run mrconvert + mrinfo -petable on the main DWI (and RPE if present) to + # derive the mode independently from the MIF header PE table. If the result + # disagrees with the filename-derived mode, warn and override. + # + # For rpe_all: the check requires a concatenated AP+PA MIF which does not + # exist at planning time. We skip the header check for rpe_all and note it. + petable_tmp = str(Path(tmp_dir) / "petable_check") + if preproc_mode == "rpe_all": + notes_petable = ( + "Header PE check: skipped for rpe_all " + "(requires concatenated AP+PA MIF — verified during processing)" + ) + else: + try: + header_mode, header_dirs, _ = get_petable_mode( + nii=dwi_nii, + bvec=dwi_bvec, + bval=dwi_bval, + json_path=dwi_json, + tmp_dir=petable_tmp, + has_rpe=rpe_nii is not None, + ) + + # Also check RPE series if present + rpe_header_mode = None + if rpe_nii: + rpe_conv_for_check = conversions.get(rpe_dir_path, {}) + try: + rpe_header_mode, _, _ = get_petable_mode( + nii=rpe_nii, + bvec=rpe_conv_for_check.get("bvec", ""), + bval=rpe_conv_for_check.get("bval", ""), + json_path=rpe_conv_for_check.get("json", ""), + tmp_dir=petable_tmp + "_rpe", + has_rpe=False, # checking the RPE series itself in isolation + ) + except RuntimeError as e: + warnings.append( + f"Header check on RPE series could not be completed: {e} " + f"— RPE series assignment retained." + ) + + if header_mode != preproc_mode: + warnings.append( + f"Preproc mode mismatch — filename-derived: {preproc_mode}, " + f"header-derived: {header_mode}. " + f"Overriding with header-derived mode. " + f"PE directions found in header: {sorted(set(header_dirs))}. " + f"Please verify series naming and acquisition protocol." + ) + preproc_mode = header_mode + + notes_petable = ( + f"Header PE check: {header_mode} " + f"(directions: {', '.join(sorted(set(header_dirs)))})" + ) + if rpe_header_mode: + notes_petable += f"; RPE header: {rpe_header_mode}" + + except RuntimeError as e: + warnings.append( + f"Header-based PE mode check could not be completed: {e} " + f"— falling back to filename-derived mode ({preproc_mode})." + ) + notes_petable = "Header PE check: unavailable" + + # #21 — note unused PE images when rpe_all is used + notes = [notes_petable] + if rpe_all_partner: + unused = [d for d in fwd_pe_dirs + rpe_dirs if d != rpe_all_partner] + for d in unused: + notes.append(f"{Path(d).name} — not used (DWI series has rpe_all partner)") + + # Resolve readout time + readout_time_override = cfg.get("readout_time", None) + if readout_time_override is not None: + readout_time = float(readout_time_override) + readout_time_source = "config override" + elif dwi_json and Path(dwi_json).exists(): + readout_time = get_readout_time(dwi_json) + readout_time_source = f"JSON ({Path(dwi_json).name})" + else: + readout_time = 0.0342002 + readout_time_source = "fallback (no JSON found)" + + do_denoise = cfg.get("denoise_degibbs", False) + do_gradcheck = cfg.get("gradcheck", False) + eddy_options = cfg.get("eddy_options", " --slm=linear") + keep_tmp = cfg.get("keep_tmp", False) + + dwi_preproc_name = ( + "DWI_denoise_gibbs_preproc_biascorr.mif.gz" + if do_denoise + else "DWI_preproc_biascorr.mif.gz" + ) + + # T1 output filename depends on whether registration was performed. + t1_output_name = "T1_in_DWI_space.nii.gz" + + rpe_conv = conversions.get(rpe_dir_path) if rpe_dir_path else None + fwd_conv = conversions.get(fwd_pe_dir_used) if fwd_pe_dir_used else None + + return { + "dwi_name": dwi_name, + "dwi_dir": dwi_dir, + "t1_dir": t1_dir, + "fwd_pe_dir": fwd_pe_dir_used, + "rpe_dir_path": rpe_dir_path, + "pe_dir": pe_dir, + "rpe_dir": rpe_dir, + "pe_source": pe_source, + "dwi_nii": dwi_nii, + "dwi_json": dwi_json, + "dwi_bvec": dwi_bvec, + "dwi_bval": dwi_bval, + "dwi_nvols": dwi_nvols, + "rpe_nii": rpe_nii, + "rpe_json": rpe_conv["json"] if rpe_conv else "", + "rpe_bvec": rpe_conv["bvec"] if rpe_conv else "", + "rpe_bval": rpe_conv["bval"] if rpe_conv else "", + "rpe_nvols": rpe_nvols, + "fwd_pe_nii": fwd_pe_nii, + "fwd_pe_json": fwd_conv["json"] if fwd_conv else "", + "fwd_pe_bvec": fwd_conv["bvec"] if fwd_conv else "", + "fwd_pe_bval": fwd_conv["bval"] if fwd_conv else "", + "preproc_mode": preproc_mode, + "readout_time": readout_time, + "readout_time_src": readout_time_source, + "do_denoise": do_denoise, + "do_gradcheck": do_gradcheck, + "eddy_options": eddy_options, + "keep_tmp": keep_tmp, + "dwi_preproc_name": dwi_preproc_name, + "t1_output_name": t1_output_name, + "out_dir": out_dir, + "tmp_dir": tmp_dir, + "warnings": warnings, + "notes": notes, + } + + +def print_plan(plans: list, skipped: list): + """Print workflow summary including all warnings and notes.""" + print("\n" + "=" * 70) + print("WORKFLOW PLAN") + print("=" * 70) + + if skipped: + print("\nSKIPPED SERIES:") + for path, reason in skipped: + print(f" SKIPPED: {Path(path).name}") + print(f" ({reason})") + + for p in plans: + rpe_name = Path(p["rpe_dir_path"]).name if p["rpe_dir_path"] else "not found" + fwd_name = Path(p["fwd_pe_dir"]).name if p["fwd_pe_dir"] else "not used" + + print(f"\nDWI series: {p['dwi_name']}") + print(f" T1: {Path(p['t1_dir']).name}") + + if p["preproc_mode"] == "rpe_all": + print(f" AP/PA pair: {p['dwi_name']} ({p['dwi_nvols']} vols)") + print(f" {rpe_name} ({p['rpe_nvols']} vols)") + print(f" Forward PE b0: not used (rpe_all)") + print(f" Reverse PE b0: not used (rpe_all)") + else: + print(f" Forward PE: {fwd_name}") + print(f" Reverse PE: {rpe_name}") + print(f" DWI volumes: {p['dwi_nvols']}") + print(f" RPE volumes: {p['rpe_nvols']}") + + pe_str = p["pe_dir"] + if p["pe_source"] == "json_sidecar": + pe_str += ( + " (WARNING: inferred from JSON sidecar — not found in folder name)" + ) + print(f" PE direction: {pe_str}") + print(f" Preproc mode: {p['preproc_mode']}") + print(f" Readout time: {p['readout_time']} ({p['readout_time_src']})") + print(f" Denoise/Gibbs: {p['do_denoise']}") + print(f" Gradcheck: {p['do_gradcheck']}") + + if p["do_gradcheck"]: + targets = [f"DWI ({p['pe_dir']})"] + if p["preproc_mode"] == "rpe_all": + targets.append(f"DWI ({p['rpe_dir']})") + elif p["fwd_pe_nii"]: + targets.append("Forward PE b0") + if p["rpe_nii"] and p["preproc_mode"] != "rpe_all": + targets.append("Reverse PE b0") + print(f" Gradcheck on: {', '.join(targets)}") + + if p["do_denoise"] and p["preproc_mode"] == "rpe_all": + print( + f" Denoise on: DWI ({p['pe_dir']}) and DWI ({p['rpe_dir']}) separately" + ) + + print(f" Output: {p['out_dir']}") + + if p["preproc_mode"] == "rpe_none": + print( + f" NOTE: preproc_mode is rpe_none — no distortion correction applied.\n" + f" B0-to-T1 co-registration will still be performed, but EPI\n" + f" distortion may reduce registration accuracy.\n" + f" Consider acquiring a reverse PE image for optimal results." + ) + + for w in p["warnings"]: + print(f" WARNING: {w}") + for n in p["notes"]: + print(f" NOTE: {n}") + + print("\n" + "=" * 70) + print("Proceed? (Ctrl+C to abort)") + print("=" * 70 + "\n") + + +# ============================================================================= +# Pydra tasks +# ============================================================================= + + +@python.define(outputs=["nii", "json_file", "bvec", "bval", "sentinel"]) +def stage_series(series_dir: str, out_dir: str) -> tuple[str, str, str, str, str]: + """Stage a series (DICOM/NIfTI/MIF) to NIfTI. Returns NIfTI + sidecar paths.""" + result = convert_series_to_nii(series_dir, out_dir) + return ( + result["nii"], + result.get("json", ""), + result.get("bvec", ""), + result.get("bval", ""), + result["nii"], # sentinel: forces true lazy dependency in downstream tasks + ) + + +@python.define +def convert_to_mif_initial( + nii: str, json_file: str, bvec: str, bval: str, out_path: str +) -> str: + """Step 1 of gradcheck: mrconvert NIfTI -> MIF with original gradients embedded.""" + run_cmd( + ["mrconvert", nii, out_path, "-json_import", json_file, "-fslgrad", bvec, bval] + ) + return out_path + + +@python.define(outputs=["bvec", "bval"]) +def run_gradcheck(mif_path: str, out_dir: str, prefix: str) -> tuple[str, str]: + """Run dwigradcheck on a MIF, export corrected bvec/bval.""" + out_bvec = str(Path(out_dir) / f"{prefix}_corrected.bvec") + out_bval = str(Path(out_dir) / f"{prefix}_corrected.bval") + run_cmd(["dwigradcheck", mif_path, "-export_grad_fsl", out_bvec, out_bval]) + return (out_bvec, out_bval) + + +@python.define +def convert_to_mif_final( + nii: str, + json_file: str, + bvec: str, + bval: str, + out_path: str, + sentinel: str = "", +) -> str: + """mrconvert NIfTI -> MIF with (optionally corrected) gradients.""" + run_cmd( + ["mrconvert", nii, out_path, "-json_import", json_file, "-fslgrad", bvec, bval] + ) + result = subprocess.run( + ["mrinfo", out_path, "-petable"], capture_output=True, text=True + ) + if not result.stdout.strip(): + print(f" Warning: PE table not found in MIF header: {out_path}") + return out_path + + +@python.define +def run_dwidenoise(in_mif: str, out_mif: str) -> str: + run_cmd(["dwidenoise", in_mif, out_mif]) + return out_mif + + +@python.define +def run_mrdegibbs(in_mif: str, out_mif: str) -> str: + run_cmd(["mrdegibbs", in_mif, out_mif]) + return out_mif + + +@python.define +def concatenate_ap_pa(ap_mif: str, pa_mif: str, out_mif: str) -> str: + """Concatenate AP and PA DWI series (AP first) for rpe_all.""" + run_cmd(["dwicat", ap_mif, pa_mif, out_mif]) + return out_mif + + +@python.define +def build_se_epi( + dwi_mif: str, + rpe_nii: str, + rpe_json: str, + rpe_bvec: str, + rpe_bval: str, + fwd_pe_nii: str, + fwd_pe_json: str, + fwd_pe_bvec: str, + fwd_pe_bval: str, + pe_dir: str, + rpe_dir: str, + preproc_mode: str, + tmp_dir: str, +) -> str: + """Build se_epi pair for rpe_pair / rpe_split. Returns bzero_pair path.""" + if preproc_mode not in ("rpe_pair", "rpe_split"): + return "" + + rpe_mif = str(Path(tmp_dir) / f"DWI_ref_{rpe_dir}.mif.gz") + run_cmd( + [ + "mrconvert", + rpe_nii, + rpe_mif, + "-json_import", + rpe_json, + "-fslgrad", + rpe_bvec, + rpe_bval, + ] + ) + + if fwd_pe_nii: + fwd_mif = str(Path(tmp_dir) / f"DWI_ref_{pe_dir}.mif.gz") + run_cmd( + [ + "mrconvert", + fwd_pe_nii, + fwd_mif, + "-json_import", + fwd_pe_json, + "-fslgrad", + fwd_pe_bvec, + fwd_pe_bval, + ] + ) + else: + # #17 — use mean b0 from main DWI as forward PE + print(" No forward PE image — computing mean b0 from DWI...") + mean_b0 = str(Path(tmp_dir) / f"mean_bzero_{pe_dir}.mif.gz") + extract = subprocess.Popen( + ["dwiextract", dwi_mif, "-", "-bzero"], stdout=subprocess.PIPE + ) + subprocess.run( + ["mrmath", "-", "mean", mean_b0, "-axis", "3"], + stdin=extract.stdout, + check=True, + ) + extract.stdout.close() + extract.wait() + fwd_mif = mean_b0 + + bzero_pair = str(Path(tmp_dir) / "bzero_pair.mif.gz") + run_cmd(["dwicat", fwd_mif, rpe_mif, bzero_pair]) + return bzero_pair + + +@python.define +def run_dwifslpreproc( + dwi_mif: str, + out_mif: str, + pe_dir: str, + preproc_mode: str, + se_epi: str, + readout_time: float, + eddy_options: str, + scratch_dir: str = "", +) -> str: + scratch_dir = scratch_dir or str(Path(out_mif).parent / "dwifslpreproc_scratch") + cmd = [ + "dwifslpreproc", + dwi_mif, + out_mif, + "-pe_dir", + pe_dir, + f"-{preproc_mode}", + "-eddy_options", + eddy_options, + "-scratch", + scratch_dir, + "-nocleanup", + ] + if preproc_mode in ("rpe_pair", "rpe_split"): + cmd += ["-se_epi", se_epi, "-readout_time", str(readout_time), "-align_seepi"] + elif preproc_mode == "rpe_all": + cmd += ["-readout_time", str(readout_time)] + run_cmd(cmd) + # Clean up scratch after successful completion (dwifslpreproc -nocleanup keeps it) + import shutil as _shutil + + if Path(scratch_dir).exists(): + _shutil.rmtree(scratch_dir) + return out_mif + + +@python.define +def run_dwi2mask(in_mif: str, out_mif: str) -> str: + run_cmd(["dwi2mask", in_mif, out_mif]) + return out_mif + + +@python.define +def run_dwibiascorrect(in_mif: str, out_mif: str, mask_mif: str, bias_mif: str) -> str: + run_cmd( + [ + "dwibiascorrect", + "ants", + in_mif, + out_mif, + "-mask", + mask_mif, + "-bias", + bias_mif, + ] + ) + return out_mif + + +@python.define +def extract_mean_b0(dwi_biascorr_mif: str, out_nii: str) -> str: + extract = subprocess.Popen( + ["dwiextract", dwi_biascorr_mif, "-", "-bzero"], stdout=subprocess.PIPE + ) + subprocess.run( + ["mrmath", "-", "mean", out_nii, "-axis", "3"], stdin=extract.stdout, check=True + ) + extract.stdout.close() + extract.wait() + return out_nii + + +@python.define +def register_b0_to_t1(b0_nii: str, t1_nii: str, out_b0_in_t1: str, out_mat: str) -> str: + run_cmd( + [ + "flirt", + "-in", + b0_nii, + "-ref", + t1_nii, + "-out", + out_b0_in_t1, + "-omat", + out_mat, + "-dof", + "6", + ] + ) + return out_mat + + +@python.define(outputs=["t1_in_dwi", "mrtrix_xfm"]) +def invert_and_apply_transform( + b02t1_mat: str, t1_nii: str, b0_nii: str, tmp_dir: str +) -> tuple[str, str]: + t12b0_mat = str(Path(tmp_dir) / "T12b0.mat") + t1_in_dwi = str(Path(tmp_dir) / "T1_in_DWI_space.nii.gz") + mrtrix_txt = str(Path(tmp_dir) / "struct2diff_mrtrix.txt") + run_cmd(["convert_xfm", "-omat", t12b0_mat, "-inverse", b02t1_mat]) + run_cmd( + [ + "flirt", + "-in", + t1_nii, + "-ref", + b0_nii, + "-out", + t1_in_dwi, + "-init", + t12b0_mat, + "-applyxfm", + ] + ) + run_cmd(["transformconvert", t12b0_mat, t1_nii, b0_nii, "flirt_import", mrtrix_txt]) + return (t1_in_dwi, mrtrix_txt) + + +@python.define +def copy_t1_as_dwi_space(t1_nii: str, tmp_dir: str) -> str: + """ + rpe_none fallback: copy the T1 directly to + T1_in_DWI_space.nii.gz without performing any registration. + + B0-to-T1 co-registration is unreliable when no distortion correction + is applied (rpe_none), so the native T1 is used as-is. Stage 2 of the + orchestrator (phantom QC in DWI space) will therefore operate on the + native T1 geometry rather than a registered approximation. + """ + + t1_out = str(Path(tmp_dir) / "T1.nii.gz") + shutil.copy2(t1_nii, t1_out) + print(f" Copied T1 (no registration): {Path(t1_out).name}") + return t1_out + + +@python.define(outputs=["adc", "fa"]) +def compute_tensor_metrics(dwi_biascorr_mif: str, tmp_dir: str) -> tuple[str, str]: + tensor_mif = str(Path(tmp_dir) / "tensor.mif.gz") + adc_mif = str(Path(tmp_dir) / "ADC.mif.gz") + fa_mif = str(Path(tmp_dir) / "FA.mif.gz") + adc_nii = str(Path(tmp_dir) / "ADC.nii.gz") + fa_nii = str(Path(tmp_dir) / "FA.nii.gz") + run_cmd(["dwi2tensor", dwi_biascorr_mif, tensor_mif]) + run_cmd(["tensor2metric", "-adc", adc_mif, "-fa", fa_mif, tensor_mif]) + run_cmd(["mrconvert", adc_mif, adc_nii]) + run_cmd(["mrconvert", fa_mif, fa_nii]) + return (adc_nii, fa_nii) + + +@python.define(outputs=["out"]) +def copy_final_outputs_task( + dwi_biascorr_mif: str, + t1_in_dwi: str, + adc_nii: str, + fa_nii: str, + out_dir: str, + dwi_preproc_name: str, + t1_output_name: str, +): + os.makedirs(out_dir, exist_ok=True) + dst_dwi = str(Path(out_dir) / dwi_preproc_name) + dst_t1 = str(Path(out_dir) / t1_output_name) + dst_adc = str(Path(out_dir) / "ADC.nii.gz") + dst_fa = str(Path(out_dir) / "FA.nii.gz") + for src, dst in [ + (dwi_biascorr_mif, dst_dwi), + (t1_in_dwi, dst_t1), + (adc_nii, dst_adc), + (fa_nii, dst_fa), + ]: + shutil.copy2(src, dst) + print(f" Copied: {Path(dst).name}") + return dst_dwi # sentinel: used by cleanup ordering + + +def cleanup_tmp(sentinel: str, tmp_dir: str, keep_tmp: bool) -> str: + """ + Remove the tmp directory after all outputs have been copied. + Skipped if keep_tmp is True (--nocleanup flag). + sentinel: any upstream output — used only to enforce task ordering. + """ + if keep_tmp: + print(f" --nocleanup set: retaining {tmp_dir}") + return tmp_dir + if Path(tmp_dir).exists(): + shutil.rmtree(tmp_dir) + print(f" Removed tmp directory: {tmp_dir}") + return tmp_dir + + +# ============================================================================= +# Per-DWI workflow builder +# ============================================================================= + + +def _exists(*paths) -> bool: + """Return True only if every path exists on disk.""" + return all(Path(p).exists() for p in paths) + + +def build_dwi_workflow(plan: dict): + """ + Build and execute a pydra 1.0 workflow for a single DWI series. + + Design decisions: + - cache_root is set per-series to /.pydra_cache — isolated, + avoids cross-series contamination. + - rerun=True ensures pydra re-executes rather than replaying stale cache. + - Conditional branching (preproc_mode, do_denoise, do_gradcheck) is + resolved at workflow-class-definition time using concrete plan values + captured in the closure. Each unique combination gets a distinctly-named + class so pydra's cache correctly distinguishes them. + - stage_series returns a sentinel output (=nii) so downstream tasks that + need T1-before-DWI ordering have a true lazy dependency edge, not a + resolved string literal that pydra treats as a known constant. + - CP1 (all final outputs exist) is checked before building the workflow — + fast early-return with no pydra overhead. + - cleanup_tmp runs as plain Python after sub() returns, guaranteeing it + only executes after all outputs are confirmed copied. + """ + tmp_dir = plan["tmp_dir"] + out_dir = plan["out_dir"] + pe_dir = plan["pe_dir"] + rpe_dir = plan["rpe_dir"] + preproc_mode = plan["preproc_mode"] + do_denoise = plan["do_denoise"] + do_gradcheck = plan["do_gradcheck"] + readout_time = plan["readout_time"] + eddy_options = plan["eddy_options"] + keep_tmp = plan["keep_tmp"] + dwi_preproc_name = plan["dwi_preproc_name"] + t1_output_name = plan["t1_output_name"] + t1_dir = plan["t1_dir"] + dwi_nii = plan["dwi_nii"] + dwi_json = plan["dwi_json"] + dwi_bvec = plan["dwi_bvec"] + dwi_bval = plan["dwi_bval"] + rpe_nii = plan["rpe_nii"] + rpe_json = plan["rpe_json"] + rpe_bvec = plan["rpe_bvec"] + rpe_bval = plan["rpe_bval"] + fwd_pe_nii = plan["fwd_pe_nii"] + fwd_pe_json = plan["fwd_pe_json"] + fwd_pe_bvec = plan["fwd_pe_bvec"] + fwd_pe_bval = plan["fwd_pe_bval"] + + t1_conv_dir = str(Path(tmp_dir) / "t1_nii") + dwi_raw_mif = str(Path(tmp_dir) / f"DWI_raw_{pe_dir}.mif.gz") + preproc_mif = str(Path(tmp_dir) / "DWI_preproc.mif.gz") + biascorr_mif = str(Path(tmp_dir) / dwi_preproc_name) + t1_in_dwi = str(Path(tmp_dir) / t1_output_name) + + out_dwi = str(Path(out_dir) / dwi_preproc_name) + out_adc = str(Path(out_dir) / "ADC.nii.gz") + out_fa = str(Path(out_dir) / "FA.nii.gz") + out_t1 = str(Path(out_dir) / t1_output_name) + + # ── CP1: all final outputs exist — nothing to do ───────────────────────── + if _exists(out_dwi, out_adc, out_fa, out_t1): + print(f" [skip] All outputs already exist in {Path(out_dir).name}") + return + + # ── CP2: bias-corrected MIF exists in out_dir — skip DWI preprocessing ─── + # dwifslpreproc + dwibiascorrect are by far the most expensive steps. + # If the bias-corrected MIF already exists in out_dir (e.g. from a prior + # successful run where only downstream steps failed), copy it into tmp/ so + # the pydra workflow can use it directly and skip straight to coregistration + # and tensor metrics. + skip_preproc = _exists(out_dwi) + if skip_preproc: + print(f" [skip] DWI preprocessing already done: {Path(out_dwi).name}") + os.makedirs(tmp_dir, exist_ok=True) + if not _exists(biascorr_mif): + shutil.copy2(out_dwi, biascorr_mif) + + # ── Workflow class name encodes the branch combination ──────────────────── + # Each unique combination gets a distinct class name so pydra caches them + # independently. skip_preproc adds an extra tag to distinguish the two paths. + dn_tag = "dn" if do_denoise else "nodn" + gc_tag = "gc" if do_gradcheck else "nogc" + sp_tag = "skippreproc" if skip_preproc else "fullpreproc" + wf_class_name = f"DwiWf_{preproc_mode}_{dn_tag}_{gc_tag}_{sp_tag}" + + if skip_preproc: + # ── Reduced workflow: T1 conversion + registration + tensor + copy ─── + # biascorr_mif is already in tmp/ (copied from out_dir above). + @workflow.define(outputs=["result"]) + def DwiWf(x: int) -> str: + + # T1 series staging (always needed for registration) + conv_t1 = workflow.add( + stage_series(series_dir=t1_dir, out_dir=t1_conv_dir), + name="convert_t1", + ) + + # ── T1-to-DWI registration ──────────────────────────────────────── + b0 = workflow.add( + extract_mean_b0( + dwi_biascorr_mif=biascorr_mif, + out_nii=str(Path(tmp_dir) / "bzero_f.nii.gz"), + ), + name="mean_b0", + ) + flirt = workflow.add( + register_b0_to_t1( + b0_nii=b0.out, + t1_nii=conv_t1.nii, + out_b0_in_t1=str(Path(tmp_dir) / "b0_to_T1.nii.gz"), + out_mat=str(Path(tmp_dir) / "b02T1.mat"), + ), + name="register", + ) + xfm = workflow.add( + invert_and_apply_transform( + b02t1_mat=flirt.out, + t1_nii=conv_t1.nii, + b0_nii=b0.out, + tmp_dir=tmp_dir, + ), + name="invert_xfm", + ) + t1_result = xfm.t1_in_dwi + + # ── Tensor metrics ──────────────────────────────────────────────── + tensor = workflow.add( + compute_tensor_metrics( + dwi_biascorr_mif=biascorr_mif, + tmp_dir=tmp_dir, + ), + name="tensor", + ) + + # ── Copy final outputs ──────────────────────────────────────────── + copy = workflow.add( + copy_final_outputs_task( + dwi_biascorr_mif=biascorr_mif, + t1_in_dwi=t1_result, + adc_nii=tensor.adc, + fa_nii=tensor.fa, + out_dir=out_dir, + dwi_preproc_name=dwi_preproc_name, + t1_output_name=t1_output_name, + ), + name="copy_outputs", + ) + return copy.out + + else: + # ── Full workflow: all stages ───────────────────────────────────────── + @workflow.define(outputs=["result"]) + def DwiWf(x: int) -> str: + + # ── T1 series staging ───────────────────────────────────────────── + # Always run — needed for registration regardless of skip_preproc. + conv_t1 = workflow.add( + stage_series(series_dir=t1_dir, out_dir=t1_conv_dir), + name="convert_t1", + ) + # conv_t1.sentinel is a true lazy output — used to gate DWI chain + + # ── DWI → MIF (with optional gradcheck) ────────────────────────── + if do_gradcheck: + mif_init = workflow.add( + convert_to_mif_initial( + nii=dwi_nii, + json_file=dwi_json, + bvec=dwi_bvec, + bval=dwi_bval, + out_path=str(Path(tmp_dir) / f"DWI_raw_{pe_dir}_init.mif.gz"), + ), + name="dwi_to_mif_init", + ) + gc_dwi = workflow.add( + run_gradcheck(mif_path=mif_init.out, out_dir=tmp_dir, prefix="dwi"), + name="gradcheck_dwi", + ) + dwi_bvec_lazy = gc_dwi.bvec + dwi_bval_lazy = gc_dwi.bval + + if preproc_mode == "rpe_all" and rpe_nii: + rpe_init = workflow.add( + convert_to_mif_initial( + nii=rpe_nii, + json_file=rpe_json, + bvec=rpe_bvec, + bval=rpe_bval, + out_path=str( + Path(tmp_dir) / f"DWI_raw_{rpe_dir}_init.mif.gz" + ), + ), + name="rpe_to_mif_init", + ) + gc_rpe = workflow.add( + run_gradcheck( + mif_path=rpe_init.out, out_dir=tmp_dir, prefix="rpe" + ), + name="gradcheck_rpe", + ) + rpe_bvec_lazy = gc_rpe.bvec + rpe_bval_lazy = gc_rpe.bval + else: + rpe_bvec_lazy = rpe_bvec + rpe_bval_lazy = rpe_bval + + if fwd_pe_nii and preproc_mode in ("rpe_pair", "rpe_split"): + fwd_init = workflow.add( + convert_to_mif_initial( + nii=fwd_pe_nii, + json_file=fwd_pe_json, + bvec=fwd_pe_bvec, + bval=fwd_pe_bval, + out_path=str( + Path(tmp_dir) / f"DWI_ref_{pe_dir}_init.mif.gz" + ), + ), + name="fwd_to_mif_init", + ) + gc_fwd = workflow.add( + run_gradcheck( + mif_path=fwd_init.out, out_dir=tmp_dir, prefix="fwd" + ), + name="gradcheck_fwd", + ) + fwd_bvec_lazy = gc_fwd.bvec + fwd_bval_lazy = gc_fwd.bval + else: + fwd_bvec_lazy = fwd_pe_bvec + fwd_bval_lazy = fwd_pe_bval + else: + dwi_bvec_lazy = dwi_bvec + dwi_bval_lazy = dwi_bval + rpe_bvec_lazy = rpe_bvec + rpe_bval_lazy = rpe_bval + fwd_bvec_lazy = fwd_pe_bvec + fwd_bval_lazy = fwd_pe_bval + + dwi_mif = workflow.add( + convert_to_mif_final( + nii=dwi_nii, + json_file=dwi_json, + bvec=dwi_bvec_lazy, + bval=dwi_bval_lazy, + out_path=dwi_raw_mif, + sentinel=conv_t1.sentinel, + ), + name="dwi_to_mif", + ) + + if preproc_mode == "rpe_all" and rpe_nii: + rpe_mif = workflow.add( + convert_to_mif_final( + nii=rpe_nii, + json_file=rpe_json, + bvec=rpe_bvec_lazy, + bval=rpe_bval_lazy, + out_path=str(Path(tmp_dir) / f"DWI_raw_{rpe_dir}.mif.gz"), + sentinel=conv_t1.sentinel, + ), + name="rpe_to_mif", + ) + rpe_mif_out = rpe_mif.out + else: + rpe_mif_out = None + + # ── Denoise + Gibbs ─────────────────────────────────────────────── + if do_denoise: + dn_dwi = workflow.add( + run_dwidenoise( + in_mif=dwi_mif.out, + out_mif=str(Path(tmp_dir) / f"DWI_raw_{pe_dir}_denoise.mif.gz"), + ), + name="denoise_dwi", + ) + dg_dwi = workflow.add( + run_mrdegibbs( + in_mif=dn_dwi.out, + out_mif=str( + Path(tmp_dir) / f"DWI_raw_{pe_dir}_denoise_gibbs.mif.gz" + ), + ), + name="degibbs_dwi", + ) + dwi_for_preproc = dg_dwi.out + + if preproc_mode == "rpe_all" and rpe_nii: + dn_rpe = workflow.add( + run_dwidenoise( + in_mif=rpe_mif_out, + out_mif=str( + Path(tmp_dir) / f"DWI_raw_{rpe_dir}_denoise.mif.gz" + ), + ), + name="denoise_rpe", + ) + dg_rpe = workflow.add( + run_mrdegibbs( + in_mif=dn_rpe.out, + out_mif=str( + Path(tmp_dir) + / f"DWI_raw_{rpe_dir}_denoise_gibbs.mif.gz" + ), + ), + name="degibbs_rpe", + ) + rpe_for_preproc = dg_rpe.out + else: + rpe_for_preproc = rpe_mif_out + else: + dwi_for_preproc = dwi_mif.out + rpe_for_preproc = rpe_mif_out + + # ── Concatenate AP+PA for rpe_all ───────────────────────────────── + if preproc_mode == "rpe_all" and rpe_nii: + cat = workflow.add( + concatenate_ap_pa( + ap_mif=dwi_for_preproc, + pa_mif=rpe_for_preproc, + out_mif=str(Path(tmp_dir) / "DWI_AP_PA_concat.mif.gz"), + ), + name="concat_ap_pa", + ) + dwi_input = cat.out + else: + dwi_input = dwi_for_preproc + + # ── se_epi pair (rpe_pair / rpe_split) ─────────────────────────── + se = workflow.add( + build_se_epi( + dwi_mif=dwi_for_preproc, + rpe_nii=rpe_nii or "", + rpe_json=rpe_json, + rpe_bvec=rpe_bvec_lazy, + rpe_bval=rpe_bval_lazy, + fwd_pe_nii=fwd_pe_nii or "", + fwd_pe_json=fwd_pe_json, + fwd_pe_bvec=fwd_bvec_lazy, + fwd_pe_bval=fwd_bval_lazy, + pe_dir=pe_dir, + rpe_dir=rpe_dir, + preproc_mode=preproc_mode, + tmp_dir=tmp_dir, + ), + name="se_epi", + ) + + # ── dwifslpreproc ───────────────────────────────────────────────── + fslpreproc = workflow.add( + run_dwifslpreproc( + dwi_mif=dwi_input, + out_mif=preproc_mif, + pe_dir=pe_dir, + preproc_mode=preproc_mode, + se_epi=se.out, + readout_time=readout_time, + eddy_options=eddy_options, + scratch_dir=str(Path(tmp_dir) / "dwifslpreproc_scratch"), + ), + name="fslpreproc", + ) + + # ── Mask + DWI bias correction ──────────────────────────────────── + dwi_mask = workflow.add( + run_dwi2mask( + in_mif=fslpreproc.out, + out_mif=str(Path(tmp_dir) / "DWI_preproc_mask.mif.gz"), + ), + name="dwi_mask", + ) + biascorr = workflow.add( + run_dwibiascorrect( + in_mif=fslpreproc.out, + out_mif=biascorr_mif, + mask_mif=dwi_mask.out, + bias_mif=str(Path(tmp_dir) / "DWI_preproc_bias.mif.gz"), + ), + name="dwi_biascorr", + ) + biascorr_out = biascorr.out + + # ── T1-to-DWI registration ──────────────────────────────────────── + b0 = workflow.add( + extract_mean_b0( + dwi_biascorr_mif=biascorr_out, + out_nii=str(Path(tmp_dir) / "bzero_f.nii.gz"), + ), + name="mean_b0", + ) + flirt = workflow.add( + register_b0_to_t1( + b0_nii=b0.out, + t1_nii=conv_t1.nii, + out_b0_in_t1=str(Path(tmp_dir) / "b0_to_T1.nii.gz"), + out_mat=str(Path(tmp_dir) / "b02T1.mat"), + ), + name="register", + ) + xfm = workflow.add( + invert_and_apply_transform( + b02t1_mat=flirt.out, + t1_nii=conv_t1.nii, + b0_nii=b0.out, + tmp_dir=tmp_dir, + ), + name="invert_xfm", + ) + t1_result = xfm.t1_in_dwi + + # ── Tensor metrics ──────────────────────────────────────────────── + tensor = workflow.add( + compute_tensor_metrics( + dwi_biascorr_mif=biascorr_out, + tmp_dir=tmp_dir, + ), + name="tensor", + ) + + # ── Copy final outputs ──────────────────────────────────────────── + copy = workflow.add( + copy_final_outputs_task( + dwi_biascorr_mif=biascorr_out, + t1_in_dwi=t1_result, + adc_nii=tensor.adc, + fa_nii=tensor.fa, + out_dir=out_dir, + dwi_preproc_name=dwi_preproc_name, + t1_output_name=t1_output_name, + ), + name="copy_outputs", + ) + return copy.out + + # Rename the class so pydra treats each branch combination as a distinct type + DwiWf.__name__ = wf_class_name + DwiWf.__qualname__ = wf_class_name + + # ── Submit ──────────────────────────────────────────────────────────────── + cache_dir = str(Path(out_dir) / ".pydra_cache") + wf = DwiWf(x=1) + with Submitter(worker="cf", cache_root=cache_dir) as sub: + sub(wf, rerun=True) + + # Cleanup runs after submission completes — guaranteed post-copy + cleanup_tmp(sentinel="", tmp_dir=tmp_dir, keep_tmp=keep_tmp) + + +# ============================================================================= +# Top-level pipeline +# ============================================================================= + + +def run_pipeline(cfg: dict): + scans_dir = cfg["scans_dir"] + output_dir = cfg.get("output_dir", str(Path(scans_dir).name)) + cfg["output_dir"] = output_dir + os.makedirs(output_dir, exist_ok=True) + + print(f"Scans directory: {scans_dir}") + print(f"Denoise/Degibbs: {cfg.get('denoise_degibbs', False)}") + print(f"Gradcheck: {cfg.get('gradcheck', False)}") + print(f"Keep tmp: {cfg.get('keep_tmp', False)}") + print(f"Output: {Path(output_dir).resolve()}") + + # Step 1: classify directories (provisional) + dirs = scan_directory(scans_dir) + print(f"\nFound:") + print(f" {len(dirs['t1_dirs'])} T1 series") + print(f" {len(dirs['candidate_dwi'])} candidate DWI series (before filtering)") + if dirs["ignored"]: + print(f" {len(dirs['ignored'])} ignored (non-DWI)") + + # Step 2: convert all candidate DICOMs + print("\nConverting DICOMs for all candidate series...") + conversions = convert_all_candidates(dirs["candidate_dwi"], output_dir) + + # Steps 3-6: validate bvec/bval, check b-values, finalise classification + classified = classify_candidates(dirs["candidate_dwi"], conversions) + + # Steps 7: detect AP/PA pairs (across dwi_dirs and pending series) + print("\nDetecting AP/PA pairs...") + # Pass existing fwd/rpe dirs into match so they are preserved + conversions["fwd_pe_dirs"] = classified["fwd_pe_dirs"] + conversions["rpe_dirs"] = classified["rpe_dirs"] + dwi_dirs, fwd_pe_dirs, rpe_dirs, rpe_all_map, tie_warnings = match_ap_pa_pairs( + classified["dwi_dirs"], + classified["pending_fwd"], + classified["pending_rpe"], + conversions, + ) + + # Step 8: build PE assignment map — one b0 PE image → all DWI series in same block + print("Assigning PE correction images to DWI blocks...") + pe_assignment_map = build_pe_assignment_map( + dwi_dirs, fwd_pe_dirs, rpe_dirs, rpe_all_map + ) + + print(f"\nAfter classification:") + print(f" {len(dwi_dirs)} DWI series to process") + print(f" {len(fwd_pe_dirs)} forward PE images") + print(f" {len(rpe_dirs)} reverse PE images") + print(f" {len(rpe_all_map)} rpe_all pairs detected") + if classified["skipped"]: + print(f" {len(classified['skipped'])} series skipped") + + if not dwi_dirs: + raise ValueError("No processable DWI series found after filtering.") + + # Steps 9-12: plan each workflow + print("\nPlanning workflows...") + plans = [] + for dwi_dir in dwi_dirs: + plan = plan_workflow( + dwi_dir=dwi_dir, + t1_dirs=dirs["t1_dirs"], + fwd_pe_dirs=fwd_pe_dirs, + rpe_dirs=rpe_dirs, + rpe_all_map=rpe_all_map, + pe_assignment_map=pe_assignment_map, + conversions=conversions, + cfg=cfg, + ) + plans.append(plan) + + # Step 13: print plan and pause + print_plan(plans, classified["skipped"]) + + for plan in plans: + build_dwi_workflow(plan) + + print("\n=== All done ===") + print(f"Outputs in: {Path(output_dir).resolve()}") + + +# ============================================================================= +# CLI +# ============================================================================= + + +def load_config(args) -> dict: + cfg = {} + if args.config: + with open(args.config) as f: + cfg = yaml.safe_load(f) or {} + if args.scans_dir: + cfg["scans_dir"] = args.scans_dir + if args.output_dir: + cfg["output_dir"] = args.output_dir + if args.denoise_degibbs: + cfg["denoise_degibbs"] = True + if args.gradcheck: + cfg["gradcheck"] = True + if args.nocleanup: + cfg["keep_tmp"] = True + if args.readout_time is not None: + cfg["readout_time"] = args.readout_time + if args.eddy_options is not None: + cfg["eddy_options"] = args.eddy_options + if "scans_dir" not in cfg: + raise ValueError("scans_dir must be provided via --scans-dir or config YAML") + return cfg + + +def main(): + parser = argparse.ArgumentParser( + description="DWI processing and tensor metrics pipeline" + ) + parser.add_argument("--config", type=str, help="Path to YAML config file") + parser.add_argument("--scans-dir", type=str, help="Path to scans directory") + parser.add_argument("--output-dir", type=str, help="Path to output directory") + parser.add_argument("--denoise-degibbs", action="store_true", default=None) + parser.add_argument("--gradcheck", action="store_true", default=None) + parser.add_argument( + "--nocleanup", + action="store_true", + default=False, + help="Keep the tmp/ directory after processing (default: remove)", + ) + parser.add_argument("--readout-time", type=float, default=None) + parser.add_argument("--eddy-options", type=str, default=None) + args = parser.parse_args() + cfg = load_config(args) + run_pipeline(cfg) + + +if __name__ == "__main__": + main() diff --git a/phantomkit/flowchart.md b/phantomkit/flowchart.md new file mode 100644 index 0000000..b7afd80 --- /dev/null +++ b/phantomkit/flowchart.md @@ -0,0 +1,55 @@ +```mermaid +flowchart TD + INPUT[/"--input-dir --phantom --output-dir
Sub-directories may contain DICOM · NIfTI (.nii/.nii.gz) · MIF (.mif/.mif.gz)"/] + + INPUT --> SCAN["Scan input directory
format auto-detected per sub-directory"] + SCAN --> S1 + SCAN --> S3 + + subgraph S1["Stage 1 — DWI Processing (dwi_processing.py)"] + direction TB + DWI_IN["DWI series
(DICOM · NIfTI · MIF)"] --> STAGE1["stage_series
→ NIfTI + bvec/bval"] + T1_IN["T1 series
(DICOM · NIfTI · MIF)"] --> STAGE1T1["stage_series → T1.nii.gz"] + STAGE1 --> PREPROC[dwifslpreproc / eddy] + PREPROC --> TENSOR["dwi2tensor → tensor2metric
ADC.nii.gz FA.nii.gz"] + TENSOR --> FLIRT["flirt
b0 → T1 co-registration"] + STAGE1T1 --> FLIRT + FLIRT --> T1DWI[T1_in_DWI_space.nii.gz] + end + + subgraph S3["Stage 3 — Native Contrast QC (phantom_processor.py)"] + direction TB + STAGE3["stage_series_dir
T1 + IR + TE → NIfTI staging folder
(DICOM · NIfTI · MIF)"] + STAGE3 --> WF3["PhantomSessionWf
— see workflow detail —"] + end + + T1DWI --> S2 + + subgraph S2["Stage 2 — DWI-space Phantom QC (phantom_processor.py)"] + direction TB + WF2["PhantomSessionWf
— see workflow detail —"] + end + + subgraph WF["PhantomSessionWf — task dependency graph"] + direction TB + REG["① antsRegistrationSyN.sh
T1 → template ► 0GenericAffine.mat
InverseWarped.nii.gz"] + + REG -->|inverse_warped| SAVE["①b mrconvert
TemplatePhantom_ScannerSpace.nii.gz"] + REG -->|transform_matrix| VIALS["② antsApplyTransforms
vial masks → subject space"] + REG -->|transform_matrix| FWDXFM["⑤ antsApplyTransforms
all contrasts → template space"] + + VIALS -->|vial_paths| METRICS["③ mrgrid + mrstats + mrdump
per-vial mean / median / std / min / max / count
p25 / p75 (via mrdump + numpy.percentile)
mean_mad / median_mad (via mrdump + numpy)
→ xlsx (one sheet per metric)"] + REFDATA[/"template_data/{phantom}/
adc_reference.json
t1t2_reference.json
(SPIRIT: 12 vials · 120E: 24 vials)"/] + REFDATA --> PLOTS + METRICS -->|sentinel| PLOTS["④ plot_vial_intensity
plot_vial_ir_means_std ← if IR series present
plot_vial_te_means_std ← if TE series present
→ Interactive HTML
(NiiVue viewer + Chart.js)
PNG fallback available"] + + PLOTS -->|sentinel| CLEANUP["⑥ shutil.rmtree
tmp tmp_vials tmp_vols vial_dir/tmp"] + FWDXFM -->|sentinel| CLEANUP + end + + S1 -.->|"runs in parallel"| S3 + S2 -.->|"runs after Stage 1"| DONE + S3 -.-> DONE + + DONE(["outputs/
{session}/metrics/plots/*.html
scatter plots · T1_mapping · T2_mapping
{session}/metrics/fits/*.csv
{session}/metrics/csv/
{session}/vial_segmentations/
{session}/images_template_space/
{session}/TemplatePhantom_ScannerSpace.nii.gz"]) +``` diff --git a/phantomkit/metrics.py b/phantomkit/metrics.py index 539cab3..78ca458 100644 --- a/phantomkit/metrics.py +++ b/phantomkit/metrics.py @@ -14,10 +14,43 @@ from fileformats.medimage import NiftiGz from pydra.compose import python, workflow from pydra.tasks.ants.v2.resampling.apply_transforms import ApplyTransforms -from pydra.tasks.mrtrix3.v3_1 import MrConvert, MrGrid, MrInfo, MrStats, MrTransform +from pydra.tasks.mrtrix3.v3_1 import MrConvert, MrGrid, MrInfo, MrStats from phantomkit.registration import ParseMrStatsStdout + +@python.define +def ComputePercentile( + vol_file: NiftiGz, mask_file: NiftiGz, percentile: int, tmp_dir: Path +) -> float: + """Compute a per-voxel percentile within a mask using mrthreshold + mrdump.""" + import hashlib + import subprocess + + h = hashlib.md5(f"{vol_file}{mask_file}{percentile}".encode()).hexdigest()[:8] + from pathlib import Path as _P + mask1 = str(_P(tmp_dir) / f"pct{percentile}_{h}_m1.mif") + mask2 = str(_P(tmp_dir) / f"pct{percentile}_{h}_m2.mif") + try: + subprocess.run( + ["mrthreshold", str(vol_file), "-mask", str(mask_file), + "-percentile", str(percentile), mask1, "-force", "-quiet"], + check=True, capture_output=True, + ) + subprocess.run( + ["mrthreshold", str(vol_file), "-mask", mask1, + "-top", "1", mask2, "-force", "-quiet"], + check=True, capture_output=True, + ) + r = subprocess.run( + ["mrdump", str(vol_file), "-mask", mask2], + capture_output=True, text=True, check=True, + ) + vals = [float(x) for x in r.stdout.strip().split() if x] + return vals[0] if vals else float("nan") + except Exception: + return float("nan") + logger = logging.getLogger(__name__) @@ -83,8 +116,6 @@ def TransformVialsToSubjectSpace( vial_masks: list[NiftiGz], reference_image: NiftiGz, transform_matrix: File, - rotation_matrix_file: File | None, - iteration: int, output_vial_dir: Path, ) -> list[NiftiGz]: """ @@ -94,8 +125,7 @@ def TransformVialsToSubjectSpace( 1. **PrepVialTransformPaths** derives per-vial output paths. 2. **ApplyTransforms** applies the inverse affine. 3. **CopyFile** moves the output to the per-vial tmp path. - 4. **MrTransform** (inverse rotation, iteration > 1) or **MrConvert** - (copy, iteration == 1) writes the final output. + 4. **MrConvert** writes the final output. A combined **GatherList** collects all per-vial output paths. """ @@ -122,28 +152,15 @@ def TransformVialsToSubjectSpace( name="copy", ) - if iteration > 1 and rotation_matrix_file: - final = workflow.add( - MrTransform( - in_file=copy.out, - linear=rotation_matrix_file, - out_file=prep.output_path, - interp="nearest", - inverse=True, - force=True, - ), - name="final", - ) - else: - final = workflow.add( - MrConvert( - in_file=copy.out, - out_file=prep.output_path, - quiet=True, - force=True, - ), - name="final", - ) + final = workflow.add( + MrConvert( + in_file=copy.out, + out_file=prep.output_path, + quiet=True, + force=True, + ), + name="final", + ) gather = workflow.add( GatherList(items=final.out_file).combine("prep"), @@ -201,11 +218,8 @@ def ExtractMetricsFromContrasts( "Processing %s (%d volume%s)", clean_name, nvols, "s" if nvols > 1 else "" ) metrics_data: dict[str, dict[str, list[float]]] = { - "mean": {}, - "median": {}, - "std": {}, - "min": {}, - "max": {}, + "mean": {}, "median": {}, "std": {}, "min": {}, "max": {}, + "count": {}, "p25": {}, "p75": {}, } for vial_mask in vial_masks: @@ -255,7 +269,7 @@ def ExtractMetricsFromContrasts( MrStats( image_=vol_file, mask=regridded_mask, - output=["mean", "median", "std", "min", "max"], + output=["mean", "median", "std", "min", "max", "count"], quiet=True, ), name=f"stats_{tag}", @@ -270,17 +284,38 @@ def ExtractMetricsFromContrasts( metrics_data["std"][vial_name].append(values[2]) metrics_data["min"][vial_name].append(values[3]) metrics_data["max"][vial_name].append(values[4]) + metrics_data["count"][vial_name].append(values[5]) - for metric_name, vial_data in metrics_data.items(): - csv_file = ( - metrics_dir / f"{session_name}_{contrast_name}_{metric_name}_matrix.csv" - ) - rows = [ - {"vial": vn, **{f"{clean_name}_vol{i}": v for i, v in enumerate(vals)}} - for vn, vals in vial_data.items() - ] - pd.DataFrame(rows).to_csv(csv_file, index=False) - logger.info("Saved: %s", csv_file.name) + p25_task = workflow.add( + ComputePercentile( + vol_file=vol_file, mask_file=regridded_mask, + percentile=25, tmp_dir=tmp_vol_dir, + ), + name=f"p25_{tag}", + ) + p75_task = workflow.add( + ComputePercentile( + vol_file=vol_file, mask_file=regridded_mask, + percentile=75, tmp_dir=tmp_vol_dir, + ), + name=f"p75_{tag}", + ) + metrics_data["p25"][vial_name].append(p25_task.out) + metrics_data["p75"][vial_name].append(p75_task.out) + + xlsx_dir = metrics_dir / "xlsx" + xlsx_dir.mkdir(parents=True, exist_ok=True) + xlsx_file = xlsx_dir / f"{clean_name}.xlsx" + sheet_order = ["mean", "median", "std", "min", "max", "count", "p25", "p75"] + with pd.ExcelWriter(xlsx_file, engine="openpyxl") as writer: + for metric_name in sheet_order: + vial_data = metrics_data[metric_name] + rows = [ + {"vial": vn, **{f"vol{i}": v for i, v in enumerate(vals)}} + for vn, vals in vial_data.items() + ] + pd.DataFrame(rows).to_excel(writer, sheet_name=metric_name, index=False) + logger.info("Saved: %s", xlsx_file.name) return metrics_dir @@ -289,8 +324,6 @@ def ExtractMetricsFromContrasts( def TransformContrastsToTemplateSpace( contrast_files: list[NiftiGz], transform_matrix: File, - rotation_matrix_file: File | None, - iteration: int, template_phantom: NiftiGz, tmp_dir: Path, output_dir: Path, @@ -299,14 +332,11 @@ def TransformContrastsToTemplateSpace( Forward-transform every contrast image into template space. For each contrast: - 1. If ``iteration > 1``, **MrTransform** applies the pre-registration - rotation (concrete workflow input → evaluated at static-graph-build - time). - 2. **MrInfo** + **ParseMrInfoSize** detect dimensionality (task outputs + 1. **MrInfo** + **ParseMrInfoSize** detect dimensionality (task outputs are concrete at runtime after the for-loop triggers the fallback). - 3. If single-slice, **MrGrid** pads the z-axis. - 4. **ApplyTransforms** applies the forward ANTs affine. - 5. **CopyFile** writes the result to the output directory. + 2. If single-slice, **MrGrid** pads the z-axis. + 3. **ApplyTransforms** applies the forward ANTs affine. + 4. **CopyFile** writes the result to the output directory. Returns the template-space output directory path. """ @@ -322,23 +352,8 @@ def TransformContrastsToTemplateSpace( contrast_name = contrast_path.stem.replace(".nii", "") logger.info("Transforming: %s", contrast_path.name) - source = contrast_file - - if iteration > 1 and rotation_matrix_file: - rot = workflow.add( - MrTransform( - in_file=contrast_file, - linear=rotation_matrix_file, - out_file=f"{contrast_name}_rotated.nii.gz", - interp="linear", - force=True, - ), - name=f"rotate_{contrast_name}", - ) - source = rot.out_file - info = workflow.add( - MrInfo(image_=[source], size=True, quiet=True), + MrInfo(image_=[contrast_file], size=True, quiet=True), name=f"info_{contrast_name}", ) parse_size = workflow.add( @@ -346,12 +361,12 @@ def TransformContrastsToTemplateSpace( name=f"parse_size_{contrast_name}", ) - transform_input = source + transform_input = contrast_file if parse_size.is_single_slice: pad = workflow.add( MrGrid( - in_file=source, + in_file=contrast_file, operation="pad", axis=[(2, (1, 1))], out_file=f"{contrast_name}_padded.nii.gz", diff --git a/phantomkit/phantom_processor.py b/phantomkit/phantom_processor.py new file mode 100644 index 0000000..c666b55 --- /dev/null +++ b/phantomkit/phantom_processor.py @@ -0,0 +1,1152 @@ +#!/usr/bin/env python3 +""" +phantom_processor.py +==================== +Core phantom processing engine for the phantomkit package. + +Contains ``PhantomProcessor``, a class that orchestrates a Pydra workflow: + + 1. ANTs registration + 2. Vial mask inverse-transform to subject space + 3. Per-vial metric extraction from all contrast images + 4. Plot generation (per-contrast scatter plots, T1/T2 parametric maps) + 5. Forward transform of all contrasts to template space + +Path conventions (shared repo): + template_data//ImageTemplate.nii.gz + template_data//VialsLabelled/*.nii.gz + template_data//adc_reference.json +""" + +import matplotlib + +matplotlib.use("Agg") # non-interactive backend; required when plotting runs +# in a background thread (e.g. ThreadPoolExecutor on macOS) + +import json +import re +import shutil +import subprocess +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +import pandas as pd +from pydra.compose import python, workflow +from pydra.engine import Submitter + + +# ============================================================================= +# Module-level helpers (called inside Pydra tasks) +# ============================================================================= + + +def _classify_contrast(contrast_file: Path) -> Optional[str]: + """ + Classify a contrast image by its filename stem. + + Returns + ------- + "adc" – filename contains 'ADC' (case-insensitive) + "fa" – filename contains standalone 'FA' (whole-word, case-insensitive) + None – no special classification + """ + stem = contrast_file.stem + if re.search(r"ADC", stem, re.IGNORECASE): + return "adc" + if re.search(r"(? Optional[str]: + """ + Capture an mrview screenshot with a vial ROI overlay. + + Parameters + ---------- + intensity_range: + If provided, passes ``-intensity_range min,max`` to mrview. + Use (0, 1) for FA maps and (0, 0.005) for ADC maps. + """ + cmd = [ + "mrview", + str(contrast_file), + "-mode", + "1", + "-plane", + "2", + "-interpolation", + "0", + "-roi.load", + roi_overlay, + "-roi.colour", + "1,0,0", + "-roi.opacity", + "1", + "-comments", + "0", + "-noannotations", + "-fullscreen", + ] + + if intensity_range is not None: + cmd.extend( + ["-intensity_range", f"{intensity_range[0]},{intensity_range[1]}"] + ) + + cmd.extend( + [ + "-capture.folder", + str(Path(output_image).parent), + "-capture.prefix", + Path(output_image).stem, + "-capture.grab", + "-exit", + ] + ) + + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + print(f" ⚠ mrview screenshot failed: {result.stderr}") + return None + + # mrview appends "0000" to the prefix + actual_file = str( + Path(output_image).parent / f"{Path(output_image).stem}0000.png" + ) + return actual_file if Path(actual_file).exists() else None + + +def _build_roi_overlay( + contrast_file: Path, + vial_masks_list: List[Path], + prefix: str, + tmp_vial_dir: Path, +) -> Optional[str]: + """Regrid each vial mask to contrast space and combine into one overlay NIfTI.""" + roi_overlay = str(tmp_vial_dir / f"{prefix}_VialsCombined.nii.gz") + regridded_vials = [] + + for vial_mask in vial_masks_list: + vial_name = vial_mask.name.replace(".nii.gz", "").replace(".nii", "") + regridded = str(tmp_vial_dir / f"{prefix}_{vial_name}.nii") + cmd = [ + "mrgrid", + "-template", + str(contrast_file), + str(vial_mask), + "regrid", + regridded, + "-interp", "nearest", + "-datatype", "bit", + "-force", + ] + subprocess.run(cmd, check=True, capture_output=True) + regridded_vials.append(regridded) + + if not regridded_vials: + return None + + cmd_cat = ["mrcat"] + regridded_vials + ["-", "-axis", "3"] + cmd_math = ["mrmath", "-", "max", roi_overlay, "-axis", "3", "-force"] + + proc_cat = subprocess.Popen( + cmd_cat, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + proc_math = subprocess.Popen( + cmd_math, + stdin=proc_cat.stdout, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + proc_cat.stdout.close() + proc_math.communicate() + + return roi_overlay if Path(roi_overlay).exists() else None + + +# ============================================================================= +# Pydra task definitions +# ============================================================================= + + +@python.define(outputs=["warped", "transform", "inverse_warped"]) +def _task_register( + input_image: str, + template_phantom: str, + output_prefix: str, +) -> tuple[str, str, str]: + """Run ANTs rigid registration of the input image to the template phantom.""" + cmd = [ + "antsRegistrationSyN.sh", + "-d", + "3", + "-f", + template_phantom, + "-m", + input_image, + "-o", + output_prefix, + "-t", + "r", + "-n", + "8", + "-j", + "1", + ] + print("Running ANTs registration...") + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError( + f"ANTs failed (exit {result.returncode}):\n" + f"stdout: {result.stdout}\n" + f"stderr: {result.stderr}" + ) + print(" ✓ Registration complete") + return ( + f"{output_prefix}Warped.nii.gz", + f"{output_prefix}0GenericAffine.mat", + f"{output_prefix}InverseWarped.nii.gz", + ) + + +@python.define(outputs=["out"]) +def _task_save_scanner_space_template( + inverse_warped: str, + output_path: str, +) -> str: + """mrconvert the inverse-warped image to the final scanner-space template path.""" + cmd = ["mrconvert", "-quiet", inverse_warped, output_path, "-force"] + subprocess.run(cmd, check=True, capture_output=True) + print(" ✓ Saved template in scanner space") + return output_path + + +@python.define(outputs=["vial_paths"]) +def _task_transform_vials( + vial_masks: list, + reference_image: str, + transform_matrix: str, + output_vial_dir: str, + tmp_vial_dir: str, +) -> list: + """Inverse-transform all vial masks from template space to subject space.""" + Path(output_vial_dir).mkdir(parents=True, exist_ok=True) + Path(tmp_vial_dir).mkdir(parents=True, exist_ok=True) + + transformed = [] + for vial_mask in vial_masks: + vial_name = ( + Path(vial_mask).name.replace(".nii.gz", "").replace(".nii", "").split(".")[0] + ) + tmp_vial = str(Path(tmp_vial_dir) / f"{vial_name}.nii") + output_vial = str(Path(output_vial_dir) / f"{vial_name}.nii.gz") + + cmd = [ + "antsApplyTransforms", + "-d", + "3", + "-i", + str(vial_mask), + "-r", + reference_image, + "-o", + tmp_vial, + "-t", + f"[{transform_matrix}, 1]", + "-n", + "NearestNeighbor", + ] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError(f"Transform failed for {vial_name}: {result.stderr}") + + cmd = ["mrconvert", "-quiet", tmp_vial, output_vial, "-force"] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError( + f"Final conversion failed for {vial_name}: {result.stderr}" + ) + + transformed.append(output_vial) + + print(f" ✓ Transformed {len(transformed)} vial masks") + return transformed + + +def _compute_voxel_stats( + vol_file: str, mask_file: str +) -> dict: + """Dump masked voxels and compute p25/p75/mean_mad/median_mad in one mrdump call.""" + import numpy as _np + + nan = float("nan") + result = {"p25": nan, "p75": nan, "mean_mad": nan, "median_mad": nan} + try: + r = subprocess.run( + ["mrdump", vol_file, "-mask", mask_file], + capture_output=True, text=True, check=True, + ) + raw = r.stdout.strip().split() + if not raw: + return result + vals = _np.array([float(x) for x in raw], dtype=float) + result["p25"] = float(_np.percentile(vals, 25)) + result["p75"] = float(_np.percentile(vals, 75)) + result["mean_mad"] = float(_np.mean(_np.abs(vals - vals.mean()))) + result["median_mad"] = float(_np.median(_np.abs(vals - _np.median(vals)))) + except Exception: + pass + return result + + +@python.define(outputs=["sentinel"]) +def _task_extract_metrics( + contrast_files: list, + vial_paths: list, + adc_vials: list, + output_metrics_dir: str, + session_name: str, + tmp_vols_dir: str, +) -> str: + """Extract per-vial statistics (mean/median/std/min/max) from all contrast images.""" + adc_vials_set = set(v.upper() for v in adc_vials) + metrics_dir = Path(output_metrics_dir) + metrics_dir.mkdir(parents=True, exist_ok=True) + Path(tmp_vols_dir).mkdir(parents=True, exist_ok=True) + + print(f"\nStep 3: Extracting metrics from all contrasts") + print(f" Found {len(contrast_files)} contrast image(s)") + + for contrast_file_str in contrast_files: + contrast_file = Path(contrast_file_str) + contrast_name = contrast_file.name + for ext in (".nii.gz", ".nii"): + if contrast_name.endswith(ext): + contrast_name = contrast_name[: -len(ext)] + break + clean_contrast_name = contrast_name + + # Classify contrast and filter vials for ADC + stem = contrast_file.stem + contrast_type = None + if re.search(r"ADC", stem, re.IGNORECASE): + contrast_type = "adc" + elif re.search(r"(?= 4 and int(size_info[3]) > 0 else 1 + ) + + print( + f" Processing {clean_contrast_name} " + f"({nvols} volume{'s' if nvols > 1 else ''})" + ) + + metrics_data: Dict[str, Dict[str, List[float]]] = { + "mean": {}, "median": {}, "std": {}, "min": {}, "max": {}, + "count": {}, "p25": {}, "p75": {}, "mean_mad": {}, "median_mad": {}, + } + + for vial_mask in active_vials: + vial_name = ( + Path(vial_mask) + .name.replace(".nii.gz", "") + .replace(".nii", "") + .split(".")[0] + ) + for metric in metrics_data: + metrics_data[metric][vial_name] = [] + + regridded_mask = str( + Path(tmp_vols_dir) / f"{contrast_name}_{vial_name}.nii" + ) + cmd = [ + "mrgrid", + "-template", + str(contrast_file), + vial_mask, + "regrid", + regridded_mask, + "-interp", "nearest", + "-datatype", "bit", + "-force", + ] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError( + f"mrgrid regrid failed for vial {vial_name}: {result.stderr}" + ) + + for vol_idx in range(nvols): + if nvols == 1: + vol_file = str(contrast_file) + else: + vol_file = str( + Path(tmp_vols_dir) / f"{contrast_name}_vol{vol_idx}.nii.gz" + ) + cmd = [ + "mrconvert", + str(contrast_file), + "-coord", + "3", + str(vol_idx), + vol_file, + "-quiet", + "-force", + ] + subprocess.run(cmd, check=True, capture_output=True) + + cmd = [ + "mrstats", "-quiet", vol_file, + "-output", "mean", "-output", "median", "-output", "std", + "-output", "min", "-output", "max", "-output", "count", + "-mask", regridded_mask, + ] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0 or not result.stdout.strip(): + raise RuntimeError( + f"mrstats failed for vial {vial_name}: {result.stderr}" + ) + values = result.stdout.strip().split() + metrics_data["mean"][vial_name].append(float(values[0])) + metrics_data["median"][vial_name].append(float(values[1])) + metrics_data["std"][vial_name].append(float(values[2])) + metrics_data["min"][vial_name].append(float(values[3])) + metrics_data["max"][vial_name].append(float(values[4])) + metrics_data["count"][vial_name].append(float(values[5])) + _vstats = _compute_voxel_stats(vol_file, regridded_mask) + metrics_data["p25"][vial_name].append(_vstats["p25"]) + metrics_data["p75"][vial_name].append(_vstats["p75"]) + metrics_data["mean_mad"][vial_name].append(_vstats["mean_mad"]) + metrics_data["median_mad"][vial_name].append(_vstats["median_mad"]) + + xlsx_dir = metrics_dir / "xlsx" + xlsx_dir.mkdir(parents=True, exist_ok=True) + xlsx_file = xlsx_dir / f"{clean_contrast_name}.xlsx" + sheet_order = ["mean", "median", "std", "min", "max", "count", "p25", "p75", "mean_mad", "median_mad"] + with pd.ExcelWriter(xlsx_file, engine="openpyxl") as writer: + for metric_name in sheet_order: + vial_data = metrics_data[metric_name] + rows = [ + {"vial": vn, **{f"vol{i}": v for i, v in enumerate(vals)}} + for vn, vals in vial_data.items() + ] + pd.DataFrame(rows).to_excel(writer, sheet_name=metric_name, index=False) + print(f" Saved: {xlsx_file.name}") + + return output_metrics_dir # sentinel for downstream ordering + + +@python.define(outputs=["sentinel"]) +def _task_generate_plots( + contrast_files: list, + metrics_dir: str, + vial_dir: str, + session_name: str, + phantom_name: str, + template_dir: str, + metrics_sentinel: str, # enforces Step 3 → Step 4 ordering; not used in body + output_format: str = "html", + filename_prefix: str = "", +) -> str: + """Generate per-contrast scatter plots and parametric map plots (IR / TE). + + Parameters + ---------- + output_format : str + "html" (default) — interactive HTML; NIfTI paths passed directly. + "png" — static matplotlib PNG; mrview used for ROI overlay. + """ + from phantomkit.plotting.vial_intensity import plot_vial_intensity + from phantomkit.plotting.maps_ir import plot_vial_ir_means_std + from phantomkit.plotting.maps_te import plot_vial_te_means_std + + metrics_path = Path(metrics_dir) + xlsx_dir = metrics_path / "xlsx" + plots_dir = metrics_path / "plots" + fits_dir = metrics_path / "fits" + plots_dir.mkdir(parents=True, exist_ok=True) + fits_dir.mkdir(parents=True, exist_ok=True) + vial_dir_path = Path(vial_dir) + tmp_vial_dir = vial_dir_path / "tmp" + tmp_vial_dir.mkdir(exist_ok=True) + vial_masks_list = list(vial_dir_path.glob("*.nii.gz")) + contrast_file_paths = [Path(f) for f in contrast_files] + ext = ".html" if output_format == "html" else ".png" + + def _matches(stem: str, token: str) -> bool: + return bool(re.search(rf"(? str: + """Forward-transform all contrast images from subject space to template space.""" + Path(tmp_dir).mkdir(parents=True, exist_ok=True) + Path(output_dir).mkdir(parents=True, exist_ok=True) + + print("\nStep 5: Transforming all contrasts to template space") + + for contrast_file_str in contrast_files: + contrast_file = Path(contrast_file_str) + contrast_name = contrast_file.stem.replace(".nii", "") + source_image = str(contrast_file) + + # Detect 4D and single-slice + detect = subprocess.run( + ["mrinfo", "-size", source_image], capture_output=True, text=True + ) + size_parts = detect.stdout.strip().split() + is_4d = len(size_parts) >= 4 and int(size_parts[3]) > 1 + is_single_slice = len(size_parts) >= 3 and int(size_parts[2]) == 1 + + if is_single_slice: + padded = str(Path(tmp_dir) / f"{contrast_name}_padded.nii.gz") + cmd = [ + "mrgrid", + source_image, + "pad", + "-axis", + "2", + "1,1", + padded, + "-force", + ] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError( + f"Padding of single-slice contrast {contrast_name} failed: " + f"{result.stderr}" + ) + transform_input = padded + else: + transform_input = source_image + + warped_tmp = str(Path(tmp_dir) / f"{contrast_name}_template_space_tmp.nii.gz") + warped_contrast = str(Path(tmp_dir) / f"{contrast_name}_template_space.nii.gz") + + cmd = [ + "antsApplyTransforms", + "-d", + "3", + "-e", + "3" if is_4d else "0", + "-i", + transform_input, + "-r", + template_phantom, + "-o", + warped_tmp, + "-t", + transform_matrix, + "-n", + "Linear", + ] + result = subprocess.run(cmd, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError( + f"Forward transform of contrast {contrast_name} failed: {result.stderr}" + ) + + verify = subprocess.run( + ["mrinfo", "-size", warped_tmp], capture_output=True, text=True + ) + if verify.returncode != 0 or not verify.stdout.strip(): + raise RuntimeError( + f"antsApplyTransforms produced no valid output for {contrast_name}. " + f"stderr: {result.stderr}" + ) + + shutil.move(warped_tmp, warped_contrast) + shutil.copy2(warped_contrast, str(Path(output_dir) / contrast_file.name)) + print(f" ✓ {contrast_file.name} → template space") + + print(f" ✓ All contrasts saved to: {output_dir}") + return output_dir # sentinel for downstream ordering + + +@python.define(outputs=["out"]) +def _task_cleanup( + dirs_to_remove: list, + sentinel_plots: str, # enforces Steps 3+4 → Step 6 ordering; not used in body + sentinel_template: str, # enforces Step 5 → Step 6 ordering; not used in body +) -> str: + """Remove temporary directories once all processing is complete.""" + print("\nStep 6: Cleaning up temporary directories") + for d in dirs_to_remove: + p = Path(d) + if p.exists(): + try: + shutil.rmtree(p) + print(f" ✓ Removed: {p.name}") + except Exception as e: + print(f" ⚠ Warning: Could not remove {p.name}: {e}") + return "done" + + +# ============================================================================= +# Module-level Pydra workflow (explicit parameters — no closure capture) +# ============================================================================= + + +@workflow.define(outputs=["out"]) +def PhantomSessionWf( + input_image: str, + template_phantom: str, + vial_masks: list, + adc_vials: list, + output_prefix: str, + output_dir_str: str, + session_name: str, + phantom_name: str, + template_dir_parent: str, + contrast_files: list, + output_format: str = "html", + filename_prefix: str = "", +) -> str: + """ + End-to-end phantom QC workflow. + + All inputs are passed explicitly (no closure) to avoid Pydra global + registry collisions when the workflow is instantiated multiple times + within the same Python process (e.g. Stage 2 + Stage 3 in parallel). + """ + from pathlib import Path as _Path + + _output_dir = _Path(output_dir_str) + _tmp_dir = _output_dir / "tmp" + _vial_dir = _output_dir / "vial_segmentations" + _metrics_dir = _output_dir / "metrics" + _images_dir = _output_dir / "images_template_space" + + # Step 1: ANTs registration + reg = workflow.add( + _task_register( + input_image=input_image, + template_phantom=template_phantom, + output_prefix=output_prefix, + ), + name="registration", + ) + + # Step 1b: Save template in scanner space (depends on reg via data) + workflow.add( + _task_save_scanner_space_template( + inverse_warped=reg.inverse_warped, + output_path=str(_output_dir / "TemplatePhantom_ScannerSpace.nii.gz"), + ), + name="save_scanner_space_template", + ) + + # Step 2: Transform vials to subject space (depends on reg via data) + vials = workflow.add( + _task_transform_vials( + vial_masks=vial_masks, + reference_image=input_image, + transform_matrix=reg.transform, + output_vial_dir=str(_vial_dir), + tmp_vial_dir=str(_output_dir / "tmp_vials"), + ), + name="transform_vials", + ) + + # Step 3: Extract metrics (depends on vials via data) + metrics = workflow.add( + _task_extract_metrics( + contrast_files=contrast_files, + vial_paths=vials.vial_paths, + adc_vials=adc_vials, + output_metrics_dir=str(_metrics_dir), + session_name=session_name, + tmp_vols_dir=str(_output_dir / "tmp_vols"), + ), + name="extract_metrics", + ) + + # Step 4: Generate plots (depends on metrics via sentinel) + plots = workflow.add( + _task_generate_plots( + contrast_files=contrast_files, + metrics_dir=str(_metrics_dir), + vial_dir=str(_vial_dir), + session_name=session_name, + phantom_name=phantom_name, + template_dir=template_dir_parent, + metrics_sentinel=metrics.sentinel, + output_format=output_format, + filename_prefix=filename_prefix, + ), + name="generate_plots", + ) + + # Step 5: Forward-transform contrasts to template space + # (depends on reg via data; runs in parallel with Steps 2–4) + template_contrasts = workflow.add( + _task_transform_contrasts( + contrast_files=contrast_files, + transform_matrix=reg.transform, + template_phantom=template_phantom, + output_dir=str(_images_dir), + tmp_dir=str(_tmp_dir / "template_space_contrasts"), + ), + name="transform_contrasts", + ) + + # Step 6: Cleanup (depends on Steps 4+5 via sentinels) + cleanup = workflow.add( + _task_cleanup( + dirs_to_remove=[ + str(_tmp_dir), + str(_output_dir / "tmp_vials"), + str(_output_dir / "tmp_vols"), + str(_vial_dir / "tmp"), + ], + sentinel_plots=plots.sentinel, + sentinel_template=template_contrasts.sentinel, + ), + name="cleanup", + ) + + return cleanup.out + + +# ============================================================================= +# PhantomProcessor +# ============================================================================= + + +class PhantomProcessor: + """ + Orchestrate phantom QC processing for a single session. + + Parameters + ---------- + template_dir: + Directory for this phantom type, e.g. + ``/template_data/SPIRIT``. + Must contain ``ImageTemplate.nii.gz`` and ``VialsLabelled/``. + output_base_dir: + Top-level output directory. Results are written to a + ``/`` subdirectory within this path. + """ + + def __init__( + self, + template_dir: str, + output_base_dir: str, + output_format: str = "html", + filename_prefix: str = "", + ): + self.template_dir = Path(template_dir) + self.output_base_dir = Path(output_base_dir) + self.output_format = output_format + self.filename_prefix = filename_prefix + + # Phantom name is the last component of template_dir (e.g. "SPIRIT") + self.phantom_name = self.template_dir.name + + self.template_phantom = self.template_dir / "ImageTemplate.nii.gz" + self.vial_dir = self.template_dir / "VialsLabelled" + self.vial_masks = sorted(self.vial_dir.glob("*.nii.gz")) + + # Load ADC vials from adc_reference.json + adc_ref_path = self.template_dir / "adc_reference.json" + if not adc_ref_path.exists(): + raise FileNotFoundError(f"adc_reference.json not found: {adc_ref_path}") + with open(adc_ref_path) as fh: + adc_ref = json.load(fh) + if "vials" not in adc_ref: + raise KeyError(f"'vials' key missing from: {adc_ref_path}") + self.adc_vials = {v.upper() for v in adc_ref["vials"]} + + if not self.template_phantom.exists(): + raise FileNotFoundError(f"Template not found: {self.template_phantom}") + if len(self.vial_masks) == 0: + raise FileNotFoundError(f"No vial masks found in: {self.vial_dir}") + + def process_session(self, input_image: str) -> Dict: + """ + Process a single phantom session end-to-end using a Pydra workflow. + + The workflow enforces the following sequence: + 1. ANTs registration + 1b. Save template in scanner space (→ depends on 1 via data) + 2. Transform vials to subject space (→ depends on 1 via data) + 3. Extract per-vial metrics (→ depends on 2 via data) + 4. Generate plots (→ depends on 3 via sentinel) + 5. Forward-transform contrasts to template (→ depends on 1 via data; + runs in parallel with 2-4) + 6. Cleanup temp directories (→ depends on 4+5 via sentinels) + + Parameters + ---------- + input_image: + Path to the primary input image (T1 MPRAGE or T1 in DWI space). + + Returns + ------- + dict + Output paths for the processed session. + """ + input_path = Path(input_image) + session_name = input_path.parent.name + + output_dir = self.output_base_dir / session_name + tmp_dir = output_dir / "tmp" + vial_dir = output_dir / "vial_segmentations" + metrics_dir = output_dir / "metrics" + images_template_space_dir = output_dir / "images_template_space" + + for d in [tmp_dir, vial_dir, metrics_dir, images_template_space_dir]: + d.mkdir(parents=True, exist_ok=True) + + print(f"\n{'=' * 60}") + print(f"Processing Session: {session_name}") + print(f"Input: {input_image}") + print(f"Output: {output_dir}") + print(f"{'=' * 60}\n") + + # Gather contrast files before starting the workflow (deterministic glob) + contrast_files = sorted( + str(f) + for f in input_path.parent.glob("*.nii.gz") + if f.name != "TemplatePhantom_ScannerSpace.nii.gz" + ) + + wf = PhantomSessionWf( + input_image=input_image, + template_phantom=str(self.template_phantom), + vial_masks=[str(m) for m in self.vial_masks], + adc_vials=sorted(self.adc_vials), + output_prefix=str(tmp_dir / f"{session_name}_Transformed_"), + output_dir_str=str(output_dir), + session_name=session_name, + phantom_name=self.phantom_name, + template_dir_parent=str(self.template_dir.parent), + contrast_files=contrast_files, + output_format=self.output_format, + filename_prefix=self.filename_prefix, + ) + cache_dir = str(output_dir / ".pydra_cache") + sub = Submitter(worker="cf", cache_root=cache_dir) + try: + sub(wf, rerun=True) + finally: + # Cancel any pending asyncio tasks before closing the event loop. + # Pydra's ConcurrentFuturesWorker leaves tasks pending after the + # workflow completes; without this, Python 3.12 logs + # "Task was destroyed but it is pending!" for each one. + import asyncio as _asyncio + _loop = sub.loop + if _loop and not _loop.is_closed(): + _pending = _asyncio.all_tasks(_loop) + if _pending: + for _t in _pending: + _t.cancel() + _loop.run_until_complete( + _asyncio.gather(*_pending, return_exceptions=True) + ) + sub.close() + + self._run_temperature_analysis(metrics_dir, session_name) + + print(f"\n{'=' * 60}") + print(f"✓ Session {session_name} complete!") + print(f" Metrics: {metrics_dir}") + print(f" Vial masks: {vial_dir}") + print(f" Template-space images: {images_template_space_dir}") + print(f"{'=' * 60}\n") + + return { + "session": session_name, + "output_dir": str(output_dir), + "metrics_dir": str(metrics_dir), + "vial_dir": str(vial_dir), + "images_template_space_dir": str(images_template_space_dir), + "space_image": str(output_dir / "TemplatePhantom_ScannerSpace.nii.gz"), + } + + def _run_temperature_analysis(self, metrics_dir: Path, session_name: str) -> None: + """Estimate phantom temperature from ADC metrics when calibration data is available. + + Writes an interactive HTML report to ``metrics_dir/plots/``. + Silently skips if ADC metrics, calibration LUT, or phantom config are absent. + """ + adc_xlsx = metrics_dir / "xlsx" / "ADC.xlsx" + if not adc_xlsx.exists(): + return + + calib_lut = self.template_dir.parent / "DIFFUSION-O-3574_Calibration_GSP_PVP_20220331.xlsx" + phantom_cfg_path = self.template_dir.parent / "phantom_config.json" + + if not calib_lut.exists() or not phantom_cfg_path.exists(): + print(" Temperature estimation skipped: calibration LUT or phantom config not found.") + return + + print(f"\n Running temperature estimation for {session_name}...") + try: + from phantomkit.plotting.calibration_plotter import ( + parse_calibration_xlsx, + load_phantom_config, + build_vial_map, + estimate_temperature, + build_vials_html, + ) + + formulations = parse_calibration_xlsx(str(calib_lut)) + _adc_df = pd.read_excel(adc_xlsx, sheet_name="mean") + vials_adc = { + str(row.iloc[0]).strip(): float(row.iloc[1]) + for _, row in _adc_df.iterrows() + } + phantom_cfg = load_phantom_config(str(phantom_cfg_path)) + vial_map = build_vial_map(phantom_cfg, self.phantom_name) + + results = [] + for vial, adc_raw in vials_adc.items(): + form_query = vial_map.get(vial) + if form_query is None: + continue + try: + res = estimate_temperature( + formulations, str(form_query), D=adc_raw, vial=vial + ) + results.append(res) + except ValueError: + pass + + if not results: + print(" Temperature estimation: no matching vials found.") + return + + plots_dir = metrics_dir / "plots" + plots_dir.mkdir(parents=True, exist_ok=True) + output_html = plots_dir / f"{self.phantom_name}_temperature_estimates.html" + output_html.write_text( + build_vials_html(formulations, results, phantom_name=self.phantom_name), + encoding="utf-8", + ) + print(f" ✓ Temperature estimates: {output_html.name}") + except Exception as e: + print(f" Temperature estimation failed: {e}") diff --git a/phantomkit/pipeline.py b/phantomkit/pipeline.py new file mode 100644 index 0000000..432621c --- /dev/null +++ b/phantomkit/pipeline.py @@ -0,0 +1,828 @@ +#!/usr/bin/env python3 +""" +pipeline.py +=========== +End-to-end orchestrator for the phantomkit phantom QC pipeline. + +Stages +------ + Stage 1 DWI processing (phantomkit.dwi_processing) + Runs if DWI acquisitions are found in --input-dir. + Outputs per DWI series: + T1_in_DWI_space.nii.gz, ADC.nii.gz, FA.nii.gz, + DWI_preproc_biascorr.mif.gz + + Stage 2 Phantom QC in DWI space (phantomkit.phantom_processor) + Runs once per DWI series produced by Stage 1. + Input image: T1_in_DWI_space.nii.gz from Stage 1. + ADC and FA files in the same folder are picked up automatically. + Temperature estimation runs automatically after this stage when + ADC metrics are available. + + Stage 3 Phantom QC on native contrasts (phantomkit.phantom_processor) + Runs if the input directory contains IR and/or TE series. + All contrast DICOMs (T1, IR, TE) are converted to NIfTI into a + temporary staging folder; the phantom processor then registers + the T1 and extracts vial metrics from every NIfTI present. + Temperature estimation runs automatically if ADC is present. + +Usage +----- + phantomkit pipeline \\ + --input-dir /path/to/patient/scans \\ + --output-dir /path/to/outputs \\ + --phantom SPIRIT + + The input directory may contain series sub-directories holding DICOM files, + NIfTI files (.nii / .nii.gz), or MRtrix MIF files (.mif / .mif.gz). + Format detection is automatic per sub-directory. + + Optional flags: + --denoise-degibbs pass to DWI pipeline + --gradcheck pass to DWI pipeline + --nocleanup keep DWI tmp/ directories + --readout-time override TotalReadoutTime (seconds) + --eddy-options override FSL eddy options string + --dry-run plan and print; do not execute + +Path conventions (shared repo) +------------------------------- + template_data//ImageTemplate.nii.gz + template_data//VialsLabelled/*.nii.gz + template_data//adc_reference.json + template_data/rotations.txt + +The template_data/ directory is resolved relative to the installed +package's location (``phantomkit/`` directory → ``../template_data/``). +""" + +import argparse +import re +import shutil +import subprocess +import sys +from pathlib import Path + + +# --------------------------------------------------------------------------- +# Path resolution +# +# template_data/ sits at /template_data/ — one level above the +# phantomkit/ package directory. +# --------------------------------------------------------------------------- + + +def _find_template_data_root() -> Path: + """ + Locate the template_data/ directory relative to this file. + Walks up from phantomkit/ to the repo root. + """ + candidate = Path(__file__).resolve().parent # phantomkit/ + for _ in range(3): + td = candidate / "template_data" + if td.is_dir(): + return td + candidate = candidate.parent + raise RuntimeError( + f"Could not locate template_data/ within 3 levels of {Path(__file__).resolve()}" + ) + + +TEMPLATE_DATA_ROOT = _find_template_data_root() + + +def _find_dwi_processing_script() -> Path: + """Locate dwi_processing.py within the package.""" + return Path(__file__).resolve().parent / "dwi_processing.py" + + +DWI_SCRIPT = _find_dwi_processing_script() + +CALIBRATION_PLOTTER_SCRIPT = Path(__file__).resolve().parent / "plotting" / "calibration_plotter.py" +CALIBRATION_LUT = TEMPLATE_DATA_ROOT / "DIFFUSION-O-3574_Calibration_GSP_PVP_20220331.xlsx" +PHANTOM_CONFIG = TEMPLATE_DATA_ROOT / "phantom_config.json" + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def print_header(title: str): + bar = "=" * 70 + print(f"\n{bar}") + print(f" {title}") + print(f"{bar}\n") + + +def run_cmd(cmd: list, label: str): + """Run a subprocess command, streaming output and raising on failure.""" + print(f" >> {' '.join(str(c) for c in cmd)}\n") + result = subprocess.run([str(c) for c in cmd]) + if result.returncode != 0: + raise RuntimeError(f"{label} failed (exit {result.returncode}).") + + +def _detect_series_format(series_dir: Path) -> str: + """Return 'nifti', 'mif', or 'dicom' based on file contents of series_dir.""" + if any(series_dir.glob("*.nii.gz")) or any(series_dir.glob("*.nii")): + return "nifti" + if any(series_dir.glob("*.mif.gz")) or any(series_dir.glob("*.mif")): + return "mif" + return "dicom" + + +_FLAT_IMAGE_EXTS = (".nii.gz", ".nii", ".mif.gz", ".mif") +_SIDECAR_EXTS = (".bvec", ".bval", ".json") + + +def _wrap_flat_inputs(input_dir: Path, output_dir: Path) -> Path: + """ + If input_dir contains flat NIfTI/MIF files rather than subdirectories, + stage them into per-stem subdirectories under output_dir/_staged_input/ + so scan_input_dir can classify them by name. Existing subdirectories + and sidecar files (.bvec/.bval/.json) are also linked in. + Returns the staged path, or input_dir unchanged if no flat images found. + """ + flat_files = [ + f + for f in sorted(input_dir.iterdir()) + if f.is_file() and any(f.name.endswith(ext) for ext in _FLAT_IMAGE_EXTS) + ] + if not flat_files: + return input_dir + + staged = output_dir / "_staged_input" + staged.mkdir(parents=True, exist_ok=True) + + for d in sorted(input_dir.iterdir()): + if d.is_dir(): + link = staged / d.name + if not link.exists(): + link.symlink_to(d) + + for img in flat_files: + stem = img.name + for ext in sorted(_FLAT_IMAGE_EXTS, key=len, reverse=True): + if stem.endswith(ext): + stem = stem[: -len(ext)] + break + sub = staged / stem + sub.mkdir(exist_ok=True) + img_link = sub / img.name + if not img_link.exists(): + img_link.symlink_to(img) + for sc_ext in _SIDECAR_EXTS: + sc = input_dir / (stem + sc_ext) + if sc.exists(): + sc_link = sub / sc.name + if not sc_link.exists(): + sc_link.symlink_to(sc) + + return staged + + +def stage_series_dir(series_dir: Path, out_dir: Path) -> list: + """ + Stage a series directory into out_dir as .nii.gz files. + Handles DICOM (dcm2niix), NIfTI (copy), and MIF (mrconvert). + Returns list of produced .nii.gz paths. + """ + out_dir.mkdir(parents=True, exist_ok=True) + fmt = _detect_series_format(series_dir) + + if fmt == "nifti": + produced = [] + for nii in sorted(series_dir.glob("*.nii.gz")): + dst = out_dir / nii.name + shutil.copy2(nii, dst) + produced.append(str(dst)) + for nii in sorted(series_dir.glob("*.nii")): + dst = out_dir / (nii.stem + ".nii.gz") + subprocess.run( + ["mrconvert", str(nii), str(dst)], check=True, capture_output=True + ) + produced.append(str(dst)) + if not produced: + raise FileNotFoundError(f"No NIfTI files found in {series_dir}") + return produced + + if fmt == "mif": + produced = [] + mifs = sorted(series_dir.glob("*.mif.gz")) + sorted(series_dir.glob("*.mif")) + for mif in mifs: + stem = mif.name + for ext in (".mif.gz", ".mif"): + if stem.endswith(ext): + stem = stem[: -len(ext)] + break + dst = out_dir / f"{stem}.nii.gz" + subprocess.run( + ["mrconvert", str(mif), str(dst)], check=True, capture_output=True + ) + produced.append(str(dst)) + if not produced: + raise FileNotFoundError(f"No MIF files found in {series_dir}") + return produced + + # DICOM fallback + subprocess.run( + ["dcm2niix", "-o", str(out_dir), "-f", "%p", "-z", "y", str(series_dir)], + check=True, + capture_output=True, + ) + niis = sorted(out_dir.glob("*.nii.gz")) + if not niis: + raise FileNotFoundError(f"dcm2niix produced no NIfTI from {series_dir}") + return [str(p) for p in niis] + + +def scan_input_dir(input_dir: Path) -> dict: + """ + Classify subdirectories in input_dir into: + t1_dirs – folders matching 't1' (case-insensitive) + ir_dirs – folders matching 'se_ir' or standalone 'ir' + te_dirs – folders matching 't2_se' or standalone 'te' + dwi_dirs – folders matching '_diff_' or '_DWI_' (case-insensitive) + AND not ending in _ADC or _FA + other_dirs – everything else + """ + t1_dirs, ir_dirs, te_dirs, dwi_dirs, other_dirs = [], [], [], [], [] + + for d in sorted(input_dir.iterdir()): + if not d.is_dir(): + continue + name = d.name + + if re.search(r"_(ADC|FA)$", name, re.IGNORECASE): + other_dirs.append(d) + continue + + if re.search(r"t1", name, re.IGNORECASE): + t1_dirs.append(d) + elif re.search(r"se_ir|(? str: + """ + Derive a clean session name from the input directory. + Strips any leading series-number prefix (e.g. '87-PatientID' → 'PatientID'). + """ + name = input_dir.name + stripped = re.sub(r"^\d+-", "", name) + return stripped if stripped else name + + +# --------------------------------------------------------------------------- +# Stage 1: DWI processing +# --------------------------------------------------------------------------- + + +def run_stage1(input_dir: Path, output_dir: Path, cfg: dict, dry_run: bool) -> list: + """ + Run dwi_processing.py on input_dir. + Returns list of DWI output subdirectory Paths (one per processed series). + """ + print_header("STAGE 1 — DWI Processing") + + cmd = [ + sys.executable, + str(DWI_SCRIPT), + "--scans-dir", + str(input_dir), + "--output-dir", + str(output_dir), + ] + + if cfg.get("denoise_degibbs"): + cmd.append("--denoise-degibbs") + if cfg.get("gradcheck"): + cmd.append("--gradcheck") + if cfg.get("nocleanup"): + cmd.append("--nocleanup") + if cfg.get("readout_time") is not None: + cmd += ["--readout-time", str(cfg["readout_time"])] + if cfg.get("eddy_options") is not None: + cmd += ["--eddy-options", cfg["eddy_options"]] + + if dry_run: + print(" [DRY RUN] Would execute:") + print(f" {' '.join(str(c) for c in cmd)}\n") + return [] + + run_cmd(cmd, "Stage 1 (DWI processing)") + + _t1_names = {"T1_in_DWI_space.nii.gz", "T1.nii.gz"} + dwi_output_dirs = [ + d + for d in sorted(output_dir.iterdir()) + if d.is_dir() and any((d / n).exists() for n in _t1_names) + ] + + print(f"\n Stage 1 complete. Found {len(dwi_output_dirs)} processed DWI series.") + for d in dwi_output_dirs: + print(f" {d.name}") + + return dwi_output_dirs + + +# --------------------------------------------------------------------------- +# Stage 2: Phantom QC in DWI space +# --------------------------------------------------------------------------- + + +def run_stage2( + dwi_output_dirs: list, + output_dir: Path, + template_dir: Path, + dry_run: bool, + input_identifier: str = "", +): + """ + For each DWI output directory, run PhantomProcessor on + T1_in_DWI_space.nii.gz (or T1.nii.gz for rpe_none). + ADC.nii.gz and FA.nii.gz in the same folder are picked up automatically. + """ + print_header("STAGE 2 — Phantom QC in DWI Space") + + if not dwi_output_dirs: + print(" No DWI output directories to process — skipping Stage 2.\n") + return + + for dwi_dir in dwi_output_dirs: + t1_in_dwi = next( + ( + dwi_dir / n + for n in ("T1_in_DWI_space.nii.gz", "T1.nii.gz") + if (dwi_dir / n).exists() + ), + None, + ) + + if t1_in_dwi is None: + print(f" WARNING: No T1 image found in {dwi_dir.name} — skipping.") + continue + + print(f" Processing: {dwi_dir.name}") + print(f" Input image: {t1_in_dwi}") + print(f" Contrast images found alongside T1:") + for nii in sorted(dwi_dir.glob("*.nii.gz")): + print(f" {nii.name}") + + if dry_run: + print(f" [DRY RUN] Would run PhantomProcessor on {t1_in_dwi.name}\n") + continue + + from phantomkit.phantom_processor import PhantomProcessor + + processor = PhantomProcessor( + template_dir=str(template_dir), + output_base_dir=str(output_dir), + filename_prefix=input_identifier, + ) + processor.process_session(str(t1_in_dwi)) + print() + + print(" Stage 2 complete.\n") + + +# --------------------------------------------------------------------------- +# Calibration plotter: temperature estimation from vial ADC values +# --------------------------------------------------------------------------- + + +def run_calibration_plot( + dwi_output_dirs: list, + output_dir: Path, + phantom: str, + dry_run: bool, +): + """ + For each processed DWI series, run the calibration plotter in vials mode + to estimate vial temperatures from the ADC_mean_matrix.csv produced by + Stage 2. Output HTML is written to /plots/. + """ + print_header("STAGE 4 — Calibration Temperature Estimation") + + if not dwi_output_dirs: + print(" No DWI output directories — skipping calibration plots.\n") + return + + for dwi_dir in dwi_output_dirs: + session_name = dwi_dir.name + metrics_dir = output_dir / session_name / "metrics" + adc_csv = metrics_dir / "csv" / "ADC_mean_matrix.csv" + output_html = metrics_dir / f"{phantom}_vial_temperature_estimates.html" + + if not adc_csv.exists(): + print(f" WARNING: ADC CSV not found for {session_name} — skipping.") + print(f" Expected: {adc_csv}\n") + continue + + print(f" Series: {session_name}") + print(f" ADC CSV: {adc_csv}") + print(f" Output: {output_html}") + + if dry_run: + print(" [DRY RUN] Would run calibration plotter.\n") + continue + + cmd = [ + sys.executable, + str(CALIBRATION_PLOTTER_SCRIPT), + "vials", + str(CALIBRATION_LUT), + str(adc_csv), + str(PHANTOM_CONFIG), + "--phantom", phantom, + "--output", str(output_html), + ] + run_cmd(cmd, f"Calibration plotter ({session_name})") + print() + + print(" Stage 4 complete.\n") + + +# --------------------------------------------------------------------------- +# Stage 3: Phantom QC on native contrasts +# --------------------------------------------------------------------------- + + +def run_stage3( + input_dir: Path, + output_dir: Path, + template_dir: Path, + scan_info: dict, + dry_run: bool, + input_identifier: str = "", +): + """ + Convert T1, IR, and TE DICOMs to NIfTI into a staging folder, then + run PhantomProcessor on the T1. The processor picks up all NIfTIs + in the staging folder automatically. + """ + print_header("STAGE 3 — Phantom QC on Native Contrasts") + + t1_dirs = scan_info["t1_dirs"] + ir_dirs = scan_info["ir_dirs"] + te_dirs = scan_info["te_dirs"] + + if not t1_dirs: + print(" No T1 directory found — cannot run Stage 3.\n") + return + + session_name = derive_session_name(input_dir) + staging_dir = output_dir / "native_contrasts_staging" + + print(f" Session name: {session_name}") + print(f" Staging folder: {staging_dir}") + print(f" T1 dirs: {[d.name for d in t1_dirs]}") + print(f" IR dirs: {[d.name for d in ir_dirs]}") + print(f" TE dirs: {[d.name for d in te_dirs]}") + print() + + # Pick the T1 with the lowest series number + def _series_num(d: Path) -> int: + m = re.match(r"^(\d+)-", d.name) + return int(m.group(1)) if m else 0 + + primary_t1_dir = sorted(t1_dirs, key=_series_num)[0] + contrast_dirs_to_convert = [primary_t1_dir] + ir_dirs + te_dirs + + if dry_run: + print(" [DRY RUN] Would stage series to NIfTI and place in staging folder:") + for d in contrast_dirs_to_convert: + fmt = _detect_series_format(d) + print(f" {d.name} ({fmt}) → {staging_dir}/") + print("\n [DRY RUN] Would run PhantomProcessor on staged T1 NIfTI.\n") + return + + # Stage series to NIfTI (handles DICOM, NIfTI, and MIF inputs) + staging_dir.mkdir(parents=True, exist_ok=True) + t1_nii_path = None + + for series_dir in contrast_dirs_to_convert: + fmt = _detect_series_format(series_dir) + print(f" Staging series ({fmt}): {series_dir.name}") + try: + produced = stage_series_dir(series_dir, staging_dir) + print(f" Produced: {[Path(p).name for p in produced]}") + if series_dir == primary_t1_dir: + t1_nii_path = Path(produced[0]) + except Exception as e: + print(f" WARNING: Staging failed for {series_dir.name}: {e}") + if series_dir == primary_t1_dir: + print(" Cannot proceed with Stage 3 without a T1 image.") + shutil.rmtree(staging_dir, ignore_errors=True) + return + + if t1_nii_path is None or not t1_nii_path.exists(): + print(" ERROR: T1 NIfTI was not produced — aborting Stage 3.") + shutil.rmtree(staging_dir, ignore_errors=True) + return + + print(f"\n All NIfTIs in staging folder:") + for nii in sorted(staging_dir.glob("*.nii.gz")): + print(f" {nii.name}") + + # Run phantom processor + print(f"\n Running PhantomProcessor:") + print(f" Input image: {t1_nii_path}") + print(f" Output base: {output_dir}") + + from phantomkit.phantom_processor import PhantomProcessor + + processor = PhantomProcessor( + template_dir=str(template_dir), + output_base_dir=str(output_dir), + filename_prefix=input_identifier, + ) + processor.process_session(str(t1_nii_path)) + + # Clean up staging NIfTIs only — leave processed outputs in place + print(f"\n Removing temporary NIfTIs from staging folder: {staging_dir}") + for nii in staging_dir.glob("*.nii.gz"): + nii.unlink(missing_ok=True) + for jsn in staging_dir.glob("*.json"): + jsn.unlink(missing_ok=True) + try: + staging_dir.rmdir() + print(f" Removed empty staging directory: {staging_dir.name}") + except OSError: + print( + f" Staging directory retained (contains phantom outputs): " + f"{staging_dir.name}" + ) + + print("\n Stage 3 complete.\n") + + +# --------------------------------------------------------------------------- +# Validation +# --------------------------------------------------------------------------- + + +def validate_inputs(args): + """Validate paths and phantom name before any processing.""" + errors = [] + + input_dir = Path(args.input_dir) + if not input_dir.is_dir(): + errors.append(f"--input-dir does not exist or is not a directory: {input_dir}") + + phantom_dir = TEMPLATE_DATA_ROOT / args.phantom + if not phantom_dir.is_dir(): + errors.append( + f"Phantom template directory not found: {phantom_dir}\n" + f" Expected: template_data/{args.phantom}/" + ) + else: + template_img = phantom_dir / "ImageTemplate.nii.gz" + vials_dir = phantom_dir / "VialsLabelled" + if not template_img.exists(): + errors.append(f"ImageTemplate.nii.gz not found in: {phantom_dir}") + if not vials_dir.is_dir() or not list(vials_dir.glob("*.nii.gz")): + errors.append( + f"VialsLabelled/ with .nii.gz masks not found in: {phantom_dir}" + ) + + if not DWI_SCRIPT.exists(): + errors.append(f"DWI processing script not found: {DWI_SCRIPT}") + + if errors: + print("\nValidation errors:") + for e in errors: + print(f" ✗ {e}") + sys.exit(1) + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + + +def _cleanup_tmp_only_dirs(output_dir: Path) -> None: + """Remove subdirectories of output_dir that contain only tmp-like directories.""" + _tmp_pattern = re.compile(r"^(tmp|\.pydra)", re.IGNORECASE) + for d in sorted(output_dir.iterdir()): + if not d.is_dir(): + continue + children = list(d.iterdir()) + if not children: + continue + if all(c.is_dir() and _tmp_pattern.match(c.name) for c in children): + shutil.rmtree(d) + print(f" Removed tmp-only directory: {d.name}") + + +def main(): + parser = argparse.ArgumentParser( + description="End-to-end phantomkit phantom QC + DWI processing pipeline.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + + parser.add_argument( + "--input-dir", + required=True, + help=( + "Root directory containing acquisition subdirectories. " + "Each sub-directory may hold DICOM, NIfTI (.nii/.nii.gz), " + "or MIF (.mif/.mif.gz) files — format is detected automatically." + ), + ) + parser.add_argument( + "--output-dir", + required=True, + help="Top-level output directory. All results are written here.", + ) + parser.add_argument( + "--phantom", + required=True, + help="Phantom name, e.g. SPIRIT. Used to locate template_data//.", + ) + parser.add_argument( + "--denoise-degibbs", + action="store_true", + default=False, + help="Apply dwidenoise + mrdegibbs before preprocessing.", + ) + parser.add_argument( + "--gradcheck", + action="store_true", + default=False, + help="Run dwigradcheck to verify gradient orientations.", + ) + parser.add_argument( + "--nocleanup", + action="store_true", + default=False, + help="Keep DWI tmp/ intermediate directories.", + ) + parser.add_argument( + "--readout-time", + type=float, + default=None, + help="Override TotalReadoutTime (seconds) for dwifslpreproc.", + ) + parser.add_argument( + "--eddy-options", + type=str, + default=None, + help="Override FSL eddy options string.", + ) + parser.add_argument( + "--dry-run", + action="store_true", + default=False, + help="Plan and print commands; do not execute any processing.", + ) + + args = parser.parse_args() + + input_dir = Path(args.input_dir).resolve() + output_dir = Path(args.output_dir).resolve() + phantom = args.phantom + template_dir = TEMPLATE_DATA_ROOT / phantom + input_identifier = derive_session_name(input_dir) + + validate_inputs(args) + output_dir.mkdir(parents=True, exist_ok=True) + input_dir = _wrap_flat_inputs(input_dir, output_dir) + + dwi_cfg = { + "denoise_degibbs": args.denoise_degibbs, + "gradcheck": args.gradcheck, + "nocleanup": args.nocleanup, + "readout_time": args.readout_time, + "eddy_options": args.eddy_options, + } + + # ── Discover what's in the input directory ─────────────────────────────── + print_header("Input Directory Scan") + scan_info = scan_input_dir(input_dir) + + print(f" Input directory: {input_dir}") + print(f" Phantom: {phantom}") + print(f" Template dir: {template_dir}") + print(f" Output dir: {output_dir}") + print() + print(f" T1 directories: {len(scan_info['t1_dirs'])}") + for d in scan_info["t1_dirs"]: + print(f" {d.name}") + print(f" IR directories: {len(scan_info['ir_dirs'])}") + for d in scan_info["ir_dirs"]: + print(f" {d.name}") + print(f" TE directories: {len(scan_info['te_dirs'])}") + for d in scan_info["te_dirs"]: + print(f" {d.name}") + print(f" DWI candidate dirs: {len(scan_info['dwi_dirs'])}") + for d in scan_info["dwi_dirs"]: + print(f" {d.name}") + print(f" Other (ignored): {len(scan_info['other_dirs'])}") + print() + + run_stage1_flag = scan_info["has_dwi"] + run_stage3_flag = bool(scan_info["t1_dirs"]) and ( + scan_info["has_native_contrasts"] or not run_stage1_flag + ) + + print( + f" Stage 1 (DWI): " + f"{'YES' if run_stage1_flag else 'NO (no DWI found)'}" + ) + print( + f" Stage 2 (phantom QC, DWI space): " + f"{'YES (runs per DWI series)' if run_stage1_flag else 'NO'}" + ) + print( + f" Stage 3 (phantom QC, native T1): " + f"{'YES' if run_stage3_flag else 'NO (no T1/IR/TE found)'}" + ) + print( + f" Stage 4 (calibration temp. est.): " + f"{'YES (runs per DWI series)' if run_stage1_flag else 'NO'}" + ) + print() + + if args.dry_run: + print(" NOTE: --dry-run is active. No processing will be performed.\n") + + # ── Execution ───────────────────────────────────────────────────────────── + # Stages run sequentially: 1 → 2 → 3 → 4. + # (Stage 1 shells out to dwifslpreproc/eddy which are already multi-threaded; + # Stage 3 runs ANTs which is also multi-threaded. Parallel execution of + # stages gives no wall-time benefit and produces interleaved output.) + + # Stage 1 — DWI processing + dwi_output_dirs = [] + if run_stage1_flag: + dwi_output_dirs = run_stage1(input_dir, output_dir, dwi_cfg, args.dry_run) + else: + print_header("STAGE 1 — DWI Processing") + print(" Skipped: no DWI acquisitions found.\n") + + # Stage 2 — Phantom QC in DWI space (follows Stage 1) + if run_stage1_flag: + run_stage2(dwi_output_dirs, output_dir, template_dir, args.dry_run, input_identifier) + else: + print_header("STAGE 2 — Phantom QC in DWI Space") + print(" Skipped: Stage 1 did not run.\n") + + # Stage 3 — Phantom QC on native contrasts + if run_stage3_flag: + run_stage3(input_dir, output_dir, template_dir, scan_info, args.dry_run, input_identifier) + else: + print_header("STAGE 3 — Phantom QC on Native Contrasts") + if not scan_info["t1_dirs"]: + print(" Skipped: no T1 directory found.\n") + else: + print(" Skipped: no IR or TE series found, and DWI pipeline was run.\n") + + # Stage 4 — Calibration temperature estimation (requires Stage 1/2 ADC output) + if run_stage1_flag: + run_calibration_plot(dwi_output_dirs, output_dir, phantom, args.dry_run) + else: + print_header("STAGE 4 — Calibration Temperature Estimation") + print(" Skipped: no DWI acquisitions found.\n") + + # ── Cleanup tmp-only directories ───────────────────────────────────────── + if not args.dry_run: + _cleanup_tmp_only_dirs(output_dir) + + # ── Summary ─────────────────────────────────────────────────────────────── + print_header("Pipeline Complete") + print(f" All outputs written to: {output_dir}\n") + + if not args.dry_run: + print(" Output structure:") + for item in sorted(output_dir.iterdir()): + if item.is_dir(): + print(f" {item.name}/") + for sub in sorted(item.iterdir()): + if sub.is_dir(): + print(f" {sub.name}/") + else: + print(f" {sub.name}") + print() + + +if __name__ == "__main__": + main() diff --git a/phantomkit/plotting/PLOTTING_OVERVIEW.md b/phantomkit/plotting/PLOTTING_OVERVIEW.md new file mode 100644 index 0000000..7adea5e --- /dev/null +++ b/phantomkit/plotting/PLOTTING_OVERVIEW.md @@ -0,0 +1,162 @@ +# PhantomKit — Interactive Plot Overview + +## Purpose + +PhantomKit QA generates a set of **self-contained interactive HTML files** for each scan session. Each file can be opened in any web browser with no server, no dependencies, and no internet connection — all data (images and charts) are embedded directly inside the HTML. + +--- + +## Output files + +| File | Contents | +|---|---| +| `{contrast_name}.html` | Per-contrast vial scatter plot (one per DWI/T1/FA/ADC contrast) | +| `{contrast_name}.png` | Per-contrast scatter plot for individual Inversion Recovery (IR) and Multi-Echo Spin Echo (MESE) timepoints | +| `T1_mapping.html` | Inversion Recovery (IR) T1 curve fits for all vials | +| `T2_mapping.html` | Multi-Echo Spin Echo (MESE) T2 decay fits for all vials | + +All files live in `{session}/metrics/plots/`. + +--- + +## Series naming conventions + +PhantomKit uses **word-boundary token matching** to classify contrast series automatically. Filenames are matched case-insensitively; the token must not be directly adjacent to alphanumeric characters on either side. + +| Series type | Radiology term | Filename token | Example filenames | +|---|---|---|---| +| Inversion Recovery | Inversion Recovery (IR), Magnetisation-Prepared Rapid Gradient Echo (MPRAGE) | `ir` | `se_ir_100.nii.gz`, `IR_500.nii.gz` | +| Multi-Echo Spin Echo | Multi-Echo Spin Echo (MESE), T2-weighted SE | `te` | `t2_se_TE_14.nii.gz`, `TE_80.nii.gz` | +| T1-weighted / MPRAGE | T1 MPRAGE, T1-Flash | `t1` or `mprage` | `T1.nii.gz`, `MPRAGE.nii.gz` | +| ADC map | Apparent Diffusion Coefficient | `adc` | `ADC.nii.gz` | +| FA map | Fractional Anisotropy | `fa` | `FA.nii.gz` | + +The **numeric suffix** in IR and MESE filenames is interpreted as the physical parameter value: +- IR: the inversion time **TI** (ms), e.g. `se_ir_500` → TI = 500 ms +- MESE: the echo time **TE** (ms), e.g. `t2_se_TE_80` → TE = 80 ms + +These values are used as the x-axis in the T1/T2 mapping plots and for fitting the relaxation models. + +--- + +## What each plot contains + +### Interactive controls (all HTML plots) + +All HTML plots share a unified control bar: + +| Control | Function | +|---|---| +| **Measure** — Mean / Median | Switches all scatter data points and error bars between the mean and median of each vial. For relaxometry plots, the T1/T2 curve fits and fit-results table are also recomputed independently for each measure. | +| **Error bars** — ±SD / ±SE / ±2 SE / ±MAD / IQR / Min–Max / None | Selects the error bar style. All variants are pre-computed at page-load time and stored in `PK_DATA.errBounds`; switching is instant with no recomputation. | +| **Legend** — Show / Hide | Toggles the Chart.js legend on all subplots simultaneously. Hidden by default to reduce clutter; internal CI-band datasets (prefixed `_`) are always excluded from the legend. | + +#### Error bar definitions + +| Variant | Definition | +|---|---| +| ±SD | Mean ± standard deviation | +| ±SE | Mean ± standard error (SD / √n) | +| ±2 SE | Mean ± 2× standard error (≈ 95% CI of the mean) | +| ±MAD | Central value ± Mean Absolute Deviation. For the **Mean** measure: MAD = mean(\|x − mean(x)\|). For the **Median** measure: MAD = mean(\|x − median(x)\|). | +| IQR | 25th–75th percentile bar (computed via `mrdump` + `numpy.percentile`). Previously computed via `mrthreshold -percentile` which was unreliable; now uses a direct voxel dump. | +| Min–Max | Range from minimum to maximum voxel value. | + +### Per-contrast scatter plots (`plot_vial_intensity`) + +These cover ADC, FA, and any other single-volume contrast (e.g. T1_in_DWI_space). + +- **Chart.js scatter chart** showing per-vial mean intensity ± std dev. +- **ADC mode** additionally overlays reference ADC values (from `adc_reference.json`) as red open circles; measured values are blue filled circles. +- **FA mode** fixes the y-axis to 0–1. +- For single-graph plots (ADC, FA, T1) the chart fills the full page width and every vial gets an x-axis label. +- **Embedded MRI viewer** (NiiVue) showing the contrast image with vial ROI overlays (see below). For ADC, only vials E–L (the calibration vials) are shown as toggleable overlays. + +### Relaxometry maps (`plot_vial_ir_means_std`, `plot_vial_te_means_std`) + +- **8-panel Chart.js grid** — one subplot per vial group — showing mean intensity vs TI (T1) or TE (T2), with fitted mono-exponential / inversion-recovery curves and 95% confidence intervals. +- **Measured vs Reference chart** — a full-width scatter showing fitted T1 or T2 (ms) per vial (blue filled circles) alongside reference values from `t1t2_reference.json` (red open circles). The vial order matches descending relaxation time. +- **Fit results table** — per-vial T1/T2, S0, R², sorted by descending relaxation time. A separate table is shown for the Mean and Median measures and toggled automatically by the Measure control. +- **Embedded MRI viewer** showing the subject T1 anatomical (or first matching contrast as fallback), with only the vials listed in `t1t2_reference.json` shown as toggleable overlays. + +--- + +## Embedded MRI viewer (NiiVue) + +All plots contain a self-contained MRI viewer rendered by [NiiVue](https://github.com/niivue/niivue) v0.46. + +### How embedding works + +1. **NIfTI → base64**: Each NIfTI file is read from disk and base64-encoded in Python. Files stored as float64 are automatically repacked as float32 to halve the payload size. +2. **Blob URLs at runtime**: JavaScript decodes the base64 string into a `Uint8Array`, wraps it in a `Blob`, and creates a temporary `URL.createObjectURL()` URL. NiiVue loads volumes from these in-memory URLs — no HTTP requests are made. +3. **Canvas initialisation**: A `ResizeObserver` waits until the canvas has non-zero painted dimensions before calling `loadVolumes`, ensuring the viewer always renders at the correct size. + +### Viewer configuration + +- `isAntiAlias: false` — nearest-neighbour interpolation (no blurring). +- `sliceType: 0` — axial single-slice view. +- `dragMode` uses the NiiVue default (1 = drag to adjust contrast), which keeps the scroll wheel free for slice navigation. +- A `{ passive: false }` wheel listener prevents the browser from scrolling the page when the cursor is over the canvas. +- For ADC maps, `setCalMinMax(0, 0.0, 0.004)` is called after loading to window the intensity appropriately. + +### Vial overlays + +- All vial NIfTIs are embedded alongside the background image. +- Each vial appears as a **red semi-transparent overlay** (opacity 0.5). +- Toggle chip buttons above the viewer show/hide individual vials via `setOpacity`. +- For ADC plots, only the ADC calibration vials (E–L) are included. +- For T1/T2 mapping, only vials listed in `t1t2_reference.json` are included. + +--- + +## Metrics xlsx structure + +Each per-contrast xlsx written by the pipeline contains the following sheets: + +| Sheet | Contents | +|---|---| +| `mean` | Per-vial voxel mean (one column per volume) | +| `median` | Per-vial voxel median | +| `std` | Per-vial standard deviation | +| `min` | Per-vial minimum voxel value | +| `max` | Per-vial maximum voxel value | +| `count` | Number of voxels in each vial ROI | +| `p25` | 25th percentile (computed via `mrdump` + `numpy.percentile`) | +| `p75` | 75th percentile (same method) | +| `mean_mad` | Mean Absolute Deviation from mean: mean(\|x − mean(x)\|) | +| `median_mad` | Mean Absolute Deviation from median: mean(\|x − median(x)\|) | + +Plotting functions degrade gracefully if a sheet is absent (e.g. when reading older xlsx files without MAD sheets) by substituting a fallback value derived from the mean and std columns. + +--- + +## Reference data + +Reference values live in `template_data/{phantom}/`: + +| File | Contents | +|---|---| +| `adc_reference.json` | Per-vial reference ADC values (mm²/s) for vials E–L | +| `t1t2_reference.json` | Per-vial reference T₁ and T₂ relaxation times (ms) from Inversion Recovery and Multi-Echo Spin Echo fits | + +Both files share the same JSON structure: +```json +{ + "vials": ["A", "B", ...], + "": { "A": , "B": , ... } +} +``` + +Vial label matching is case-insensitive throughout. + +--- + +## Key libraries + +| Library | Role | +|---|---| +| [Chart.js](https://www.chartjs.org/) v4.4 | Interactive scatter/line charts with zoom and pan | +| [NiiVue](https://github.com/niivue/niivue) v0.46 | WebGL MRI viewer; loaded from local bundle (`niivue.umd.min.js`) or CDN fallback | +| [chartjs-plugin-zoom](https://www.chartjs.org/chartjs-plugin-zoom/) | Wheel-zoom and pinch-zoom for Chart.js | +| scipy / numpy | Curve fitting (T1/T2 models) | +| pydra | Task orchestration for the full processing pipeline | diff --git a/phantomkit/plotting/_html_common.py b/phantomkit/plotting/_html_common.py new file mode 100644 index 0000000..b23ed14 --- /dev/null +++ b/phantomkit/plotting/_html_common.py @@ -0,0 +1,1148 @@ +""" +Shared HTML generation utilities for phantomkit interactive plots. + +Provides CDN constants, CSS, JavaScript plugins, and data embedding +utilities used by vial_intensity, maps_ir, and maps_te. +""" + +from __future__ import annotations + +import base64 +import json +import re +from pathlib import Path + +# --------------------------------------------------------------------------- +# CDN constants (pinned versions) +# --------------------------------------------------------------------------- + +CHARTJS_CDN = "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js" +HAMMERJS_CDN = "https://cdnjs.cloudflare.com/ajax/libs/hammer.js/2.0.8/hammer.min.js" +ZOOM_CDN = ( + "https://cdnjs.cloudflare.com/ajax/libs/" + "chartjs-plugin-zoom/1.2.1/chartjs-plugin-zoom.min.js" +) + +_NIIVUE_CDN = ( + "https://cdn.jsdelivr.net/npm/@niivue/niivue@0.46.0/dist/niivue.umd.min.js" +) +_NIIVUE_BUNDLE = Path(__file__).parent / "niivue.umd.min.js" + + +def _niivue_script_tag() -> str: + """Return a ", r"<\/script>", src) + return f"" + return f'' + + +def nifti_to_base64(path: str) -> str: + """Base64-encode a NIfTI file for embedding in an HTML page. + + If the file stores float64 voxels it is re-packed as float32 in-memory + before encoding — halving the payload with no perceptible visual change. + The result is always a valid ``.nii.gz`` byte stream. + """ + import gzip + import io + import struct + + import numpy as np # type: ignore[import] + + raw = Path(path).read_bytes() + + # Decompress if gzipped so we can inspect/rewrite the header + try: + data = gzip.decompress(raw) + except OSError: + data = raw # already uncompressed .nii + + # NIfTI-1 datatype field is a little-endian int16 at byte offset 70 + (dtype_code,) = struct.unpack_from("= 352 else 352 + + hdr = bytearray(data[:vox_start]) + # Patch datatype (offset 70) and bitpix (offset 72) for float32 + struct.pack_into(" str: + return _PALETTE[idx % len(_PALETTE)] + + +# --------------------------------------------------------------------------- +# CSS +# --------------------------------------------------------------------------- + +_CSS = """ + *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + :root { + --bg: #ffffff; --bg2: #f4f4f2; --bg3: #e9e9e6; + --text: #1a1a18; --text2: #5f5e5a; --border: rgba(0,0,0,0.12); + --radius: 8px; --font: system-ui, -apple-system, sans-serif; + } + @media (prefers-color-scheme: dark) { + :root { + --bg: #1c1c1a; --bg2: #252523; --bg3: #2e2e2b; + --text: #e8e8e4; --text2: #888780; --border: rgba(255,255,255,0.10); + } + } + body { font-family: var(--font); background: var(--bg); color: var(--text); padding: 24px; } + h1 { font-size: 18px; font-weight: 500; margin-bottom: 4px; } + .subtitle { font-size: 13px; color: var(--text2); margin-bottom: 20px; } + .controls { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; margin-bottom: 20px; } + label { font-size: 12px; color: var(--text2); font-weight: 500; } + .panel-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-bottom: 24px; + } + @media (max-width: 900px) { .panel-row { grid-template-columns: 1fr; } } + .chart-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 16px; + margin-bottom: 24px; + } + @media (max-width: 900px) { .chart-grid { grid-template-columns: 1fr; } } + .chart-card { + background: var(--bg2); border: 0.5px solid var(--border); + border-radius: 12px; padding: 16px; + } + .chart-title { font-size: 13px; font-weight: 500; margin-bottom: 8px; } + .chart-wrap { position: relative; width: 100%; height: 280px; } + /* Legend */ + .legend-row { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; } + .legend-item { + display: flex; align-items: center; gap: 6px; font-size: 12px; + color: var(--text2); padding: 4px 10px; border-radius: var(--radius); + background: var(--bg2); border: 0.5px solid var(--border); + } + .legend-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } + /* Stats table */ + .stats-section { margin-top: 28px; } + .stats-title { font-size: 13px; font-weight: 500; color: var(--text2); margin-bottom: 10px; } + .stats-table { width: 100%; border-collapse: collapse; font-size: 12px; } + .stats-table th { + text-align: left; padding: 6px 10px; background: var(--bg3); + border-bottom: 0.5px solid var(--border); color: var(--text2); font-weight: 500; + } + .stats-table td { padding: 5px 10px; border-bottom: 0.5px solid var(--border); } + .stats-table tr:last-child td { border-bottom: none; } + /* Measure / error-bar toggle controls */ + .pk-controls { + display: flex; gap: 14px; flex-wrap: wrap; margin: 0 0 14px; + align-items: center; padding: 8px 12px; + background: var(--bg2); border-radius: 8px; border: 0.5px solid var(--border); + } + .pk-ctrl-group { display: flex; align-items: center; gap: 4px; } + .pk-ctrl-label { + font-size: 11px; color: var(--text2); margin-right: 6px; + text-transform: uppercase; letter-spacing: 0.05em; + } + .pk-btn { + padding: 3px 10px; font-size: 12px; border: 1px solid var(--border); + border-radius: 4px; background: transparent; color: var(--text2); + cursor: pointer; transition: background 0.1s, color 0.1s, border-color 0.1s; line-height: 1.5; + } + .pk-btn.active { background: #378ADD; color: #fff; border-color: #378ADD; } + .pk-btn:hover:not(.active) { border-color: #888; color: var(--text); } +""" + +# --------------------------------------------------------------------------- +# Shared JavaScript — error bar plugin and base chart options +# --------------------------------------------------------------------------- + +ERROR_BAR_PLUGIN_JS = """ +const errorBarPlugin = { + id: "errorBar", + afterDatasetsDraw(chart) { + if (window._pkShowErrBars === false) return; + const ctx = chart.ctx; + chart.data.datasets.forEach((ds, di) => { + if (!ds.errorBars) return; + const meta = chart.getDatasetMeta(di); + if (meta.hidden) return; + ctx.save(); ctx.strokeStyle = ds.borderColor; ctx.lineWidth = 1.2; + Object.entries(ds.errorBars).forEach(([i, eb]) => { + const el = meta.data[+i]; if (!el) return; + const x = el.x, cap = 4; + const yMin = chart.scales.y.getPixelForValue(eb.yMin); + const yMax = chart.scales.y.getPixelForValue(eb.yMax); + if (!isFinite(yMin) || !isFinite(yMax)) return; + ctx.beginPath(); + ctx.moveTo(x, yMin); ctx.lineTo(x, yMax); + ctx.moveTo(x-cap, yMin); ctx.lineTo(x+cap, yMin); + ctx.moveTo(x-cap, yMax); ctx.lineTo(x+cap, yMax); + ctx.stroke(); + }); + ctx.restore(); + }); + } +}; +""" + + +PK_CONTROLS_HTML = """\ +
+
+ Measure + + +
+
+ Error bars + + + + + + + +
+
""" + +PK_CONTROLS_HTML_WITH_LEGEND = """\ +
+
+ Measure + + +
+
+ Error bars + + + + + + + +
+
+ Legend + +
+
""" + +PK_TOGGLE_JS = """ +window._pkMeasure = "mean"; +window._pkErrMode = "sd"; +window._pkShowLegend = false; +window._pkAfterUpdate = null; +var _pkCharts = []; + +function pkSetMeasure(mode, btn) { + window._pkMeasure = mode; + document.querySelectorAll(".pk-measure-btn").forEach(b => b.classList.remove("active")); + btn.classList.add("active"); + pkUpdateAllCharts(); +} + +function pkSetErrMode(mode, btn) { + window._pkErrMode = mode; + document.querySelectorAll(".pk-err-btn").forEach(b => b.classList.remove("active")); + btn.classList.add("active"); + pkUpdateAllCharts(); +} + +function pkToggleLegend(btn) { + window._pkShowLegend = !window._pkShowLegend; + btn.textContent = window._pkShowLegend ? "Hide" : "Show"; + btn.classList.toggle("active", window._pkShowLegend); + _pkCharts.forEach(ch => { + ch.options.plugins.legend.display = window._pkShowLegend; + ch.update("none"); + }); +} + +function pkUpdateAllCharts() { + const m = window._pkMeasure, e = window._pkErrMode; + _pkCharts.forEach(ch => { + ch.data.datasets.forEach((ds, di) => { + if (ds._row !== undefined) { + const vals = PK_DATA.measure[m][ds._row]; + ds.data.forEach((pt, k) => { pt.y = vals[k]; }); + const eb = (e !== "none" && PK_DATA.errBounds[m] && PK_DATA.errBounds[m][e]); + if (eb) { + const lo = PK_DATA.errBounds[m][e].lower[ds._row]; + const hi = PK_DATA.errBounds[m][e].upper[ds._row]; + ds.errorBars = {}; + lo.forEach((l, k) => { ds.errorBars[String(k)] = { yMin: l, yMax: hi[k] }; }); + } else { + ds.errorBars = {}; + } + } + if (ds._fit_measure !== undefined) { + ch.setDatasetVisibility(di, ds._fit_measure === m); + } + if (ds._refMeas && typeof _REF_MEAS !== "undefined") { + const pts = _REF_MEAS[m]; + ds.data.length = 0; + pts.forEach(p => ds.data.push(p)); + } + }); + ch.update("none"); + }); + // Toggle fit results tables (relaxometry plots only) + document.querySelectorAll(".pk-fit-table").forEach(el => { + el.style.display = (el.dataset.measure === m) ? "" : "none"; + }); + if (typeof window._pkAfterUpdate === "function") window._pkAfterUpdate(); +} +""" + + +def _compute_pk_err_bounds( + mean_m, median_m, std_m, count_m, p25_m, p75_m, min_m, max_m, + mean_mad_m=None, median_mad_m=None, +) -> dict: + """Compute all error bound variants for embedding in HTML. + + All inputs are numpy arrays of the same shape (n_rows, n_cols). + Returns a dict keyed by measure → variant → {lower, upper} lists. + """ + import numpy as np + + se_m = std_m / np.sqrt(np.maximum(count_m, 1.0)) + _mean_mad = mean_mad_m if mean_mad_m is not None else std_m + _median_mad = median_mad_m if median_mad_m is not None else std_m + + def _b(lo, hi): + return {"lower": lo.tolist(), "upper": hi.tolist()} + + result = {} + for key, vals, mad in ( + ("mean", mean_m, _mean_mad), + ("median", median_m, _median_mad), + ): + result[key] = { + "sd": _b(vals - std_m, vals + std_m), + "se": _b(vals - se_m, vals + se_m), + "2se": _b(vals - 2 * se_m, vals + 2 * se_m), + "mad": _b(vals - mad, vals + mad), + "iqr": _b(p25_m, p75_m), + "minmax": _b(min_m, max_m), + } + return result + + +def base_opts_js( + x_label: str = "x", y_label: str = "Intensity", enable_zoom: bool = True +) -> str: + """Return a JS baseOpts() function for Chart.js. + + Parameters + ---------- + enable_zoom : bool + When True (default) zoom/pan via the chartjs-plugin-zoom is active. + Pass False to disable zoom and pan entirely (e.g. for ADC, FA, vial + intensity charts where scroll-to-zoom is undesirable). + """ + if enable_zoom: + zoom_plugin = """\ + zoom: { + zoom: { wheel: { enabled: true }, pinch: { enabled: true }, mode: "xy" }, + pan: { enabled: true, mode: "xy" }, + }""" + else: + zoom_plugin = """\ + zoom: { + zoom: { wheel: { enabled: false }, pinch: { enabled: false } }, + pan: { enabled: false }, + }""" + return f""" +function baseOpts(xLabel, yLabel) {{ + xLabel = xLabel || {json.dumps(x_label)}; + yLabel = yLabel || {json.dumps(y_label)}; + const isDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + const grid = isDark ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.07)"; + const tick = "#888780"; + return {{ + responsive: true, maintainAspectRatio: false, + plugins: {{ + legend: {{ + display: false, + onClick: null, + labels: {{ + filter: (item, data) => data.datasets[item.datasetIndex]._row !== undefined, + color: "#888780", font: {{ size: 11 }} + }} + }}, + tooltip: {{ callbacks: {{ label: ctx => `${{ctx.dataset.label}}: ${{ctx.parsed.y.toFixed(2)}}` }} }}, +{zoom_plugin} + }}, + scales: {{ + x: {{ type: "linear", + title: {{ display: true, text: xLabel, color: tick, font: {{ size: 13 }} }}, + ticks: {{ color: tick, font: {{ size: 13 }} }}, grid: {{ color: grid }} }}, + y: {{ title: {{ display: true, text: yLabel, color: tick, font: {{ size: 13 }} }}, + ticks: {{ color: tick, font: {{ size: 13 }} }}, grid: {{ color: grid }} }} + }} + }}; +}} +""" + + +# --------------------------------------------------------------------------- +# Embedded data tag +# --------------------------------------------------------------------------- + + +def phantomkit_data_tag(data: dict) -> str: + """Return a " + ) + + +# --------------------------------------------------------------------------- +# NiiVue viewer panel (base64-embedded NIfTI — no server required) +# --------------------------------------------------------------------------- + + +def _niivue_viewer_panel( + nifti_image: str, + vial_niftis: dict[str, str], + bg_cal_min: float | None = None, + bg_cal_max: float | None = None, + overlay_nifti: str | None = None, + overlay_label: str = "Contrast", +) -> tuple[str, str]: + """Build an embedded NiiVue viewer panel for a static HTML page. + + NIfTI files are base64-encoded and converted to blob URLs at runtime so + the HTML is fully self-contained with no HTTP server required. + + Parameters + ---------- + nifti_image: + Path to the background NIfTI file. + vial_niftis: + ``{vial_name: path}`` mapping for ROI overlay NIfTI files. Only + files that exist on disk are included. + bg_cal_min, bg_cal_max: + Optional intensity window for the background volume (e.g. 0/0.004 for ADC). + overlay_nifti: + Optional path to a second image (e.g. first IR/TE contrast) shown as a + toggleable "hot" overlay on top of the background. + overlay_label: + Button label for the overlay toggle (e.g. "IR contrast"). + + Returns + ------- + html_panel : str + The ``
`` element containing the canvas and vial toggle chips. + js_block : str + JavaScript that initialises NiiVue and defines ``pkToggleVial``. + """ + bg_b64 = nifti_to_base64(nifti_image) + + vials_data = [ + {"name": name, "b64": nifti_to_base64(vpath)} + for name, vpath in sorted(vial_niftis.items()) + if vpath and Path(vpath).exists() + ] + + _has_overlay = bool(overlay_nifti and Path(overlay_nifti).exists()) + overlay_b64 = nifti_to_base64(overlay_nifti) if _has_overlay else None + + chips = "".join( + f'' + for i, v in enumerate(vials_data) + ) + chips_section = ( + ( + '

' + "Toggle vial ROIs

" + f'
{chips}
' + ) + if vials_data + else "" + ) + + overlay_btn_html = ( + f'' + if _has_overlay + else "" + ) + + _zoom_btn_style = ( + "padding:3px 8px;border-radius:99px;border:1.5px solid var(--border);" + "background:var(--bg3);color:var(--text2);font-size:13px;font-weight:600;" + "cursor:pointer;user-select:none;transition:opacity .15s;line-height:1;" + ) + html_panel = f"""
+
+

MRI Viewer

+
+ {overlay_btn_html} + + + +
+
+ +

Scroll: change slice · Ctrl+scroll or +/−: zoom · drag: adjust contrast · axial / coronal / sagittal

+ {chips_section} +
""" + + bg_b64_js = json.dumps(bg_b64) + vials_js = json.dumps(vials_data) + overlay_b64_js = json.dumps(overlay_b64) + cal_min_js = "null" if bg_cal_min is None else str(float(bg_cal_min)) + cal_max_js = "null" if bg_cal_max is None else str(float(bg_cal_max)) + + js_block = f""" +var _NV_BG = {bg_b64_js}; +var _NV_VIALS = {vials_js}; +var _NV_OVERLAY = {overlay_b64_js}; +var _NV_CAL_MIN = {cal_min_js}; +var _NV_CAL_MAX = {cal_max_js}; + +(function() {{ + var canvas = document.getElementById("nv-canvas"); + if (!canvas) return; + var ro = new ResizeObserver(function(entries) {{ + for (var i = 0; i < entries.length; i++) {{ + var r = entries[i].contentRect; + var w = Math.round(r.width), h = Math.round(r.height); + if (w > 0 && h > 0) {{ ro.disconnect(); _pkInitNv(canvas, w, h); break; }} + }} + }}); + ro.observe(canvas); +}})(); + +function _pkB64ToUrl(b64) {{ + var bin = atob(b64), arr = new Uint8Array(bin.length); + for (var i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i); + return URL.createObjectURL(new Blob([arr], {{type:"application/octet-stream"}})); +}} + +function _pkInitNv(canvas, w, h) {{ + canvas.width = w; canvas.height = h; + // Ctrl+scroll → zoom via scene.pan2Dxyzmm[3] (the 2-D zoom scale in NiiVue). + // Plain scroll is left for NiiVue's own wheelListener (slice navigation). + canvas.addEventListener("wheel", function(e) {{ + e.preventDefault(); + if ((e.ctrlKey || e.metaKey) && window._pkNv && window._pkNv.scene) {{ + e.stopPropagation(); + var factor = e.deltaY < 0 ? 1.15 : 1 / 1.15; + window._pkNv.scene.pan2Dxyzmm[3] = Math.max(0.1, window._pkNv.scene.pan2Dxyzmm[3] * factor); + window._pkNv.drawScene(); + }} + }}, {{ passive: false }}); + window._pkNv = new niivue.Niivue({{ + isColorbar: false, crosshairWidth: 1, isResizeCanvas: false, + isAntiAlias: false, + multiplanarLayout: 3, + multiplanarShowRender: 0, + }}); + window._pkNv.attachToCanvas(canvas); + window._pkNv.opts.sliceType = 3; + var vols = [{{url: _pkB64ToUrl(_NV_BG), name: "background.nii.gz", colormap: "gray"}}]; + for (var i = 0; i < _NV_VIALS.length; i++) {{ + vols.push({{ + url: _pkB64ToUrl(_NV_VIALS[i].b64), + name: _NV_VIALS[i].name + ".nii.gz", + colormap: "red", + opacity: 0.5, + }}); + }} + if (_NV_OVERLAY !== null) {{ + vols.push({{ + url: _pkB64ToUrl(_NV_OVERLAY), + name: "contrast_overlay.nii.gz", + colormap: "winter", + opacity: 0.0, + }}); + }} + window._pkNv.loadVolumes(vols).then(function() {{ + window._pkNv.setRadiologicalConvention(true); + if (_NV_CAL_MIN !== null && _NV_CAL_MAX !== null) {{ + if (typeof window._pkNv.setCalMinMax === "function") {{ + window._pkNv.setCalMinMax(0, _NV_CAL_MIN, _NV_CAL_MAX); + }} else if (window._pkNv.volumes && window._pkNv.volumes[0]) {{ + window._pkNv.volumes[0].cal_min = _NV_CAL_MIN; + window._pkNv.volumes[0].cal_max = _NV_CAL_MAX; + window._pkNv.updateGLVolume(); + }} + }} + }}); +}} + +function pkToggleVial(idx, btn) {{ + if (!window._pkNv) return; + var wasActive = btn.dataset.active === "1"; + btn.dataset.active = wasActive ? "0" : "1"; + btn.style.opacity = wasActive ? "0.35" : "1.0"; + window._pkNv.setOpacity(idx, wasActive ? 0.0 : 0.5); +}} + +function pkToggleOverlay(btn) {{ + if (!window._pkNv || _NV_OVERLAY === null) return; + var wasActive = btn.dataset.active === "1"; + btn.dataset.active = wasActive ? "0" : "1"; + btn.style.opacity = wasActive ? "0.55" : "1.0"; + var overlayIdx = _NV_VIALS.length + 1; + window._pkNv.setOpacity(overlayIdx, wasActive ? 0.0 : 0.6); +}} + +function pkZoom(factor) {{ + if (!window._pkNv || !window._pkNv.scene) return; + window._pkNv.scene.pan2Dxyzmm[3] = Math.max(0.1, window._pkNv.scene.pan2Dxyzmm[3] * factor); + window._pkNv.drawScene(); +}} + +function pkToggleRadConvention(btn) {{ + if (!window._pkNv) return; + var isRad = btn.dataset.rad === "1"; + btn.dataset.rad = isRad ? "0" : "1"; + btn.textContent = isRad ? "Neurological" : "Radiological"; + window._pkNv.setRadiologicalConvention(!isRad); +}} +""" + return html_panel, js_block + + +# --------------------------------------------------------------------------- +# Relaxometry (IR / TE) 3×3 HTML builder +# --------------------------------------------------------------------------- + + +def build_relaxometry_html( + *, + title: str, + subtitle: str, + x_label: str, + fit_label: str, + fit_key: str, + vial_groups: list, + contrast_numbers, + mean_matrix, + std_matrix, + vial_labels: list, + subplot_fits: list, + embedded_data: dict, + subplot_fits_median: list | None = None, + fit_results_median: list | None = None, + median_matrix=None, + count_matrix=None, + p25_matrix=None, + p75_matrix=None, + min_matrix=None, + max_matrix=None, + mean_mad_matrix=None, + median_mad_matrix=None, + nifti_image: str | None = None, + vial_niftis: dict | None = None, + ref_data: dict | None = None, + overlay_contrast: str | None = None, +) -> str: + """Build the interactive HTML for a relaxometry (IR or TE) plot. + + Parameters + ---------- + title : str + Page/plot title (e.g. "T1 Inversion Recovery Mapping"). + subtitle : str + Short description line. + x_label : str + X-axis label (e.g. "Inversion Time (ms)"). + fit_label : str + Legend label for fit curve (e.g. "T₁ fit"). + fit_key : str + Key in fit_results for the relaxation time (e.g. "T1_ms"). + vial_groups : list of list of str + Groups of vial names for the subplot grid. + contrast_numbers : array-like + Sorted numeric values (TI or TE) used as x-axis. + mean_matrix : ndarray + Shape (n_vials, n_contrasts) — mean intensities, rows=vials, cols=contrasts. + std_matrix : ndarray + Shape (n_vials, n_contrasts) — std deviations, same layout. + vial_labels : list of str + Ordered list of vial names matching row order in mean_matrix. + subplot_fits : list of dict + One entry per vial group, each with pre-computed fit data: + {"vial": str, "color": str, "x_fit": list, "y_fit": list, + "ci_upper": list or None, "ci_lower": list or None} + embedded_data : dict + Data to embed as machine-readable JSON in the HTML. + overlay_contrast : str, optional + Path to a NIfTI file (e.g. first IR or TE image) to offer as a + toggleable "hot" overlay in the MRI viewer. + """ + import numpy as np + + vial_to_idx = {label: i for i, label in enumerate(vial_labels)} + # Convert to plain Python float so json.dumps handles them without error + # (contrast_numbers may be a numpy array of int64 or float64) + x_arr = [float(x) for x in contrast_numbers] + + # Fall back to mean-based proxies when optional matrices are absent + _median = median_matrix if median_matrix is not None else mean_matrix + _count = count_matrix if count_matrix is not None else np.ones_like(mean_matrix) * 1000 + _p25 = p25_matrix if p25_matrix is not None else mean_matrix - std_matrix + _p75 = p75_matrix if p75_matrix is not None else mean_matrix + std_matrix + _min = min_matrix if min_matrix is not None else mean_matrix - std_matrix + _max = max_matrix if max_matrix is not None else mean_matrix + std_matrix + _mean_mad = mean_mad_matrix if mean_mad_matrix is not None else None + _median_mad = median_mad_matrix if median_mad_matrix is not None else None + + # Pre-compute all error bound variants for the toggle controls + pk_err_bounds = _compute_pk_err_bounds( + mean_matrix, _median, std_matrix, _count, _p25, _p75, _min, _max, + mean_mad_m=_mean_mad, median_mad_m=_median_mad, + ) + pk_data_json = json.dumps({ + "measure": { + "mean": mean_matrix.tolist(), + "median": _median.tolist(), + }, + "errBounds": pk_err_bounds, + }) + + # Helper: build CI band + fit line datasets tagged with a measure + def _fit_datasets_for(fit_entry_, color_, measure_): + dsets = [] + if not fit_entry_ or not fit_entry_.get("x_fit"): + return dsets + xf_ = fit_entry_["x_fit"] + yf_ = fit_entry_["y_fit"] + ci_lo_ = fit_entry_.get("ci_lower") + ci_hi_ = fit_entry_.get("ci_upper") + if ci_hi_ and ci_lo_: + dsets.append({ + "label": "_ci_upper", "_fit_measure": measure_, + "data": [{"x": xf_[k], "y": ci_hi_[k]} for k in range(len(xf_))], + "borderColor": "transparent", "backgroundColor": color_ + "22", + "pointRadius": 0, "borderWidth": 0, "showLine": True, + "tension": 0.3, "fill": "+1", + }) + dsets.append({ + "label": "_ci_lower", "_fit_measure": measure_, + "data": [{"x": xf_[k], "y": ci_lo_[k]} for k in range(len(xf_))], + "borderColor": "transparent", "backgroundColor": "transparent", + "pointRadius": 0, "borderWidth": 0, "showLine": True, + "tension": 0.3, "fill": False, + }) + dsets.append({ + "label": fit_label, "_fit_measure": measure_, + "data": [{"x": xf_[k], "y": yf_[k]} for k in range(len(xf_))], + "borderColor": color_ + "bb", "backgroundColor": "transparent", + "pointRadius": 0, "borderWidth": 1.5, "borderDash": [4, 3], + "showLine": True, "tension": 0.3, "fill": False, + }) + return dsets + + _have_median_fits = subplot_fits_median is not None + + # Build per-subplot Chart.js dataset lists + subplot_datasets = [] + for g_idx, group in enumerate(vial_groups): + group_datasets = [] + group_fits_this = [f for f in subplot_fits if f["vial"] in group] + group_fits_med = [f for f in (subplot_fits_median or []) if f["vial"] in group] + + for j, vial in enumerate(group): + if vial not in vial_to_idx: + continue + row = vial_to_idx[vial] + color = chart_color(j if len(group) > 1 else 8) # black-ish for single + + means = mean_matrix[row, :].tolist() + stds = std_matrix[row, :].tolist() + + scatter_ds = { + "label": f"Vial {vial}", + "_row": row, + "data": [{"x": x_arr[k], "y": means[k]} for k in range(len(x_arr))], + "borderColor": color, + "backgroundColor": color + "33", + "pointBackgroundColor": color, + "pointRadius": 5, + "pointHoverRadius": 7, + "borderWidth": 0, + "showLine": False, + "errorBars": { + str(k): {"yMin": means[k] - stds[k], "yMax": means[k] + stds[k]} + for k in range(len(x_arr)) + }, + } + group_datasets.append(scatter_ds) + + # Mean fit datasets (always present; tagged so toggle can hide them) + fit_entry = next((f for f in group_fits_this if f["vial"] == vial), None) + group_datasets.extend(_fit_datasets_for( + fit_entry, color, "mean" if _have_median_fits else None + )) + + # Median fit datasets (only when median fits were computed) + if _have_median_fits: + med_fit_entry = next((f for f in group_fits_med if f["vial"] == vial), None) + group_datasets.extend(_fit_datasets_for(med_fit_entry, color, "median")) + + subplot_datasets.append(group_datasets) + + datasets_json = json.dumps(subplot_datasets) + x_label_json = json.dumps(x_label) + data_tag = phantomkit_data_tag(embedded_data) + opts_js = base_opts_js(x_label=x_label, y_label="Intensity", enable_zoom=True) + + # ------------------------------------------------------------------ + # Standardised axis bounds — shared across every subplot on the page + # ------------------------------------------------------------------ + x_min_plot = 0.0 + x_max_plot = float(np.max(contrast_numbers)) * 1.05 # 5 % right padding + + y_lower = float(np.minimum(_p25, mean_matrix - std_matrix).min()) + y_upper = float(np.maximum(_p75, mean_matrix + std_matrix).max()) + for _fit in subplot_fits: + for _key in ("y_fit", "ci_lower", "ci_upper"): + if _fit.get(_key): + y_lower = min(y_lower, min(_fit[_key])) + y_upper = max(y_upper, max(_fit[_key])) + _y_pad = (y_upper - y_lower) * 0.12 + y_min_raw = y_lower - _y_pad + y_max_raw = y_upper + _y_pad + + # Round to a sensible grid unit based on the data range so axis tick + # labels are clean integers (e.g. -200, 0, 1000, 2000 … not -187.3). + _range = y_max_raw - y_min_raw + _unit = 10 ** int(np.floor(np.log10(_range / 5))) if _range > 0 else 1 + y_min_plot = int(np.floor(y_min_raw / _unit)) * _unit + y_max_plot = int(np.ceil(y_max_raw / _unit)) * _unit + + axis_consts_js = ( + f"const X_MIN = {x_min_plot:.1f};\n" + f"const X_MAX = {x_max_plot:.1f};\n" + f"const Y_MIN = {y_min_plot};\n" + f"const Y_MAX = {y_max_plot};\n" + ) + + # ------------------------------------------------------------------ + # Fit-results table(s) (T1 / T2 per vial) + # ------------------------------------------------------------------ + fit_results = embedded_data.get("fit_results", []) + fit_unit_label = "T\u2081 (ms)" if fit_key == "T1_ms" else "T\u2082 (ms)" + + def _fit_table_body(results): + rows = "" + for r in sorted(results, key=lambda r: r.get(fit_key) or 0, reverse=True): + vial = r.get("Vial", "") + t_val = r.get(fit_key, "") + s0_val = r.get("S0", "") + r2_val = r.get("R2", "") + t_str = f"{t_val:.1f}" if isinstance(t_val, (int, float)) else str(t_val) + s0_str = f"{s0_val:.1f}" if isinstance(s0_val, (int, float)) else str(s0_val) + r2_str = f"{r2_val:.4f}" if isinstance(r2_val, (int, float)) else str(r2_val) + rows += f" {vial}{t_str}{s0_str}{r2_str}\n" + return rows + + if fit_results: + _mean_rows = _fit_table_body(fit_results) + if fit_results_median: + _med_rows = _fit_table_body(fit_results_median) + fits_table_html = f"""
+
Relaxometry Fit Results
+
+ + + +{_mean_rows} +
Vial{fit_unit_label} (mean fit)S0R\u00b2
+
+ +
""" + else: + fits_table_html = f"""
+
Relaxometry Fit Results
+ + + + + +{_mean_rows} +
Vial{fit_unit_label}S0R\u00b2
+
""" + else: + fits_table_html = "" + + # ------------------------------------------------------------------ + # Optional measured-vs-reference relaxometry chart + # ------------------------------------------------------------------ + ref_chart_html = "" + ref_chart_js = "" + if ref_data is not None and fit_results: + _ref_vials = ref_data.get("vials", []) + _ref_vals = ref_data.get(fit_key, {}) + _ref_upper = {k.upper(): v for k, v in _ref_vals.items()} + def _build_meas_pts(results): + mmap = { + r.get("Vial", "").upper(): r.get(fit_key) + for r in (results or []) + if r.get(fit_key) is not None + } + return [ + {"x": _j, "y": round(float(mmap[_v.upper()]), 1)} + for _j, _v in enumerate(_ref_vials) + if mmap.get(_v.upper()) is not None + ] + + _meas_pts = _build_meas_pts(fit_results) + _meas_pts_median = _build_meas_pts(fit_results_median or fit_results) + _ref_pts = [] + for _j, _v in enumerate(_ref_vials): + _mu = _v.upper() + if _ref_upper.get(_mu) is not None: + _ref_pts.append({"x": _j, "y": float(_ref_upper[_mu])}) + + _unit_label = "T\u2081 (ms)" if fit_key == "T1_ms" else "T\u2082 (ms)" + _meas_color = "#378ADD" # blue filled — measured + _ref_color = "#C62828" # red open circles — reference + _meas_ds = { + "label": f"Measured {_unit_label}", + "_refMeas": True, + "data": _meas_pts, + "borderColor": _meas_color, + "backgroundColor": _meas_color, + "pointBackgroundColor": _meas_color, + "pointRadius": 6, + "pointHoverRadius": 8, + "showLine": False, + "borderWidth": 0, + } + _ref_ds = { + "label": f"Reference {_unit_label}", + "data": _ref_pts, + "borderColor": "transparent", + "backgroundColor": "transparent", + "pointBackgroundColor": "transparent", + "pointBorderColor": _ref_color, + "pointBorderWidth": 2, + "pointRadius": 8, + "pointHoverRadius": 10, + "showLine": False, + "borderWidth": 0, + } + _vial_labels_json = json.dumps(_ref_vials) + _meas_ds_json = json.dumps(_meas_ds) + _ref_ds_json = json.dumps(_ref_ds) + _ref_meas_json = json.dumps({"mean": _meas_pts, "median": _meas_pts_median}) + _unit_label_json = json.dumps(_unit_label) + + ref_chart_html = f"""
+
Measured vs Reference {_unit_label}
+
+
""" + + ref_chart_js = f""" +const _REF_VIALS = {_vial_labels_json}; +const _REF_MEAS = {_ref_meas_json}; +(function() {{ + const opts = baseOpts("Vial", {_unit_label_json}); + opts.scales.x.type = "linear"; + opts.scales.x.ticks.stepSize = 1; + opts.scales.x.ticks.callback = v => _REF_VIALS[v] ?? v; + opts.plugins.legend.display = true; + opts.plugins.legend.onClick = null; + opts.plugins.legend.labels = {{ color: "#888780", font: {{ size: 12 }} }}; + const refChart = new Chart( + document.getElementById("refChart").getContext("2d"), + {{ type: "line", data: {{ datasets: [{_meas_ds_json}, {_ref_ds_json}] }}, options: opts }} + ); + _pkCharts.push(refChart); +}})();""" + + # ------------------------------------------------------------------ + # Optional NiiVue viewer panel + # ------------------------------------------------------------------ + _has_viewer = bool(nifti_image and Path(nifti_image).exists()) + if _has_viewer: + # Only show vials present in the reference JSON (if provided) + _viewer_vials = dict(vial_niftis or {}) + if ref_data is not None: + _ref_set = {v.upper() for v in ref_data.get("vials", [])} + _viewer_vials = {k: v for k, v in _viewer_vials.items() if k.upper() in _ref_set} + _overlay_label = "IR contrast" if fit_key == "T1_ms" else "TE contrast" + viewer_html, viewer_js = _niivue_viewer_panel( + nifti_image, # type: ignore[arg-type] + _viewer_vials, + overlay_nifti=overlay_contrast, + overlay_label=_overlay_label, + ) + else: + viewer_html = viewer_js = "" + + head = html_head(title, include_niivue=_has_viewer) + + # Build chart card divs — 2-column grid + chart_cards_html = "" + for g_idx, group in enumerate(vial_groups): + group_title = " & ".join(f"Vial {v}" for v in group) + chart_cards_html += f"""
+
{group_title}
+
+
+""" + + return f"""{head} + +

{title}

+

{subtitle}

+ +{viewer_html} + +{PK_CONTROLS_HTML_WITH_LEGEND} + +
+{chart_cards_html} +
+

+ Shaded band: 95 % CI of fitted curve (always based on mean) +

+ +{ref_chart_html} + +{fits_table_html} + +{data_tag} + + + +""" + + +def parse_phantomkit_html(html_path: str) -> dict: + """Parse the embedded phantomkit-data JSON from an HTML output file. + + Works without BeautifulSoup by using a simple regex, making it a + zero-dependency helper for downstream scripts. + """ + text = Path(html_path).read_text(encoding="utf-8") + m = re.search( + r'\s*(\{.*?\})\s*', + text, + re.DOTALL, + ) + if not m: + raise ValueError( + f"No phantomkit-data JSON block found in {html_path!r}. " + "Is this a phantomkit HTML output file?" + ) + return json.loads(m.group(1)) + + +# --------------------------------------------------------------------------- +# HTML head builder +# --------------------------------------------------------------------------- + + +def html_head(title: str, include_niivue: bool = False) -> str: + """Return the ```` block with Chart.js CDN scripts and shared CSS. + + Parameters + ---------- + include_niivue: + When True, the NiiVue script is added to the head (inlined bundle or + CDN fallback) for pages that embed an MRI viewer panel. + """ + niivue_tag = _niivue_script_tag() if include_niivue else "" + return f""" + + + + +{title} + + + +{niivue_tag} + + +""" diff --git a/phantomkit/plotting/calibration_plotter.py b/phantomkit/plotting/calibration_plotter.py new file mode 100644 index 0000000..17a9204 --- /dev/null +++ b/phantomkit/plotting/calibration_plotter.py @@ -0,0 +1,1092 @@ +""" +MRI Calibration Plotter & Temperature Estimator +================================================ +Reads a GSP/PVP phantom calibration xlsx and provides three modes: + + plot — interactive HTML showing all calibration curves + estimate — estimate temperature from a measured ADC value for one formulation + vials — batch estimate temperatures from a CSV of vial ADC measurements, + with a visualisation overlaid on the calibration curves + +Usage: + python calibration_plotter.py plot [output.html] + + python calibration_plotter.py estimate --D + can be an exact name, case-insensitive substring, or index number. + Use "list" to print available formulations. + --D accepts both mm²/s (e.g. 0.00196) and 10⁻³ mm²/s (e.g. 1.96) — auto-detected. + + python calibration_plotter.py vials --phantom [output.html] + vials.csv — two-column CSV: vial, ADC (mm²/s or 10⁻³ mm²/s, auto-detected) + phantom_config.json — JSON describing all phantoms: + { + "SPIRIT": {"5% Aqueous PVP NiCl2": ["E"], ...}, + "120E": {"5% Aqueous PVP NiCl2": ["G","M"], ...} + } + --phantom — which phantom to use (must match a key in phantom_config.json) + +Notes: + - Temperature estimation uses ADC only (most sensitive and monotonic parameter). + - T1 and T2 are present in the parsed data but not plotted or used for estimation. + - ADC units are auto-detected: values < 0.1 treated as mm²/s and converted to 10⁻³ mm²/s. +""" + +import sys +import json +import argparse +import warnings +import numpy as np +import pandas as pd +from pathlib import Path +from dataclasses import dataclass, field +from typing import Optional +from scipy.optimize import brentq + + +# --------------------------------------------------------------------------- +# Data structures +# --------------------------------------------------------------------------- + + +@dataclass +class ParameterEstimate: + """Temperature estimate from ADC.""" + + param: str # always "D" + measured: float # measured ADC in 10⁻³ mm²/s + temperature: float # estimated temperature (°C) + temp_unc: float # ±1σ uncertainty (°C) + fit_residual: float # RMS residual of polynomial fit (10⁻³ mm²/s) + poly_degree: int # polynomial degree used + t_range: tuple # (T_min, T_max) of calibration data + + +@dataclass +class TemperatureEstimate: + """Temperature estimate for a single formulation from ADC.""" + + formulation: str + vial: Optional[str] = None + estimate: Optional[ParameterEstimate] = None + + def summary(self) -> str: + prefix = f"Vial {self.vial} · " if self.vial else "" + lines = [f"{prefix}Formulation : {self.formulation}"] + lines.append("-" * 60) + if self.estimate: + e = self.estimate + lines.append( + f" ADC = {e.measured:.4f} × 10⁻³ mm²/s" + f" → T = {e.temperature:.2f} ± {e.temp_unc:.2f} °C" + ) + lines.append( + f" (degree-{e.poly_degree} poly, fit residual = {e.fit_residual:.4g}, " + f"valid T range {e.t_range[0]:.0f}–{e.t_range[1]:.0f} °C)" + ) + else: + lines.append(" No estimate available.") + return "\n".join(lines) + + +# --------------------------------------------------------------------------- +# Parsing — calibration spreadsheet +# --------------------------------------------------------------------------- + + +def parse_calibration_xlsx(filepath: str) -> dict: + """ + Parse the multi-formulation calibration spreadsheet. + Returns dict: { formulation_name: [ {"temperature": float, "D_val": float, ...} ] } + """ + xl = pd.ExcelFile(filepath) + sheet = xl.parse(xl.sheet_names[0], header=None) + + header_row = None + for i, row in sheet.iterrows(): + if any("Formulation" in str(v) for v in row.values if pd.notna(v)): + header_row = i + break + if header_row is None: + raise ValueError("Could not find header row containing 'Formulation Name'") + + data_start = header_row + 2 + headers = sheet.iloc[header_row].tolist() + + col_map = {"formulation": None, "temperature": None} + for idx, h in enumerate(headers): + h_str = str(h).strip().lower() + if "formulation" in h_str: + col_map["formulation"] = idx + elif "temperature" in h_str: + col_map["temperature"] = idx + + temp_col = col_map["temperature"] + numeric_cols = [ + i + for i in range(len(headers)) + if i > temp_col and str(headers[i]).strip() not in ("", "nan") + ] + + for pi, pair in enumerate(["D", "T1", "T2"]): + col_map[f"{pair}_val"] = ( + numeric_cols[2 * pi] if 2 * pi < len(numeric_cols) else None + ) + col_map[f"{pair}_unc"] = ( + numeric_cols[2 * pi + 1] if 2 * pi + 1 < len(numeric_cols) else None + ) + + formulations = {} + current_name = None + + for _, row in sheet.iloc[data_start:].reset_index(drop=True).iterrows(): + vals = row.tolist() + fname = ( + vals[col_map["formulation"]] if col_map["formulation"] is not None else None + ) + if pd.notna(fname) and str(fname).strip(): + current_name = str(fname).strip() + if current_name is None: + continue + try: + temp = float(vals[col_map["temperature"]]) + except (ValueError, TypeError): + continue + record = {"temperature": temp} + for param in ["D", "T1", "T2"]: + for suffix in ["_val", "_unc"]: + key = f"{param}{suffix}" + try: + record[key] = ( + float(vals[col_map[key]]) if col_map[key] is not None else None + ) + except (ValueError, TypeError): + record[key] = None + formulations.setdefault(current_name, []).append(record) + + return formulations + + +# --------------------------------------------------------------------------- +# Parsing — vials CSV and vial map JSON +# --------------------------------------------------------------------------- + + +def parse_vials_csv(filepath: str) -> dict: + """ + Parse a two-column CSV (vial, ADC). + Returns dict: { vial_label: adc_raw_float } + """ + df = pd.read_csv(filepath) + df.columns = [c.strip() for c in df.columns] + return { + str(row[df.columns[0]]).strip(): float(row[df.columns[1]]) + for _, row in df.iterrows() + } + + +def load_phantom_config(filepath: str) -> dict: + """Load phantom config JSON. Returns the full dict (all phantoms).""" + with open(filepath) as f: + return json.load(f) + + +def build_vial_map(phantom_config: dict, phantom_name: str) -> dict: + """ + Resolve a flat {vial_label: formulation_name} dict for a given phantom. + Raises KeyError with a helpful message if the phantom name is not found. + """ + available = list(phantom_config.keys()) + if phantom_name not in phantom_config: + raise KeyError( + f"Phantom {phantom_name!r} not found in config. " f"Available: {available}" + ) + flat = {} + for formulation, vials in phantom_config[phantom_name].items(): + for vial in vials: + flat[vial.strip()] = formulation + return flat + + +def autoconvert_adc(value: float) -> float: + """Convert mm²/s → 10⁻³ mm²/s if the value looks like mm²/s (< 0.1).""" + return value * 1000.0 if value < 0.1 else value + + +# --------------------------------------------------------------------------- +# Formulation resolution +# --------------------------------------------------------------------------- + + +def list_formulations(formulations: dict) -> None: + print("Available formulations:") + for i, (name, rows) in enumerate(formulations.items()): + temps = [r["temperature"] for r in rows if np.isfinite(r["temperature"])] + print( + f" [{i}] {name!r} ({len(temps)} points, T = {min(temps):.0f}–{max(temps):.0f} °C)" + ) + + +def resolve_formulation(formulations: dict, query: str) -> str: + """Match by exact name, case-insensitive substring, or integer index.""" + names = list(formulations.keys()) + try: + return names[int(query)] + except (ValueError, IndexError): + pass + if query in formulations: + return query + matches = [n for n in names if query.lower() in n.lower()] + if len(matches) == 1: + return matches[0] + if len(matches) > 1: + raise ValueError( + f"Ambiguous query {query!r}. Matches:\n" + + "\n".join(f" {m}" for m in matches) + ) + raise ValueError( + f"No formulation matching {query!r}.\nAvailable:\n" + + "\n".join(f" {n}" for n in names) + ) + + +# --------------------------------------------------------------------------- +# Temperature estimation — ADC only +# --------------------------------------------------------------------------- + + +def _best_poly_degree(n: int) -> int: + if n <= 3: + return 1 + if n <= 6: + return 2 + return 3 + + +def _fit_and_invert( + temps: np.ndarray, + values: np.ndarray, + uncertainties: np.ndarray, + measured: float, +) -> ParameterEstimate: + """ + Fit polynomial to ADC vs T calibration data, invert to find T. + Uncertainty estimated via Monte Carlo (2000 samples). + """ + mask = np.isfinite(temps) & np.isfinite(values) & np.isfinite(uncertainties) + temps, values, uncertainties = temps[mask], values[mask], uncertainties[mask] + + n = len(temps) + if n < 2: + raise ValueError(f"Insufficient valid calibration points ({n})") + + degree = _best_poly_degree(n) + + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + coeffs = np.polyfit(temps, values, degree) + poly = np.poly1d(coeffs) + + residual = float(np.sqrt(np.mean((poly(temps) - values) ** 2))) + t_min, t_max = float(temps.min()), float(temps.max()) + + cal_vals = [float(poly(t)) for t in temps] + cal_min, cal_max = min(cal_vals), max(cal_vals) + margin = 0.1 * (cal_max - cal_min) + if not (cal_min - margin <= measured <= cal_max + margin): + raise ValueError( + f"Measured ADC {measured:.4f} is outside calibration range " + f"[{cal_min:.4f}, {cal_max:.4f}] for T = {t_min:.1f}–{t_max:.1f} °C" + ) + + def solve_T(val: float, p: np.poly1d) -> Optional[float]: + f = lambda t: p(t) - val + lo, hi = t_min - 5, t_max + 5 + try: + if f(lo) * f(hi) < 0: + return float(brentq(f, lo, hi)) + except Exception: + pass + return None + + t_est = solve_T(measured, poly) + if t_est is None: + raise ValueError(f"Could not bracket root for ADC = {measured:.4f}") + + N_MC = 2000 + t_samples = [] + rng = np.random.default_rng(42) + + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + for _ in range(N_MC): + v_p = values + rng.normal(0, uncertainties) + m_p = measured + rng.normal(0, max(residual, 1e-9)) + c_p = np.polyfit(temps, v_p, degree) + t2 = solve_T(m_p, np.poly1d(c_p)) + if t2 is not None: + t_samples.append(t2) + + if len(t_samples) < 10: + raise ValueError("Monte Carlo uncertainty estimation failed (too few samples)") + + return ParameterEstimate( + param="D", + measured=measured, + temperature=t_est, + temp_unc=float(np.std(t_samples)), + fit_residual=residual, + poly_degree=degree, + t_range=(t_min, t_max), + ) + + +def estimate_temperature( + formulations: dict, + formulation_query: str, + D: float, + vial: Optional[str] = None, +) -> TemperatureEstimate: + """ + Estimate temperature from a measured ADC value. + + Parameters + ---------- + formulations : dict + From parse_calibration_xlsx(). + formulation_query : str + Name, substring, or integer index. + D : float + Measured ADC — auto-converted from mm²/s if needed. + vial : str, optional + Label for display/output purposes. + """ + D_conv = autoconvert_adc(D) + name = resolve_formulation(formulations, formulation_query) + rows = formulations[name] + + pts = [ + (r["temperature"], r["D_val"], r["D_unc"]) + for r in rows + if r["D_val"] is not None and r["D_unc"] is not None + ] + + result = TemperatureEstimate(formulation=name, vial=vial) + if len(pts) < 2: + print(f" Warning: insufficient calibration data for {name}") + return result + + temps_arr = np.array([p[0] for p in pts]) + vals_arr = np.array([p[1] for p in pts]) + uncs_arr = np.array([p[2] for p in pts]) + + try: + result.estimate = _fit_and_invert(temps_arr, vals_arr, uncs_arr, D_conv) + except ValueError as e: + print(f" Warning: {e}") + + return result + + +# --------------------------------------------------------------------------- +# Polynomial curve helper (dense fit line for HTML) +# --------------------------------------------------------------------------- + + +def _poly_curve(formulations: dict) -> dict: + """Return dense (T, D) polynomial fit curve per formulation.""" + curves = {} + for name, rows in formulations.items(): + pts = [ + (r["temperature"], r["D_val"]) + for r in rows + if r["D_val"] is not None and np.isfinite(r["temperature"]) + ] + if len(pts) < 2: + continue + temps = np.array([p[0] for p in pts]) + vals = np.array([p[1] for p in pts]) + mask = np.isfinite(temps) & np.isfinite(vals) + temps, vals = temps[mask], vals[mask] + degree = _best_poly_degree(len(temps)) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + coeffs = np.polyfit(temps, vals, degree) + poly = np.poly1d(coeffs) + t_dense = np.linspace(temps.min(), temps.max(), 120) + curves[name] = {"t": t_dense.tolist(), "d": poly(t_dense).tolist()} + return curves + + +# --------------------------------------------------------------------------- +# Shared HTML fragments +# --------------------------------------------------------------------------- + +_PALETTE = [ + "#378ADD", + "#D85A30", + "#1D9E75", + "#D4537E", + "#7F77DD", + "#BA7517", + "#639922", + "#888780", + "#185FA5", + "#993C1D", +] + +_CSS = """ + *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + :root { + --bg: #ffffff; --bg2: #f4f4f2; --bg3: #e9e9e6; + --text: #1a1a18; --text2: #5f5e5a; --border: rgba(0,0,0,0.12); + --radius: 8px; --font: system-ui, -apple-system, sans-serif; + } + @media (prefers-color-scheme: dark) { + :root { + --bg: #1c1c1a; --bg2: #252523; --bg3: #2e2e2b; + --text: #e8e8e4; --text2: #888780; --border: rgba(255,255,255,0.10); + } + } + body { font-family: var(--font); background: var(--bg); color: var(--text); padding: 24px; } + h1 { font-size: 18px; font-weight: 500; margin-bottom: 4px; } + .subtitle { font-size: 13px; color: var(--text2); margin-bottom: 20px; } + .controls { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; margin-bottom: 20px; } + .ctrl { display: flex; flex-direction: column; gap: 4px; } + label { font-size: 12px; color: var(--text2); font-weight: 500; } + select { + padding: 6px 10px; border: 0.5px solid var(--border); border-radius: var(--radius); + background: var(--bg2); color: var(--text); font-size: 13px; cursor: pointer; + appearance: none; padding-right: 28px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23888' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; background-position: right 8px center; + } + .toggle-row { display: flex; flex-wrap: wrap; gap: 6px; } + .chip { + display: flex; align-items: center; gap: 6px; padding: 5px 10px; + border-radius: 99px; border: 0.5px solid var(--border); cursor: pointer; + font-size: 12px; background: var(--bg2); user-select: none; transition: opacity 0.15s; + } + .chip.off { opacity: 0.35; } + .chip-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } + .charts { display: grid; grid-template-columns: 1fr; gap: 24px; } + @media (min-width: 900px) { .charts { grid-template-columns: 1fr 1fr; } } + .chart-card { + background: var(--bg2); border: 0.5px solid var(--border); border-radius: 12px; padding: 16px; + } + .chart-card.wide { grid-column: 1 / -1; } + .chart-title { font-size: 13px; font-weight: 500; margin-bottom: 4px; } + .chart-unit { font-size: 11px; color: var(--text2); margin-bottom: 12px; } + .chart-wrap { position: relative; width: 100%; height: 300px; } + .stats-section { margin-top: 28px; } + .stats-title { font-size: 13px; font-weight: 500; color: var(--text2); margin-bottom: 10px; } + .stats-table { width: 100%; border-collapse: collapse; font-size: 12px; } + .stats-table th { + text-align: left; padding: 6px 10px; background: var(--bg3); + border-bottom: 0.5px solid var(--border); color: var(--text2); font-weight: 500; + } + .stats-table td { padding: 5px 10px; border-bottom: 0.5px solid var(--border); } + .stats-table tr:last-child td { border-bottom: none; } + .swatch { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; vertical-align: middle; } + .muted { font-size: 11px; color: var(--text2); } + .legend-grid { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; } + .legend-item { + display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text2); + background: var(--bg2); border: 0.5px solid var(--border); + border-radius: var(--radius); padding: 4px 10px; + cursor: pointer; user-select: none; transition: opacity 0.15s; + } + .legend-item.off { opacity: 0.3; } + .vial-badge { + display: inline-flex; align-items: center; justify-content: center; + width: 20px; height: 20px; border-radius: 50%; + font-size: 10px; font-weight: 500; color: #fff; flex-shrink: 0; + } +""" + +_ERROR_BAR_PLUGIN_JS = """ +const errorBarPlugin = { + id: "errorBar", + afterDatasetsDraw(chart) { + const ctx = chart.ctx; + chart.data.datasets.forEach((ds, di) => { + if (!ds.errorBars) return; + const meta = chart.getDatasetMeta(di); + if (meta.hidden) return; + ctx.save(); ctx.strokeStyle = ds.borderColor; ctx.lineWidth = 1.2; + Object.entries(ds.errorBars).forEach(([i, eb]) => { + const el = meta.data[+i]; if (!el) return; + const x = el.x, cap = 4; + const yMin = chart.scales.y.getPixelForValue(eb.yMin); + const yMax = chart.scales.y.getPixelForValue(eb.yMax); + ctx.beginPath(); + ctx.moveTo(x, yMin); ctx.lineTo(x, yMax); + ctx.moveTo(x-cap, yMin); ctx.lineTo(x+cap, yMin); + ctx.moveTo(x-cap, yMax); ctx.lineTo(x+cap, yMax); + ctx.stroke(); + }); + ctx.restore(); + }); + } +}; +""" + +_BASE_OPTS_JS = """ +function baseOpts() { + const isDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + const grid = isDark ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.07)"; + const tick = "#888780"; + return { + responsive: true, maintainAspectRatio: false, + plugins: { + legend: { display: false }, + tooltip: { callbacks: { label: ctx => `${ctx.dataset.label}: ${ctx.parsed.y.toFixed(4)}` } }, + zoom: { + zoom: { wheel: { enabled: true }, pinch: { enabled: true }, mode: "xy" }, + pan: { enabled: true, mode: "xy" }, + } + }, + scales: { + x: { type: "linear", + title: { display: true, text: "Temperature (°C)", color: tick, font: { size: 11 } }, + ticks: { color: tick, font: { size: 11 } }, grid: { color: grid } }, + y: { ticks: { color: tick, font: { size: 11 } }, grid: { color: grid } } + } + }; +} +""" + + +# --------------------------------------------------------------------------- +# HTML — plot mode +# --------------------------------------------------------------------------- + + +def build_html(formulations: dict) -> str: + data_json = json.dumps(formulations, indent=2) + curves_json = json.dumps(_poly_curve(formulations)) + form_names = list(formulations.keys()) + colour_map = {n: _PALETTE[i % len(_PALETTE)] for i, n in enumerate(form_names)} + colour_json = json.dumps(colour_map) + + return f""" + + + + +MRI Calibration Plotter + + + + + + +

MRI Calibration — GSP / PVP Phantom

+

ADC vs temperature · error bars = ±1× uncertainty · dashed line = polynomial fit · scroll to zoom · drag to pan · double-click to reset

+ +
+
+ + +
+
+ + +
+
+ +
+
+
+ +
+
+
Apparent Diffusion Coefficient (ADC)
+
10⁻³ mm²/s
+
+
+ +
+ +
+
Summary at 20 °C (or nearest)
+ + + + + + +
FormulationTemp (°C)ADC (10⁻³ mm²/s)
+
+ + + + +""" + + +# --------------------------------------------------------------------------- +# HTML — vials mode +# --------------------------------------------------------------------------- + + +def build_vials_html( + formulations: dict, vial_results: list, phantom_name: str = "" +) -> str: + data_json = json.dumps(formulations, indent=2) + curves_json = json.dumps(_poly_curve(formulations)) + form_names = list(formulations.keys()) + colour_map = {n: _PALETTE[i % len(_PALETTE)] for i, n in enumerate(form_names)} + colour_json = json.dumps(colour_map) + + # Vial marker colours — distinct from formulation colours + vial_palette = [ + "#1a1a18", + "#c0392b", + "#16a085", + "#8e44ad", + "#d35400", + "#2980b9", + "#27ae60", + "#f39c12", + ] + + vial_data = [] + for idx, res in enumerate(vial_results): + if res.estimate is None: + continue + vial_data.append( + { + "vial": res.vial, + "formulation": res.formulation, + "adc": res.estimate.measured, + "T": res.estimate.temperature, + "T_unc": res.estimate.temp_unc, + "colour": vial_palette[idx % len(vial_palette)], + "formColour": colour_map.get(res.formulation, "#888"), + } + ) + vial_json = json.dumps(vial_data) + + table_rows = [] + for res in vial_results: + e = res.estimate + if e: + table_rows.append( + f"{res.vial}" + f"{res.formulation}" + f"{e.measured:.4f}" + f"{e.temperature:.2f}" + f"± {e.temp_unc:.2f} °C" + ) + else: + table_rows.append( + f"{res.vial}" + f"{res.formulation}" + f"No estimate" + ) + + return f""" + + + + +MRI Calibration — {phantom_name} Vial Temperature Estimates + + + + + + +

MRI Calibration — {phantom_name + " " if phantom_name else ""}Vial Temperature Estimates

+

ADC calibration curves with measured vial values overlaid · scroll to zoom · drag to pan · double-click to reset

+ +
+
+ +
+
+
+ +
+ +
+
+
ADC vs temperature — calibration + vial measurements
+
10⁻³ mm²/s
+
+
+
+ +
+
Estimated temperatures by vial
+ + + + + + {"".join(table_rows)} +
VialFormulationADC (10⁻³ mm²/s)Est. T (°C)Uncertainty
+
+ + + + +""" + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + + +def main(): + parser = argparse.ArgumentParser( + description="MRI Calibration Plotter & Temperature Estimator", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + sub = parser.add_subparsers(dest="command", required=True) + + p_plot = sub.add_parser( + "plot", help="Generate interactive HTML calibration plotter" + ) + p_plot.add_argument("xlsx", help="Calibration spreadsheet (.xlsx)") + p_plot.add_argument( + "--output", + "-o", + default=None, + metavar="FILE", + help="Output HTML (default: _plotter.html)", + ) + + p_est = sub.add_parser( + "estimate", help="Estimate temperature from a measured ADC value" + ) + p_est.add_argument("xlsx", help="Calibration spreadsheet (.xlsx)") + p_est.add_argument("formulation", help="Name, substring, index, or 'list'") + p_est.add_argument( + "--D", + type=float, + required=False, + metavar="VAL", + help="Measured ADC (mm²/s or 10⁻³ mm²/s — auto-detected)", + ) + + p_vials = sub.add_parser( + "vials", help="Batch estimate temperatures from a vials CSV" + ) + p_vials.add_argument("xlsx", help="Calibration spreadsheet (.xlsx)") + p_vials.add_argument("csv", help="Vials CSV (columns: vial, ADC)") + p_vials.add_argument("config", help="Phantom config JSON (all phantoms)") + p_vials.add_argument( + "--phantom", required=True, help="Phantom name to use (e.g. SPIRIT or 120E)" + ) + p_vials.add_argument( + "--output", + "-o", + default=None, + metavar="FILE", + help="Output HTML (default: vials_estimates.html)", + ) + + args = parser.parse_args() + + print(f"Parsing calibration: {args.xlsx}") + formulations = parse_calibration_xlsx(args.xlsx) + print(f"Found {len(formulations)} formulations.\n") + + if args.command == "plot": + out = args.output or Path(args.xlsx).stem + "_plotter.html" + with open(out, "w", encoding="utf-8") as f: + f.write(build_html(formulations)) + print(f"HTML plotter written to: {out}") + + elif args.command == "estimate": + if args.formulation.lower() == "list": + list_formulations(formulations) + return + if args.D is None: + parser.error("--D is required for the estimate command") + result = estimate_temperature(formulations, args.formulation, D=args.D) + print(result.summary()) + + elif args.command == "vials": + vials_adc = parse_vials_csv(args.csv) + phantom_cfg = load_phantom_config(args.config) + try: + vial_map = build_vial_map(phantom_cfg, args.phantom) + except KeyError as e: + parser.error(str(e)) + + print(f"Phantom : {args.phantom} ({len(vial_map)} vials)\n") + + results = [] + for vial, adc_raw in vials_adc.items(): + form_query = vial_map.get(vial) + if form_query is None: + print(f" Vial {vial}: not in phantom {args.phantom!r} — skipping") + continue + try: + res = estimate_temperature( + formulations, str(form_query), D=adc_raw, vial=vial + ) + print(res.summary()) + print() + results.append(res) + except ValueError as e: + print(f" Vial {vial}: {e}\n") + + out = args.output or "vials_estimates.html" + with open(out, "w", encoding="utf-8") as f: + f.write(build_vials_html(formulations, results, phantom_name=args.phantom)) + print(f"\nHTML estimates written to: {out}") + + +if __name__ == "__main__": + main() diff --git a/phantomkit/plotting/compare_plots.py b/phantomkit/plotting/compare_plots.py new file mode 100644 index 0000000..28def19 --- /dev/null +++ b/phantomkit/plotting/compare_plots.py @@ -0,0 +1,673 @@ +#!/usr/bin/env python3 +""" +compare_plots.py — Compare measurements across multiple phantomkit HTML output files. + +Reads the embedded phantomkit-data JSON from each HTML, extracts per-vial +measurements (ADC, fitted T1, or fitted T2), and produces a new self-contained +interactive HTML showing all sessions on a single scatter plot. + +Features +-------- +* Each input file gets a unique colour (filled circles). +* Reference values shown as red open circles (loaded from template_data/ if available). +* Toggle buttons show/hide individual sessions. +* Checkboxes select which sessions contribute to a live group mean (filled squares). + +Registered as ``phantomkit plot compare-plots`` via CLI auto-discovery. +""" + +from __future__ import annotations + +import json +import re +from pathlib import Path + +import click + + +# --------------------------------------------------------------------------- +# Colour palette (session colours — red #C62828 is reserved for reference) +# --------------------------------------------------------------------------- + +_SESSION_PALETTE = [ + "#378ADD", # blue + "#1D9E75", # teal-green + "#D4537E", # rose + "#7F77DD", # violet + "#BA7517", # amber + "#639922", # lime + "#185FA5", # navy + "#D85A30", # burnt orange + "#993C1D", # dark sienna + "#888780", # stone grey +] + +_REFERENCE_COLOR = "#C62828" + + +# --------------------------------------------------------------------------- +# Embedded data extraction +# --------------------------------------------------------------------------- + + +def _load_embedded(html_path: str) -> dict: + """Extract the phantomkit-data JSON block from a phantomkit HTML file.""" + text = Path(html_path).read_text(encoding="utf-8") + m = re.search( + r'\s*(\{.*?\})\s*', + text, + re.DOTALL, + ) + if not m: + raise click.ClickException( + f"No phantomkit-data block found in {html_path!r}. " + "Is this a phantomkit HTML output file?" + ) + return json.loads(m.group(1)) + + +def _extract( + data: dict, +) -> tuple[str, list[str], dict[str, float | None], dict[str, float | None]]: + """Return (metric_key, vials_in_order, {vial_upper: value_or_None}, {vial_upper: se_or_None}). + + metric_key is one of: "ADC", "FA", "Intensity", "T1", "T2". + se_vals contains the curve-fit standard error of the fitted relaxation time + (T1_se_ms or T2_se_ms) for T1/T2 types; empty dict for ADC/FA/Intensity. + """ + dtype = data.get("type", "") + + if dtype == "vial_intensity": + vials = data.get("vials", []) + means = data.get("means", []) + mode = data.get("contrast_mode", "generic") + metric = {"adc": "ADC", "fa": "FA"}.get(mode, "Intensity") + + def _scalar(m): + """Return a single float from a value that may be a list (multi-volume).""" + if isinstance(m, list): + valid = [x for x in m if x is not None] + return sum(valid) / len(valid) if valid else None + return float(m) if m is not None else None + + vals = {v.upper(): _scalar(m) for v, m in zip(vials, means)} + return metric, vials, vals, {} + + if dtype == "maps_ir": + fit_results = data.get("fit_results", []) + vials_order, vals, se_vals = [], {}, {} + for r in fit_results: + v = r.get("Vial", "") + t1 = r.get("T1_ms") + se = r.get("T1_se_ms") + vals[v.upper()] = float(t1) if t1 is not None else None + se_vals[v.upper()] = float(se) if se is not None else None + vials_order.append(v) + return "T1", vials_order, vals, se_vals + + if dtype == "maps_te": + fit_results = data.get("fit_results", []) + vials_order, vals, se_vals = [], {}, {} + for r in fit_results: + v = r.get("Vial", "") + t2 = r.get("T2_ms") + se = r.get("T2_se_ms") + vals[v.upper()] = float(t2) if t2 is not None else None + se_vals[v.upper()] = float(se) if se is not None else None + vials_order.append(v) + return "T2", vials_order, vals, se_vals + + raise click.ClickException( + f"Unknown embedded data type {dtype!r}. " + "Expected: vial_intensity, maps_ir, or maps_te." + ) + + +# --------------------------------------------------------------------------- +# Reference data loading +# --------------------------------------------------------------------------- + + +def _auto_template_dir() -> str | None: + """Locate template_data/ from the installed phantomkit package.""" + import importlib.util + + spec = importlib.util.find_spec("phantomkit") + if not spec: + return None + pkg_dir = Path(spec.origin).parent + for candidate in [pkg_dir.parent / "template_data", pkg_dir / "template_data"]: + if candidate.is_dir(): + return str(candidate) + return None + + +def _load_reference( + metric: str, template_dir: str, phantom: str +) -> tuple[list[str], dict[str, float]]: + """Load reference values for *metric* from template_data. + + Returns (vials_ordered, {vial_upper: value}). + ADC values are scaled to ×10⁻³ mm²/s to match the display units stored in + the HTML. + """ + ref_dir = Path(template_dir) / phantom + + if metric == "ADC": + ref_file = ref_dir / "adc_reference.json" + if not ref_file.exists(): + return [], {} + with open(ref_file) as fh: + raw = json.load(fh) + vials = raw.get("vials", []) + vals_raw = raw.get("adc_mm2_per_s", {}) + vals = {v.upper(): float(vals_raw[v]) * 1e3 for v in vials if v in vals_raw} + return vials, vals + + if metric in ("T1", "T2"): + ref_file = ref_dir / "t1t2_reference.json" + if not ref_file.exists(): + return [], {} + with open(ref_file) as fh: + raw = json.load(fh) + vials = raw.get("vials", []) + key = "T1_ms" if metric == "T1" else "T2_ms" + vals_raw = raw.get(key, {}) + vals = {v.upper(): float(vals_raw[v]) for v in vials if v in vals_raw} + return vials, vals + + return [], {} + + +# --------------------------------------------------------------------------- +# X-axis vial ordering +# --------------------------------------------------------------------------- + + +def _vial_axis(sessions: list[dict], ref_vials: list[str]) -> list[str]: + """Return an ordered vial list for the x-axis. + + Reference vials come first (preserving their prescribed order), then any + measured vials that are absent from the reference. + """ + if ref_vials: + seen = {v.upper() for v in ref_vials} + result = list(ref_vials) + else: + seen: set = set() + result: list = [] + + for sess in sessions: + for v in sess["vials_order"]: + if v.upper() not in seen: + result.append(v) + seen.add(v.upper()) + + return result + + +# --------------------------------------------------------------------------- +# Session label derivation +# --------------------------------------------------------------------------- + + +def _derive_labels(paths: list[str]) -> list[str]: + """Derive a unique, human-readable label for each input path. + + Finds the longest common path suffix shared by all files (walking inward + from the filename) and uses the first path component that *differs* between + files as the label. This naturally surfaces the subject/session directory + regardless of how deeply the file is nested. + + Example:: + + P000009_testing/native_contrasts_staging/metrics/plots/T1_mapping.html + P000008_html/native_contrasts_staging/metrics/plots/T1_mapping.html + → labels: ["P000009_testing", "P000008_html"] + """ + if len(paths) == 1: + return [Path(paths[0]).stem] + + parts_list = [Path(p).resolve().parts for p in paths] + min_len = min(len(p) for p in parts_list) + + # Count how many components from the right are identical across all files. + common_suffix_len = 0 + for i in range(1, min_len + 1): + if len({p[-i] for p in parts_list}) == 1: + common_suffix_len = i + else: + break + + labels = [] + for parts in parts_list: + idx = len(parts) - common_suffix_len - 1 + labels.append(parts[idx] if idx >= 0 else parts[-1]) + return labels + + +# --------------------------------------------------------------------------- +# Y-axis labels +# --------------------------------------------------------------------------- + +_Y_LABELS: dict[str, str] = { + "ADC": "ADC \u00d710\u207b\u00b3 mm\u00b2/s", + "FA": "Fractional Anisotropy", + "T1": "T\u2081 (ms)", + "T2": "T\u2082 (ms)", + "Intensity": "Intensity", +} + + +# --------------------------------------------------------------------------- +# HTML generation +# --------------------------------------------------------------------------- + + +def _build_html( + metric: str, + vial_axis: list[str], + sessions: list[dict], # [{label, color, vials_order, vals, se_vals}] + ref_vals: dict[str, float], # {vial_upper: value} +) -> str: + from phantomkit.plotting._html_common import html_head + + y_label = _Y_LABELS.get(metric, metric) + title = f"Comparison: {metric} per vial" + + vial_upper_to_x = {v.upper(): i for i, v in enumerate(vial_axis)} + + # -- Per-session point data + session_datasets = [] + for sess in sessions: + pts = [ + {"x": vial_upper_to_x[v_up], "y": round(val, 4)} + for v_up, val in sess["vals"].items() + if val is not None and v_up in vial_upper_to_x + ] + pts.sort(key=lambda p: p["x"]) + session_datasets.append({ + "label": sess["label"], + "color": sess["color"], + "data": pts, + }) + + # -- Reference point data + ref_pts = [ + {"x": vial_upper_to_x[v.upper()], "y": round(ref_vals[v.upper()], 4)} + for v in vial_axis + if ref_vals.get(v.upper()) is not None + ] + has_ref = bool(ref_pts) + + sessions_json = json.dumps(session_datasets) + ref_pts_json = json.dumps(ref_pts) + vial_labels_json = json.dumps(vial_axis) + y_label_json = json.dumps(y_label) + ref_color_json = json.dumps(_REFERENCE_COLOR) + + # -- Session control rows (toggle button + include-in-mean checkbox) + session_controls_html = "" + for i, sess in enumerate(sessions): + c = sess["color"] + lbl = sess["label"] + session_controls_html += ( + f'\n
' + f'' + f'' + f'' + f'
' + ) + + # -- Reference legend entry + ref_legend_html = "" + if has_ref: + ref_legend_html = ( + f'\n
' + f'' + f'Reference
' + ) + + mean_legend_html = ( + '\n
' + '' + 'Group mean (■)
' + ) + + head = html_head(title) + + return f"""{head} + +
+

{title}

+

{y_label}

+ +
+

Sessions

+
+{session_controls_html} +{ref_legend_html} +{mean_legend_html} +
+
+ +
+

{metric} per vial

+
+ +
+

+ Click session buttons to toggle visibility · + check/uncheck “include in mean” to update the group mean (□) +

+
+
+ + + + +""" + + +# --------------------------------------------------------------------------- +# CLI entry point +# --------------------------------------------------------------------------- + + +@click.command("compare-plots") +@click.argument("html_files", nargs=-1, required=True, type=click.Path(exists=True)) +@click.option( + "--output", "-o", required=True, type=click.Path(), + help="Output HTML file path.", +) +@click.option( + "--template-dir", default=None, metavar="DIR", + help="Path to template_data/ directory (auto-detected if omitted).", +) +@click.option( + "--phantom", default=None, metavar="NAME", + help="Phantom name, e.g. SPIRIT (auto-detected from input files if omitted).", +) +@click.option( + "--label", "labels", multiple=True, metavar="TEXT", + help="Label for each input file (repeat once per file; defaults to filename stem).", +) +def main( + html_files: tuple[str, ...], + output: str, + template_dir: str | None, + phantom: str | None, + labels: tuple[str, ...], +) -> None: + """Compare measurements from multiple phantomkit HTML output files. + + Reads the embedded JSON from each HTML, overlays all sessions on one + scatter plot, and provides a toggleable group-mean marker (filled square). + + \b + Example: + phantomkit plot compare-plots \\ + session01/metrics/plots/ADC.html \\ + session02/metrics/plots/ADC.html \\ + -o comparison_ADC.html + """ + if labels and len(labels) != len(html_files): + raise click.ClickException( + f"--label provided {len(labels)} time(s) but " + f"{len(html_files)} input file(s) given — counts must match." + ) + + # ---- Load and parse each HTML file + sessions_raw: list[dict] = [] + metrics_seen: list[str] = [] + for path in html_files: + data = _load_embedded(path) + metric, vials_order, vals, se_vals = _extract(data) + metrics_seen.append(metric) + sessions_raw.append({ + "path": path, + "data": data, + "metric": metric, + "vials_order": vials_order, + "vals": vals, + "se_vals": se_vals, + }) + + # ---- Validate that all inputs share the same metric + unique_metrics = list(dict.fromkeys(metrics_seen)) + if len(unique_metrics) > 1: + raise click.ClickException( + f"Input files contain mixed metrics: {unique_metrics}. " + "All files must be the same type (all ADC, all T1, or all T2)." + ) + metric = unique_metrics[0] + + # ---- Determine session labels + if labels: + session_labels = list(labels) + else: + session_labels = _derive_labels(list(html_files)) + + # ---- Assign colours + colors = [_SESSION_PALETTE[i % len(_SESSION_PALETTE)] for i in range(len(html_files))] + + sessions = [ + { + "label": session_labels[i], + "color": colors[i], + "vials_order": sessions_raw[i]["vials_order"], + "vals": sessions_raw[i]["vals"], + "se_vals": sessions_raw[i].get("se_vals", {}), + } + for i in range(len(html_files)) + ] + + # ---- Auto-detect phantom from embedded data + if phantom is None: + for sr in sessions_raw: + p = sr["data"].get("phantom") + if p: + phantom = p + break + + # ---- Load reference values + ref_vials: list[str] = [] + ref_vals: dict[str, float] = {} + resolved_template_dir = template_dir or _auto_template_dir() + + if resolved_template_dir and phantom is None: + # Auto-select phantom by finding the candidate whose reference vials best + # overlap with the measured vials across all input sessions. + measured_upper = set() + for sess in sessions: + measured_upper.update(sess["vals"].keys()) + candidates = [ + d.name for d in Path(resolved_template_dir).iterdir() + if d.is_dir() and not d.name.startswith(".") + ] + best_overlap, best_candidate = 0, None + for cand in candidates: + cand_vials, _ = _load_reference(metric, resolved_template_dir, cand) + overlap = len({v.upper() for v in cand_vials} & measured_upper) + if overlap > best_overlap: + best_overlap, best_candidate = overlap, cand + if best_candidate: + phantom = best_candidate + + if resolved_template_dir and phantom: + ref_vials, ref_vals = _load_reference(metric, resolved_template_dir, phantom) + + if not ref_vals: + click.echo( + "[WARN] Reference values not loaded — provide --template-dir and --phantom " + "to overlay reference data.", + err=True, + ) + + # ---- Build x-axis vial order + vial_axis = _vial_axis(sessions, ref_vials) + + # ---- Generate and write HTML + html = _build_html(metric, vial_axis, sessions, ref_vals) + out_path = Path(output) + out_path.parent.mkdir(parents=True, exist_ok=True) + out_path.write_text(html, encoding="utf-8") + click.echo(f"[INFO] Comparison plot saved to: {out_path}") diff --git a/phantomkit/plotting/maps_ir.py b/phantomkit/plotting/maps_ir.py index eca601b..24d0137 100644 --- a/phantomkit/plotting/maps_ir.py +++ b/phantomkit/plotting/maps_ir.py @@ -8,11 +8,13 @@ inversion recovery model to estimate T1 relaxation times. Key outputs: -- Publication-quality 3x3 grid plot of intensity vs inversion time +- Interactive HTML (default) or publication-quality PNG with 3x3 grid plot - CSV file with fitted T1 values and R² statistics ================================================================================ """ +import matplotlib + import logging import os import re @@ -23,32 +25,82 @@ import pandas as pd from scipy.optimize import curve_fit +matplotlib.use("Agg") # non-interactive backend; required when plotting runs +# in a background thread (e.g. ThreadPoolExecutor on macOS) + logger = logging.getLogger(__name__) -def find_csv_file(metric_dir, contrast_name, suffix): +def find_xlsx_file(metric_dir, contrast_name): """ - Find a CSV file in a directory that matches the contrast name and suffix. - - Args: - metric_dir: Directory containing CSV files - contrast_name: Base name of the contrast to search for - suffix: File suffix to match (e.g., '_mean_matrix.csv') - - Returns: - Full path to the matched CSV file + Find a per-contrast xlsx file in metric_dir. Raises: FileNotFoundError: If no matching file is found """ + target = contrast_name + ".xlsx" + for f in os.listdir(metric_dir): + if f == target: + return os.path.join(metric_dir, f) + raise FileNotFoundError( + f"No xlsx file found for contrast '{contrast_name}' in {metric_dir}" + ) + + +def find_csv_file(metric_dir, contrast_name, suffix): + """Kept for backwards compatibility — prefer find_xlsx_file.""" + exact_tail = contrast_name + suffix for f in os.listdir(metric_dir): - if contrast_name in f and f.endswith(suffix): + if f.endswith(exact_tail): return os.path.join(metric_dir, f) raise FileNotFoundError( f"No CSV file found for contrast '{contrast_name}' with suffix '{suffix}' in {metric_dir}" ) +def _compute_fits_ir(vial_groups, vial_to_idx, data_matrix, contrast_numbers): + """Fit T1 inversion recovery for all vials; return (subplot_fits, fit_results).""" + subplot_fits = [] + fit_results = [] + for group in vial_groups: + for vial in group: + if vial not in vial_to_idx: + continue + i = vial_to_idx[vial] + try: + popt, pcov = curve_fit( + inv_rec, contrast_numbers, data_matrix[i, :], + p0=(data_matrix[i, -1], 1000), maxfev=5000, + ) + S0_fit, T1_fit = popt + r2 = calc_r2(data_matrix[i, :], inv_rec(contrast_numbers, *popt)) + try: + T1_se = float(np.sqrt(pcov[1, 1])) if np.isfinite(pcov[1, 1]) else None + except Exception: + T1_se = None + fit_results.append({"Vial": vial, "S0": S0_fit, "T1_ms": T1_fit, "T1_se_ms": T1_se, "R2": r2}) + x_fit = np.linspace(0, max(contrast_numbers), 200) + y_fit = inv_rec(x_fit, *popt) + ci_lower = ci_upper = None + try: + samples = np.random.multivariate_normal(popt, pcov, 1000) + preds = np.array([inv_rec(x_fit, *s) for s in samples]) + ci_lower = np.percentile(preds, 2.5, axis=0) + ci_upper = np.percentile(preds, 97.5, axis=0) + except (np.linalg.LinAlgError, ValueError) as e: + logger.warning("Could not calculate CI for vial %s: %s", vial, e) + subplot_fits.append({ + "vial": vial, + "x_fit": x_fit.tolist(), + "y_fit": y_fit.tolist(), + "ci_lower": ci_lower.tolist() if ci_lower is not None else None, + "ci_upper": ci_upper.tolist() if ci_upper is not None else None, + }) + except RuntimeError: + logger.warning("Could not fit T₁ for vial %s", vial) + return subplot_fits, fit_results + + def extract_numeric(label): """ Extract the last numeric value from a string label. @@ -109,9 +161,17 @@ def plot_vial_ir_means_std( output_file: str = "vial_summary_T1.png", annotate: bool = False, roi_image: str | None = None, + output_format: str = "html", + nifti_image: str | None = None, + vial_niftis: dict | None = None, + fits_output: str | None = None, + relaxometry_reference: dict | None = None, + phantom: str | None = None, + overlay_contrast: str | None = None, ) -> str: """ - Create publication-quality plots of vial intensity data with T1 curve fitting. + Create interactive HTML or publication-quality PNG plots of vial intensity + data with T1 curve fitting. Generates a 3x3 grid of subplots showing intensity vs inversion time for different vial groups, with fitted T1 curves overlaid on the measured data. @@ -120,11 +180,14 @@ def plot_vial_ir_means_std( contrast_files: List of NIfTI file paths for different inversion times metric_dir: Directory containing mean/std CSV files output_file: Output filename for the plot (default: 'vial_summary_T1.png') - annotate: Whether to annotate points with mean ± std (not currently used) - roi_image: Optional path to ROI overlay image for extra subplot + annotate: Whether to annotate points with mean ± std (PNG mode only) + roi_image: Optional path to ROI overlay image (PNG mode only) + output_format: "html" (default) for interactive HTML, "png" for static figure + nifti_image: Path to the background NIfTI file to embed in the HTML viewer. + vial_niftis: ``{vial_name: path}`` mapping for ROI overlay NIfTIs (all shown in red). Returns: - Absolute path to the saved plot file. + Absolute path to the saved output file. """ # ======================================================================== @@ -142,7 +205,7 @@ def plot_vial_ir_means_std( ["A", "R"], # Subplot 6: Vials A and R together ["O"], # Subplot 7: Vial O alone ["Q"], # Subplot 8: Vial Q alone - # Subplot 9: Reserved for ROI overlay image (if provided) + # Subplot 9: Reserved for MRI viewer (HTML) or ROI overlay image (PNG) ] # ======================================================================== @@ -152,19 +215,24 @@ def plot_vial_ir_means_std( contrast_numbers = [] # Inversion times extracted from filenames mean_matrix = [] # Mean intensity values for each vial at each TI std_matrix = [] # Standard deviation values + median_matrix = [] + count_matrix = [] + p25_matrix = [] + p75_matrix = [] + min_matrix = [] + max_matrix = [] + mean_mad_matrix = [] + median_mad_matrix = [] # Loop through each contrast file (different inversion times) for nifti_path in contrast_files: # Extract base filename without extension base_name = os.path.basename(nifti_path).replace(".nii.gz", "") - # Find corresponding CSV files with mean and std data - mean_csv = find_csv_file(metric_dir, base_name, "_mean_matrix.csv") - std_csv = find_csv_file(metric_dir, base_name, "_std_matrix.csv") - - # Read CSV files (auto-detect delimiter: comma, tab, etc.) - mean_df = pd.read_csv(mean_csv, sep=None, engine="python") - std_df = pd.read_csv(std_csv, sep=None, engine="python") + # Find the per-contrast xlsx and read mean/std sheets + xlsx_path = find_xlsx_file(metric_dir, base_name) + mean_df = pd.read_excel(xlsx_path, sheet_name="mean") + std_df = pd.read_excel(xlsx_path, sheet_name="std") # Get vial labels from first file (column 0) if vial_labels is None: @@ -175,9 +243,39 @@ def plot_vial_ir_means_std( std_matrix.append(std_df.iloc[:, 1].to_numpy()) contrast_numbers.append(extract_numeric(base_name)) + # Optional sheets — graceful degradation for older xlsx files + _mean_col = mean_df.iloc[:, 1].to_numpy() + for _attr, _sheet in [ + (median_matrix, "median"), + (count_matrix, "count"), + (p25_matrix, "p25"), + (p75_matrix, "p75"), + (min_matrix, "min"), + (max_matrix, "max"), + (mean_mad_matrix, "mean_mad"), + (median_mad_matrix, "median_mad"), + ]: + try: + _df = pd.read_excel(xlsx_path, sheet_name=_sheet) + vals = _df.iloc[:, 1].to_numpy().astype(float) + nan_mask = np.isnan(vals) + if nan_mask.any(): + vals[nan_mask] = _mean_col[nan_mask] + _attr.append(vals) + except Exception: + _attr.append(_mean_col.copy()) + # Convert lists to numpy arrays for easier manipulation mean_matrix = np.array(mean_matrix) std_matrix = np.array(std_matrix) + median_matrix = np.array(median_matrix) + count_matrix = np.array(count_matrix) + p25_matrix = np.array(p25_matrix) + p75_matrix = np.array(p75_matrix) + min_matrix = np.array(min_matrix) + max_matrix = np.array(max_matrix) + mean_mad_matrix = np.array(mean_mad_matrix) + median_mad_matrix = np.array(median_mad_matrix) # ======================================================================== # DATA ORGANIZATION: Sort by inversion time and transpose @@ -185,8 +283,16 @@ def plot_vial_ir_means_std( # Sort all data by inversion time (ascending order) sort_idx = np.argsort(contrast_numbers) contrast_numbers = np.array(contrast_numbers)[sort_idx] - mean_matrix = mean_matrix[sort_idx].T # Transpose so rows=vials, cols=TI - std_matrix = std_matrix[sort_idx].T + mean_matrix = mean_matrix[sort_idx].T # rows=vials, cols=TI + std_matrix = std_matrix[sort_idx].T + median_matrix = median_matrix[sort_idx].T + count_matrix = count_matrix[sort_idx].T + p25_matrix = p25_matrix[sort_idx].T + p75_matrix = p75_matrix[sort_idx].T + min_matrix = min_matrix[sort_idx].T + max_matrix = max_matrix[sort_idx].T + mean_mad_matrix = mean_mad_matrix[sort_idx].T + median_mad_matrix = median_mad_matrix[sort_idx].T # Create mapping from vial label to row index for quick lookup vial_to_idx = {label: i for i, label in enumerate(vial_labels)} @@ -195,20 +301,84 @@ def plot_vial_ir_means_std( yticks = [-100, 1000, 2000, 3000, 4000] # ======================================================================== - # FIGURE SETUP: Create 3x3 subplot grid + # CURVE FITTING (mean and median \u2014 shared by both PNG and HTML paths) # ======================================================================== - fig, axes = plt.subplots(3, 3, figsize=(18, 12)) - axes = axes.flatten() # Convert 2D array to 1D for easier indexing - cmap = plt.get_cmap("tab10") # Color map for multi-vial plots (10 colors) + cmap = plt.get_cmap("tab10") + subplot_fits, fit_results = _compute_fits_ir( + vial_groups, vial_to_idx, mean_matrix, contrast_numbers + ) + subplot_fits_median, fit_results_median = _compute_fits_ir( + vial_groups, vial_to_idx, median_matrix, contrast_numbers + ) - # Storage for fitted parameters (will be saved to CSV) - fit_results = [] + # ======================================================================== + # SAVE: Fitted T1 CSV (mean-based; always, regardless of output format) + # ======================================================================== + csv_stem = re.sub(r"\.(png|html)$", "", output_file, flags=re.IGNORECASE) + csv_output = fits_output if fits_output else csv_stem + "_T1_fits.csv" + pd.DataFrame(fit_results).to_csv(csv_output, index=False) + logger.info("Fitted parameters saved to %s", csv_output) + + # ======================================================================== + # HTML OUTPUT + # ======================================================================== + if output_format == "html": + from phantomkit.plotting._html_common import build_relaxometry_html + + html_file = re.sub(r"\.(png|html)$", "", output_file, flags=re.IGNORECASE) + ".html" + + embedded_data = { + "type": "maps_ir", + "phantom": phantom, + "vial_groups": vial_groups, + "contrast_numbers": contrast_numbers.tolist(), + "mean_matrix": mean_matrix.tolist(), + "std_matrix": std_matrix.tolist(), + "fit_results": fit_results, + } + + html = build_relaxometry_html( + title="T1 Inversion Recovery Mapping", + subtitle="Intensity vs inversion time with T₁ curve fitting", + x_label="Inversion Time (ms)", + fit_label="T₁ fit", + fit_key="T1_ms", + vial_groups=vial_groups, + contrast_numbers=contrast_numbers, + mean_matrix=mean_matrix, + std_matrix=std_matrix, + median_matrix=median_matrix, + count_matrix=count_matrix, + p25_matrix=p25_matrix, + p75_matrix=p75_matrix, + min_matrix=min_matrix, + max_matrix=max_matrix, + mean_mad_matrix=mean_mad_matrix, + median_mad_matrix=median_mad_matrix, + vial_labels=vial_labels, + subplot_fits=subplot_fits, + subplot_fits_median=subplot_fits_median, + fit_results_median=fit_results_median, + embedded_data=embedded_data, + nifti_image=nifti_image, + vial_niftis=vial_niftis, + ref_data=relaxometry_reference, + overlay_contrast=overlay_contrast, + ) + + from pathlib import Path + Path(html_file).write_text(html, encoding="utf-8") + logger.info("Interactive HTML saved to %s", html_file) + return os.path.abspath(html_file) # ======================================================================== - # MAIN PLOTTING LOOP: Process each vial group + # PNG OUTPUT (original matplotlib behaviour) # ======================================================================== + fig, axes = plt.subplots(3, 3, figsize=(18, 12)) + axes = axes.flatten() + for g_idx, group in enumerate(vial_groups): - ax = axes[g_idx] # Get current subplot + ax = axes[g_idx] # -------------------------------------------------------------------- # CASE 1: Single vial subplot @@ -217,119 +387,42 @@ def plot_vial_ir_means_std( vial = group[0] if vial not in vial_to_idx: continue - i = vial_to_idx[vial] # Get row index for this vial - - # ================================================================ - # *** RAW DATA PLOTTING SECTION *** - # ================================================================ - # Plot measured intensity data with error bars - # This is the experimental data before any curve fitting + i = vial_to_idx[vial] - # Plot error bars only (no markers, no line) ax.errorbar( - contrast_numbers, # x-axis: inversion times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - yerr=std_matrix[i, :], # error bars: ± standard deviation - fmt="none", # NO markers or lines (error bars only) - capsize=5, # width of error bar caps - color="black", # error bar color - alpha=0.5, # slight transparency for error bars + contrast_numbers, + mean_matrix[i, :], + yerr=std_matrix[i, :], + fmt="none", + capsize=5, + color="black", + alpha=0.5, ) - - # Plot scatter points on top ax.scatter( - contrast_numbers, # x-axis: inversion times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - s=50, # marker size - color="black", # marker color - marker="o", # circle markers - label=f"Vial {vial}", # legend label - zorder=3, # draw on top of error bars + contrast_numbers, + mean_matrix[i, :], + s=50, + color="black", + marker="o", + label=f"Vial {vial}", + zorder=3, ) - # ================================================================ - - # Attempt to fit T1 inversion recovery curve to the data - try: - # Non-linear least squares curve fitting - # Keep the covariance matrix (pcov) for confidence interval calculation - popt, pcov = curve_fit( - inv_rec, # Model function to fit - contrast_numbers, # x data (inversion times) - mean_matrix[i, :], # y data (intensities) - p0=(mean_matrix[i, -1], 1000), # Initial guesses: [S0, T1] - maxfev=5000, # Max iterations - ) - S0_fit, T1_fit = popt # Extract fitted parameters - - # Calculate fitted curve and goodness of fit (R²) - fit_signal = inv_rec(contrast_numbers, *popt) - r2 = calc_r2(mean_matrix[i, :], fit_signal) - - # Store fit results for CSV output - fit_results.append( - {"Vial": vial, "S0": S0_fit, "T1_ms": T1_fit, "R2": r2} - ) - - # ============================================================ - # *** 95% CONFIDENCE INTERVAL CALCULATION *** - # ============================================================ - # Create fine grid for smooth curve visualization - x_fit = np.linspace(min(contrast_numbers), max(contrast_numbers), 200) - - # Calculate 95% CI via Monte Carlo sampling from parameter covariance - ci_lower = None - ci_upper = None - try: - # Sample parameter space (1000 samples from multivariate normal) - n_samples = 1000 - param_samples = np.random.multivariate_normal(popt, pcov, n_samples) - - # Generate predictions for each parameter sample - predictions = np.array( - [ - inv_rec(x_fit, sample[0], sample[1]) - for sample in param_samples - ] - ) - - # Calculate 2.5th and 97.5th percentiles (95% CI) - ci_lower = np.percentile(predictions, 2.5, axis=0) - ci_upper = np.percentile(predictions, 97.5, axis=0) - - except (np.linalg.LinAlgError, ValueError) as e: - # Covariance matrix might be singular or ill-conditioned - logger.warning( - "Could not calculate 95%% CI for vial %s: %s", vial, e - ) - # ============================================================ - # *** FITTED CURVE AND CI BAND PLOTTING *** - # ============================================================ - # Plot 95% confidence interval band (if calculated successfully) - if ci_lower is not None and ci_upper is not None: + fit_entry = next((f for f in subplot_fits if f["vial"] == vial), None) + if fit_entry: + x_fit = np.array(fit_entry["x_fit"]) + y_fit = np.array(fit_entry["y_fit"]) + if fit_entry.get("ci_lower") and fit_entry.get("ci_upper"): ax.fill_between( x_fit, - ci_lower, - ci_upper, - color="gray", # Gray to match fitted curve - alpha=0.2, # Transparent (subtle background) - zorder=1, # Behind fitted curve and data - label="95% CI", # Legend label + fit_entry["ci_lower"], + fit_entry["ci_upper"], + color="gray", + alpha=0.2, + zorder=1, + label="95% CI", ) - - # Plot smooth fitted curve (dashed line) over data - ax.plot( - x_fit, - inv_rec(x_fit, *popt), - "--", # Dashed line style - color="gray", # Gray color for fitted curve - alpha=0.8, # Slight transparency - zorder=2, # On top of CI band, below data - label="T₁ fit", # Legend label - ) - except RuntimeError: - # Curve fitting failed for this vial - logger.warning("Could not fit T\u2081 for vial %s", vial) + ax.plot(x_fit, y_fit, "--", color="gray", alpha=0.8, zorder=2, label="T₁ fit") # -------------------------------------------------------------------- # CASE 2: Multiple vials in one subplot @@ -338,143 +431,61 @@ def plot_vial_ir_means_std( for j, vial in enumerate(group): if vial not in vial_to_idx: continue - i = vial_to_idx[vial] # Get row index for this vial - - # ============================================================ - # *** RAW DATA PLOTTING SECTION *** - # ============================================================ - # Plot measured intensity data with error bars - # Each vial in the group gets a different color + i = vial_to_idx[vial] - # Plot error bars only (no markers, no line) ax.errorbar( - contrast_numbers, # x-axis: inversion times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - yerr=std_matrix[i, :], # error bars: ± standard deviation - fmt="none", # NO markers or lines (error bars only) - capsize=5, # width of error bar caps - color=cmap(j % 10), # error bar color matches vial color - alpha=0.5, # slight transparency for error bars + contrast_numbers, + mean_matrix[i, :], + yerr=std_matrix[i, :], + fmt="none", + capsize=5, + color=cmap(j % 10), + alpha=0.5, ) - - # Plot scatter points on top ax.scatter( - contrast_numbers, # x-axis: inversion times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - s=50, # marker size - color=cmap(j % 10), # marker color from colormap - marker="o", # circle markers - label=f"Vial {vial}", # legend label - zorder=3, # draw on top of error bars + contrast_numbers, + mean_matrix[i, :], + s=50, + color=cmap(j % 10), + marker="o", + label=f"Vial {vial}", + zorder=3, ) - # ============================================================ - - # Attempt to fit T1 inversion recovery curve - try: - # Non-linear least squares curve fitting - # Keep covariance matrix for CI calculation - popt, pcov = curve_fit( - inv_rec, - contrast_numbers, - mean_matrix[i, :], - p0=(mean_matrix[i, -1], 1000), - maxfev=5000, - ) - S0_fit, T1_fit = popt - - # Calculate fitted curve and R² - fit_signal = inv_rec(contrast_numbers, *popt) - r2 = calc_r2(mean_matrix[i, :], fit_signal) - - # Store fit results - fit_results.append( - {"Vial": vial, "S0": S0_fit, "T1_ms": T1_fit, "R2": r2} - ) - # ======================================================== - # *** 95% CONFIDENCE INTERVAL CALCULATION *** - # ======================================================== - # Create fine grid for smooth curve - x_fit = np.linspace( - min(contrast_numbers), max(contrast_numbers), 200 - ) - - # Calculate 95% CI via Monte Carlo sampling - ci_lower = None - ci_upper = None - try: - # Sample parameter space - n_samples = 1000 - param_samples = np.random.multivariate_normal( - popt, pcov, n_samples - ) - - # Generate predictions - predictions = np.array( - [ - inv_rec(x_fit, sample[0], sample[1]) - for sample in param_samples - ] - ) - - # Calculate percentiles (95% CI) - ci_lower = np.percentile(predictions, 2.5, axis=0) - ci_upper = np.percentile(predictions, 97.5, axis=0) - - except (np.linalg.LinAlgError, ValueError) as e: - print(f"[WARN] Could not calculate 95% CI for vial {vial}: {e}") - - # ======================================================== - # *** PLOT CI BAND AND FITTED CURVE *** - # ======================================================== - # Plot 95% CI band (if calculated) - if ci_lower is not None and ci_upper is not None: + fit_entry = next((f for f in subplot_fits if f["vial"] == vial), None) + if fit_entry: + x_fit = np.array(fit_entry["x_fit"]) + y_fit = np.array(fit_entry["y_fit"]) + if fit_entry.get("ci_lower") and fit_entry.get("ci_upper"): ax.fill_between( x_fit, - ci_lower, - ci_upper, - color=cmap(j % 10), # Match vial color - alpha=0.15, # Very transparent - zorder=1, # Behind everything + fit_entry["ci_lower"], + fit_entry["ci_upper"], + color=cmap(j % 10), + alpha=0.15, + zorder=1, ) - - # Plot smooth fitted curve (dashed, same color as data) ax.plot( - x_fit, - inv_rec(x_fit, *popt), - "--", # Dashed line - color=cmap(j % 10), # Match data color - alpha=0.8, - zorder=2, # On top of CI, below data + x_fit, y_fit, "--", color=cmap(j % 10), alpha=0.8, zorder=2 ) - except RuntimeError: - print(f"[WARN] Could not fit T₁ for vial {vial}") - # Add legend for multi-vial subplots ax.legend(loc="upper right", fontsize=8) - # -------------------------------------------------------------------- - # SUBPLOT FORMATTING: Set titles, limits, and labels - # -------------------------------------------------------------------- - ax.set_title(" & ".join(group), fontsize=10) # e.g., "D & P" - ax.set_ylim(min(yticks), max(yticks)) # Consistent y-axis range - ax.grid(True, axis="y", linestyle="--", alpha=0.5) # Horizontal gridlines + ax.set_title(" & ".join(group), fontsize=10) + ax.set_ylim(min(yticks), max(yticks)) + ax.grid(True, axis="y", linestyle="--", alpha=0.5) - # Only show y-axis labels on leftmost column if g_idx % 3 == 0: ax.set_yticks(yticks) ax.set_yticklabels([str(t) for t in yticks]) ax.set_ylabel("Intensity", fontsize=9) else: ax.set_yticks(yticks) - ax.set_yticklabels([]) # Hide labels but keep tick marks + ax.set_yticklabels([]) - # ======================================================================== - # SPECIAL SUBPLOT: ROI Overlay (bottom-right position) - # ======================================================================== - ax = axes[-1] # Last subplot (position 9) + # ROI overlay in last subplot + ax = axes[-1] if roi_image and os.path.exists(roi_image): - # Display ROI overlay image if provided img = plt.imread(roi_image) ax.imshow( img, @@ -490,48 +501,30 @@ def plot_vial_ir_means_std( ax.set_yticks([]) ax.set_title("ROI Overlay", fontsize=10) else: - # Hide subplot if no ROI image provided ax.axis("off") - # ======================================================================== - # SAVE OUTPUTS: Plot and fitted parameters - # ======================================================================== plt.tight_layout(rect=[0, 0, 1, 1]) plt.savefig(output_file, dpi=300, bbox_inches="tight") logger.info("Publication-ready plot saved to %s", output_file) - - # Save fitted T1 values to CSV - csv_output = os.path.splitext(output_file)[0] + "_T1_fits.csv" - pd.DataFrame(fit_results).to_csv(csv_output, index=False) - logger.info("Fitted parameters saved to %s", csv_output) - plt.close(fig) return os.path.abspath(output_file) -@click.command() +@click.command("maps-ir") @click.argument("contrast_files", nargs=-1, required=True) +@click.option("-m", "--metric-dir", required=True, help="Directory with mean/std CSVs.") +@click.option("-o", "--output", default="vial_summary_T1.png", show_default=True) +@click.option("--annotate", is_flag=True, default=False) +@click.option("--roi-image", default=None, help="ROI overlay PNG (PNG mode only).") @click.option( - "-m", - "--metric_dir", - required=True, - help="Directory containing the mean/std CSV files.", -) -@click.option( - "-o", - "--output", - default="vial_summary_T1.png", + "--format", "output_format", + default="html", + type=click.Choice(["html", "png"]), show_default=True, - help="Output filename for the plot.", -) -@click.option("--annotate", is_flag=True, help="Annotate each point with mean ± std.") -@click.option( - "--roi_image", - default=None, - help="Path to ROI overlay PNG image for the extra subplot.", + help="Output format: interactive HTML (default) or static PNG.", ) -def main(contrast_files, metric_dir, output, annotate, roi_image): - """Plot vial mean ± std for inversion recovery with T₁ fitting and save fit metrics.""" +def main(contrast_files, metric_dir, output, annotate, roi_image, output_format): + """Plot vial mean ± std for inversion recovery with T1 fitting.""" logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") plot_vial_ir_means_std( list(contrast_files), @@ -539,6 +532,7 @@ def main(contrast_files, metric_dir, output, annotate, roi_image): output_file=output, annotate=annotate, roi_image=roi_image, + output_format=output_format, ) diff --git a/phantomkit/plotting/maps_te.py b/phantomkit/plotting/maps_te.py index c74a58f..4ad564b 100644 --- a/phantomkit/plotting/maps_te.py +++ b/phantomkit/plotting/maps_te.py @@ -8,11 +8,16 @@ mono-exponential T2 decay model to estimate T2 relaxation times. Key outputs: -- Publication-quality 3x3 grid plot of intensity vs echo time +- Interactive HTML (default) or publication-quality PNG with 3x3 grid plot - CSV file with fitted T2 values and R² statistics ================================================================================ """ +import matplotlib + +matplotlib.use("Agg") # non-interactive backend; required when plotting runs +# in a background thread (e.g. ThreadPoolExecutor on macOS) + import logging import os import re @@ -26,29 +31,76 @@ logger = logging.getLogger(__name__) -def find_csv_file(metric_dir, contrast_name, suffix): +def find_xlsx_file(metric_dir, contrast_name): """ - Find a CSV file in a directory that matches the contrast name and suffix. - - Args: - metric_dir: Directory containing CSV files - contrast_name: Base name of the contrast to search for - suffix: File suffix to match (e.g., '_mean_matrix.csv') - - Returns: - Full path to the matched CSV file + Find a per-contrast xlsx file in metric_dir. Raises: FileNotFoundError: If no matching file is found """ + target = contrast_name + ".xlsx" + for f in os.listdir(metric_dir): + if f == target: + return os.path.join(metric_dir, f) + raise FileNotFoundError( + f"No xlsx file found for contrast '{contrast_name}' in {metric_dir}" + ) + + +def find_csv_file(metric_dir, contrast_name, suffix): + """Kept for backwards compatibility — prefer find_xlsx_file.""" + exact_tail = contrast_name + suffix for f in os.listdir(metric_dir): - if contrast_name in f and f.endswith(suffix): + if f.endswith(exact_tail): return os.path.join(metric_dir, f) raise FileNotFoundError( f"No CSV file found for contrast '{contrast_name}' with suffix '{suffix}' in {metric_dir}" ) +def _compute_fits_te(vial_groups, vial_to_idx, data_matrix, contrast_numbers): + """Fit T2 mono-exponential decay for all vials; return (subplot_fits, fit_results).""" + subplot_fits = [] + fit_results = [] + for group in vial_groups: + for vial in group: + if vial not in vial_to_idx: + continue + i = vial_to_idx[vial] + try: + popt, pcov = curve_fit( + mono_exp, contrast_numbers, data_matrix[i, :], + p0=(data_matrix[i, 0], 100), + ) + S0_fit, T2_fit = popt + r2 = calc_r2(data_matrix[i, :], mono_exp(contrast_numbers, *popt)) + try: + T2_se = float(np.sqrt(pcov[1, 1])) if np.isfinite(pcov[1, 1]) else None + except Exception: + T2_se = None + fit_results.append({"Vial": vial, "S0": S0_fit, "T2_ms": T2_fit, "T2_se_ms": T2_se, "R2": r2}) + x_fit = np.linspace(0, max(contrast_numbers), 200) + y_fit = mono_exp(x_fit, *popt) + ci_lower = ci_upper = None + try: + samples = np.random.multivariate_normal(popt, pcov, 1000) + preds = np.array([mono_exp(x_fit, *s) for s in samples]) + ci_lower = np.percentile(preds, 2.5, axis=0) + ci_upper = np.percentile(preds, 97.5, axis=0) + except (np.linalg.LinAlgError, ValueError) as e: + logger.warning("Could not calculate CI for vial %s: %s", vial, e) + subplot_fits.append({ + "vial": vial, + "x_fit": x_fit.tolist(), + "y_fit": y_fit.tolist(), + "ci_lower": ci_lower.tolist() if ci_lower is not None else None, + "ci_upper": ci_upper.tolist() if ci_upper is not None else None, + }) + except RuntimeError: + logger.warning("Could not fit T₂ for vial %s", vial) + return subplot_fits, fit_results + + def extract_numeric(label): """ Extract the last numeric value from a string label. @@ -103,14 +155,22 @@ def calc_r2(y_true, y_pred): def plot_vial_te_means_std( - contrast_files: list[str], - metric_dir: str, - output_file: str = "vial_summary_pub.png", - annotate: bool = False, - roi_image: str | None = None, -) -> str: + contrast_files, + metric_dir, + output_file="vial_summary_pub.png", + annotate=False, + roi_image=None, + output_format: str = "html", + nifti_image: str | None = None, + vial_niftis: dict | None = None, + fits_output: str | None = None, + relaxometry_reference: dict | None = None, + phantom: str | None = None, + overlay_contrast: str | None = None, +): """ - Create publication-quality plots of vial intensity data with T2 curve fitting. + Create interactive HTML or publication-quality PNG plots of vial intensity + data with T2 curve fitting. Generates a 3x3 grid of subplots showing intensity vs echo time for different vial groups, with fitted T2 decay curves overlaid on the measured data. @@ -119,19 +179,19 @@ def plot_vial_te_means_std( contrast_files: List of NIfTI file paths for different echo times metric_dir: Directory containing mean/std CSV files output_file: Output filename for the plot (default: 'vial_summary_pub.png') - annotate: Whether to annotate points with mean ± std (not currently used) - roi_image: Optional path to ROI overlay image for extra subplot + annotate: Whether to annotate points with mean ± std (PNG mode only) + roi_image: Optional path to ROI overlay image (PNG mode only) + output_format: "html" (default) for interactive HTML, "png" for static figure + nifti_image: Path to the background NIfTI file to embed in the HTML viewer. + vial_niftis: ``{vial_name: path}`` mapping for ROI overlay NIfTIs (all shown in red). Returns: - Absolute path to the saved plot file. + Absolute path to the saved output file. """ # ======================================================================== # CONFIGURATION: Vial groupings for subplots # ======================================================================== - # Define which vials appear together in each subplot - # Single-element lists get their own subplot (plotted in black) - # Multi-element lists share a subplot (each vial gets a different color) vial_groups = [ ["S"], # Subplot 1: Vial S alone ["D", "P"], # Subplot 2: Vials D and P together @@ -141,337 +201,270 @@ def plot_vial_te_means_std( ["A", "R"], # Subplot 6: Vials A and R together ["O"], # Subplot 7: Vial O alone ["Q"], # Subplot 8: Vial Q alone - # Subplot 9: Reserved for ROI overlay image (if provided) + # Subplot 9: Reserved for MRI viewer (HTML) or ROI overlay image (PNG) ] # ======================================================================== # DATA LOADING: Read mean and std deviation from CSV files # ======================================================================== - vial_labels = None # Vial identifiers (e.g., ['A', 'B', 'C', ...]) - contrast_numbers = [] # Echo times extracted from filenames - mean_matrix = [] # Mean intensity values for each vial at each TE - std_matrix = [] # Standard deviation values + vial_labels = None + contrast_numbers = [] + mean_matrix = [] + std_matrix = [] + median_matrix = [] + count_matrix = [] + p25_matrix = [] + p75_matrix = [] + min_matrix = [] + max_matrix = [] + mean_mad_matrix = [] + median_mad_matrix = [] - # Loop through each contrast file (different echo times) for nifti_path in contrast_files: - # Extract base filename without extension base_name = os.path.basename(nifti_path).replace(".nii.gz", "") + xlsx_path = find_xlsx_file(metric_dir, base_name) + mean_df = pd.read_excel(xlsx_path, sheet_name="mean") + std_df = pd.read_excel(xlsx_path, sheet_name="std") - # Find corresponding CSV files with mean and std data - mean_csv = find_csv_file(metric_dir, base_name, "_mean_matrix.csv") - std_csv = find_csv_file(metric_dir, base_name, "_std_matrix.csv") - - # Read CSV files (auto-detect delimiter: comma, tab, etc.) - mean_df = pd.read_csv(mean_csv, sep=None, engine="python") - std_df = pd.read_csv(std_csv, sep=None, engine="python") - - # Get vial labels from first file (column 0) if vial_labels is None: vial_labels = mean_df.iloc[:, 0].astype(str).tolist() - # Extract intensity values (column 1) and echo time from filename mean_matrix.append(mean_df.iloc[:, 1].to_numpy()) std_matrix.append(std_df.iloc[:, 1].to_numpy()) contrast_numbers.append(extract_numeric(base_name)) - # Convert lists to numpy arrays for easier manipulation - mean_matrix = np.array(mean_matrix) - std_matrix = np.array(std_matrix) + # Optional sheets — graceful degradation for older xlsx files + _mean_col = mean_df.iloc[:, 1].to_numpy() + for _attr, _sheet in [ + (median_matrix, "median"), + (count_matrix, "count"), + (p25_matrix, "p25"), + (p75_matrix, "p75"), + (min_matrix, "min"), + (max_matrix, "max"), + (mean_mad_matrix, "mean_mad"), + (median_mad_matrix, "median_mad"), + ]: + try: + _df = pd.read_excel(xlsx_path, sheet_name=_sheet) + vals = _df.iloc[:, 1].to_numpy().astype(float) + nan_mask = np.isnan(vals) + if nan_mask.any(): + vals[nan_mask] = _mean_col[nan_mask] + _attr.append(vals) + except Exception: + _attr.append(_mean_col.copy()) + + mean_matrix = np.array(mean_matrix) + std_matrix = np.array(std_matrix) + median_matrix = np.array(median_matrix) + count_matrix = np.array(count_matrix) + p25_matrix = np.array(p25_matrix) + p75_matrix = np.array(p75_matrix) + min_matrix = np.array(min_matrix) + max_matrix = np.array(max_matrix) + mean_mad_matrix = np.array(mean_mad_matrix) + median_mad_matrix = np.array(median_mad_matrix) # ======================================================================== # DATA ORGANIZATION: Sort by echo time and transpose # ======================================================================== - # Sort all data by echo time (ascending order) sort_idx = np.argsort(contrast_numbers) - contrast_numbers = np.array(contrast_numbers)[sort_idx] - mean_matrix = mean_matrix[sort_idx].T # Transpose so rows=vials, cols=TE - std_matrix = std_matrix[sort_idx].T + contrast_numbers = np.array(contrast_numbers)[sort_idx] + mean_matrix = mean_matrix[sort_idx].T # rows=vials, cols=TE + std_matrix = std_matrix[sort_idx].T + median_matrix = median_matrix[sort_idx].T + count_matrix = count_matrix[sort_idx].T + p25_matrix = p25_matrix[sort_idx].T + p75_matrix = p75_matrix[sort_idx].T + min_matrix = min_matrix[sort_idx].T + max_matrix = max_matrix[sort_idx].T + mean_mad_matrix = mean_mad_matrix[sort_idx].T + median_mad_matrix = median_mad_matrix[sort_idx].T - # Create mapping from vial label to row index for quick lookup vial_to_idx = {label: i for i, label in enumerate(vial_labels)} - - # Define y-axis limits for all subplots (consistent across all plots) yticks = [-100, 1000, 2000, 3000, 4000] # ======================================================================== - # FIGURE SETUP: Create 3x3 subplot grid + # CURVE FITTING (mean and median \u2014 shared by both PNG and HTML paths) # ======================================================================== - fig, axes = plt.subplots(3, 3, figsize=(18, 12)) - axes = axes.flatten() # Convert 2D array to 1D for easier indexing - cmap = plt.get_cmap("tab10") # Color map for multi-vial plots (10 colors) + cmap = plt.get_cmap("tab10") + subplot_fits, fit_results = _compute_fits_te( + vial_groups, vial_to_idx, mean_matrix, contrast_numbers + ) + subplot_fits_median, fit_results_median = _compute_fits_te( + vial_groups, vial_to_idx, median_matrix, contrast_numbers + ) - # Storage for fitted parameters (will be saved to CSV) - fit_results = [] + # ======================================================================== + # SAVE: Fitted T2 CSV (mean-based; always, regardless of output format) + # ======================================================================== + csv_stem = re.sub(r"\.(png|html)$", "", output_file, flags=re.IGNORECASE) + csv_output = fits_output if fits_output else csv_stem + "_T2_fits.csv" + pd.DataFrame(fit_results).to_csv(csv_output, index=False) + logger.info("Fitted parameters saved to %s", csv_output) + + # ======================================================================== + # HTML OUTPUT + # ======================================================================== + if output_format == "html": + from phantomkit.plotting._html_common import build_relaxometry_html + + html_file = re.sub(r"\.(png|html)$", "", output_file, flags=re.IGNORECASE) + ".html" + + embedded_data = { + "type": "maps_te", + "phantom": phantom, + "vial_groups": vial_groups, + "contrast_numbers": contrast_numbers.tolist(), + "mean_matrix": mean_matrix.tolist(), + "std_matrix": std_matrix.tolist(), + "fit_results": fit_results, + } + + html = build_relaxometry_html( + title="T2 Echo Time Mapping", + subtitle="Intensity vs echo time with T₂ curve fitting", + x_label="Echo Time (ms)", + fit_label="T₂ fit", + fit_key="T2_ms", + vial_groups=vial_groups, + contrast_numbers=contrast_numbers, + mean_matrix=mean_matrix, + std_matrix=std_matrix, + median_matrix=median_matrix, + count_matrix=count_matrix, + p25_matrix=p25_matrix, + p75_matrix=p75_matrix, + min_matrix=min_matrix, + max_matrix=max_matrix, + mean_mad_matrix=mean_mad_matrix, + median_mad_matrix=median_mad_matrix, + vial_labels=vial_labels, + subplot_fits=subplot_fits, + subplot_fits_median=subplot_fits_median, + fit_results_median=fit_results_median, + embedded_data=embedded_data, + nifti_image=nifti_image, + vial_niftis=vial_niftis, + ref_data=relaxometry_reference, + overlay_contrast=overlay_contrast, + ) + + from pathlib import Path + Path(html_file).write_text(html, encoding="utf-8") + logger.info("Interactive HTML saved to %s", html_file) + return os.path.abspath(html_file) # ======================================================================== - # MAIN PLOTTING LOOP: Process each vial group + # PNG OUTPUT (original matplotlib behaviour) # ======================================================================== + fig, axes = plt.subplots(3, 3, figsize=(18, 12)) + axes = axes.flatten() + for g_idx, group in enumerate(vial_groups): - ax = axes[g_idx] # Get current subplot + ax = axes[g_idx] - # -------------------------------------------------------------------- - # CASE 1: Single vial subplot - # -------------------------------------------------------------------- if len(group) == 1: vial = group[0] if vial not in vial_to_idx: continue - i = vial_to_idx[vial] # Get row index for this vial + i = vial_to_idx[vial] - # ================================================================ - # *** RAW DATA PLOTTING SECTION *** - # ================================================================ - # Plot measured intensity data with error bars - # This is the experimental data before any curve fitting - - # Plot error bars only (no markers, no line) ax.errorbar( - contrast_numbers, # x-axis: echo times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - yerr=std_matrix[i, :], # error bars: ± standard deviation - fmt="none", # NO markers or lines (error bars only) - capsize=5, # width of error bar caps - color="black", # error bar color - alpha=0.5, # slight transparency for error bars + contrast_numbers, + mean_matrix[i, :], + yerr=std_matrix[i, :], + fmt="none", + capsize=5, + color="black", + alpha=0.5, ) - - # Plot scatter points on top ax.scatter( - contrast_numbers, # x-axis: echo times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - s=50, # marker size - color="black", # marker color - marker="o", # circle markers - label=f"Vial {vial}", # legend label - zorder=3, # draw on top of error bars + contrast_numbers, + mean_matrix[i, :], + s=50, + color="black", + marker="o", + label=f"Vial {vial}", + zorder=3, ) - # ================================================================ - # Attempt to fit T2 mono-exponential decay curve to the data - try: - # Non-linear least squares curve fitting - # Keep covariance matrix for CI calculation - popt, pcov = curve_fit( - mono_exp, # Model function to fit - contrast_numbers, # x data (echo times) - mean_matrix[i, :], # y data (intensities) - p0=(mean_matrix[i, 0], 100), # Initial guesses: [S0, T2] - ) - S0_fit, T2_fit = popt # Extract fitted parameters - - # Calculate fitted curve and goodness of fit (R²) - fit_signal = mono_exp(contrast_numbers, *popt) - r2 = calc_r2(mean_matrix[i, :], fit_signal) - - # Store fit results for CSV output - fit_results.append( - {"Vial": vial, "S0": S0_fit, "T2_ms": T2_fit, "R2": r2} - ) - - # ============================================================ - # *** 95% CONFIDENCE INTERVAL CALCULATION *** - # ============================================================ - # Create fine grid for smooth curve visualization - x_fit = np.linspace(min(contrast_numbers), max(contrast_numbers), 200) - - # Calculate 95% CI via Monte Carlo sampling from parameter covariance - ci_lower = None - ci_upper = None - try: - # Sample parameter space (1000 samples from multivariate normal) - n_samples = 1000 - param_samples = np.random.multivariate_normal(popt, pcov, n_samples) - - # Generate predictions for each parameter sample - predictions = np.array( - [ - mono_exp(x_fit, sample[0], sample[1]) - for sample in param_samples - ] - ) - - # Calculate 2.5th and 97.5th percentiles (95% CI) - ci_lower = np.percentile(predictions, 2.5, axis=0) - ci_upper = np.percentile(predictions, 97.5, axis=0) - - except (np.linalg.LinAlgError, ValueError) as e: - # Covariance matrix might be singular or ill-conditioned - logger.warning( - "Could not calculate 95%% CI for vial %s: %s", vial, e - ) - - # ============================================================ - # *** FITTED CURVE AND CI BAND PLOTTING *** - # ============================================================ - # Plot 95% confidence interval band (if calculated successfully) - if ci_lower is not None and ci_upper is not None: + fit_entry = next((f for f in subplot_fits if f["vial"] == vial), None) + if fit_entry: + x_fit = np.array(fit_entry["x_fit"]) + y_fit = np.array(fit_entry["y_fit"]) + if fit_entry.get("ci_lower") and fit_entry.get("ci_upper"): ax.fill_between( x_fit, - ci_lower, - ci_upper, - color="gray", # Gray to match fitted curve - alpha=0.2, # Transparent (subtle background) - zorder=1, # Behind fitted curve and data - label="95% CI", # Legend label + fit_entry["ci_lower"], + fit_entry["ci_upper"], + color="gray", + alpha=0.2, + zorder=1, + label="95% CI", ) + ax.plot(x_fit, y_fit, "--", color="gray", alpha=0.8, zorder=2, label="T₂ fit") - # Plot smooth fitted curve (dashed line) over data - ax.plot( - x_fit, - mono_exp(x_fit, *popt), - "--", # Dashed line style - color="gray", # Gray color for fitted curve - alpha=0.8, # Slight transparency - zorder=2, # On top of CI band, below data - label="T₂ fit", # Legend label - ) - except RuntimeError: - # Curve fitting failed for this vial - logger.warning("Could not fit T\u2082 for vial %s", vial) - - # -------------------------------------------------------------------- - # CASE 2: Multiple vials in one subplot - # -------------------------------------------------------------------- else: for j, vial in enumerate(group): if vial not in vial_to_idx: continue - i = vial_to_idx[vial] # Get row index for this vial - - # ============================================================ - # *** RAW DATA PLOTTING SECTION *** - # ============================================================ - # Plot measured intensity data with error bars - # Each vial in the group gets a different color + i = vial_to_idx[vial] - # Plot error bars only (no markers, no line) ax.errorbar( - contrast_numbers, # x-axis: echo times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - yerr=std_matrix[i, :], # error bars: ± standard deviation - fmt="none", # NO markers or lines (error bars only) - capsize=5, # width of error bar caps - color=cmap(j % 10), # error bar color matches vial color - alpha=0.5, # slight transparency for error bars + contrast_numbers, + mean_matrix[i, :], + yerr=std_matrix[i, :], + fmt="none", + capsize=5, + color=cmap(j % 10), + alpha=0.5, ) - - # Plot scatter points on top ax.scatter( - contrast_numbers, # x-axis: echo times (ms) - mean_matrix[i, :], # y-axis: mean intensity values - s=50, # marker size - color=cmap(j % 10), # marker color from colormap - marker="o", # circle markers - label=f"Vial {vial}", # legend label - zorder=3, # draw on top of error bars + contrast_numbers, + mean_matrix[i, :], + s=50, + color=cmap(j % 10), + marker="o", + label=f"Vial {vial}", + zorder=3, ) - # ============================================================ - - # Attempt to fit T2 mono-exponential decay curve - try: - # Non-linear least squares curve fitting - # Keep covariance matrix for CI calculation - popt, pcov = curve_fit( - mono_exp, - contrast_numbers, - mean_matrix[i, :], - p0=(mean_matrix[i, 0], 100), - ) - S0_fit, T2_fit = popt - - # Calculate fitted curve and R² - fit_signal = mono_exp(contrast_numbers, *popt) - r2 = calc_r2(mean_matrix[i, :], fit_signal) - # Store fit results - fit_results.append( - {"Vial": vial, "S0": S0_fit, "T2_ms": T2_fit, "R2": r2} - ) - - # ======================================================== - # *** 95% CONFIDENCE INTERVAL CALCULATION *** - # ======================================================== - # Create fine grid for smooth curve - x_fit = np.linspace( - min(contrast_numbers), max(contrast_numbers), 200 - ) - - # Calculate 95% CI via Monte Carlo sampling - ci_lower = None - ci_upper = None - try: - # Sample parameter space - n_samples = 1000 - param_samples = np.random.multivariate_normal( - popt, pcov, n_samples - ) - - # Generate predictions - predictions = np.array( - [ - mono_exp(x_fit, sample[0], sample[1]) - for sample in param_samples - ] - ) - - # Calculate percentiles (95% CI) - ci_lower = np.percentile(predictions, 2.5, axis=0) - ci_upper = np.percentile(predictions, 97.5, axis=0) - - except (np.linalg.LinAlgError, ValueError) as e: - print(f"[WARN] Could not calculate 95% CI for vial {vial}: {e}") - - # ======================================================== - # *** PLOT CI BAND AND FITTED CURVE *** - # ======================================================== - # Plot 95% CI band (if calculated) - if ci_lower is not None and ci_upper is not None: + fit_entry = next((f for f in subplot_fits if f["vial"] == vial), None) + if fit_entry: + x_fit = np.array(fit_entry["x_fit"]) + y_fit = np.array(fit_entry["y_fit"]) + if fit_entry.get("ci_lower") and fit_entry.get("ci_upper"): ax.fill_between( x_fit, - ci_lower, - ci_upper, - color=cmap(j % 10), # Match vial color - alpha=0.15, # Very transparent - zorder=1, # Behind everything + fit_entry["ci_lower"], + fit_entry["ci_upper"], + color=cmap(j % 10), + alpha=0.15, + zorder=1, ) - - # Plot smooth fitted curve (dashed, same color as data) ax.plot( - x_fit, - mono_exp(x_fit, *popt), - "--", # Dashed line - color=cmap(j % 10), # Match data color - alpha=0.8, - zorder=2, # On top of CI, below data + x_fit, y_fit, "--", color=cmap(j % 10), alpha=0.8, zorder=2 ) - except RuntimeError: - print(f"[WARN] Could not fit T₂ for vial {vial}") - # Add legend for multi-vial subplots ax.legend(loc="upper right", fontsize=8) - # -------------------------------------------------------------------- - # SUBPLOT FORMATTING: Set titles, limits, and labels - # -------------------------------------------------------------------- - ax.set_title(" & ".join(group), fontsize=10) # e.g., "D & P" - ax.set_ylim(min(yticks), max(yticks)) # Consistent y-axis range - ax.grid(True, axis="y", linestyle="--", alpha=0.5) # Horizontal gridlines + ax.set_title(" & ".join(group), fontsize=10) + ax.set_ylim(min(yticks), max(yticks)) + ax.grid(True, axis="y", linestyle="--", alpha=0.5) - # Only show y-axis labels on leftmost column if g_idx % 3 == 0: ax.set_yticks(yticks) ax.set_yticklabels([str(t) for t in yticks]) ax.set_ylabel("Intensity", fontsize=9) else: ax.set_yticks(yticks) - ax.set_yticklabels([]) # Hide labels but keep tick marks + ax.set_yticklabels([]) - # ======================================================================== - # SPECIAL SUBPLOT: ROI Overlay (bottom-right position) - # ======================================================================== - ax = axes[-1] # Last subplot (position 9) + # ROI overlay in last subplot + ax = axes[-1] if roi_image and os.path.exists(roi_image): - # Display ROI overlay image if provided img = plt.imread(roi_image) ax.imshow( img, @@ -487,48 +480,30 @@ def plot_vial_te_means_std( ax.set_yticks([]) ax.set_title("ROI Overlay", fontsize=10) else: - # Hide subplot if no ROI image provided ax.axis("off") - # ======================================================================== - # SAVE OUTPUTS: Plot and fitted parameters - # ======================================================================== plt.tight_layout(rect=[0, 0, 1, 1]) plt.savefig(output_file, dpi=300, bbox_inches="tight") logger.info("Publication-ready plot saved to %s", output_file) - - # Save fitted T2 values to CSV - csv_output = os.path.splitext(output_file)[0] + "_T2_fits.csv" - pd.DataFrame(fit_results).to_csv(csv_output, index=False) - logger.info("Fitted parameters saved to %s", csv_output) - plt.close(fig) return os.path.abspath(output_file) -@click.command() +@click.command("maps-te") @click.argument("contrast_files", nargs=-1, required=True) +@click.option("-m", "--metric-dir", required=True, help="Directory with mean/std CSVs.") +@click.option("-o", "--output", default="vial_summary_pub.png", show_default=True) +@click.option("--annotate", is_flag=True, default=False) +@click.option("--roi-image", default=None, help="ROI overlay PNG (PNG mode only).") @click.option( - "-m", - "--metric_dir", - required=True, - help="Directory containing the mean/std CSV files.", -) -@click.option( - "-o", - "--output", - default="vial_summary_pub.png", + "--format", "output_format", + default="html", + type=click.Choice(["html", "png"]), show_default=True, - help="Output filename for the plot.", -) -@click.option("--annotate", is_flag=True, help="Annotate each point with mean ± std.") -@click.option( - "--roi_image", - default=None, - help="Path to ROI overlay PNG image for the extra subplot.", + help="Output format: interactive HTML (default) or static PNG.", ) -def main(contrast_files, metric_dir, output, annotate, roi_image): - """Plot grouped vial mean ± std with mono-exponential T₂ fitting and save fit metrics.""" +def main(contrast_files, metric_dir, output, annotate, roi_image, output_format): + """Plot vial mean ± std for T2 spin-echo with mono-exponential fitting.""" logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") plot_vial_te_means_std( list(contrast_files), @@ -536,6 +511,7 @@ def main(contrast_files, metric_dir, output, annotate, roi_image): output_file=output, annotate=annotate, roi_image=roi_image, + output_format=output_format, ) diff --git a/phantomkit/plotting/niivue.umd.min.js b/phantomkit/plotting/niivue.umd.min.js new file mode 100644 index 0000000..5273b06 --- /dev/null +++ b/phantomkit/plotting/niivue.umd.min.js @@ -0,0 +1,38 @@ +/** + * Minified by jsDelivr using Terser v5.39.0. + * Original file: /npm/@niivue/niivue@0.46.0/dist/niivue.umd.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(e,t){"object"==typeof exports&&typeof module<"u"?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=typeof globalThis<"u"?globalThis:e||self).niivue={})}(this,(function(exports){"use strict";var zp=Object.defineProperty,Qp=(e,t,i)=>t in e?zp(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,g0=(e,t,i)=>Qp(e,"symbol"!=typeof t?t+"":t,i);function _mergeNamespaces(e,t){for(var i=0;ir[t]})}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}var EPSILON=1e-6,ARRAY_TYPE=typeof Float32Array<"u"?Float32Array:Array;function create$4(){var e=new ARRAY_TYPE(9);return ARRAY_TYPE!=Float32Array&&(e[1]=0,e[2]=0,e[3]=0,e[5]=0,e[6]=0,e[7]=0),e[0]=1,e[4]=1,e[8]=1,e}function fromValues$4(e,t,i,r,n,a,o,s,l){var c=new ARRAY_TYPE(9);return c[0]=e,c[1]=t,c[2]=i,c[3]=r,c[4]=n,c[5]=a,c[6]=o,c[7]=s,c[8]=l,c}function multiply$1(e,t,i){var r=t[0],n=t[1],a=t[2],o=t[3],s=t[4],l=t[5],c=t[6],u=t[7],f=t[8],h=i[0],d=i[1],m=i[2],g=i[3],p=i[4],A=i[5],S=i[6],b=i[7],v=i[8];return e[0]=h*r+d*o+m*c,e[1]=h*n+d*s+m*u,e[2]=h*a+d*l+m*f,e[3]=g*r+p*o+A*c,e[4]=g*n+p*s+A*u,e[5]=g*a+p*l+A*f,e[6]=S*r+b*o+v*c,e[7]=S*n+b*s+v*u,e[8]=S*a+b*l+v*f,e}function create$3(){var e=new ARRAY_TYPE(16);return ARRAY_TYPE!=Float32Array&&(e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0),e[0]=1,e[5]=1,e[10]=1,e[15]=1,e}function clone$2(e){var t=new ARRAY_TYPE(16);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}function copy$1(e,t){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}function fromValues$3(e,t,i,r,n,a,o,s,l,c,u,f,h,d,m,g){var p=new ARRAY_TYPE(16);return p[0]=e,p[1]=t,p[2]=i,p[3]=r,p[4]=n,p[5]=a,p[6]=o,p[7]=s,p[8]=l,p[9]=c,p[10]=u,p[11]=f,p[12]=h,p[13]=d,p[14]=m,p[15]=g,p}function identity$1(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=0,e[5]=1,e[6]=0,e[7]=0,e[8]=0,e[9]=0,e[10]=1,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}function transpose(e,t){if(e===t){var i=t[1],r=t[2],n=t[3],a=t[6],o=t[7],s=t[11];e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=i,e[6]=t[9],e[7]=t[13],e[8]=r,e[9]=a,e[11]=t[14],e[12]=n,e[13]=o,e[14]=s}else e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15];return e}function invert(e,t){var i=t[0],r=t[1],n=t[2],a=t[3],o=t[4],s=t[5],l=t[6],c=t[7],u=t[8],f=t[9],h=t[10],d=t[11],m=t[12],g=t[13],p=t[14],A=t[15],S=i*s-r*o,b=i*l-n*o,v=i*c-a*o,w=r*l-n*s,T=r*c-a*s,y=n*c-a*l,C=u*g-f*m,I=u*p-h*m,D=u*A-d*m,x=f*p-h*g,E=f*A-d*g,M=h*A-d*p,k=S*M-b*E+v*x+w*D-T*I+y*C;return k?(k=1/k,e[0]=(s*M-l*E+c*x)*k,e[1]=(n*E-r*M-a*x)*k,e[2]=(g*y-p*T+A*w)*k,e[3]=(h*T-f*y-d*w)*k,e[4]=(l*D-o*M-c*I)*k,e[5]=(i*M-n*D+a*I)*k,e[6]=(p*v-m*y-A*b)*k,e[7]=(u*y-h*v+d*b)*k,e[8]=(o*E-s*D+c*C)*k,e[9]=(r*D-i*E-a*C)*k,e[10]=(m*T-g*v+A*S)*k,e[11]=(f*v-u*T-d*S)*k,e[12]=(s*I-o*x-l*C)*k,e[13]=(i*x-r*I+n*C)*k,e[14]=(g*b-m*w-p*S)*k,e[15]=(u*w-f*b+h*S)*k,e):null}function multiply(e,t,i){var r=t[0],n=t[1],a=t[2],o=t[3],s=t[4],l=t[5],c=t[6],u=t[7],f=t[8],h=t[9],d=t[10],m=t[11],g=t[12],p=t[13],A=t[14],S=t[15],b=i[0],v=i[1],w=i[2],T=i[3];return e[0]=b*r+v*s+w*f+T*g,e[1]=b*n+v*l+w*h+T*p,e[2]=b*a+v*c+w*d+T*A,e[3]=b*o+v*u+w*m+T*S,b=i[4],v=i[5],w=i[6],T=i[7],e[4]=b*r+v*s+w*f+T*g,e[5]=b*n+v*l+w*h+T*p,e[6]=b*a+v*c+w*d+T*A,e[7]=b*o+v*u+w*m+T*S,b=i[8],v=i[9],w=i[10],T=i[11],e[8]=b*r+v*s+w*f+T*g,e[9]=b*n+v*l+w*h+T*p,e[10]=b*a+v*c+w*d+T*A,e[11]=b*o+v*u+w*m+T*S,b=i[12],v=i[13],w=i[14],T=i[15],e[12]=b*r+v*s+w*f+T*g,e[13]=b*n+v*l+w*h+T*p,e[14]=b*a+v*c+w*d+T*A,e[15]=b*o+v*u+w*m+T*S,e}function translate(e,t,i){var r,n,a,o,s,l,c,u,f,h,d,m,g=i[0],p=i[1],A=i[2];return t===e?(e[12]=t[0]*g+t[4]*p+t[8]*A+t[12],e[13]=t[1]*g+t[5]*p+t[9]*A+t[13],e[14]=t[2]*g+t[6]*p+t[10]*A+t[14],e[15]=t[3]*g+t[7]*p+t[11]*A+t[15]):(r=t[0],n=t[1],a=t[2],o=t[3],s=t[4],l=t[5],c=t[6],u=t[7],f=t[8],h=t[9],d=t[10],m=t[11],e[0]=r,e[1]=n,e[2]=a,e[3]=o,e[4]=s,e[5]=l,e[6]=c,e[7]=u,e[8]=f,e[9]=h,e[10]=d,e[11]=m,e[12]=r*g+s*p+f*A+t[12],e[13]=n*g+l*p+h*A+t[13],e[14]=a*g+c*p+d*A+t[14],e[15]=o*g+u*p+m*A+t[15]),e}function scale$3(e,t,i){var r=i[0],n=i[1],a=i[2];return e[0]=t[0]*r,e[1]=t[1]*r,e[2]=t[2]*r,e[3]=t[3]*r,e[4]=t[4]*n,e[5]=t[5]*n,e[6]=t[6]*n,e[7]=t[7]*n,e[8]=t[8]*a,e[9]=t[9]*a,e[10]=t[10]*a,e[11]=t[11]*a,e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}function rotateX(e,t,i){var r=Math.sin(i),n=Math.cos(i),a=t[4],o=t[5],s=t[6],l=t[7],c=t[8],u=t[9],f=t[10],h=t[11];return t!==e&&(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15]),e[4]=a*n+c*r,e[5]=o*n+u*r,e[6]=s*n+f*r,e[7]=l*n+h*r,e[8]=c*n-a*r,e[9]=u*n-o*r,e[10]=f*n-s*r,e[11]=h*n-l*r,e}function rotateZ(e,t,i){var r=Math.sin(i),n=Math.cos(i),a=t[0],o=t[1],s=t[2],l=t[3],c=t[4],u=t[5],f=t[6],h=t[7];return t!==e&&(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[0]=a*n+c*r,e[1]=o*n+u*r,e[2]=s*n+f*r,e[3]=l*n+h*r,e[4]=c*n-a*r,e[5]=u*n-o*r,e[6]=f*n-s*r,e[7]=h*n-l*r,e}function fromRotation(e,t,i){var r,n,a,o=i[0],s=i[1],l=i[2],c=Math.hypot(o,s,l);return c0&&(a=1/Math.sqrt(a)),e[0]=t[0]*a,e[1]=t[1]*a,e[2]=t[2]*a,e}function dot(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function cross(e,t,i){var r=t[0],n=t[1],a=t[2],o=i[0],s=i[1],l=i[2];return e[0]=n*l-a*s,e[1]=a*o-r*l,e[2]=r*s-n*o,e}function lerp(e,t,i,r){var n=t[0],a=t[1],o=t[2];return e[0]=n+r*(i[0]-n),e[1]=a+r*(i[1]-a),e[2]=o+r*(i[2]-o),e}function angle(e,t){var i=e[0],r=e[1],n=e[2],a=t[0],o=t[1],s=t[2],l=Math.sqrt(i*i+r*r+n*n)*Math.sqrt(a*a+o*o+s*s),c=l&&dot(e,t)/l;return Math.acos(Math.min(Math.max(c,-1),1))}var sub$1=subtract$1,len=length$1,C;function create$1(){var e=new ARRAY_TYPE(4);return ARRAY_TYPE!=Float32Array&&(e[0]=0,e[1]=0,e[2]=0,e[3]=0),e}function clone(e){var t=new ARRAY_TYPE(4);return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function fromValues$1(e,t,i,r){var n=new ARRAY_TYPE(4);return n[0]=e,n[1]=t,n[2]=i,n[3]=r,n}function add(e,t,i){return e[0]=t[0]+i[0],e[1]=t[1]+i[1],e[2]=t[2]+i[2],e[3]=t[3]+i[3],e}function subtract(e,t,i){return e[0]=t[0]-i[0],e[1]=t[1]-i[1],e[2]=t[2]-i[2],e[3]=t[3]-i[3],e}function scale$1(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e[2]=t[2]*i,e[3]=t[3]*i,e}function transformMat4(e,t,i){var r=t[0],n=t[1],a=t[2],o=t[3];return e[0]=i[0]*r+i[4]*n+i[8]*a+i[12]*o,e[1]=i[1]*r+i[5]*n+i[9]*a+i[13]*o,e[2]=i[2]*r+i[6]*n+i[10]*a+i[14]*o,e[3]=i[3]*r+i[7]*n+i[11]*a+i[15]*o,e}C=create$2();var sub=subtract;function create(){var e=new ARRAY_TYPE(2);return ARRAY_TYPE!=Float32Array&&(e[0]=0,e[1]=0),e}function fromValues(e,t){var i=new ARRAY_TYPE(2);return i[0]=e,i[1]=t,i}function scale(e,t,i){return e[0]=t[0]*i,e[1]=t[1]*i,e}function length(e){var t=e[0],i=e[1];return Math.hypot(t,i)}function normalize(e,t){var i=t[0],r=t[1],n=i*i+r*r;return n>0&&(n=1/Math.sqrt(n)),e[0]=t[0]*n,e[1]=t[1]*n,e}!function(){var e=create$1()}(),function(){var e=create()}();const version="0.46.0",Ut=class e{constructor({name:e="niivue",level:t="info"}={}){g0(this,"level"),g0(this,"name"),this.name=`${e}`,this.level=t}debug(...t){e.levels[this.level]>e.levels.debug||console.debug(`${this.name}-debug`,...t)}info(...t){e.levels[this.level]>e.levels.info||console.info(`${this.name}-info`,...t)}warn(...t){e.levels[this.level]>e.levels.warn||console.warn(`${this.name}-warn`,...t)}error(...t){e.levels[this.level]>e.levels.error||console.error(`${this.name}-error`,...t)}fatal(...t){e.levels[this.level]>e.levels.fatal||console.error(`${this.name}-fatal`,...t)}setLogLevel(e){this.level=e}setName(e){this.name=e}};g0(Ut,"levels",{debug:0,info:1,warn:2,error:3,fatal:4,silent:1/0});let Log=Ut;const log=new Log({name:"niivue",level:"info"}),compileShader=function(e,t,i){const r=e.createShader(e.VERTEX_SHADER);e.shaderSource(r,t),e.compileShader(r);const n=e.createShader(e.FRAGMENT_SHADER);e.shaderSource(n,i),e.compileShader(n);const a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,n),e.linkProgram(a),!e.getProgramParameter(a,e.LINK_STATUS))throw log.error(e.getProgramInfoLog(a)),new Error("Shader failed to link, see console for log");return a};class Shader{constructor(e,t,i){g0(this,"program"),g0(this,"uniforms",{}),g0(this,"isMatcap"),this.program=compileShader(e,t,i);const r=/uniform[^;]+[ ](\w+);/g,n=/uniform[^;]+[ ](\w+);/,a=t.match(r),o=i.match(r);a&&a.forEach((e=>{const t=e.match(n);this.uniforms[t[1]]=-1})),o&&o.forEach((e=>{const t=e.match(n);this.uniforms[t[1]]=-1}));for(const t in this.uniforms)this.uniforms[t]=e.getUniformLocation(this.program,t)}use(e){e.useProgram(this.program)}}const vertRenderShader="#version 300 es\n#line 4\nlayout(location=0) in vec3 pos;\nlayout(location=1) in vec3 texCoords;\nuniform mat4 mvpMtx;\nout vec3 vColor;\nvoid main(void) {\n\tgl_Position = mvpMtx * vec4(pos, 1.0);\n\tvColor = texCoords;\n}",kDrawFunc="\n\tvec4 drawColor(float scalar, float drawOpacity) {\n\t\tfloat nlayer = float(textureSize(colormap, 0).y);\n\t\tfloat layer = (nlayer - 0.5) / nlayer;\n\t\tvec4 dcolor = texture(colormap, vec2((scalar * 255.0)/256.0 + 0.5/256.0, layer)).rgba;\n\t\tdcolor.a *= drawOpacity;\n\t\treturn dcolor;\n}",kRenderFunc="vec3 GetBackPosition(vec3 startPositionTex) {\n\tvec3 startPosition = startPositionTex * volScale;\n\tvec3 invR = 1.0 / rayDir;\n\tvec3 tbot = invR * (vec3(0.0)-startPosition);\n\tvec3 ttop = invR * (volScale-startPosition);\n\tvec3 tmax = max(ttop, tbot);\n\tvec2 t = min(tmax.xx, tmax.yz);\n\tvec3 endPosition = startPosition + (rayDir * min(t.x, t.y));\n\t//convert world position back to texture position:\n\tendPosition = endPosition / volScale;\n\treturn endPosition;\n}\n\nvec4 applyClip (vec3 dir, inout vec4 samplePos, inout float len, inout bool isClip) {\n\tfloat cdot = dot(dir,clipPlane.xyz);\n\tisClip = false;\n\tif ((clipPlane.a > 1.0) || (cdot == 0.0)) return samplePos;\n\tbool frontface = (cdot > 0.0);\n\tfloat dis = (-clipPlane.a - dot(clipPlane.xyz, samplePos.xyz-0.5)) / cdot;\n\tfloat thick = clipThick;\n\tif (thick <= 0.0) thick = 2.0;\n\tfloat disBackFace = (-(clipPlane.a-thick) - dot(clipPlane.xyz, samplePos.xyz-0.5)) / cdot;\n\tif (((frontface) && (dis >= len)) || ((!frontface) && (dis <= 0.0))) {\n\t\tsamplePos.a = len + 1.0;\n\t\treturn samplePos;\n\t}\n\tif (frontface) {\n\t\tdis = max(0.0, dis);\n\t\tsamplePos = vec4(samplePos.xyz+dir * dis, dis);\n\t\tif (dis > 0.0) isClip = true;\n\t\tlen = min(disBackFace, len);\n\t}\n\tif (!frontface) {\n\t\tlen = min(dis, len);\n\t\tdisBackFace = max(0.0, disBackFace);\n\t\tif (len == dis) isClip = true;\n\t\tsamplePos = vec4(samplePos.xyz+dir * disBackFace, disBackFace);\n\t}\n\treturn samplePos;\n}\n\nvoid clipVolume(inout vec3 startPos, inout vec3 backPos, int dim, float frac, bool isLo) {\n\tvec3 dir = backPos - startPos;\n\tfloat len = length(dir);\n\tdir = normalize(dir);\n\t// Discard if both startPos and backPos are outside the clipping plane\n\tif (isLo && startPos[dim] < frac && backPos[dim] < frac) {\n\t\tdiscard;\n\t}\n\tif (!isLo && startPos[dim] > frac && backPos[dim] > frac) {\n\t\tdiscard;\n\t}\n\tvec4 plane = vec4(0.0, 0.0, 0.0, 0.5 - frac);\n\tplane[dim] = 1.0;\n\tfloat cdot = dot(dir, plane.xyz);\n\tfloat dis = (-plane.w - dot(plane.xyz, startPos - vec3(0.5))) / cdot;\n\t// Adjust startPos or backPos based on the intersection with the plane\n\tbool isFrontFace = (cdot > 0.0);\n\tif (!isLo)\n\t\tisFrontFace = !isFrontFace;\n\tif (dis > 0.0) {\n\t\tif (isFrontFace) {\n\t\t\t\tif (dis <= len) {\n\t\t\t\t\tstartPos = startPos + dir * dis;\n\t\t\t\t}\n\t\t} else {\n\t\t\tif (dis < len) {\n\t\t\t\tbackPos = startPos + dir * dis;\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid clipVolumeStart (inout vec3 startPos, inout vec3 backPos) {\n\t// vec3 clipLo = vec3(0.1, 0.2, 0.4);\n\t// vec3 clipHi = vec3(0.8, 0.7, 0.7);\n\tfor (int i = 0; i < 3; i++) {\n\t\tif (clipLo[i] > 0.0)\n\t\t\tclipVolume(startPos, backPos, i, clipLo[i], true);\n\t}\n\tfor (int i = 0; i < 3; i++) {\n\t\tif (clipHi[i] < 1.0)\n\t\t\tclipVolume(startPos, backPos, i, clipHi[i], false);\n\t}\n}\n\nfloat frac2ndc(vec3 frac) {\n//https://stackoverflow.com/questions/7777913/how-to-render-depth-linearly-in-modern-opengl-with-gl-fragcoord-z-in-fragment-sh\n\tvec4 pos = vec4(frac.xyz, 1.0); //fraction\n\tvec4 dim = vec4(vec3(textureSize(volume, 0)), 1.0);\n\tpos = pos * dim;\n\tvec4 shim = vec4(-0.5, -0.5, -0.5, 0.0);\n\tpos += shim;\n\tvec4 mm = transpose(matRAS) * pos;\n\tfloat z_ndc = (mvpMtx * vec4(mm.xyz, 1.0)).z;\n\treturn (z_ndc + 1.0) / 2.0;\n}"+kDrawFunc,kRenderInit="void main() {\n\tif (fColor.x > 2.0) {\n\t\tfColor = vec4(1.0, 0.0, 0.0, 0.5);\n\t\treturn;\n\t}\n\tfColor = vec4(0.0,0.0,0.0,0.0);\n\tvec4 clipPlaneColorX = clipPlaneColor;\n\t//if (clipPlaneColor.a < 0.0)\n\t//\tclipPlaneColorX.a = - 1.0;\n\tbool isColorPlaneInVolume = false;\n\tif (clipPlaneColorX.a < 0.0) {\n\t\tisColorPlaneInVolume = true;\n\t\tclipPlaneColorX.a = 0.0;\n\t}\n\t//fColor = vec4(vColor.rgb, 1.0); return;\n\tvec3 start = vColor;\n\tgl_FragDepth = 0.0;\n\tvec3 backPosition = GetBackPosition(start);\n\t// fColor = vec4(backPosition, 1.0); return;\n\tvec3 dir = normalize(backPosition - start);\n\tclipVolumeStart(start, backPosition);\n\tdir = normalize(dir);\n\tfloat len = length(backPosition - start);\n\tfloat lenVox = length((texVox * start) - (texVox * backPosition));\n\tif ((lenVox < 0.5) || (len > 3.0)) { //length limit for parallel rays\n\t\treturn;\n\t}\n\tfloat sliceSize = len / lenVox; //e.g. if ray length is 1.0 and traverses 50 voxels, each voxel is 0.02 in unit cube\n\tfloat stepSize = sliceSize; //quality: larger step is faster traversal, but fewer samples\n\tfloat opacityCorrection = stepSize/sliceSize;\n\tvec4 deltaDir = vec4(dir.xyz * stepSize, stepSize);\n\tvec4 samplePos = vec4(start.xyz, 0.0); //ray position\n\tfloat lenNoClip = len;\n\tbool isClip = false;\n\tvec4 clipPos = applyClip(dir, samplePos, len, isClip);\n\t//if ((clipPos.a != samplePos.a) && (len < 3.0)) {\n\t//start: OPTIONAL fast pass: rapid traversal until first hit\n\tfloat stepSizeFast = sliceSize * 1.9;\n\tvec4 deltaDirFast = vec4(dir.xyz * stepSizeFast, stepSizeFast);\n\twhile (samplePos.a <= len) {\n\t\tfloat val = texture(volume, samplePos.xyz).a;\n\t\tif (val > 0.01)\n\t\t\tbreak;\n\t\tsamplePos += deltaDirFast; //advance ray position\n\t}\n\tfloat drawOpacityA = renderDrawAmbientOcclusionXY.y;\n\tif ((samplePos.a >= len) && (((overlays < 1.0) && (drawOpacityA <= 0.0) ) || (backgroundMasksOverlays > 0))) {\n\t\tif (isClip)\n\t\t\tfColor += clipPlaneColorX;\n\t\treturn;\n\t}\n\tfColor = vec4(1.0, 1.0, 1.0, 1.0);\n\t//gl_FragDepth = frac2ndc(samplePos.xyz); //crude due to fast pass resolution\n\tsamplePos -= deltaDirFast;\n\tif (samplePos.a < 0.0)\n\t\tvec4 samplePos = vec4(start.xyz, 0.0); //ray position\n\t//end: fast pass\n\tvec4 colAcc = vec4(0.0,0.0,0.0,0.0);\n\tvec4 firstHit = vec4(0.0,0.0,0.0,2.0 * lenNoClip);\n\tconst float earlyTermination = 0.95;\n\tfloat backNearest = len; //assume no hit\n\tfloat ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453);\n\tsamplePos += deltaDir * ran; //jitter ray\n",kRenderTail="\n\tif (firstHit.a < len)\n\t\tgl_FragDepth = frac2ndc(firstHit.xyz);\n\tcolAcc.a = (colAcc.a / earlyTermination) * backOpacity;\n\tfColor = colAcc;\n\t//if (isClip) //CR\n\tif ((isColorPlaneInVolume) && (clipPos.a != samplePos.a) && (abs(firstHit.a - clipPos.a) < deltaDir.a))\n\t\tfColor.rgb = mix(fColor.rgb, clipPlaneColorX.rgb, abs(clipPlaneColor.a));\n\t\t//fColor.rgb = mix(fColor.rgb, clipPlaneColorX.rgb, clipPlaneColorX.a * 0.65);\n\tfloat renderDrawAmbientOcclusionX = renderDrawAmbientOcclusionXY.x;\n\tfloat drawOpacity = renderDrawAmbientOcclusionXY.y;\n\tif ((overlays < 1.0) && (drawOpacity <= 0.0))\n\t\treturn;\n\t//overlay pass\n\tlen = lenNoClip;\n\tsamplePos = vec4(start.xyz, 0.0); //ray position\n\t//start: OPTIONAL fast pass: rapid traversal until first hit\n\tstepSizeFast = sliceSize * 1.0;\n\tdeltaDirFast = vec4(dir.xyz * stepSizeFast, stepSizeFast);\n\twhile (samplePos.a <= len) {\n\t\tfloat val = texture(overlay, samplePos.xyz).a;\n\t\tif (drawOpacity > 0.0)\n\t\t\tval = max(val, texture(drawing, samplePos.xyz).r);\n\t\tif (val > 0.001)\n\t\t\tbreak;\n\t\tsamplePos += deltaDirFast; //advance ray position\n\t}\n\tif (samplePos.a >= len) {\n\t\tif (isClip && (fColor.a == 0.0))\n\t\t\t\tfColor += clipPlaneColorX;\n\t\t\treturn;\n\t}\n\tsamplePos -= deltaDirFast;\n\tif (samplePos.a < 0.0)\n\t\tvec4 samplePos = vec4(start.xyz, 0.0); //ray position\n\t//end: fast pass\n\tfloat overFarthest = len;\n\tcolAcc = vec4(0.0, 0.0, 0.0, 0.0);\n\n\tsamplePos += deltaDir * ran; //jitter ray\n\tvec4 overFirstHit = vec4(0.0,0.0,0.0,2.0 * len);\n\tif (backgroundMasksOverlays > 0)\n\t\tsamplePos = firstHit;\n\tbool firstDraw = true;\n\twhile (samplePos.a <= len) {\n\t\tvec4 colorSample = texture(overlay, samplePos.xyz);\n\t\tif ((colorSample.a < 0.01) && (drawOpacity > 0.0)) {\n\t\t\tfloat val = texture(drawing, samplePos.xyz).r;\n\t\t\tvec4 draw = drawColor(val, drawOpacity);\n\t\t\tif ((draw.a > 0.0) && (firstDraw)) {\n\t\t\t\tfirstDraw = false;\n\t\t\t\tfloat sum = 0.0;\n\t\t\t\tconst float mn = 1.0 / 256.0;\n\t\t\t\tconst float sampleRadius = 1.1;\n\t\t\t\tfloat dx = sliceSize * sampleRadius;\n\t\t\t\tvec3 center = samplePos.xyz;\n\t\t\t\t//six neighbors that share a face\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,0.0,+dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,0.0,-dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,+dx,0.0), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,-dx,0.0), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(+dx,0.0,0.0), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(-dx,0.0,0.0), dir)).r, mn);\n\t\t\t\t//float proportion = (sum / mn) / 6.0;\n\t\t\t\t\n\t\t\t\t//12 neighbors that share an edge\n\t\t\t\tdx = sliceSize * sampleRadius * sqrt(2.0) * 0.5;\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,+dx,+dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(+dx,0.0,+dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(+dx,+dx,0.0), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,-dx,-dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(-dx,0.0,-dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(-dx,-dx,0.0), dir)).r, mn);\n\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,+dx,-dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(+dx,0.0,-dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(+dx,-dx,0.0), dir)).r, mn);\n\t\t\t\t\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(0.0,-dx,+dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(-dx,0.0,+dx), dir)).r, mn);\n\t\t\t\tsum += min(texture(drawing, center.xyz + cross(vec3(-dx,+dx,0.0), dir)).r, mn);\n\t\t\t\tfloat proportion = (sum / mn) / 18.0; //proportion of six neighbors is non-zero\n\t\t\t\t\n\t\t\t\t//a high proportion of hits means crevice\n\t\t\t\t//since the AO term adds shadows that darken most voxels, it will result in dark surfaces\n\t\t\t\t//the term brighten adds a little illumination to balance this\n\t\t\t\t// without brighten, only the most extreme ridges will not be darker\n\t\t\t\tconst float brighten = 1.2;\n\t\t\t\tvec3 ao = draw.rgb * (1.0 - proportion) * brighten;\n\t\t\t\tdraw.rgb = mix (draw.rgb, ao , renderDrawAmbientOcclusionX);\n\t\t\t}\n\t\t\tcolorSample = draw;\n\t\t}\n\t\tsamplePos += deltaDir; //advance ray position\n\t\tif (colorSample.a >= 0.01) {\n\t\t\tif (overFirstHit.a > len)\n\t\t\t\toverFirstHit = samplePos;\n\t\t\tcolorSample.a *= renderOverlayBlend;\n\t\t\tcolorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection);\n\t\t\tcolorSample.rgb *= colorSample.a;\n\t\t\tcolAcc= (1.0 - colAcc.a) * colorSample + colAcc;\n\t\t\toverFarthest = samplePos.a;\n\t\t\tif ( colAcc.a > earlyTermination )\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t//if (samplePos.a >= len) {\n\tif (colAcc.a <= 0.0) {\n\t\tif (isClip && (fColor.a == 0.0))\n\t\t\tfColor += clipPlaneColorX;\n\t\treturn;\n\t}\n\tif (overFirstHit.a < firstHit.a)\n\t\tgl_FragDepth = frac2ndc(overFirstHit.xyz);\n\tfloat overMix = colAcc.a;\n\tfloat overlayDepth = 0.3;\n\tif (fColor.a <= 0.0)\n\t\toverMix = 1.0;\n\telse if (((overFarthest) > backNearest)) {\n\t\tfloat dx = (overFarthest - backNearest)/1.73;\n\t\tdx = fColor.a * pow(dx, overlayDepth);\n\t\toverMix *= 1.0 - dx;\n\t}\n\tfColor.rgb = mix(fColor.rgb, colAcc.rgb, overMix);\n\tfColor.a = max(fColor.a, colAcc.a);\n}",fragRenderSliceShader="#version 300 es\n#line 215\nprecision highp int;\nprecision highp float;\nuniform vec3 rayDir;\nuniform vec3 texVox;\nuniform int backgroundMasksOverlays;\nuniform vec3 volScale;\nuniform vec4 clipPlane;\nuniform highp sampler3D volume, overlay;\nuniform float overlays;\nuniform float clipThick;\nuniform vec3 clipLo;\nuniform vec3 clipHi;\nuniform float backOpacity;\nuniform mat4 mvpMtx;\nuniform mat4 matRAS;\nuniform vec4 clipPlaneColor;\nuniform float renderOverlayBlend;\nuniform highp sampler3D drawing;\nuniform highp sampler2D colormap;\nuniform vec2 renderDrawAmbientOcclusionXY;\nin vec3 vColor;\nout vec4 fColor;\n"+kRenderFunc+"\n\tvoid main() {\n\tvec3 start = vColor;\n\tgl_FragDepth = 0.0;\n\tvec3 backPosition = GetBackPosition(start);\n\tvec3 dir = normalize(backPosition - start);\n\tclipVolumeStart(start, backPosition);\n\tfloat len = length(backPosition - start);\n\tfloat lenVox = length((texVox * start) - (texVox * backPosition));\n\tif ((lenVox < 0.5) || (len > 3.0)) { //length limit for parallel rays\n\t\tfColor = vec4(0.0,0.0,0.0,0.0);\n\t\treturn;\n\t}\n\tfloat sliceSize = len / lenVox; //e.g. if ray length is 1.0 and traverses 50 voxels, each voxel is 0.02 in unit cube\n\tfloat stepSize = sliceSize; //quality: larger step is faster traversal, but fewer samples\n\tfloat opacityCorrection = stepSize/sliceSize;\n\tvec4 deltaDir = vec4(dir.xyz * stepSize, stepSize);\n\tvec4 samplePos = vec4(start.xyz, 0.0); //ray position\n\tvec4 colAcc = vec4(0.0,0.0,0.0,0.0);\n\tvec4 firstHit = vec4(0.0,0.0,0.0,2.0 * len);\n\tconst float earlyTermination = 0.95;\n\tfloat backNearest = len; //assume no hit\n\tfloat dis = len;\n\t//check if axial plane is closest\n\tvec4 aClip = vec4(0.0, 0.0, 1.0, (1.0- clipPlane.z) - 0.5);\n\tfloat adis = (-aClip.a - dot(aClip.xyz, samplePos.xyz-0.5)) / dot(dir,aClip.xyz);\n\tif (adis > 0.0)\n\t\tdis = min(adis, dis);\n\t//check of coronal plane is closest\n\tvec4 cClip = vec4(0.0, 1.0, 0.0, (1.0- clipPlane.y) - 0.5);\n\tfloat cdis = (-cClip.a - dot(cClip.xyz, samplePos.xyz-0.5)) / dot(dir,cClip.xyz);\n\tif (cdis > 0.0)\n\t\tdis = min(cdis, dis);\n\t//check if coronal slice is closest\n\tvec4 sClip = vec4(1.0, 0.0, 0.0, (1.0- clipPlane.x) - 0.5);\n\tfloat sdis = (-sClip.a - dot(sClip.xyz, samplePos.xyz-0.5)) / dot(dir,sClip.xyz);\n\tif (sdis > 0.0)\n\t\tdis = min(sdis, dis);\n\tif ((dis > 0.0) && (dis < len)) {\n\t\tsamplePos = vec4(samplePos.xyz+dir * dis, dis);\n\t\tcolAcc = texture(volume, samplePos.xyz);\n\t\tcolAcc.a = earlyTermination;\n\t\tfirstHit = samplePos;\n\t\tbackNearest = min(backNearest, samplePos.a);\n\t}\n\t//the following are only used by overlays\n\tvec4 clipPlaneColorX = clipPlaneColor;\n\tbool isColorPlaneInVolume = false;\n\tfloat lenNoClip = len;\n\tbool isClip = false;\n\tvec4 clipPos = applyClip(dir, samplePos, len, isClip);\n\tfloat stepSizeFast = sliceSize * 1.9;\n\tvec4 deltaDirFast = vec4(dir.xyz * stepSizeFast, stepSizeFast);\n\tif (samplePos.a < 0.0)\n\t\tvec4 samplePos = vec4(start.xyz, 0.0); //ray position\n\tfloat ran = fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453);\n\tsamplePos += deltaDir * ran; //jitter ray\n"+kRenderTail,fragRenderShader="#version 300 es\n#line 215\nprecision highp int;\nprecision highp float;\nuniform vec3 rayDir;\nuniform vec3 texVox;\nuniform int backgroundMasksOverlays;\nuniform vec3 volScale;\nuniform vec4 clipPlane;\nuniform highp sampler3D volume, overlay;\nuniform float overlays;\nuniform float clipThick;\nuniform vec3 clipLo;\nuniform vec3 clipHi;\nuniform float backOpacity;\nuniform mat4 mvpMtx;\nuniform mat4 matRAS;\nuniform vec4 clipPlaneColor;\nuniform float renderOverlayBlend;\nuniform highp sampler3D drawing;\nuniform highp sampler2D colormap;\nuniform vec2 renderDrawAmbientOcclusionXY;\nin vec3 vColor;\nout vec4 fColor;\n"+kRenderFunc+kRenderInit+"while (samplePos.a <= len) {\n\t\tvec4 colorSample = texture(volume, samplePos.xyz);\n\t\tsamplePos += deltaDir; //advance ray position\n\t\tif (colorSample.a >= 0.01) {\n\t\t\tif (firstHit.a > lenNoClip)\n\t\t\t\tfirstHit = samplePos;\n\t\t\tbackNearest = min(backNearest, samplePos.a);\n\t\t\tcolorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection);\n\t\t\tcolorSample.rgb *= colorSample.a;\n\t\t\tcolAcc= (1.0 - colAcc.a) * colorSample + colAcc;\n\t\t\tif ( colAcc.a > earlyTermination )\n\t\t\t\tbreak;\n\t\t}\n\t}\n"+kRenderTail,fragRenderGradientShader="#version 300 es\n#line 215\nprecision highp int;\nprecision highp float;\nuniform vec3 rayDir;\nuniform vec3 texVox;\nuniform int backgroundMasksOverlays;\nuniform vec3 volScale;\nuniform vec4 clipPlane;\nuniform highp sampler3D volume, overlay;\nuniform float overlays;\nuniform float clipThick;\nuniform vec3 clipLo;\nuniform vec3 clipHi;\nuniform float backOpacity;\nuniform mat4 mvpMtx;\nuniform mat4 normMtx;\nuniform mat4 matRAS;\nuniform vec4 clipPlaneColor;\nuniform float renderOverlayBlend;\nuniform highp sampler3D drawing, gradient;\nuniform highp sampler2D colormap;\nuniform highp sampler2D matCap;\nuniform vec2 renderDrawAmbientOcclusionXY;\nuniform float gradientAmount;\nin vec3 vColor;\nout vec4 fColor;\n"+kRenderFunc+kRenderInit+"\n\tfloat startPos = samplePos.a;\n\tfloat clipClose = clipPos.a + 3.0 * deltaDir.a; //do not apply gradients near clip plane\n\tfloat brighten = 2.0; //modulating makes average intensity darker 0.5 * 0.5 = 0.25\n\t//vec4 prevGrad = vec4(0.0);\n\twhile (samplePos.a <= len) {\n\t\tvec4 colorSample = texture(volume, samplePos.xyz);\n\t\tif (colorSample.a >= 0.0) {\n\t\t\tvec4 grad = texture(gradient, samplePos.xyz);\n\t\t\tgrad.rgb = normalize(grad.rgb*2.0 - 1.0);\n\t\t\t//if (grad.a < prevGrad.a)\n\t\t\t//\tgrad.rgb = prevGrad.rgb;\n\t\t\t//prevGrad = grad;\n\t\t\tvec3 n = mat3(normMtx) * grad.rgb;\n\t\t\tn.y = - n.y;\n\t\t\tvec4 mc = vec4(texture(matCap, n.xy * 0.5 + 0.5).rgb, 1.0) * brighten;\n\t\t\tmc = mix(vec4(1.0), mc, gradientAmount);\n\t\t\tif (samplePos.a > clipClose)\n\t\t\t\tcolorSample.rgb *= mc.rgb;\n\t\t\tif (firstHit.a > lenNoClip)\n\t\t\t\tfirstHit = samplePos;\n\t\t\tbackNearest = min(backNearest, samplePos.a);\n\t\t\tcolorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection);\n\t\t\tcolorSample.rgb *= colorSample.a;\n\t\t\tcolAcc= (1.0 - colAcc.a) * colorSample + colAcc;\n\t\t\tif ( colAcc.a > earlyTermination )\n\t\t\t\tbreak;\n\t\t}\n\t\tsamplePos += deltaDir; //advance ray position\n\t}\n"+kRenderTail,vertSliceMMShader="#version 300 es\n#line 392\nlayout(location=0) in vec3 pos;\nuniform int axCorSag;\nuniform mat4 mvpMtx;\nuniform mat4 frac2mm;\nuniform float slice;\nout vec3 texPos;\nvoid main(void) {\n\ttexPos = vec3(pos.x, pos.y, slice);\n\tif (axCorSag > 1)\n\t\ttexPos = vec3(slice, pos.x, pos.y);\n\telse if (axCorSag > 0)\n\t\ttexPos = vec3(pos.x, slice, pos.y);\n\tvec4 mm = frac2mm * vec4(texPos, 1.0);\n\tgl_Position = mvpMtx * mm;\n}",kFragSliceHead="#version 300 es\n#line 411\nprecision highp int;\nprecision highp float;\nuniform highp sampler3D volume, overlay;\nuniform int backgroundMasksOverlays;\nuniform float overlayOutlineWidth;\nuniform float overlayAlphaShader;\nuniform int axCorSag;\nuniform float overlays;\nuniform float opacity;\nuniform float drawOpacity;\nuniform bool isAlphaClipDark;\nuniform highp sampler3D drawing;\nuniform highp sampler2D colormap;\nin vec3 texPos;\nout vec4 color;"+kDrawFunc+'void main() {\n\t//color = vec4(1.0, 0.0, 1.0, 1.0);return;\n\tvec4 background = texture(volume, texPos);\n\tcolor = vec4(background.rgb, opacity);\n\tif ((isAlphaClipDark) && (background.a == 0.0)) color.a = 0.0; //FSLeyes clipping range\n\tvec4 ocolor = vec4(0.0);\n\tfloat overlayAlpha = overlayAlphaShader;\n\tif (overlays > 0.0) {\n\t\tocolor = texture(overlay, texPos);\n\t\t//dFdx for "boxing" issue 435 has aliasing on some implementations (coarse vs fine)\n\t\t//however, this only identifies 50% of the edges due to aliasing effects\n\t\t// http://www.aclockworkberry.com/shader-derivative-functions/\n\t\t// https://bgolus.medium.com/distinctive-derivative-differences-cce38d36797b\n\t\t//if ((ocolor.a >= 1.0) && ((dFdx(ocolor.a) != 0.0) || (dFdy(ocolor.a) != 0.0) ))\n\t\t//\tocolor.rbg = vec3(0.0, 0.0, 0.0);\n\t\tbool isOutlineBelowNotAboveThreshold = true;\n\t\tif (isOutlineBelowNotAboveThreshold) {\n\t\t\tif ((overlayOutlineWidth > 0.0) && (ocolor.a < 1.0)) { //check voxel neighbors for edge\n\t\t\t\tvec3 vx = (overlayOutlineWidth ) / vec3(textureSize(overlay, 0));\n\t\t\t\t//6 voxel neighbors that share a face\n\t\t\t\tvec3 vxR = vec3(texPos.x+vx.x, texPos.y, texPos.z);\n\t\t\t\tvec3 vxL = vec3(texPos.x-vx.x, texPos.y, texPos.z);\n\t\t\t\tvec3 vxA = vec3(texPos.x, texPos.y+vx.y, texPos.z);\n\t\t\t\tvec3 vxP = vec3(texPos.x, texPos.y-vx.y, texPos.z);\n\t\t\t\tvec3 vxS = vec3(texPos.x, texPos.y, texPos.z+vx.z);\n\t\t\t\tvec3 vxI = vec3(texPos.x, texPos.y, texPos.z-vx.z);\n\t\t\t\tfloat a = 0.0;\n\t\t\t\tif (axCorSag != 2) {\n\t\t\t\t\ta = max(a, texture(overlay, vxR).a);\n\t\t\t\t\ta = max(a, texture(overlay, vxL).a);\n\t\t\t\t}\n\t\t\t\tif (axCorSag != 1) {\n\t\t\t\t\ta = max(a, texture(overlay, vxA).a);\n\t\t\t\t\ta = max(a, texture(overlay, vxP).a);\n\t\t\t\t}\n\t\t\t\tif (axCorSag != 0) {\n\t\t\t\t\ta = max(a, texture(overlay, vxS).a);\n\t\t\t\t\ta = max(a, texture(overlay, vxI).a);\n\t\t\t\t}\n\t\t\t\tbool isCheckCorners = true;\n\t\t\t\tif (isCheckCorners) {\n\t\t\t\t\t//12 voxel neighbors that share an edge\n\t\t\t\t\tvec3 vxRA = vec3(texPos.x+vx.x, texPos.y+vx.y, texPos.z);\n\t\t\t\t\tvec3 vxLA = vec3(texPos.x-vx.x, texPos.y+vx.y, texPos.z);\n\t\t\t\t\tvec3 vxRP = vec3(texPos.x+vx.x, texPos.y-vx.y, texPos.z);\n\t\t\t\t\tvec3 vxLP = vec3(texPos.x-vx.x, texPos.y-vx.y, texPos.z);\n\t\t\t\t\tvec3 vxRS = vec3(texPos.x+vx.x, texPos.y, texPos.z+vx.z);\n\t\t\t\t\tvec3 vxLS = vec3(texPos.x-vx.x, texPos.y, texPos.z+vx.z);\n\t\t\t\t\tvec3 vxRI = vec3(texPos.x+vx.x, texPos.y, texPos.z-vx.z);\n\t\t\t\t\tvec3 vxLI = vec3(texPos.x-vx.x, texPos.y, texPos.z-vx.z);\n\t\t\t\t\tvec3 vxAS = vec3(texPos.x, texPos.y+vx.y, texPos.z+vx.z);\n\t\t\t\t\tvec3 vxPS = vec3(texPos.x, texPos.y-vx.y, texPos.z+vx.z);\n\t\t\t\t\tvec3 vxAI = vec3(texPos.x, texPos.y+vx.y, texPos.z-vx.z);\n\t\t\t\t\tvec3 vxPI = vec3(texPos.x, texPos.y-vx.y, texPos.z-vx.z);\n\n\t\t\t\t\tif (axCorSag == 0) { //axial corners\n\t\t\t\t\t\ta = max(a, texture(overlay, vxRA).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxLA).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxRP).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxLP).a);\n\t\t\t\t\t}\n\t\t\t\t\tif (axCorSag == 1) { //coronal corners\n\t\t\t\t\t\ta = max(a, texture(overlay, vxRS).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxLS).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxRI).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxLI).a);\n\t\t\t\t\t}\n\t\t\t\t\tif (axCorSag == 2) { //sagittal corners\n\t\t\t\t\t\ta = max(a, texture(overlay, vxAS).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxPS).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxAI).a);\n\t\t\t\t\t\ta = max(a, texture(overlay, vxPI).a);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (a >= 1.0) {\n\t\t\t\t\tocolor = vec4(0.0, 0.0, 0.0, 1.0);\n\t\t\t\t\toverlayAlpha = 1.0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ((overlayOutlineWidth > 0.0) && (ocolor.a >= 1.0)) { //check voxel neighbors for edge\n\t\t\t\tvec3 vx = (overlayOutlineWidth ) / vec3(textureSize(overlay, 0));\n\t\t\t\tvec3 vxR = vec3(texPos.x+vx.x, texPos.y, texPos.z);\n\t\t\t\tvec3 vxL = vec3(texPos.x-vx.x, texPos.y, texPos.z);\n\t\t\t\tvec3 vxA = vec3(texPos.x, texPos.y+vx.y, texPos.z);\n\t\t\t\tvec3 vxP = vec3(texPos.x, texPos.y-vx.y, texPos.z);\n\t\t\t\tvec3 vxS = vec3(texPos.x, texPos.y, texPos.z+vx.z);\n\t\t\t\tvec3 vxI = vec3(texPos.x, texPos.y, texPos.z-vx.z);\n\t\t\t\tfloat a = 1.0;\n\t\t\t\tif (axCorSag != 2) {\n\t\t\t\t\ta = min(a, texture(overlay, vxR).a);\n\t\t\t\t\ta = min(a, texture(overlay, vxL).a);\n\t\t\t\t}\n\t\t\t\tif (axCorSag != 1) {\n\t\t\t\t\ta = min(a, texture(overlay, vxA).a);\n\t\t\t\t\ta = min(a, texture(overlay, vxP).a);\n\t\t\t\t}\n\t\t\t\tif (axCorSag != 0) {\n\t\t\t\t\ta = min(a, texture(overlay, vxS).a);\n\t\t\t\t\ta = min(a, texture(overlay, vxI).a);\n\t\t\t\t}\n\t\t\t\tif (a < 1.0) {\n\t\t\t\t\tocolor = vec4(0.0, 0.0, 0.0, 1.0);\n\t\t\t\t\toverlayAlpha = 1.0;\n\t\t\t\t}\n\t\t\t}\n\t\t} //outline above threshold\n\t}\n\n',kFragSliceTail="\tocolor.a *= overlayAlpha;\n\tvec4 dcolor = drawColor(texture(drawing, texPos).r, drawOpacity);\n\tif (dcolor.a > 0.0) {\n\t\tcolor.rgb = mix(color.rgb, dcolor.rgb, dcolor.a);\n\t\tcolor.a = max(drawOpacity, color.a);\n\t}\n\tif ((backgroundMasksOverlays > 0) && (background.a == 0.0))\n\t\treturn;\n\tfloat a = color.a + ocolor.a * (1.0 - color.a); // premultiplied alpha\n\tif (a == 0.0) return;\n\tcolor.rgb = mix(color.rgb, ocolor.rgb, ocolor.a / a);\n\tcolor.a = a;\n}",fragSliceMMShader=kFragSliceHead+kFragSliceTail,fragSliceV1Shader=kFragSliceHead+"\tif (ocolor.a > 0.0) {\n\t\t//https://gamedev.stackexchange.com/questions/102889/is-it-possible-to-convert-vec4-to-int-in-glsl-using-opengl-es\n\t\tuint alpha = uint(ocolor.a * 255.0);\n\t\tvec3 xyzFlip = vec3(float((uint(1) & alpha) > uint(0)), float((uint(2) & alpha) > uint(0)), float((uint(4) & alpha) > uint(0)));\n\t\t//convert from 0 and 1 to -1 and 1\n\t\txyzFlip = (xyzFlip * 2.0) - 1.0;\n\t\t//https://math.stackexchange.com/questions/1905533/find-perpendicular-distance-from-point-to-line-in-3d\n\t\t//v1 principle direction of tensor for this voxel\n\t\tvec3 v1 = ocolor.rgb;\n\t\t//flips encode polarity to convert from 0..1 to -1..1 (27 bits vs 24 bit precision)\n\t\tv1 = normalize( v1 * xyzFlip);\n\t\tvec3 vxl = fract(texPos * vec3(textureSize(volume, 0))) - 0.5;\n\t\t//vxl coordinates now -0.5..+0.5 so 0,0,0 is origin\n\t\tvxl.x = -vxl.x;\n\t\tfloat t = dot(vxl,v1);\n\t\tvec3 P = t * v1;\n\t\tfloat dx = length(P-vxl);\n\t\tocolor.a = 1.0 - smoothstep(0.2,0.25, dx);\n\t\t//if modulation was applied, use that to scale alpha not color:\n\t\tocolor.a *= length(ocolor.rgb);\n\t\tocolor.rgb = normalize(ocolor.rgb);\n\t\t//compute distance one half voxel closer to viewer:\n\t\tfloat pan = 0.5;\n\t\tif (axCorSag == 0)\n\t\t\tvxl.z -= pan;\n\t\tif (axCorSag == 1)\n\t\t\tvxl.y -= pan;\n\t\tif (axCorSag == 2)\n\t\t\tvxl.x += pan;\n\t\tt = dot(vxl,v1);\n\t\tP = t * v1;\n\t\tfloat dx2 = length(P-vxl);\n\t\tocolor.rgb += (dx2-dx-(0.5 * pan)) * 1.0;\n\t}\n"+kFragSliceTail,fragRectShader="#version 300 es\n#line 480\nprecision highp int;\nprecision highp float;\nuniform vec4 lineColor;\nout vec4 color;\nvoid main() {\n\tcolor = lineColor;\n}",fragRectOutlineShader="#version 300 es\n#line 723\nprecision highp int;\nprecision highp float;\n\nuniform vec4 lineColor;\nuniform vec4 leftTopWidthHeight;\nuniform float thickness; // line thickness in pixels\nuniform vec2 canvasWidthHeight;\n\nout vec4 color;\n\nvoid main() {\n // fragment position in screen coordinates\n vec2 fragCoord = gl_FragCoord.xy;\n\n // canvas height\n float canvasHeight = canvasWidthHeight.y;\n\n // 'top' and 'bottom' to match gl_FragCoord.y coordinate system\n float top = canvasHeight - leftTopWidthHeight.y;\n float bottom = top - leftTopWidthHeight.w;\n\n // left and right edges\n float left = leftTopWidthHeight.x;\n float right = left + leftTopWidthHeight.z;\n\n bool withinLeft = fragCoord.x >= left && fragCoord.x <= left + thickness;\n bool withinRight = fragCoord.x <= right && fragCoord.x >= right - thickness;\n bool withinTop = fragCoord.y <= top && fragCoord.y >= top - thickness;\n bool withinBottom = fragCoord.y >= bottom && fragCoord.y <= bottom + thickness;\n\n bool isOutline = withinLeft || withinRight || withinTop || withinBottom;\n\n if (isOutline) {\n color = lineColor;\n } else {\n discard; \n }\n}",vertColorbarShader="#version 300 es\n#line 490\nlayout(location=0) in vec3 pos;\nuniform vec2 canvasWidthHeight;\nuniform vec4 leftTopWidthHeight;\nout vec2 vColor;\nvoid main(void) {\n\t//convert pixel x,y space 1..canvasWidth,1..canvasHeight to WebGL 1..-1,-1..1\n\tvec2 frac;\n\tfrac.x = (leftTopWidthHeight.x + (pos.x * leftTopWidthHeight.z)) / canvasWidthHeight.x; //0..1\n\tfrac.y = 1.0 - ((leftTopWidthHeight.y + ((1.0 - pos.y) * leftTopWidthHeight.w)) / canvasWidthHeight.y); //1..0\n\tfrac = (frac * 2.0) - 1.0;\n\tgl_Position = vec4(frac, 0.0, 1.0);\n\tvColor = pos.xy;\n}",fragColorbarShader="#version 300 es\n#line 506\nprecision highp int;\nprecision highp float;\nuniform highp sampler2D colormap;\nuniform float layer;\nin vec2 vColor;\nout vec4 color;\nvoid main() {\n\tfloat nlayer = float(textureSize(colormap, 0).y);\n\tfloat fmap = (0.5 + layer) / nlayer;\n\tcolor = vec4(texture(colormap, vec2(vColor.x, fmap)).rgb, 1.0);\n}",vertRectShader="#version 300 es\n#line 520\nlayout(location=0) in vec3 pos;\nuniform vec2 canvasWidthHeight;\nuniform vec4 leftTopWidthHeight;\nvoid main(void) {\n\t//convert pixel x,y space 1..canvasWidth,1..canvasHeight to WebGL 1..-1,-1..1\n\tvec2 frac;\n\tfrac.x = (leftTopWidthHeight.x + (pos.x * leftTopWidthHeight.z)) / canvasWidthHeight.x; //0..1\n\tfrac.y = 1.0 - ((leftTopWidthHeight.y + ((1.0 - pos.y) * leftTopWidthHeight.w)) / canvasWidthHeight.y); //1..0\n\tfrac = (frac * 2.0) - 1.0;\n\tgl_Position = vec4(frac, 0.0, 1.0);\n}",vertLineShader="#version 300 es\n#line 534\nlayout(location=0) in vec3 pos;\nuniform vec2 canvasWidthHeight;\nuniform float thickness;\nuniform vec4 startXYendXY;\nvoid main(void) {\n\tvec2 posXY = mix(startXYendXY.xy, startXYendXY.zw, pos.x);\n\tvec2 dir = normalize(startXYendXY.xy - startXYendXY.zw);\n\tposXY += vec2(-dir.y, dir.x) * thickness * (pos.y - 0.5);\n\tposXY.x = (posXY.x) / canvasWidthHeight.x; //0..1\n\tposXY.y = 1.0 - (posXY.y / canvasWidthHeight.y); //1..0\n\tgl_Position = vec4((posXY * 2.0) - 1.0, 0.0, 1.0);\n}",vertLine3DShader="#version 300 es\n#line 534\nlayout(location=0) in vec3 pos;\nuniform vec2 canvasWidthHeight;\nuniform float thickness;\nuniform vec2 startXY;\nuniform vec3 endXYZ; // transformed XYZ point\nvoid main(void) {\t\n\tvec2 posXY = mix(startXY.xy, endXYZ.xy, pos.x);\n\tvec2 startDiff = endXYZ.xy - startXY.xy;\n\tfloat startDistance = length(startDiff);\n\tvec2 diff = endXYZ.xy - posXY;\n\tfloat currentDistance = length(diff);\n\tvec2 dir = normalize(startXY.xy - endXYZ.xy);\n\tposXY += vec2(-dir.y, dir.x) * thickness * (pos.y - 0.5);\n\tposXY.x = (posXY.x) / canvasWidthHeight.x; //0..1\n\tposXY.y = 1.0 - (posXY.y / canvasWidthHeight.y); //1..0\t\n\tfloat z = endXYZ.z * ( 1.0 - abs(currentDistance/startDistance)); \n\tgl_Position = vec4((posXY * 2.0) - 1.0, z, 1.0);\n}",vertBmpShader="#version 300 es\n#line 549\nlayout(location=0) in vec3 pos;\nuniform vec2 canvasWidthHeight;\nuniform vec4 leftTopWidthHeight;\nout vec2 vUV;\nvoid main(void) {\n\t//convert pixel x,y space 1..canvasWidth,1..canvasHeight to WebGL 1..-1,-1..1\n\tvec2 frac;\n\tfrac.x = (leftTopWidthHeight.x + (pos.x * leftTopWidthHeight.z)) / canvasWidthHeight.x; //0..1\n\tfrac.y = 1.0 - ((leftTopWidthHeight.y + ((1.0 - pos.y) * leftTopWidthHeight.w)) / canvasWidthHeight.y); //1..0\n\tfrac = (frac * 2.0) - 1.0;\n\tgl_Position = vec4(frac, 0.0, 1.0);\n\tvUV = vec2(pos.x, 1.0 - pos.y);\n}",fragBmpShader="#version 300 es\n#line 565\nprecision highp int;\nprecision highp float;\nuniform highp sampler2D bmpTexture;\nin vec2 vUV;\nout vec4 color;\nvoid main() {\n\tcolor = texture(bmpTexture, vUV);\n}",vertFontShader="#version 300 es\n#line 576\nlayout(location=0) in vec3 pos;\nuniform vec2 canvasWidthHeight;\nuniform vec4 leftTopWidthHeight;\nuniform vec4 uvLeftTopWidthHeight;\nout vec2 vUV;\nvoid main(void) {\n\t//convert pixel x,y space 1..canvasWidth,1..canvasHeight to WebGL 1..-1,-1..1\n\tvec2 frac;\n\tfrac.x = (leftTopWidthHeight.x + (pos.x * leftTopWidthHeight.z)) / canvasWidthHeight.x; //0..1\n\tfrac.y = 1.0 - ((leftTopWidthHeight.y + ((1.0 - pos.y) * leftTopWidthHeight.w)) / canvasWidthHeight.y); //1..0\n\tfrac = (frac * 2.0) - 1.0;\n\tgl_Position = vec4(frac, 0.0, 1.0);\n\tvUV = vec2(uvLeftTopWidthHeight.x + (pos.x * uvLeftTopWidthHeight.z), uvLeftTopWidthHeight.y + ((1.0 - pos.y) * uvLeftTopWidthHeight.w) );\n}",fragFontShader="#version 300 es\n#line 593\nprecision highp int;\nprecision highp float;\nuniform highp sampler2D fontTexture;\nuniform vec4 fontColor;\nuniform float screenPxRange;\nin vec2 vUV;\nout vec4 color;\nfloat median(float r, float g, float b) {\n\treturn max(min(r, g), min(max(r, g), b));\n}\nvoid main() {\n\tvec3 msd = texture(fontTexture, vUV).rgb;\n\tfloat sd = median(msd.r, msd.g, msd.b);\n\tfloat screenPxDistance = screenPxRange*(sd - 0.5);\n\tfloat opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0);\n\tcolor = vec4(fontColor.rgb , fontColor.a * opacity);\n}",vertCircleShader="#version 300 es\nlayout(location=0) in vec3 pos;\nuniform vec2 canvasWidthHeight;\nuniform vec4 leftTopWidthHeight;\nuniform vec4 uvLeftTopWidthHeight;\nout vec2 vUV;\nvoid main(void) {\n\t//convert pixel x,y space 1..canvasWidth,1..canvasHeight to WebGL 1..-1,-1..1\n\tvec2 frac;\n\tfrac.x = (leftTopWidthHeight.x + (pos.x * leftTopWidthHeight.z)) / canvasWidthHeight.x; //0..1\n\tfrac.y = 1.0 - ((leftTopWidthHeight.y + ((1.0 - pos.y) * leftTopWidthHeight.w)) / canvasWidthHeight.y); //1..0\n\tfrac = (frac * 2.0) - 1.0;\n\tgl_Position = vec4(frac, 0.0, 1.0);\n\tvUV = pos.xy;\n}",fragCircleShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform vec4 circleColor;\nuniform float fillPercent;\nin vec2 vUV;\nout vec4 color;\nvoid main() {\n\t/* Check if the pixel is inside the circle\n\t\t and color it with a gradient. Otherwise, color it \n\t\t transparent */\n\tfloat distance = length(vUV-vec2(0.5,0.5));\n\tif ( distance < 0.5 && distance >= (1.0 - fillPercent) / 2.0){\n\t\t\tcolor = vec4(circleColor.r,circleColor.g,circleColor.b,circleColor.a) ;\t\t\t\n\t}else{\n\t\t\tcolor = vec4(0.0,0.0,0.0,0.0);\n\t}\n}\n",vertOrientShader="#version 300 es\n#line 613\nprecision highp int;\nprecision highp float;\nin vec3 vPos;\nout vec2 TexCoord;\nvoid main() {\n\tTexCoord = vPos.xy;\n\tgl_Position = vec4( (vPos.xy-vec2(0.5,0.5)) * 2.0, 0.0, 1.0);\n}",fragOrientShaderU="#version 300 es\nuniform highp usampler3D intensityVol;\n",fragOrientShaderI="#version 300 es\nuniform highp isampler3D intensityVol;\n",fragOrientShaderF="#version 300 es\nuniform highp sampler3D intensityVol;\n",fragOrientShaderAtlas="#line 636\nprecision highp int;\nprecision highp float;\nin vec2 TexCoord;\nout vec4 FragColor;\nuniform float coordZ;\nuniform float layer;\nuniform highp sampler2D colormap;\nuniform lowp sampler3D blend3D;\nuniform float opacity;\nuniform vec4 xyzaFrac;\nuniform mat4 mtx;\nvoid main(void) {\n\tvec4 vx = vec4(TexCoord.x, TexCoord.y, coordZ, 1.0) * mtx;\n\tuint idx = uint(texture(intensityVol, vx.xyz).r);\n\tFragColor = vec4(0.0, 0.0, 0.0, 0.0);\n\tif (idx == uint(0))\n\t\treturn;\n\t//idx = ((idx - uint(1)) % uint(100))+uint(1);\n\tfloat textureWidth = float(textureSize(colormap, 0).x);\n\tfloat fx = (float(idx)+0.5) / textureWidth;\n\tfloat nlayer = float(textureSize(colormap, 0).y);\n\tfloat y = ((2.0 * layer) + 1.5)/nlayer;\n\tFragColor = texture(colormap, vec2(fx, y)).rgba;\n\tfloat alpha = FragColor.a;\n\tFragColor.a *= opacity;\n\tif (xyzaFrac.a > 0.0) { //outline\n\t\tvx = vec4(TexCoord.x+xyzaFrac.x, TexCoord.y, coordZ, 1.0) * mtx;\n\t\tuint R = uint(texture(intensityVol, vx.xyz).r);\n\t\tvx = vec4(TexCoord.x-xyzaFrac.x, TexCoord.y, coordZ, 1.0) * mtx;\n\t\tuint L = uint(texture(intensityVol, vx.xyz).r);\n\t\tvx = vec4(TexCoord.x, TexCoord.y+xyzaFrac.y, coordZ, 1.0) * mtx;\n\t\tuint A = uint(texture(intensityVol, vx.xyz).r);\n\t\tvx = vec4(TexCoord.x, TexCoord.y-xyzaFrac.y, coordZ, 1.0) * mtx;\n\t\tuint P = uint(texture(intensityVol, vx.xyz).r);\n\t\tvx = vec4(TexCoord.x, TexCoord.y, coordZ+xyzaFrac.z, 1.0) * mtx;\n\t\tuint S = uint(texture(intensityVol, vx.xyz).r);\n\t\tvx = vec4(TexCoord.x, TexCoord.y, coordZ-xyzaFrac.z, 1.0) * mtx;\n\t\tuint I = uint(texture(intensityVol, vx.xyz).r);\n\t\tif ((idx != R) || (idx != L) || (idx != A) || (idx != P) || (idx != S) || (idx != I))\n\t\t\tFragColor.a = alpha * xyzaFrac.a;\n\t}\n}",fragOrientShader="#line 691\nprecision highp int;\nprecision highp float;\nin vec2 TexCoord;\nout vec4 FragColor;\nuniform float coordZ;\nuniform float layer;\nuniform float scl_slope;\nuniform float scl_inter;\nuniform float cal_max;\nuniform float cal_min;\nuniform float cal_maxNeg;\nuniform float cal_minNeg;\nuniform bool isAlphaThreshold;\nuniform bool isAdditiveBlend;\nuniform highp sampler2D colormap;\nuniform lowp sampler3D blend3D;\nuniform int modulation;\nuniform highp sampler3D modulationVol;\nuniform float opacity;\nuniform mat4 mtx;\nvoid main(void) {\n\tvec4 vx = vec4(TexCoord.xy, coordZ, 1.0) * mtx;\n\tif ((vx.x < 0.0) || (vx.x > 1.0) || (vx.y < 0.0) || (vx.y > 1.0) || (vx.z < 0.0) || (vx.z > 1.0)) {\n\t\t//set transparent if out of range\n\t\t//https://webglfundamentals.org/webgl/webgl-3d-textures-repeat-clamp.html\n\t\tFragColor = texture(blend3D, vec3(TexCoord.xy, coordZ));\n\t\treturn;\n\t}\n\tfloat f = (scl_slope * float(texture(intensityVol, vx.xyz).r)) + scl_inter;\n\tfloat mn = cal_min;\n\tfloat mx = cal_max;\n\tif (isAlphaThreshold)\n\t\tmn = 0.0;\n\tfloat r = max(0.00001, abs(mx - mn));\n\tmn = min(mn, mx);\n\tfloat txl = mix(0.0, 1.0, (f - mn) / r);\n\t//https://stackoverflow.com/questions/5879403/opengl-texture-coordinates-in-pixel-space\n\tfloat nlayer = float(textureSize(colormap, 0).y);\n\t//each volume has two color maps:\n\t// (layer*2) = negative and (layer * 2) + 1 = postive\n\tfloat y = ((2.0 * layer) + 1.5)/nlayer;\n\tFragColor = texture(colormap, vec2(txl, y)).rgba;\n\t//negative colors\n\tmn = cal_minNeg;\n\tmx = cal_maxNeg;\n\tif (isAlphaThreshold)\n\t\tmx = 0.0;\n\t//if ((!isnan(cal_minNeg)) && ( f < mx)) {\n\tif ((cal_minNeg < cal_maxNeg) && ( f < mx)) {\n\t\tr = max(0.00001, abs(mx - mn));\n\t\tmn = min(mn, mx);\n\t\ttxl = 1.0 - mix(0.0, 1.0, (f - mn) / r);\n\t\ty = ((2.0 * layer) + 0.5)/nlayer;\n\t\tFragColor = texture(colormap, vec2(txl, y));\n\t}\n\tif (layer > 0.7)\n\t\tFragColor.a = step(0.00001, FragColor.a);\n\t//if (modulation > 10)\n\t//\tFragColor.a *= texture(modulationVol, vx.xyz).r;\n\t//\tFragColor.rgb *= texture(modulationVol, vx.xyz).r;\n\tif (isAlphaThreshold) {\n\t\tif ((cal_minNeg != cal_maxNeg) && ( f < 0.0) && (f > cal_maxNeg))\n\t\t\tFragColor.a = pow(-f / -cal_maxNeg, 2.0);\n\t\telse if ((f > 0.0) && (cal_min > 0.0))\n\t\t\tFragColor.a *= pow(f / cal_min, 2.0); //issue435: A = (V/X)**2\n\t\t//FragColor.g = 0.0;\n\t}\n\tif (modulation == 1) {\n\t\tFragColor.rgb *= texture(modulationVol, vx.xyz).r;\n\t} else if (modulation == 2) {\n\t\tFragColor.a = texture(modulationVol, vx.xyz).r;\n\t}\n\tFragColor.a *= opacity;\n\tif (layer < 1.0) return;\n\tvec4 prevColor = texture(blend3D, vec3(TexCoord.xy, coordZ));\n\t// https://en.wikipedia.org/wiki/Alpha_compositing\n\tfloat aout = FragColor.a + (1.0 - FragColor.a) * prevColor.a;\n\tif (aout <= 0.0) return;\n\tif (isAdditiveBlend)\n\t\tFragColor.rgb = ((FragColor.rgb * FragColor.a) + (prevColor.rgb * prevColor.a)) / aout;\n\telse\n\t\tFragColor.rgb = ((FragColor.rgb * FragColor.a) + (prevColor.rgb * prevColor.a * (1.0 - FragColor.a))) / aout;\n\tFragColor.a = aout;\n}",fragRGBOrientShader="#line 773\nprecision highp int;\nprecision highp float;\nin vec2 TexCoord;\nout vec4 FragColor;\nuniform float coordZ;\nuniform float layer;\nuniform float scl_slope;\nuniform float scl_inter;\nuniform float cal_max;\nuniform float cal_min;\nuniform highp sampler2D colormap;\nuniform lowp sampler3D blend3D;\nuniform float opacity;\nuniform mat4 mtx;\nuniform bool hasAlpha;\nuniform int modulation;\nuniform highp sampler3D modulationVol;\nvoid main(void) {\n\tvec4 vx = vec4(TexCoord.xy, coordZ, 1.0) * mtx;\n\tuvec4 aColor = texture(intensityVol, vx.xyz);\n\tFragColor = vec4(float(aColor.r) / 255.0, float(aColor.g) / 255.0, float(aColor.b) / 255.0, float(aColor.a) / 255.0);\n\tif (modulation == 1)\n\t\tFragColor.rgb *= texture(modulationVol, vx.xyz).r;\n\tif (!hasAlpha) {\n\t\tFragColor.a = (FragColor.r * 0.21 + FragColor.g * 0.72 + FragColor.b * 0.07);\n\t\t//next line: we could binarize alpha, but see rendering of visible human\n\t\t//FragColor.a = step(0.01, FragColor.a);\n\t}\n\tif (modulation == 2)\n\t\tFragColor.a = texture(modulationVol, vx.xyz).r;\n\tFragColor.a *= opacity;\n}",vertGrowCutShader="#version 300 es\n#line 808\nprecision highp int;\nprecision highp float;\nin vec3 vPos;\nout vec2 TexCoord;\nvoid main() {\n\tTexCoord = vPos.xy;\n\tgl_Position = vec4((vPos.x - 0.5) * 2.0, (vPos.y - 0.5) * 2.0, 0.0, 1.0);\n}",fragGrowCutShader="#version 300 es\n#line 829\n\tprecision highp float;\n\tprecision highp int;\n\tprecision highp isampler3D;\n\tlayout(location = 0) out int label;\n\tlayout(location = 1) out int strength;\n\tin vec2 TexCoord;\n\tuniform int finalPass;\n\tuniform float coordZ;\n\tuniform lowp sampler3D in3D;\n\tuniform highp isampler3D backTex; // background\n\tuniform highp isampler3D labelTex; // label\n\tuniform highp isampler3D strengthTex; // strength\nvoid main(void) {\n\tvec3 interpolatedTextureCoordinate = vec3(TexCoord.xy, coordZ);\n\tivec3 size = textureSize(backTex, 0);\n\tivec3 texelIndex = ivec3(floor(interpolatedTextureCoordinate * vec3(size)));\n\tint background = texelFetch(backTex, texelIndex, 0).r;\n\tlabel = texelFetch(labelTex, texelIndex, 0).r;\n\tstrength = texelFetch(strengthTex, texelIndex, 0).r;\n\tfor (int k = -1; k <= 1; k++) {\n\t\tfor (int j = -1; j <= 1; j++) {\n\t\t\tfor (int i = -1; i <= 1; i++) {\n\t\t\t\tif (i != 0 && j != 0 && k != 0) {\n\t\t\t\t\tivec3 neighborIndex = texelIndex + ivec3(i,j,k);\n\t\t\t\t\tint neighborBackground = texelFetch(backTex, neighborIndex, 0).r;\n\t\t\t\t\tint neighborStrength = texelFetch(strengthTex, neighborIndex, 0).r;\n\t\t\t\t\tint strengthCost = abs(neighborBackground - background);\n\t\t\t\t\tint takeoverStrength = neighborStrength - strengthCost;\n\t\t\t\t\tif (takeoverStrength > strength) {\n\t\t\t\t\t\tstrength = takeoverStrength;\n\t\t\t\t\t\tlabel = texelFetch(labelTex, neighborIndex, 0).r;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (finalPass < 1)\n\t\treturn;\n\tint ok = 1;\n\tivec4 labelCount = ivec4(0,0,0,0);\n\tfor (int k = -1; k <= 1; k++)\n\t\tfor (int j = -1; j <= 1; j++)\n\t\t\tfor (int i = -1; i <= 1; i++) {\n\t\t\t\tivec3 neighborIndex = texelIndex + ivec3(i,j,k);\n\t\t\t\tint ilabel = texelFetch(labelTex, neighborIndex, 0).r;\n\t\t\t\tif ((ilabel < 0) || (ilabel > 3))\n\t\t\t\t\tok = 0;\n\t\t\t\telse\n\t\t\t\t\tlabelCount[ilabel]++;\n\t\t\t}\n\tif (ok != 1) {\n\t\treturn;\n\t}\n\tint maxIdx = 0;\n\tfor (int i = 1; i < 4; i++) {\n\t\tif (labelCount[i] > labelCount[maxIdx])\n\t\t\tmaxIdx = i;\n\t}\n\tlabel = maxIdx;\n}",vertSurfaceShader="#version 300 es\nlayout(location=0) in vec3 pos;\nuniform mat4 mvpMtx;\nvoid main(void) {\n\tgl_Position = mvpMtx * vec4(pos, 1.0);\n}",fragSurfaceShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform vec4 surfaceColor;\nout vec4 color;\nvoid main() {\n\tcolor = surfaceColor;\n}",vertFiberShader="#version 300 es\nlayout(location=0) in vec3 pos;\nlayout(location=1) in vec4 clr;\nout vec4 vClr;\nuniform mat4 mvpMtx;\nvoid main(void) {\n\tgl_Position = mvpMtx * vec4(pos, 1.0);\n\tvClr = clr;\n}",fragFiberShader="#version 300 es\nprecision highp int;\nprecision highp float;\nin vec4 vClr;\nout vec4 color;\nuniform float opacity;\nvoid main() {\n\tcolor = vec4(vClr.rgb, opacity);\n}",vertMeshShader="#version 300 es\nlayout(location=0) in vec3 pos;\nlayout(location=1) in vec4 norm;\nlayout(location=2) in vec4 clr;\nuniform mat4 mvpMtx;\n//uniform mat4 modelMtx;\nuniform mat4 normMtx;\nout vec4 vClr;\nout vec3 vN;\nout vec4 vPc;\nvoid main(void) {\n\tvec3 lightPosition = vec3(0.0, 0.0, -10.0);\n\tvPc = mvpMtx * vec4(pos, 1.0);\n\tgl_Position = vPc;\n\tvN = normalize((normMtx * vec4(norm.xyz,1.0)).xyz);\n\t//vV = -vec3(modelMtx*vec4(pos,1.0));\n\tvClr = clr;\n}",fragMeshDepthShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nout vec4 color;\nvec4 packFloatToVec4i(const float value) {\n\tconst vec4 bitSh = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);\n\tconst vec4 bitMsk = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);\n\tvec4 res = fract(value * bitSh);\n\tres -= res.xxyz * bitMsk;\n\treturn res;\n}\nvoid main() {\n\tcolor = packFloatToVec4i(gl_FragCoord.z);\n}",fragMeshToonShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nfloat stepmix(float edge0, float edge1, float E, float x){\n\tfloat T = clamp(0.5 * (x - edge0 + E) / E, 0.0, 1.0);\n\treturn mix(edge0, edge1, T);\n}\nvoid main() {\n\tvec3 r = vec3(0.0, 0.0, 1.0);\n\tfloat ambient = 0.3;\n\tfloat diffuse = 0.6;\n\tfloat specular = 0.5;\n\tfloat shininess = 50.0;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 10.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat df = max(0.0, dot(n, l));\n\tfloat sf = pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tconst float A = 0.1;\n\tconst float B = 0.3;\n\tconst float C = 0.6;\n\tconst float D = 1.0;\n\tfloat E = fwidth(df);\n\tif (df > A - E && df < A + E) df = stepmix(A, B, E, df);\n\telse if (df > B - E && df < B + E) df = stepmix(B, C, E, df);\n\telse if (df > C - E && df < C + E) df = stepmix(C, D, E, df);\n\telse if (df < A) df = 0.0;\n\telse if (df < B) df = B;\n\telse if (df < C) df = C;\n\telse df = D;\n\tE = fwidth(sf);\n\tif (sf > 0.5 - E && sf < 0.5 + E)\n\t\tsf = smoothstep(0.5 - E, 0.5 + E, sf);\n\telse\n\t\tsf = step(0.5, sf);\n\tvec3 a = vClr.rgb * ambient;\n\tvec3 d = max(df, 0.0) * vClr.rgb * diffuse;\n\tcolor.rgb = a + d + (specular * sf);\n\tcolor.a = opacity;\n}",fragMeshOutlineShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nvoid main() {\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tfloat ambient = 0.3;\n\tfloat diffuse = 0.6;\n\tfloat specular = 0.25;\n\tfloat shininess = 10.0;\n\tfloat PenWidth = 0.6;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 10.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat lightNormDot = dot(n, l);\n\tfloat view = abs(dot(n,r)); //with respect to viewer\n\tif (PenWidth < view) discard;\n\tvec3 a = vClr.rgb * ambient;\n\tvec3 d = max(lightNormDot, 0.0) * vClr.rgb * diffuse;\n\tfloat s = specular * pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tcolor.rgb = a + d + s;\n\tcolor.a = opacity;\n}",fragMeshEdgeShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nvoid main() {\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tfloat diffuse = 1.0;\n\tfloat specular = 0.2;\n\tfloat shininess = 10.0;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 0.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat lightNormDot = max(dot(n, l), 0.0);\n\tvec3 d = lightNormDot * vClr.rgb * diffuse;\n\tfloat s = specular * pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tcolor = vec4(d + s, opacity);\n}",fragMeshDiffuseEdgeShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nvoid main() {\n\tfloat diffuse = 1.4;\n\tvec3 l = vec3(0.0, 0.0, -1.0);\n\tfloat lightNormDot = max(dot(normalize(vN), l), 0.0);\n\tcolor = vec4(lightNormDot * vClr.rgb * diffuse, opacity);\n}",fragMeshSpecularEdgeShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nvoid main() {\n\tfloat specularRGB = 0.7;\n\tfloat specularWhite = 0.3;\n\tfloat shininess = 10.0;\n\tfloat diffuse = 1.0;\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tvec3 n = normalize(vN);\n\tvec3 l = vec3(0.0, 0.0, -1.0);\n\tfloat lightNormDot = max(dot(n, l), 0.0);\n\tvec3 d3 = lightNormDot * vClr.rgb * diffuse;\n\tfloat s = pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tvec3 s3 = specularRGB * s * vClr.rgb;\n\ts *= specularWhite;\n\tcolor = vec4(d3 + s3 + s, opacity);\n}",fragMeshShaderCrevice="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nin vec4 vPc;\nout vec4 color;\nvoid main() {\n\tvec3 n = normalize(vN);\n\t// Compute curvature\n\tvec3 dx = dFdx(n);\n\tvec3 dy = dFdy(n);\n\tvec3 xneg = n - dx;\n\tvec3 xpos = n + dx;\n\tvec3 yneg = n - dy;\n\tvec3 ypos = n + dy;\n\tfloat depth = length(vPc.xyz);\n\tfloat curv = (cross(xneg, xpos).y - cross(yneg, ypos).x) / depth;\n\t//at this stage 0.5 for flat, with valleys dark and ridges bright\n\tcurv = 1.0 - (curv + 0.5);\n\t//clamp\n\tcurv = min(max(curv, 0.0), 1.0);\n\t// easing function\n\tcurv = pow(curv, 0.5);\n\t//modulate ambient and diffuse with curvature\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tfloat ambient = 0.6;\n\tfloat diffuse = 0.6;\n\tfloat specular = 0.2;\n\tfloat shininess = 10.0;\n\tvec3 lightPosition = vec3(0.0, 10.0, -2.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat lightNormDot = dot(n, l);\n\tvec3 a = vClr.rgb * ambient * curv;\n\tvec3 d = max(lightNormDot, 0.0) * vClr.rgb * diffuse;\n\tfloat s = specular * pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tcolor = vec4(a + d + s, opacity);\n}",fragMeshShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nvoid main() {\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tfloat ambient = 0.35;\n\tfloat diffuse = 0.5;\n\tfloat specular = 0.2;\n\tfloat shininess = 10.0;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 10.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat lightNormDot = dot(n, l);\n\tvec3 a = vClr.rgb * ambient;\n\tvec3 d = max(lightNormDot, 0.0) * vClr.rgb * diffuse;\n\tfloat s = specular * pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tcolor = vec4(a + d + s, opacity);\n}",fragMeshMatcapShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nuniform sampler2D matCap;\nout vec4 color;\nvoid main() {\n\tvec3 n = normalize(vN);\n\tvec2 uv = n.xy * 0.5 + 0.5;\n\tuv.y = 1.0 - uv.y;\n\tvec3 clr = texture(matCap,uv.xy).rgb * vClr.rgb;\n\tcolor = vec4(clr, opacity);\n}",fragMeshMatteShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nvoid main() {\n\tfloat ambient = 0.35;\n\tfloat diffuse = 0.6;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 10.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat lightNormDot = dot(n, l);\n\tvec3 a = vClr.rgb * ambient;\n\tvec3 d = max(lightNormDot, 0.0) * vClr.rgb * diffuse;\n\tcolor = vec4(a + d, opacity);\n}",fragMeshHemiShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\nvoid main() {\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tfloat ambient = 0.35;\n\tfloat diffuse = 0.5;\n\tfloat specular = 0.2;\n\tfloat shininess = 10.0;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 10.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat lightNormDot = dot(n, l);\n\tvec3 up = vec3(0.0, 1.0, 0.0);\n\tfloat ax = dot(n, up) * 0.5 + 0.5; //Shreiner et al. (2013) OpenGL Programming Guide, 8th Ed., p 388. ISBN-10: 0321773039\n\tvec3 upClr = vec3(1.0, 1.0, 0.95);\n\tvec3 downClr = vec3(0.4, 0.4, 0.6);\n\tvec3 a = vClr.rgb * ambient;\n\ta *= mix(downClr, upClr, ax);\n\tvec3 d = max(lightNormDot, 0.0) * vClr.rgb * diffuse;\n\tfloat s = specular * pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tcolor = vec4(a + d + s, opacity);\n}",fragMeshShaderSHBlue='#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nin vec3 vN;\nout vec4 color;\n//Spherical harmonics constants\nconst float C1 = 0.429043;\nconst float C2 = 0.511664;\nconst float C3 = 0.743125;\nconst float C4 = 0.886227;\nconst float C5 = 0.247708;\n//Spherical harmonics coefficients\n// Ramamoorthi, R., and P. Hanrahan. 2001b. "An Efficient Representation for Irradiance Environment Maps." In Proceedings of SIGGRAPH 2001, pp. 497–500.\n// https://github.com/eskimoblood/processingSketches/blob/master/data/shader/shinyvert.glsl\n// https://github.com/eskimoblood/processingSketches/blob/master/data/shader/shinyvert.glsl\n// Constants for Eucalyptus Grove lighting\nconst vec3 L00 = vec3( 0.3783264, 0.4260425, 0.4504587);\nconst vec3 L1m1 = vec3( 0.2887813, 0.3586803, 0.4147053);\nconst vec3 L10 = vec3( 0.0379030, 0.0295216, 0.0098567);\nconst vec3 L11 = vec3(-0.1033028, -0.1031690, -0.0884924);\nconst vec3 L2m2 = vec3(-0.0621750, -0.0554432, -0.0396779);\nconst vec3 L2m1 = vec3( 0.0077820, -0.0148312, -0.0471301);\nconst vec3 L20 = vec3(-0.0935561, -0.1254260, -0.1525629);\nconst vec3 L21 = vec3(-0.0572703, -0.0502192, -0.0363410);\nconst vec3 L22 = vec3( 0.0203348, -0.0044201, -0.0452180);\nvec3 SH(vec3 vNormal) {\n\tvNormal = vec3(vNormal.x,vNormal.z,vNormal.y);\n\tvec3 diffuseColor = C1 * L22 * (vNormal.x * vNormal.x - vNormal.y * vNormal.y) +\n\tC3 * L20 * vNormal.z * vNormal.z +\n\tC4 * L00 -\n\tC5 * L20 +\n\t2.0 * C1 * L2m2 * vNormal.x * vNormal.y +\n\t2.0 * C1 * L21 * vNormal.x * vNormal.z +\n\t2.0 * C1 * L2m1 * vNormal.y * vNormal.z +\n\t2.0 * C2 * L11 * vNormal.x +\n\t2.0 * C2 * L1m1 * vNormal.y +\n\t2.0 * C2 * L10 * vNormal.z;\n\treturn diffuseColor;\n}\nvoid main() {\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tfloat ambient = 0.3;\n\tfloat diffuse = 0.6;\n\tfloat specular = 0.1;\n\tfloat shininess = 10.0;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 10.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat s = specular * pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tvec3 a = vClr.rgb * ambient;\n\tvec3 d = vClr.rgb * diffuse * SH(-reflect(n, vec3(l.x, l.y, -l.z)) );\n\tcolor = vec4(a + d + s, opacity);\n}',vertFlatMeshShader="#version 300 es\nlayout(location=0) in vec3 pos;\nlayout(location=1) in vec4 norm;\nlayout(location=2) in vec4 clr;\nuniform mat4 mvpMtx;\n//uniform mat4 modelMtx;\nuniform mat4 normMtx;\nout vec4 vClr;\nflat out vec3 vN;\nvoid main(void) {\n\tgl_Position = mvpMtx * vec4(pos, 1.0);\n\tvN = normalize((normMtx * vec4(norm.xyz,1.0)).xyz);\n\t//vV = -vec3(modelMtx*vec4(pos,1.0));\n\tvClr = clr;\n}",fragFlatMeshShader="#version 300 es\nprecision highp int;\nprecision highp float;\nuniform float opacity;\nin vec4 vClr;\nflat in vec3 vN;\nout vec4 color;\nvoid main() {\n\tvec3 r = vec3(0.0, 0.0, 1.0); //rayDir: for orthographic projections moving in Z direction (no need for normal matrix)\n\tfloat ambient = 0.35;\n\tfloat diffuse = 0.5;\n\tfloat specular = 0.2;\n\tfloat shininess = 10.0;\n\tvec3 n = normalize(vN);\n\tvec3 lightPosition = vec3(0.0, 10.0, -5.0);\n\tvec3 l = normalize(lightPosition);\n\tfloat lightNormDot = dot(n, l);\n\tvec3 a = vClr.rgb * ambient;\n\tvec3 d = max(lightNormDot, 0.0) * vClr.rgb * diffuse;\n\tfloat s = specular * pow(max(dot(reflect(l, n), r), 0.0), shininess);\n\tcolor = vec4(a + d + s, opacity);\n}",fragVolumePickingShader="#version 300 es\n#line 1260\n//precision highp int;\nprecision highp float;\nuniform vec3 rayDir;\nuniform vec3 volScale;\nuniform vec3 texVox;\nuniform vec4 clipPlane;\nuniform highp sampler3D volume, overlay;\nuniform float overlays;\nuniform float clipThick;\nuniform vec3 clipLo;\nuniform vec3 clipHi;\nuniform mat4 matRAS;\nuniform mat4 mvpMtx;\nuniform float drawOpacity, renderOverlayBlend;\nuniform highp sampler3D drawing;\nuniform highp sampler2D colormap;\nuniform int backgroundMasksOverlays;\nin vec3 vColor;\nout vec4 fColor;\n"+kRenderFunc+"\nvoid main() {\n\tint id = 254;\n\tvec3 start = vColor;\n\tgl_FragDepth = 0.0;\n\tfColor = vec4(0.0, 0.0, 0.0, 0.0); //assume no hit: ID = 0\n\tfloat fid = float(id & 255)/ 255.0;\n\tvec3 backPosition = GetBackPosition(start);\n\tvec3 dir = normalize(backPosition - start);\n\tclipVolumeStart(start, backPosition);\n\tfloat len = length(backPosition - start);\n\tfloat lenVox = length((texVox * start) - (texVox * backPosition));\n\tif ((lenVox < 0.5) || (len > 3.0)) return;//discard; //length limit for parallel rays\n\tfloat sliceSize = len / lenVox; //e.g. if ray length is 1.0 and traverses 50 voxels, each voxel is 0.02 in unit cube\n\tfloat stepSize = sliceSize; //quality: larger step is faster traversal, but fewer samples\n\tfloat opacityCorrection = stepSize/sliceSize;\n\tdir = normalize(dir);\n\tvec4 samplePos = vec4(start.xyz, 0.0); //ray position\n\tfloat lenNoClip = len;\n\tbool isClip = false;\n\tvec4 clipPos = applyClip(dir, samplePos, len, isClip);\n\tif (isClip) fColor = vec4(samplePos.xyz, 253.0 / 255.0); //assume no hit: ID = 0\n\t//start: OPTIONAL fast pass: rapid traversal until first hit\n\tfloat stepSizeFast = sliceSize * 1.9;\n\tvec4 deltaDirFast = vec4(dir.xyz * stepSizeFast, stepSizeFast);\n\twhile (samplePos.a <= len) {\n\t\tfloat val = texture(volume, samplePos.xyz).a;\n\t\tif (val > 0.01) {\n\t\t\tfColor = vec4(samplePos.rgb, fid);\n\t\t\tgl_FragDepth = frac2ndc(samplePos.xyz);\n\t\t\tbreak;\n\t\t}\n\t\tsamplePos += deltaDirFast; //advance ray position\n\t}\n\t//end: fast pass\n\tif ((overlays < 1.0) || (backgroundMasksOverlays > 0)) {\n\t\treturn; //background hit, no overlays\n\t}\n\t//overlay pass\n\tlen = min(lenNoClip, samplePos.a); //only find overlay closer than background\n\tsamplePos = vec4(start.xyz, 0.0); //ray position\n\twhile (samplePos.a <= len) {\n\t\tfloat val = texture(overlay, samplePos.xyz).a;\n\t\tif (val > 0.01) {\n\t\t\tfColor = vec4(samplePos.rgb, fid);\n\t\t\tgl_FragDepth = frac2ndc(samplePos.xyz);\n\t\t\treturn;\n\t\t}\n\t\tsamplePos += deltaDirFast; //advance ray position\n\t}\n\t//if (fColor.a == 0.0) discard; //no hit in either background or overlays\n\t//you only get here if there is a hit with the background that is closer than any overlay\n}",vertOrientCubeShader="#version 300 es\n// an attribute is an input (in) to a vertex shader.\n// It will receive data from a buffer\nlayout(location=0) in vec3 a_position;\nlayout(location=1) in vec3 a_color;\n// A matrix to transform the positions by\nuniform mat4 u_matrix;\nout vec3 vColor;\n// all shaders have a main function\nvoid main() {\n\t// Multiply the position by the matrix.\n\tvec4 pos = vec4(a_position, 1.0);\n\tgl_Position = u_matrix * vec4(pos);\n\tvColor = a_color;\n}\n",fragOrientCubeShader="#version 300 es\nprecision highp float;\nuniform vec4 u_color;\nin vec3 vColor;\nout vec4 outColor;\nvoid main() {\n\toutColor = vec4(vColor, 1.0);\n}",vertPassThroughShader="#version 300 es\n#line 1359\nprecision highp int;\nprecision highp float;\nin vec3 vPos;\nout vec2 TexCoord;\nvoid main() {\n\tTexCoord = vPos.xy;\n\tvec2 viewCoord = (vPos.xy - 0.5) * 2.0;\n\tgl_Position = vec4((vPos.xy - 0.5) * 2.0, 0.0, 1.0);\n}",fragPassThroughShader="#version 300 es\nprecision highp int;\nprecision highp float;\nin vec2 TexCoord;\nout vec4 FragColor;\nuniform float coordZ;\nuniform lowp sampler3D in3D;\nvoid main(void) {\n FragColor = texture(in3D, vec3(TexCoord.xy, coordZ));\n}",blurVertShader="#version 300 es\n#line 286\nprecision highp int;\nprecision highp float;\nin vec3 vPos;\nout vec2 TexCoord;\nvoid main() {\n TexCoord = vPos.xy;\n gl_Position = vec4( (vPos.xy-vec2(0.5,0.5))* 2.0, 0.0, 1.0);\n}",blurFragShader="#version 300 es\n#line 298\nprecision highp int;\nprecision highp float;\nin vec2 TexCoord;\nout vec4 FragColor;\nuniform float coordZ;\nuniform float dX;\nuniform float dY;\nuniform float dZ;\nuniform highp sampler3D intensityVol;\nvoid main(void) {\n vec3 vx = vec3(TexCoord.xy, coordZ);\n vec4 samp = texture(intensityVol,vx+vec3(+dX,+dY,+dZ));\n samp += texture(intensityVol,vx+vec3(+dX,+dY,-dZ));\n samp += texture(intensityVol,vx+vec3(+dX,-dY,+dZ));\n samp += texture(intensityVol,vx+vec3(+dX,-dY,-dZ));\n samp += texture(intensityVol,vx+vec3(-dX,+dY,+dZ));\n samp += texture(intensityVol,vx+vec3(-dX,+dY,-dZ));\n samp += texture(intensityVol,vx+vec3(-dX,-dY,+dZ));\n samp += texture(intensityVol,vx+vec3(-dX,-dY,-dZ));\n FragColor = samp*0.125;\n}",sobelFragShader="#version 300 es\n#line 323\nprecision highp int;\nprecision highp float;\nin vec2 TexCoord;\nout vec4 FragColor;\nuniform float coordZ;\nuniform float dX;\nuniform float dY;\nuniform float dZ;\nuniform highp sampler3D intensityVol;\nvoid main(void) {\n vec3 vx = vec3(TexCoord.xy, coordZ);\n //Neighboring voxels 'T'op/'B'ottom, 'A'nterior/'P'osterior, 'R'ight/'L'eft\n float TAR = texture(intensityVol,vx+vec3(+dX,+dY,+dZ)).r;\n float TAL = texture(intensityVol,vx+vec3(+dX,+dY,-dZ)).r;\n float TPR = texture(intensityVol,vx+vec3(+dX,-dY,+dZ)).r;\n float TPL = texture(intensityVol,vx+vec3(+dX,-dY,-dZ)).r;\n float BAR = texture(intensityVol,vx+vec3(-dX,+dY,+dZ)).r;\n float BAL = texture(intensityVol,vx+vec3(-dX,+dY,-dZ)).r;\n float BPR = texture(intensityVol,vx+vec3(-dX,-dY,+dZ)).r;\n float BPL = texture(intensityVol,vx+vec3(-dX,-dY,-dZ)).r;\n vec4 gradientSample = vec4 (0.0, 0.0, 0.0, 0.0);\n gradientSample.r = BAR+BAL+BPR+BPL -TAR-TAL-TPR-TPL;\n gradientSample.g = TPR+TPL+BPR+BPL -TAR-TAL-BAR-BAL;\n gradientSample.b = TAL+TPL+BAL+BPL -TAR-TPR-BAR-BPR;\n gradientSample.a = (abs(gradientSample.r)+abs(gradientSample.g)+abs(gradientSample.b))*0.29;\n gradientSample.rgb = normalize(gradientSample.rgb);\n gradientSample.rgb = (gradientSample.rgb * 0.5)+0.5;\n FragColor = gradientSample;\n}",orientCube=new Float32Array([-1,-1,-1,.28,.28,.28,-1,-1,-1,.28,.28,.28,-1,1,-1,.28,.28,.28,1,-1,-1,.28,.28,.28,1,1,-1,.28,.28,.28,1,1,-1,.28,.28,.28,-1,-1,1,.8,.8,.8,-1,-1,1,.8,.8,.8,1,-1,1,.8,.8,.8,-1,1,1,.8,.8,.8,1,1,1,.8,.8,.8,1,1,1,.8,.8,.8,-1,1,-1,0,0,.74,-1,1,-1,0,0,.74,-1,1,1,0,0,.74,1,1,-1,0,0,.74,1,1,1,0,0,.74,1,1,1,0,0,.74,-1,-1,-1,.42,0,.42,-1,-1,-1,.42,0,.42,1,-1,-1,.42,0,.42,-1,-1,1,.42,0,.42,1,-1,1,.42,0,.42,1,-1,1,.42,0,.42,-1,-1,-1,.64,0,0,-1,-1,-1,.64,0,0,-1,-1,1,.64,0,0,-1,1,-1,.64,0,0,-1,1,1,.64,0,0,-1,1,1,.64,0,0,1,-1,-1,0,.5,0,1,-1,-1,0,.5,0,1,1,-1,0,.5,0,1,-1,1,0,.5,0,1,1,1,0,.5,0,1,1,1,0,.5,0,-.45,1,-.8,0,0,0,-.45,1,-.8,0,0,0,-.45,1,.8,0,0,0,-.25,1,-.8,0,0,0,-.25,1,.8,0,0,0,-.25,1,.8,0,0,0,-.25,1,.6,0,0,0,-.25,1,.6,0,0,0,-.25,1,.8,0,0,0,.45,1,.6,0,0,0,.25,1,.8,0,0,0,.25,1,.8,0,0,0,.25,1,.1,0,0,0,.25,1,.1,0,0,0,.25,1,.6,0,0,0,.45,1,.1,0,0,0,.45,1,.6,0,0,0,.45,1,.6,0,0,0,-.25,1,-.1,0,0,0,-.25,1,-.1,0,0,0,-.25,1,.1,0,0,0,.25,1,-.1,0,0,0,.45,1,.1,0,0,0,.45,1,.1,0,0,0,.45,-1,-.8,0,0,0,.45,-1,-.8,0,0,0,.05,-1,.8,0,0,0,.25,-1,-.8,0,0,0,-.15,-1,.8,0,0,0,-.15,-1,.8,0,0,0,-.25,-1,-.8,0,0,0,-.25,-1,-.8,0,0,0,.05,-1,.8,0,0,0,-.45,-1,-.8,0,0,0,-.15,-1,.8,0,0,0,-.15,-1,.8,0,0,0,.13,-1,-.3,0,0,0,.13,-1,-.3,0,0,0,.07,-1,-.1,0,0,0,-.33,-1,-.3,0,0,0,-.27,-1,-.1,0,0,0,-.27,-1,-.1,0,0,0,-.45,.6,1,0,0,0,-.45,.6,1,0,0,0,-.45,.4,1,0,0,0,-.25,.8,1,0,0,0,-.25,.4,1,0,0,0,-.25,.4,1,0,0,0,-.25,.8,1,0,0,0,-.25,.8,1,0,0,0,-.25,.6,1,0,0,0,.25,.8,1,0,0,0,.45,.6,1,0,0,0,.45,.6,1,0,0,0,.25,.8,1,0,0,0,.25,.8,1,0,0,0,.25,-.1,1,0,0,0,.45,.6,1,0,0,0,.45,.1,1,0,0,0,.45,.1,1,0,0,0,-.25,.1,1,0,0,0,-.25,.1,1,0,0,0,-.45,-.1,1,0,0,0,.25,.1,1,0,0,0,.25,-.1,1,0,0,0,.25,-.1,1,0,0,0,-.45,-.1,1,0,0,0,-.45,-.1,1,0,0,0,-.45,-.6,1,0,0,0,-.25,-.1,1,0,0,0,-.25,-.8,1,0,0,0,-.25,-.8,1,0,0,0,-.25,-.6,1,0,0,0,-.25,-.6,1,0,0,0,-.25,-.8,1,0,0,0,.45,-.6,1,0,0,0,.25,-.8,1,0,0,0,.25,-.8,1,0,0,0,.25,-.4,1,0,0,0,.25,-.4,1,0,0,0,.25,-.6,1,0,0,0,.45,-.4,1,0,0,0,.45,-.6,1,0,0,0,.45,-.6,1,0,0,0,-.1,-.8,-1,0,0,0,-.1,-.8,-1,0,0,0,-.1,.8,-1,0,0,0,.1,-.8,-1,0,0,0,.1,.8,-1,0,0,0,.1,.8,-1,0,0,0,-1,-.45,-.8,0,0,0,-1,-.45,-.8,0,0,0,-1,-.45,.8,0,0,0,-1,-.25,-.8,0,0,0,-1,-.25,.8,0,0,0,-1,-.25,.8,0,0,0,-1,-.25,-.8,0,0,0,-1,-.25,-.8,0,0,0,-1,-.25,-.6,0,0,0,-1,.45,-.8,0,0,0,-1,.45,-.6,0,0,0,-1,.45,-.6,0,0,0,1,.45,-.8,0,0,0,1,.45,-.8,0,0,0,1,.45,.8,0,0,0,1,.25,-.8,0,0,0,1,.25,.8,0,0,0,1,.25,.8,0,0,0,1,.25,.6,0,0,0,1,.25,.6,0,0,0,1,.25,.8,0,0,0,1,-.45,.6,0,0,0,1,-.25,.8,0,0,0,1,-.25,.8,0,0,0,1,-.25,.1,0,0,0,1,-.25,.1,0,0,0,1,-.25,.6,0,0,0,1,-.45,.1,0,0,0,1,-.45,.6,0,0,0,1,-.45,.6,0,0,0,1,.25,-.1,0,0,0,1,.25,-.1,0,0,0,1,.25,.1,0,0,0,1,-.25,-.1,0,0,0,1,-.45,.1,0,0,0,1,-.45,.1,0,0,0,1,-.25,-.8,0,0,0,1,-.25,-.8,0,0,0,1,-.05,-.1,0,0,0,1,-.45,-.8,0,0,0,1,-.25,-.1,0,0,0,1,-.25,-.1,0,0,0]),ft=class{constructor(e,t,i,r,n=null,a=null){g0(this,"sphereIdx",[]),g0(this,"sphereVtx",[]),g0(this,"renderShaders",[]),g0(this,"isVisible",!0),g0(this,"isPickable",!0),g0(this,"vertexBuffer"),g0(this,"indexCount"),g0(this,"indexBuffer"),g0(this,"vao"),g0(this,"mode"),g0(this,"glFlags",0),g0(this,"id"),g0(this,"colorId"),g0(this,"modelMatrix",create$3()),g0(this,"scale",[1,1,1]),g0(this,"position",[0,0,0]),g0(this,"rotation",[0,0,0]),g0(this,"rotationRadians",0),g0(this,"extentsMin",[]),g0(this,"extentsMax",[]),g0(this,"furthestVertexFromOrigin"),g0(this,"originNegate"),g0(this,"fieldOfViewDeObliqueMM"),g0(this,"mm"),this.vertexBuffer=t,this.indexCount=r,this.indexBuffer=n,this.vao=a,this.mode=i,this.id=e,this.colorId=[(255&e)/255,(e>>8&255)/255,(e>>16&255)/255,(e>>24&255)/255]}};g0(ft,"BLEND",1),g0(ft,"CULL_FACE",2),g0(ft,"CULL_FRONT",4),g0(ft,"CULL_BACK",8),g0(ft,"ENABLE_DEPTH_TEST",16),g0(ft,"generateCrosshairs",(function(e,t,i,r,n,a,o=20,s=0){const l=ft.generateCrosshairsGeometry(e,i,r,n,a,o,s);return new ft(t,l.vertexBuffer,e.TRIANGLES,l.indexCount,l.indexBuffer,l.vao)})),g0(ft,"generateCrosshairsGeometry",(function(e,t,i,r,n,a=20,o=0){const s=[],l=[],c=n*o;if(c<=0){let e=fromValues$2(i[0],t[1],t[2]),o=fromValues$2(r[0],t[1],t[2]);ft.makeCylinder(s,l,e,o,n,a),e=fromValues$2(t[0],i[1],t[2]),o=fromValues$2(t[0],r[1],t[2]),ft.makeCylinder(s,l,e,o,n,a),e=fromValues$2(t[0],t[1],i[2]),o=fromValues$2(t[0],t[1],r[2]),ft.makeCylinder(s,l,e,o,n,a)}else{let e=fromValues$2(i[0],t[1],t[2]),o=fromValues$2(t[0]-c,t[1],t[2]);ft.makeCylinder(s,l,e,o,n,a,!1),e=fromValues$2(t[0]+c,t[1],t[2]),o=fromValues$2(r[0],t[1],t[2]),ft.makeCylinder(s,l,e,o,n,a,!1),e=fromValues$2(t[0],i[1],t[2]),o=fromValues$2(t[0],t[1]-c,t[2]),ft.makeCylinder(s,l,e,o,n,a,!1),e=fromValues$2(t[0],t[1]+c,t[2]),o=fromValues$2(t[0],r[1],t[2]),ft.makeCylinder(s,l,e,o,n,a,!1),e=fromValues$2(t[0],t[1],i[2]),o=fromValues$2(t[0],t[1],t[2]-c),ft.makeCylinder(s,l,e,o,n,a,!1),e=fromValues$2(t[0],t[1],t[2]+c),o=fromValues$2(t[0],t[1],r[2]),ft.makeCylinder(s,l,e,o,n,a,!1)}const u=e.createBuffer();if(null===u)throw new Error("could not instantiate vertex buffer");e.bindBuffer(e.ARRAY_BUFFER,u),e.bufferData(e.ARRAY_BUFFER,new Float32Array(s),e.STATIC_DRAW);const f=e.createBuffer();if(null===f)throw new Error("could not instantiate index buffer");e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,f),e.bufferData(e.ELEMENT_ARRAY_BUFFER,new Uint32Array(l),e.STATIC_DRAW);const h=e.createVertexArray();return e.bindVertexArray(h),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,f),e.bindBuffer(e.ARRAY_BUFFER,u),e.enableVertexAttribArray(0),e.vertexAttribPointer(0,3,e.FLOAT,!1,0,0),e.bindVertexArray(null),{vertexBuffer:u,indexBuffer:f,indexCount:l.length,vao:h}})),g0(ft,"getFirstPerpVector",(function(e){const t=fromValues$2(0,0,0);return 0===e[0]?t[0]=1:0===e[1]?t[1]=1:0===e[2]?t[2]=1:(t[0]=e[2],t[1]=e[2],t[2]=-(e[0]+e[1]),normalize$1(t,t)),t})),g0(ft,"subdivide",(function(e,t){let i=e.length/3,r=t.length/3;const n=r,a=create$2(),o=create$2();for(let s=0;s256){for(BUFFER=Array(t=256);t--;)BUFFER[t]=256*Math.random()|0;t=IDX=0}for(;t<16;t++)e=BUFFER[IDX+t],i+=6==t?HEX[15&e|64]:8==t?HEX[63&e|128]:HEX[e],1&t&&t>1&&t<11&&(i+="-");return IDX++,i}const R$12=[0,255,0,0,255,0,255,255,0,205,210,102,0,0,46,255,106,221,233,165,255,147,218,75,255,60,255,255,218,0,188,255,255,222,127,139,124,255,70,0,238,238,240,245,184,32,255,25,112,34,248,245,255,144,173,65,255,250,128,50,244,255,123,255,173,255,127,255,143,220,253,255,0,0,128,255,250,148,178,255,135,100,240,250,255,107,135,0,139,245,186,255,255,0,210,255,47,72,175,128,176,255,139,240,255,216,119,219,72,255,199,154,189,240,230,0,85,64,153,205,250,95,0,255,224,176,138,30,240,152,160],G$12=[0,0,255,0,255,255,0,239,0,133,180,205,0,139,139,228,90,160,150,42,250,112,112,0,182,179,235,228,165,128,143,105,218,184,255,69,252,255,130,100,130,232,255,222,134,178,20,25,128,139,248,255,160,238,255,105,99,240,0,205,164,255,104,165,216,192,255,140,188,20,245,250,206,255,0,250,128,0,34,127,206,149,230,235,245,142,206,0,0,245,85,228,222,191,105,248,79,61,238,128,224,240,0,255,215,191,136,112,209,0,21,205,183,248,230,250,107,224,50,92,250,158,128,69,255,196,43,144,128,251,82],B$12=[0,0,0,255,0,255,255,213,205,63,140,170,128,139,87,225,205,221,122,42,250,219,214,130,193,113,205,196,32,128,143,180,185,135,0,19,0,224,180,0,238,170,240,179,11,170,147,112,144,34,255,250,122,144,47,225,71,230,0,50,96,240,238,0,230,203,212,0,143,60,230,240,209,127,128,205,114,211,34,80,235,237,140,215,238,35,250,139,139,220,211,181,173,255,30,220,79,139,238,0,230,245,0,255,0,216,153,147,204,255,133,50,107,255,250,154,47,208,204,92,210,160,0,0,255,222,226,255,128,152,45],A$12=[0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],I$12=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130],_itksnap={R:R$12,G:G$12,B:B$12,A:A$12,I:I$12},labels=["background","tissue","bone","skin","connective tissue","blood","organ","mass","muscle","foreign object","waste","teeth","fat","gray matter","white matter","nerve","vein","artery","capillary","ligament","tendon","cartilage","meniscus","lymph node","lymphatic vessel","cerebro-spinal fluid","bile","urine","feces","gas","fluid","edema","bleeding","necrosis","clot","embolism","head","central nervous system","brain","gray matter of brain","telencephalon","cerebral cortex","right frontal lobe","left frontal lobe","right temporal lobe","left temporal lobe","right parietal lobe","left parietal lobe","right occipital lobe","left occipital lobe","right insular lobe","left insular lobe","right limbic lobe","left limbic lobe","right striatum","left striatum","right caudate nucleus","left caudate nucleus","right putamen","left putamen","right pallidum","left pallidum","right amygdaloid complex","left amygdaloid complex","diencephalon","thalamus","right thalamus","left thalamus","pineal gland","midbrain","substantia nigra","right substantia nigra","left substantia nigra","cerebral white matter","right superior longitudinal fasciculus","left superior longitudinal fasciculus","right inferior longitudinal fasciculus","left inferior longitudinal fasciculus","right arcuate fasciculus","left arcuate fasciculus","right uncinate fasciculus","left uncinate fasciculus","right cingulum bundle","left cingulum bundle","projection fibers","right corticospinal tract","left corticospinal tract","right optic radiation","left optic radiation","right medial lemniscus","left medial lemniscus","right superior cerebellar peduncle","left superior cerebellar peduncle","right middle cerebellar peduncle","left middle cerebellar peduncle","right inferior cerebellar peduncle","left inferior cerebellar peduncle","optic chiasm","right optic tract","left optic tract","right fornix","left fornix","commissural fibers","corpus callosum","posterior commissure","cerebellar white matter","CSF space","ventricles of brain","right lateral ventricle","left lateral ventricle","right third ventricle","left third ventricle","cerebral aqueduct","fourth ventricle","subarachnoid space","spinal cord","gray matter of spinal cord","white matter of spinal cord","endocrine system of brain","pituitary gland","adenohypophysis","neurohypophysis","meninges","dura mater","arachnoid","pia mater","muscles of head","salivary glands","lips","nose","tongue","soft palate","right inner ear","left inner ear","right external ear","left external ear","right middle ear","left middle ear","right eyeball","left eyeball","skull","right frontal bone","left frontal bone","right parietal bone","left parietal bone","right temporal bone","left temporal bone","right sphenoid bone","left sphenoid bone","right ethmoid bone","left ethmoid bone","occipital bone","maxilla","right zygomatic bone","right lacrimal bone","vomer bone","right palatine bone","left palatine bone","mandible","neck","muscles of neck","pharynx","larynx","thyroid gland","right parathyroid glands","left parathyroid glands","skeleton of neck","hyoid bone","cervical vertebral column","thorax","trachea","bronchi","right lung","left lung","superior lobe of right lung","superior lobe of left lung","middle lobe of right lung","inferior lobe of right lung","inferior lobe of left lung","pleura","heart","right atrium","left atrium","atrial septum","ventricular septum","right ventricle of heart","left ventricle of heart","mitral valve","tricuspid valve","aortic valve","pulmonary valve","aorta","pericardium","pericardial cavity","esophagus","thymus","mediastinum","skin of thoracic wall","muscles of thoracic wall","skeleton of thorax","thoracic vertebral column","ribs","sternum","right clavicle","left clavicle","abdominal cavity","abdomen","peritoneum","omentum","peritoneal cavity","retroperitoneal space","stomach","duodenum","small bowel","colon","anus","liver","biliary tree","gallbladder","pancreas","spleen","urinary system","right kidney","left kidney","right ureter","left ureter","urinary bladder","urethra","right adrenal gland","left adrenal gland","female internal genitalia","uterus","right fallopian tube","left fallopian tube","right ovary","left ovary","vagina","male internal genitalia","prostate","right seminal vesicle","left seminal vesicle","right deferent duct","left deferent duct","skin of abdominal wall","muscles of abdominal wall","skeleton of abdomen","lumbar vertebral column","female external genitalia","male external genitalia","skeleton of upper limb","muscles of upper limb","right upper limb","left upper limb","right shoulder","left shoulder","right arm"],R$11=[0,128,241,177,111,216,221,144,192,220,78,255,230,200,250,244,0,216,183,183,152,111,178,68,111,85,0,214,78,218,170,140,188,216,145,150,177,244,250,200,68,128,83,83,162,162,141,141,182,182,188,188,154,154,177,177,30,30,210,210,48,48,98,98,69,166,122,122,253,145,46,0,0,250,127,127,159,159,125,125,106,106,154,154,126,201,201,78,78,174,174,139,139,148,148,186,186,99,156,156,64,64,138,97,126,194,85,88,88,88,88,88,88,88,88,244,200,250,82,57,60,92,255,255,255,255,201,70,188,177,166,182,229,229,174,174,201,201,194,194,241,203,203,229,229,255,255,209,209,248,248,255,196,255,255,255,242,242,222,177,213,184,150,62,62,62,242,250,255,177,182,175,197,197,172,172,202,224,224,255,206,210,203,233,195,181,152,159,166,218,225,224,255,184,211,47,255,173,188,255,226,253,244,205,205,186,177,255,234,204,180,216,255,205,204,255,221,0,139,249,157,203,185,185,247,247,222,124,249,249,244,255,255,227,213,213,193,216,230,245,245,241,241,177,171,217,212,185,185,198,194,177,177,177,177,177],G$11=[0,174,214,122,184,101,130,238,104,245,63,250,220,200,250,214,151,101,156,214,189,184,212,172,197,188,145,230,63,255,250,224,65,191,60,98,122,214,250,200,131,174,146,146,115,115,93,93,166,166,135,135,150,150,140,140,111,111,157,157,129,129,153,153,110,113,101,101,135,92,101,108,108,250,150,150,116,116,102,102,174,174,146,146,126,160,160,152,152,140,140,126,126,120,120,135,135,106,171,171,123,123,95,113,161,195,188,106,106,106,106,106,106,106,106,214,200,250,174,157,143,162,244,244,244,244,121,163,91,122,84,105,147,147,122,122,112,112,142,142,213,179,179,204,204,243,243,185,185,223,223,230,172,255,250,237,217,217,198,122,124,105,208,162,162,162,206,210,255,122,228,216,165,165,138,138,164,186,186,245,110,115,108,138,100,85,55,63,70,123,130,97,244,122,171,150,244,121,95,239,202,232,217,179,179,124,122,255,234,142,119,132,253,167,168,224,130,145,150,180,108,136,102,102,182,182,154,186,186,186,170,181,190,153,141,141,123,146,158,172,172,172,172,124,85,198,188,135,135,175,98,122,122,122,122,122],B$11=[0,128,145,101,210,79,101,144,88,20,0,220,70,235,210,49,206,79,220,211,207,210,242,100,131,255,30,130,0,255,250,228,28,216,66,83,101,49,225,215,98,128,164,164,105,105,137,137,110,110,166,166,201,201,190,190,85,85,166,166,126,126,112,112,53,137,38,38,192,109,131,112,112,225,88,88,163,163,154,154,155,155,83,83,55,133,133,141,141,103,103,177,177,72,72,135,135,24,108,108,147,147,74,158,197,164,255,215,215,215,215,215,215,215,215,49,215,225,128,110,83,109,209,209,209,209,77,117,95,101,94,107,118,118,90,90,73,73,0,0,144,77,77,109,109,152,152,85,85,131,131,138,68,167,160,145,123,123,101,101,109,108,243,114,114,114,142,139,207,101,255,244,145,145,115,115,140,162,162,217,84,89,81,112,73,57,13,27,38,97,104,76,209,154,143,103,209,88,76,172,134,158,154,108,108,161,101,220,194,178,153,105,229,142,143,199,101,30,98,111,162,116,83,83,164,164,132,223,150,150,147,158,165,130,113,113,103,127,140,147,147,151,151,92,68,131,102,134,134,125,79,101,101,101,101,101],A$11=[0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255],I$11=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],_slicer3d={labels:labels,R:R$11,G:G$11,B:B$11,A:A$11,I:I$11},R$10=[0,0,24,248,255],G$10=[0,0,177,254,0],B$10=[0,136,0,0,0],A$10=[0,32,64,78,128],I$10=[0,64,128,156,255],actc={R:R$10,G:G$10,B:B$10,A:A$10,I:I$10},R$$=[0,248,242,235,229,222,212,202,193,183,173,145,117,78,39,0,0,0,0,0,0,64,128,191,255,255,255,255,255,238,221,204,214,224,235,245,255,249,242,236,229,223,217,210,204,197,191,184,176,169,161,154,146,139,132,124,117,109,102,0],G$$=[0,251,247,243,239,235,235,235,235,235,235,216,197,174,150,127,153,178,204,229,255,255,255,255,255,220,185,150,115,77,38,0,31,61,92,122,153,138,122,107,92,77,61,46,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0],B$$=[0,254,253,252,251,250,251,252,253,254,255,226,198,132,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,80,120,160,200,199,198,197,196,196,195,194,193,192,191,184,176,169,161,154,146,139,132,124,117,109,102,0],A$$=[256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256],I$$=[0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,255],bcgwhw_dark={R:R$$,G:G$$,B:B$$,A:A$$,I:I$$},R$_=[255,248,242,235,229,222,212,202,193,183,173,145,117,78,39,0,0,0,0,0,0,64,128,191,255,255,255,255,255,238,221,204,214,224,235,245,255,249,242,236,229,223,217,210,204,197,191,184,176,169,161,154,146,139,132,124,117,109,102,0],G$_=[255,251,247,243,239,235,235,235,235,235,235,216,197,174,150,127,153,178,204,229,255,255,255,255,255,220,185,150,115,77,38,0,31,61,92,122,153,138,122,107,92,77,61,46,31,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0],B$_=[255,254,253,252,251,250,251,252,253,254,255,226,198,132,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,80,120,160,200,199,198,197,196,196,195,194,193,192,191,184,176,169,161,154,146,139,132,124,117,109,102,0],A$_=[256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256],I$_=[0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,255],bcgwhw={R:R$_,G:G$_,B:B$_,A:A$_,I:I$_},R$Z=[0,0,0,0,196,255],G$Z=[0,32,128,128,128,32],B$Z=[0,255,196,0,0,0],A$Z=[0,128,64,64,64,128],I$Z=[0,1,64,128,192,255],blue2red={R:R$Z,G:G$Z,B:B$Z,A:A$Z,I:I$Z},R$Y=[0,255],G$Y=[0,0],B$Y=[255,255],A$Y=[0,128],I$Y=[0,255],blue2magenta={R:R$Y,G:G$Y,B:B$Y,A:A$Y,I:I$Y},R$X=[0,0],G$X=[0,255],B$X=[255,255],A$X=[0,128],I$X=[0,255],blue2cyan={R:R$X,G:G$X,B:B$X,A:A$X,I:I$X},R$W=[0,0,0,0],G$W=[0,1,128,255],B$W=[0,222,127,32],A$W=[0,0,64,128],I$W=[0,1,128,255],bluegrn={R:R$W,G:G$W,B:B$W,A:A$W,I:I$W},R$V=[0,0,0],G$V=[0,0,0],B$V=[0,128,255],A$V=[0,64,128],I$V=[0,128,255],blue={R:R$V,G:G$V,B:B$V,A:A$V,I:I$V},R$U=[0,103,255],G$U=[0,126,255],B$U=[0,165,255],A$U=[0,76,128],I$U=[0,153,255],bone={R:R$U,G:G$U,B:B$U,A:A$U,I:I$U},R$T=[0,43,103,199,216,255],G$T=[0,0,37,155,213,255],B$T=[0,0,20,97,201,255],A$T=[0,44,48,54,56,56],I$T=[0,64,128,196,240,255],bronze={R:R$T,G:G$T,B:B$T,A:A$T,I:I$T},R$S=[0,9,24,33,40,46,52,57,62,66,70,74,78,81,85,88,91,94,98,101,103,106,109,112,114,117,119,121,124,126,128,130,133,135,137,139,141,143,145,147,149,151,153,155,157,159,161,163,164,166,168,169,171,172,174,175,177,178,180,181,183,184,186,187,189,190,191,193,194,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,222,223,224,224,225,226,226,227,228,228,229,229,230,231,231,232,233,233,234,234,235,235,236,236,236,237,237,237,238,238,238,239,239,239,240,240,240,241,241,241,242,242,242,243,243,243,243,243,243,243,243,244,244,244,244,244,244,244,244,244,244,244,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,243,243,243,243,243,243,243,243,243,243,243,243,242,242,242,242,242,242,242,242,241,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,242,243,243,244,244,245,246,246,247,247,248,249,249,250,250,251,251,252,252,253,253,254,254,254],G$S=[42,41,41,41,40,40,40,39,39,39,38,38,37,37,36,36,35,35,34,34,33,32,32,31,30,30,30,30,29,29,29,29,28,28,28,27,27,27,26,26,26,25,25,25,24,24,24,24,24,25,25,26,27,27,28,28,29,30,30,31,31,32,33,33,34,34,35,36,36,37,38,39,40,42,43,44,45,47,48,49,50,51,53,54,55,56,57,58,59,60,62,63,64,65,66,68,69,71,72,73,75,76,77,79,80,81,83,84,85,87,88,89,90,92,93,94,95,97,98,100,101,102,104,105,107,108,109,111,112,113,115,116,117,119,120,121,122,124,125,126,128,129,130,132,133,134,136,137,138,140,141,142,144,145,146,147,149,150,151,153,154,155,156,158,159,160,161,163,164,165,167,168,169,170,172,173,174,175,176,178,179,180,181,183,184,185,186,187,189,190,191,192,193,194,196,197,198,199,200,201,203,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,228,229,230,231,232,233,234,235,236,237,238,238,239,240,241,241,242,243,244,244,245,246,247,248,248,249,250,251,251,252,253,254,255],B$S=[167,167,166,166,166,165,165,165,164,164,164,163,163,162,162,162,161,161,161,160,160,160,159,159,158,158,157,157,156,155,155,154,154,153,153,152,151,151,150,150,149,149,148,147,147,146,146,145,144,144,143,143,142,141,141,140,139,139,138,137,137,136,135,135,134,133,133,132,131,131,130,130,129,128,128,127,127,126,125,125,124,124,123,123,122,121,121,120,119,119,118,118,117,116,116,116,115,115,114,114,113,113,113,112,112,111,111,110,110,109,109,109,108,108,107,107,106,106,106,106,106,105,105,105,105,105,105,105,104,104,104,104,104,103,103,103,103,103,102,102,102,103,103,103,103,104,104,104,104,104,105,105,105,105,106,106,106,106,106,107,107,107,107,108,108,109,110,111,111,112,113,113,114,115,115,116,117,117,118,119,120,120,121,122,122,123,124,125,126,128,129,130,131,132,134,135,136,137,138,140,141,142,143,144,146,147,148,149,150,152,153,155,157,158,160,162,163,165,167,168,170,172,173,175,177,178,180,182,183,185,187,188,190,193,196,199,201,204,207,210,212,215,218,221,224,226,229,232,235,238,240,243,246,249,252,255],A$S=[0,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64],I$S=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],cet_l17={R:R$S,G:G$S,B:B$S,A:A$S,I:I$S},R$R=[0,86,166,255],G$R=[32,92,156,233],B$R=[76,108,117,69],A$R=[0,56,80,88],I$R=[0,64,192,255],cividis={R:R$R,G:G$R,B:B$R,A:A$R,I:I$R},R$Q=[0,0,0],G$Q=[127,196,254],B$Q=[255,255,255],A$Q=[0,64,128],I$Q=[0,128,255],cool={R:R$Q,G:G$Q,B:B$Q,A:A$Q,I:I$Q},R$P=[0,61,122,183,244,255],G$P=[0,41,81,122,163,255],B$P=[0,25,51,76,102,255],A$P=[0,25,51,71,102,128],I$P=[0,51,102,153,204,255],copper2={R:R$P,G:G$P,B:B$P,A:A$P,I:I$P},R$O=[0,61,122,183,244,255],G$O=[0,41,81,122,163,203],B$O=[0,25,51,76,102,127],A$O=[0,25,51,71,102,128],I$O=[0,51,102,153,204,255],copper={R:R$O,G:G$O,B:B$O,A:A$O,I:I$O},min$i=-643,max$k=-235,R$N=[0,0,0],G$N=[154,154,154],B$N=[179,179,101],A$N=[0,32,0],I$N=[0,163,255],ct_airways={min:min$i,max:max$k,R:R$N,G:G$N,B:B$N,A:A$N,I:I$N},min$h=114,max$j=800,R$M=[0,255,255,255],G$M=[0,0,129,255],B$M=[0,0,0,255],A$M=[0,64,88,228],I$M=[0,80,160,255],ct_artery={min:min$h,max:max$j,R:R$M,G:G$M,B:B$M,A:A$M,I:I$M},min$g=180,max$i=600,R$L=[0,0,113,255],G$L=[0,0,109,250],B$L=[0,0,101,245],A$L=[0,0,100,160],I$L=[0,1,128,255],ct_bones={min:min$g,max:max$i,R:R$L,G:G$L,B:B$L,A:A$L,I:I$L},min$f=-10,max$h=110,R$K=[0,127,255],G$K=[0,127,255],B$K=[0,127,255],A$K=[0,48,128],I$K=[0,124,255],ct_brain_gray={min:min$f,max:max$h,R:R$K,G:G$K,B:B$K,A:A$K,I:I$K},min$e=-10,max$g=110,R$J=[0,199,255],G$J=[0,127,255],B$J=[0,127,255],A$J=[0,48,128],I$J=[0,124,255],ct_brain={min:min$e,max:max$g,R:R$J,G:G$J,B:B$J,A:A$J,I:I$J},min$d=-80,max$f=1e3,R$I=[0,189,150,150,150,150,255],G$I=[0,169,54,54,54,54,240],B$I=[0,153,52,52,52,52,242],A$I=[0,32,64,0,0,64,64],I$I=[0,1,82,92,234,242,255],ct_cardiac={min:min$d,max:max$f,R:R$I,G:G$I,B:B$I,A:A$I,I:I$I},min$c=-590,max$e=600,R$H=[0,241,241,248,248,178,178,232,255,255,255],G$H=[0,156,156,222,222,36,36,51,255,255,255],B$H=[0,130,130,169,169,24,24,37,255,255,255],A$H=[0,8,0,0,0,64,64,0,0,222,222],I$H=[0,2,3,64,122,142,172,182,252,253,255],ct_head={min:min$c,max:max$e,R:R$H,G:G$H,B:B$H,A:A$H,I:I$H},min$b=114,max$d=302,R$G=[0,255,255],G$G=[0,129,255],B$G=[0,0,255],A$G=[0,88,228],I$G=[0,103,255],ct_kidneys={min:min$b,max:max$d,R:R$G,G:G$G,B:B$G,A:A$G,I:I$G},min$a=-23,max$c=246,R$F=[0,44,255,255,255],G$F=[0,128,90,255,255],B$F=[0,0,70,0,255],A$F=[0,0,82,184,228],I$F=[0,64,131,196,255],ct_liver={min:min$a,max:max$c,R:R$F,G:G$F,B:B$F,A:A$F,I:I$F},min$9=-100,max$b=246,R$E=[0,128,159,255,255,255,255],G$E=[0,0,56,90,0,255,255],B$E=[0,0,41,70,0,0,255],A$E=[0,63,105,135,167,184,228],I$E=[0,100,128,155,180,209,255],ct_muscles={min:min$9,max:max$b,R:R$E,G:G$E,B:B$E,A:A$E,I:I$E},min$8=-590,max$a=600,R$D=[0,241,241,248,248,178,232,255,255],G$D=[0,156,156,222,222,36,51,255,255],B$D=[0,130,130,169,169,24,37,255,255],A$D=[0,63,105,135,167,184,228,228,228],I$D=[0,1,52,127,137,162,172,252,255],ct_scalp={min:min$8,max:max$a,R:R$D,G:G$D,B:B$D,A:A$D,I:I$D},min$7=140,max$9=1024,R$C=[0,2,113,255],G$C=[0,1,109,250],B$C=[0,1,101,245],A$C=[0,1,96,168],I$C=[0,1,128,255],ct_skull={min:min$7,max:max$9,R:R$C,G:G$C,B:B$C,A:A$C,I:I$C},min$6=-923,max$8=679,R$B=[0,0,0,0,0,255,255,255],G$B=[154,154,154,154,0,0,254,255],B$B=[179,179,179,179,0,0,0,255],A$B=[0,3,8,0,0,10,15,20],I$B=[0,30,62,88,170,200,232,255],ct_soft={min:min$6,max:max$8,R:R$B,G:G$B,B:B$B,A:A$B,I:I$B},min$5=-10,max$7=110,R$A=[0,199,255],G$A=[0,127,255],B$A=[0,127,255],A$A=[0,48,128],I$A=[0,124,255],ct_soft_tissue={min:min$5,max:max$7,R:R$A,G:G$A,B:B$A,A:A$A,I:I$A},min$4=-600,max$6=100,R$z=[0,134,255],G$z=[0,109,250],B$z=[0,101,245],A$z=[0,60,148],I$z=[0,128,255],ct_surface={min:min$4,max:max$6,R:R$z,G:G$z,B:B$z,A:A$z,I:I$z},min$3=114,max$5=246,R$y=[0,255,255],G$y=[0,128,255],B$y=[0,128,255],A$y=[0,64,96],I$y=[0,87,255],ct_vessels={min:min$3,max:max$5,R:R$y,G:G$y,B:B$y,A:A$y,I:I$y},min$2=50,max$4=1e3,R$x=[98,210,169,128,255],G$x=[94,26,77,128,255],B$x=[45,21,74,128,255],A$x=[0,25,0,4,168],I$x=[0,41,87,154,255],ct_w_contrast={min:min$2,max:max$4,R:R$x,G:G$x,B:B$x,A:A$x,I:I$x},R$w=[0,13,21,26,27,25,22,21,22,28,39,54,75,98,124,148,171,189,202,210,213,211,206,200,195,193,195,201,211,225,240,255],G$w=[0,5,11,20,31,44,58,72,86,99,109,116,120,122,122,122,121,121,124,129,137,147,161,175,190,205,218,229,238,245,251,255],B$w=[0,14,30,46,61,71,77,78,75,68,60,52,48,47,53,65,83,105,131,157,183,205,222,235,241,243,242,240,239,240,245,255],A$w=[0,4,8,12,17,21,25,29,33,37,41,45,50,54,58,62,66,70,74,78,83,87,91,95,99,103,107,111,116,120,124,128],I$w=[0,8,16,25,33,41,49,58,66,74,82,90,99,107,115,123,132,140,148,156,165,173,181,189,197,206,214,222,230,239,247,255],cubehelix={R:R$w,G:G$w,B:B$w,A:A$w,I:I$w},R$v=[0,10,136,255],G$v=[0,39,220,255],B$v=[0,223,253,255],A$v=[0,48,64,70],I$v=[0,92,192,255],electric_blue={R:R$v,G:G$v,B:B$v,A:A$v,I:I$v},R$u=[0,245,205,120,196,220,230,0,122,236,12,204,42,119,220,103,60,255,165,160,0,245,205,120,196,220,230,0,122,236,13,220,103,255,165,160,0,120,200,255,255,164,164,164,234,0,0,0,0,0],G$u=[0,245,62,18,58,248,148,118,186,13,48,182,204,159,216,255,60,165,42,32,200,245,62,18,58,248,148,118,186,13,48,216,255,165,42,32,200,190,70,148,148,108,108,108,169,0,0,0,0,0],B$u=[0,245,78,134,250,164,34,14,220,176,255,142,164,176,20,255,60,0,42,240,200,245,78,134,250,164,34,14,220,176,255,20,255,0,42,240,221,150,255,10,10,226,226,226,30,64,112,160,208,255],A$u=[0,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64],I$u=[0,2,3,4,5,7,8,10,11,12,13,14,15,16,17,18,24,26,28,30,31,41,42,43,44,46,47,49,50,51,52,53,54,58,60,62,63,72,77,78,79,80,81,82,85,251,252,253,254,255],freesurfer={R:R$u,G:G$u,B:B$u,A:A$u,I:I$u},R$t=[0,0,128,255,255],G$t=[0,128,0,128,255],B$t=[0,125,255,0,255],A$t=[0,32,64,96,128],I$t=[0,63,128,192,255],ge_color={R:R$t,G:G$t,B:B$t,A:A$t,I:I$t},R$s=[0,142,227,255],G$s=[0,85,170,255],B$s=[0,14,76,255],A$s=[0,42,84,128],I$s=[0,85,170,255],gold={R:R$s,G:G$s,B:B$s,A:A$s,I:I$s},R$r=[0,255],G$r=[0,255],B$r=[0,255],A$r=[0,128],I$r=[0,255],gray={R:R$r,G:G$r,B:B$r,A:A$r,I:I$r},R$q=[0,0,0],G$q=[0,128,255],B$q=[0,0,0],A$q=[0,64,128],I$q=[0,128,255],green={R:R$q,G:G$q,B:B$q,A:A$q,I:I$q},R$p=[0,0,0],G$p=[72,72,255],B$p=[0,255,255],A$p=[0,64,128],I$p=[0,88,255],green2cyan={R:R$p,G:G$p,B:B$p,A:A$p,I:I$p},R$o=[0,255,255],G$o=[72,88,255],B$o=[0,0,0],A$o=[0,64,128],I$o=[0,88,255],green2orange={R:R$o,G:G$o,B:B$o,A:A$o,I:I$o},R$n=[0,255,255,255],G$n=[0,0,126,255],B$n=[0,0,0,255],A$n=[0,64,96,128],I$n=[0,128,191,255],hotiron={R:R$n,G:G$n,B:B$n,A:A$n,I:I$n},R$m=[3,255,255,255],G$m=[0,0,255,255],B$m=[0,0,0,255],A$m=[0,48,96,128],I$m=[0,95,191,255],hot={R:R$m,G:G$m,B:B$m,A:A$m,I:I$m},R$l=[255,255,0,0,0,255,255],G$l=[0,255,255,255,0,0,0],B$l=[0,0,0,255,255,255,0],A$l=[0,14,28,43,57,71,85],I$l=[0,43,85,128,170,213,255],hsv={R:R$l,G:G$l,B:B$l,A:A$l,I:I$l},R$k=[0,120,237,240],G$k=[0,28,105,249],B$k=[4,109,37,33],A$k=[0,56,80,88],I$k=[0,64,192,255],inferno={R:R$k,G:G$k,B:B$k,A:A$k,I:I$k},R$j=[0,0,127,255,127],G$j=[0,127,255,127,0],B$j=[127,255,127,0,0],A$j=[0,32,64,96,128],I$j=[0,63,128,192,255],jet={R:R$j,G:G$j,B:B$j,A:A$j,I:I$j},R$i=[94,50,90,152,215,238,249,254,252,241,209,158],G$i=[79,131,186,214,240,244,237,210,157,100,57,1],B$i=[162,189,167,164,155,169,168,123,86,68,79,66],A$i=[0,12,23,35,47,58,70,81,93,105,116,128],I$i=[0,23,46,70,93,116,139,162,185,209,232,255],linspecer={R:R$i,G:G$i,B:B$i,A:A$i,I:I$i},R$h=[0,148,183,223,247,252],G$h=[0,44,55,74,112,253],B$h=[4,128,121,104,92,191],A$h=[0,44,53,64,75,107],I$h=[0,107,128,154,179,255],magma={R:R$h,G:G$h,B:B$h,A:A$h,I:I$h},R$g=[11,59,55,222],G$g=[4,45,165,245],B$g=[5,91,172,229],A$g=[0,23,70,107],I$g=[0,56,167,255],mako={R:R$g,G:G$g,B:B$g,A:A$g,I:I$g},R$f=[0,85,0,0,0,0,0,0,85,255,255,255,172],G$f=[0,0,0,0,85,170,255,255,255,255,85,0,0],B$f=[0,170,85,255,255,170,170,0,85,0,0,0,0],A$f=[0,5,10,21,26,32,37,42,48,53,64,72,85],I$f=[0,15,31,63,79,95,111,127,143,159,191,217,255],nih={R:R$f,G:G$f,B:B$f,A:A$f,I:I$f},R$e=[13,156,237,240],G$e=[8,23,121,249],B$e=[135,158,83,33],A$e=[0,56,80,88],I$e=[0,64,192,255],plasma={R:R$e,G:G$e,B:B$e,A:A$e,I:I$e},R$d=[208,71,33,192,32,195,208,173,233,202,25,210,145,89,87,245,246,38,3,25,57,167,245,86,227,208,81,64,90,199,140,48,212,180,70,120,9,192,245,177,65,157,9,193,100,181,125,145,62,8,108,36,140,237,242,248,161,189,41,114,65,121,97,50,238,149,44,214,124,167,40,167,127,178,231,30,173,244,193,203,204,238,139,135,71,234,234,217,66,14,129,19,97,165,112,244,35,73,192,12,149,71,33,192,32,195,208,173,233,202,25,210,145,89,87,245,246,38,3,25,57,167,245,86,227,208,81,64,90,199,140,48,212,180,70,120,9,192,245,177,65,157,9,193,100,181,125,145,62,8,108,36,140,237,242,248,161,189,41,114,65,121,97,50,238,149,44,214,124,167,40,167,127,178,231,30,173,244,193,203,204,238,139,135,71,234,234,217,66,14,129,19,97,165,112,244,35,73,192,12,149,71,33,192,32,195,208,173,233,202,25,210,145,89,87,245,246,38,3,25,57,167,245,86,227,208,81,64,90,199,140,48,212,180,70,120,9,192,245,177,65,157,9,193,100,181,125,145,62,8,108,36,140,237,242,248],G$d=[182,46,78,199,79,89,41,208,135,20,154,35,21,43,230,113,191,147,208,37,28,27,86,203,25,209,148,187,139,111,48,102,76,110,106,130,37,160,34,222,90,165,245,222,102,47,19,130,4,232,137,211,240,11,140,21,42,22,241,61,99,115,199,166,114,190,204,60,233,66,115,230,125,103,203,125,13,176,94,131,39,198,167,124,67,175,254,1,15,198,62,237,159,31,218,58,244,47,61,67,94,46,78,199,79,89,41,208,135,20,154,35,21,43,230,113,191,147,208,37,28,27,86,203,25,209,148,187,139,111,48,102,76,110,106,130,37,160,34,222,90,165,245,222,102,47,19,130,4,232,137,211,240,11,140,21,42,22,241,61,99,115,199,166,114,190,204,60,233,66,115,230,125,103,203,125,13,176,94,131,39,198,167,124,67,175,254,1,15,198,62,237,159,31,218,58,244,47,61,67,94,46,78,199,79,89,41,208,135,20,154,35,21,43,230,113,191,147,208,37,28,27,86,203,25,209,148,187,139,111,48,102,76,110,106,130,37,160,34,222,90,165,245,222,102,47,19,130,4,232,137,211,240,11,140,21],B$d=[191,154,43,10,207,204,164,231,136,58,239,30,147,230,101,111,150,35,128,57,252,79,173,120,25,126,81,85,8,7,122,237,190,152,246,182,130,219,67,76,167,178,235,250,28,61,186,250,199,67,58,50,86,182,108,77,89,112,59,125,226,50,205,227,125,128,104,27,59,66,53,133,159,203,97,125,139,159,158,7,215,47,140,226,223,231,44,110,184,61,233,47,67,148,22,120,173,156,117,181,94,154,43,10,207,204,164,231,136,58,239,30,147,230,101,111,150,35,128,57,252,79,173,120,25,126,81,85,8,7,122,237,190,152,246,182,130,219,67,76,167,178,235,250,28,61,186,250,199,67,58,50,86,182,108,77,89,112,59,125,226,50,205,227,125,128,104,27,59,66,53,133,159,203,97,125,139,159,158,7,215,47,140,226,223,231,44,110,184,61,233,47,67,148,22,120,173,156,117,181,94,154,43,10,207,204,164,231,136,58,239,30,147,230,101,111,150,35,128,57,252,79,173,120,25,126,81,85,8,7,122,237,190,152,246,182,130,219,67,76,167,178,235,250,28,61,186,250,199,67,58,50,86,182,108,77],A$d=[0,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64],I$d=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],random={R:R$d,G:G$d,B:B$d,A:A$d,I:I$d},R$c=[0,128,255],G$c=[0,0,0],B$c=[0,0,0],A$c=[0,64,128],I$c=[0,128,255],red={R:R$c,G:G$c,B:B$c,A:A$c,I:I$c},R$b=[192,224,255],G$b=[1,128,255],B$b=[0,0,0],A$b=[0,64,128],I$b=[0,128,255],redyell={R:R$b,G:G$b,B:B$b,A:A$b,I:I$b},R$a=[3,112,144,188,236,246,255],G$a=[5,31,29,22,76,158,250],B$a=[26,87,91,86,62,117,235],A$a=[0,30,38,49,67,85,107],I$a=[0,73,92,118,160,205,255],rocket={R:R$a,G:G$a,B:B$a,A:A$a,I:I$a},R$9=[1,240,255],G$9=[1,128,255],B$9=[1,128,255],A$9=[0,76,128],I$9=[0,153,255],surface={R:R$9,G:G$9,B:B$9,A:A$9,I:I$9},R$8=[48,48,64,70,65,25,132,195,244,254,218,122],G$8=[18,18,64,107,150,226,255,241,199,158,57,4],B$8=[59,59,162,227,255,187,81,52,58,47,7,3],A$8=[0,22,26,30,34,43,52,57,63,67,77,86],I$8=[0,1,16,32,49,83,118,140,164,181,219,255],turbo={R:R$8,G:G$8,B:B$8,A:A$8,I:I$8},R$7=[0,128,255],G$7=[0,0,0],B$7=[0,128,255],A$7=[0,64,128],I$7=[0,128,255],violet={R:R$7,G:G$7,B:B$7,A:A$7,I:I$7},R$6=[68,49,53,253],G$6=[1,104,183,231],B$6=[84,142,121,37],A$6=[0,56,80,88],I$6=[0,64,192,255],viridis={R:R$6,G:G$6,B:B$6,A:A$6,I:I$6},R$5=[255,255,255],G$5=[127,196,254],B$5=[0,0,0],A$5=[0,64,128],I$5=[0,128,255],warm={R:R$5,G:G$5,B:B$5,A:A$5,I:I$5},R$4=[0,0,0],G$4=[0,128,255],B$4=[255,196,128],A$4=[0,64,128],I$4=[0,128,255],winter={R:R$4,G:G$4,B:B$4,A:A$4,I:I$4},R$3=[3,64,0,0,255,255,255],G$3=[0,0,0,255,255,192,3],B$3=[0,32,48,56,64,96,128],A$3=[0,8,16,24,32,52,80],I$3=[0,32,64,96,160,192,255],x_rain={R:R$3,G:G$3,B:B$3,A:A$3,I:I$3},min$1=0,max$3=0,R$2=[0,37],G$2=[242,0],B$2=[255,255],A$2=[0,64],I$2=[0,255],afni_blues_inv={min:min$1,max:max$3,R:R$2,G:G$2,B:B$2,A:A$2,I:I$2},R$1=[255,255],G$1=[255,11],B$1=[0,0],A$1=[0,64],I$1=[0,255],afni_reds_inv={R:R$1,G:G$1,B:B$1,A:A$1,I:I$1},min=0,max$2=0,R=[65,10,223,120,216,207,251,93,252,217,21,253,131,165,173,143,144,217,86,89,63,254,172,1,142,107,42,78,221,8,222,71,127,126,167,33,104,2,208,216,0,251,7,105,2,101,248,190,253,62,255,224,166,37,110,138,45,34,6,37,69,201,43,122,199,37,173,194,103,211,75,159,96,4,239,98,110,193,253,166,40,255,48,130,140,243,101,9,177,220,133,32,4,81,48,48,210,109,60,132,1,119,1,159,247,33,212,187,253,144,196,254,168,79,64,196,39,97,73,173,104,216,217,43,101,119,254,5,237,103,203,122,57,87,251,164,19,75,200,2,252,150,66,0,255,157,23,254,55,16,240,161,69,253,207,195,5,60,255,251,200,217,134,123,253,180,27,246,130,136,250,232,4,125,140,22,253,255,13,180,123,61,254,111,10,185,76,192,255,223,186,61,198,5,172,13,83,172,171,6,23,73,134,133,109,61,213,55,57,132,36,209,2,144,1,253,68,155,3,160,2,77,121,70,67,176,223,131,4,162,232,255,150,94,235,191,207,10,246,0,225,4,209,116,57,112,172,253,1,6,92,227,73,62,135,223],G=[162,50,112,245,4,124,176,243,56,125,183,139,182,68,189,4,225,10,20,223,7,46,31,193,225,250,219,41,2,100,83,181,34,150,72,223,168,248,80,253,7,117,214,2,248,10,3,59,179,160,90,244,146,4,207,4,125,255,96,100,1,208,130,51,116,181,236,53,244,5,165,28,181,86,96,42,254,1,134,194,214,92,41,204,137,86,207,3,143,3,100,239,164,94,65,251,131,244,173,57,143,107,217,53,210,0,148,250,45,198,81,40,61,218,252,88,171,0,248,24,248,4,41,100,187,46,208,145,43,168,121,46,175,250,125,107,233,112,207,231,174,215,53,9,43,153,52,124,128,65,210,147,255,147,63,200,148,254,0,179,241,42,239,2,230,8,82,135,87,16,3,87,86,151,254,8,255,86,53,19,7,192,171,201,253,247,197,103,251,126,0,149,54,183,61,126,79,113,10,103,184,75,11,195,222,136,149,131,8,99,240,177,252,255,198,16,7,68,178,66,191,150,73,26,211,109,78,209,240,254,1,166,247,131,2,0,167,127,133,10,43,99,235,3,214,142,176,82,132,38,10,249,255,215,44,81],B=[176,182,248,37,117,35,96,69,32,152,108,20,237,250,2,89,141,216,111,251,211,149,10,44,214,103,31,251,3,32,252,246,97,1,219,167,197,4,36,116,206,118,106,43,205,204,114,69,127,205,87,80,41,251,145,204,253,161,247,1,149,9,43,253,97,72,136,161,171,181,26,255,108,80,218,214,231,255,84,31,109,4,218,3,217,36,68,85,241,39,221,2,240,2,173,42,206,5,110,46,103,27,212,184,2,207,246,45,116,72,110,253,38,105,248,159,243,81,192,93,141,145,24,157,234,131,57,178,62,75,65,176,148,40,253,66,76,240,51,154,17,251,139,253,207,9,114,49,200,254,96,73,138,118,204,102,137,89,145,161,4,112,66,234,147,178,212,205,185,11,203,131,2,250,118,169,1,185,154,53,171,197,61,175,249,96,15,254,95,5,222,75,246,194,2,61,180,25,133,165,15,233,59,35,221,140,109,7,114,255,198,0,115,168,252,23,242,80,75,142,137,255,12,182,68,201,4,111,37,228,83,248,24,192,249,5,54,223,160,122,160,114,145,119,252,31,253,250,10,214,8,47,0,142,222,70],A=[0,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64],I=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],roi_i256={min:min,max:max$2,R:R,G:G,B:B,A:A,I:I},cmaps=Object.freeze(Object.defineProperty({__proto__:null,$itksnap:_itksnap,$slicer3d:_slicer3d,actc:actc,afni_blues_inv:afni_blues_inv,afni_reds_inv:afni_reds_inv,bcgwhw:bcgwhw,bcgwhw_dark:bcgwhw_dark,blue:blue,blue2cyan:blue2cyan,blue2magenta:blue2magenta,blue2red:blue2red,bluegrn:bluegrn,bone:bone,bronze:bronze,cet_l17:cet_l17,cividis:cividis,cool:cool,copper:copper,copper2:copper2,ct_airways:ct_airways,ct_artery:ct_artery,ct_bones:ct_bones,ct_brain:ct_brain,ct_brain_gray:ct_brain_gray,ct_cardiac:ct_cardiac,ct_head:ct_head,ct_kidneys:ct_kidneys,ct_liver:ct_liver,ct_muscles:ct_muscles,ct_scalp:ct_scalp,ct_skull:ct_skull,ct_soft:ct_soft,ct_soft_tissue:ct_soft_tissue,ct_surface:ct_surface,ct_vessels:ct_vessels,ct_w_contrast:ct_w_contrast,cubehelix:cubehelix,electric_blue:electric_blue,freesurfer:freesurfer,ge_color:ge_color,gold:gold,gray:gray,green:green,green2cyan:green2cyan,green2orange:green2orange,hot:hot,hotiron:hotiron,hsv:hsv,inferno:inferno,jet:jet,linspecer:linspecer,magma:magma,mako:mako,nih:nih,plasma:plasma,random:random,red:red,redyell:redyell,rocket:rocket,roi_i256:roi_i256,surface:surface,turbo:turbo,violet:violet,viridis:viridis,warm:warm,winter:winter,x_rain:x_rain},Symbol.toStringTag,{value:"Module"}));class ColorTables{constructor(){g0(this,"gamma",1),g0(this,"version",.1),g0(this,"cluts",{});const e=Object.keys(cmaps).filter((e=>!e.startsWith("$"))).sort(new Intl.Collator("en").compare);for(const t of e)this.cluts[t]=cmaps[t]}addColormap(e,t){this.cluts[e]=t}colormaps(){return Object.keys(this.cluts)}colorMaps(){return this.colormaps()}colormapFromKey(e){let t=this.cluts[e];return void 0!==t||(t=this.cluts[e.toLowerCase()],void 0!==t)?t:(e.length>0&&log.warn("No color map named "+e),{min:0,max:0,R:[0,255],G:[0,255],B:[0,255],A:[0,255],I:[0,255]})}colormap(e="",t=!1){const i=this.colormapFromKey(e);return this.makeLut(i.R,i.G,i.B,i.A,i.I,t)}makeLabelLut(e,t=255){if(void 0===e.R||void 0===e.G||void 0===e.B)throw new Error(`Invalid colormap table: ${e}`);const i=e.R.length,r=e.I??[...Array(i).keys()];if(i!==e.G.length||i!==e.B.length||i!==r.length)throw new Error(`colormap does not make sense: ${e}`);let n=new Uint8ClampedArray(i).fill(t);n[0]=0,void 0!==e.A&&(n=Uint8ClampedArray.from(e.A));const a=Math.min(...r),o=Math.max(...r),s=o-a+1,l=new Uint8ClampedArray(4*s).fill(0);for(let t=0;t0)for(let e=0;e"u"){f=new Uint8ClampedArray(o).fill(0);for(let e=0;e"u"&&(u=new Uint8ClampedArray(o).fill(64),u[0]=0);for(let e=0;e>1|(21845&i$1)<<1;x$1=(52428&x$1)>>2|(13107&x$1)<<2,x$1=(61680&x$1)>>4|(3855&x$1)<<4,rev$1[i$1]=((65280&x$1)>>8|(255&x$1)<<8)>>1}for(var hMap$1=function(e,t,i){for(var r=e.length,n=0,a=new u16$1(t);n>l]=c}else for(o=new u16$1(r),n=0;n>15-e[n]);return o},flt$1=new u8$1(288),i$1=0;i$1<144;++i$1)flt$1[i$1]=8;for(var i$1=144;i$1<256;++i$1)flt$1[i$1]=9;for(var i$1=256;i$1<280;++i$1)flt$1[i$1]=7;for(var i$1=280;i$1<288;++i$1)flt$1[i$1]=8;for(var fdt$1=new u8$1(32),i$1=0;i$1<32;++i$1)fdt$1[i$1]=5;var flm$1=hMap$1(flt$1,9,0),flrm$1=hMap$1(flt$1,9,1),fdm$1=hMap$1(fdt$1,5,0),fdrm$1=hMap$1(fdt$1,5,1),max$1=function(e){for(var t=e[0],i=1;it&&(t=e[i]);return t},bits$1=function(e,t,i){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&i},bits16$1=function(e,t){var i=t/8|0;return(e[i]|e[i+1]<<8|e[i+2]<<16)>>(7&t)},shft$1=function(e){return(e+7)/8|0},slc$1=function(e,t,i){return(null==t||t<0)&&(t=0),(null==i||i>e.length)&&(i=e.length),new u8$1(e.subarray(t,i))},ec$1=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],err$1=function(e,t,i){var r=new Error(t||ec$1[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,err$1),!i)throw r;return r},inflt$1=function(e,t,i,r){var n=e.length,a=r?r.length:0;if(!n||t.f&&!t.l)return i||new u8$1(0);var o=!i,s=o||2!=t.i,l=t.i;o&&(i=new u8$1(3*n));var c=function(e){var t=i.length;if(e>t){var r=new u8$1(Math.max(2*t,e));r.set(i),i=r}},u=t.f||0,f=t.p||0,h=t.b||0,d=t.l,m=t.d,g=t.m,p=t.n,A=8*n;do{if(!d){u=bits$1(e,f,1);var S=bits$1(e,f+1,3);if(f+=3,!S){var b=e[(k=shft$1(f)+4)-4]|e[k-3]<<8,v=k+b;if(v>n){l&&err$1(0);break}s&&c(h+b),i.set(e.subarray(k,v),h),t.b=h+=b,t.p=f=8*v,t.f=u;continue}if(1==S)d=flrm$1,m=fdrm$1,g=9,p=5;else if(2==S){var w=bits$1(e,f,31)+257,T=bits$1(e,f+10,15)+4,y=w+bits$1(e,f+5,31)+1;f+=14;for(var C=new u8$1(y),I=new u8$1(19),D=0;D>4)<16)C[D++]=k;else{var F=0,P=0;for(16==k?(P=3+bits$1(e,f,3),f+=2,F=C[D-1]):17==k?(P=3+bits$1(e,f,7),f+=3):18==k&&(P=11+bits$1(e,f,127),f+=7);P--;)C[D++]=F}}var L=C.subarray(0,w),_=C.subarray(w);g=max$1(L),p=max$1(_),d=hMap$1(L,g,1),m=hMap$1(_,p,1)}else err$1(1);if(f>A){l&&err$1(0);break}}s&&c(h+131072);for(var N=(1<>4;if((f+=15&F)>A){l&&err$1(0);break}if(F||err$1(2),B<256)i[h++]=B;else{if(256==B){O=f,d=null;break}var V=B-254;if(B>264){var q=fleb$1[D=B-257];V=bits$1(e,f,(1<>4;G||err$1(3),f+=15&G;_=fd$1[Q];if(Q>3){q=fdeb$1[Q];_+=bits16$1(e,f)&(1<A){l&&err$1(0);break}s&&c(h+131072);var z=h+V;if(h<_){var H=a-_,Y=Math.min(_,z);for(H+h<0&&err$1(3);h>8},wbits16$1=function(e,t,i){i<<=7&t;var r=t/8|0;e[r]|=i,e[r+1]|=i>>8,e[r+2]|=i>>16},hTree$1=function(e,t){for(var i=[],r=0;rh&&(h=a[r].s);var d=new u16$1(h+1),m=ln$1(i[u-1],d,0);if(m>t){r=0;var g=0,p=m-t,A=1<t))break;g+=A-(1<>=p;g>0;){var b=a[r].s;d[b]=0&&g;--r){var v=a[r].s;d[v]==t&&(--d[v],++g)}m=t}return{t:new u8$1(d),l:m}},ln$1=function(e,t,i){return-1==e.s?Math.max(ln$1(e.l,t,i+1),ln$1(e.r,t,i+1)):t[e.s]=i},lc$1=function(e){for(var t=e.length;t&&!e[--t];);for(var i=new u16$1(++t),r=0,n=e[0],a=1,o=function(e){i[r++]=e},s=1;s<=t;++s)if(e[s]==n&&s!=t)++a;else{if(!n&&a>2){for(;a>138;a-=138)o(32754);a>2&&(o(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(o(n),--a;a>6;a-=6)o(8304);a>2&&(o(a-3<<5|8208),a=0)}for(;a--;)o(n);a=1,n=e[s]}return{c:i.subarray(0,r),n:t}},clen$1=function(e,t){for(var i=0,r=0;r>8,e[n+2]=255^e[n],e[n+3]=255^e[n+1];for(var a=0;a4&&!D[clim$1[E-1]];--E);var M,k,R,F,P=c+5<<3,L=clen$1(n,flt$1)+clen$1(a,fdt$1)+o,_=clen$1(n,h)+clen$1(a,g)+o+14+3*E+clen$1(y,D)+2*y[16]+3*y[17]+7*y[18];if(l>=0&&P<=L&&P<=_)return wfblk$1(t,u,e.subarray(l,l+c));if(wbits$1(t,u,1+(_15&&(wbits$1(t,u,B[C]>>5&127),u+=B[C]>>12)}}}else M=flm$1,k=flt$1,R=fdm$1,F=fdt$1;for(C=0;C255){wbits16$1(t,u,M[(V=q>>18&31)+257]),u+=k[V+257],V>7&&(wbits$1(t,u,q>>23&31),u+=fleb$1[V]);var G=31&q;wbits16$1(t,u,R[G]),u+=F[G],G>3&&(wbits16$1(t,u,q>>5&8191),u+=fdeb$1[G])}else wbits16$1(t,u,M[q]),u+=k[q]}return wbits16$1(t,u,M[256]),u+k[256]},deo$1=new i32$1([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),et$1=new u8$1(0),dflt$1=function(e,t,i,r,n,a){var o=a.z||e.length,s=new u8$1(r+o+5*(1+Math.ceil(o/7e3))+n),l=s.subarray(r,s.length-n),c=a.l,u=7&(a.r||0);if(t){u&&(l[0]=a.r>>3);for(var f=deo$1[t-1],h=f>>13,d=8191&f,m=(1<7e3||D>24576)&&(F>423||!c)){u=wblk$1(e,l,0,v,w,T,C,D,E,I-E,u),D=y=C=0,E=I;for(var P=0;P<286;++P)w[P]=0;for(P=0;P<30;++P)T[P]=0}var L=2,_=0,N=d,U=k-R&32767;if(F>2&&M==b(I-U))for(var O=Math.min(h,F)-1,B=Math.min(32767,I),V=Math.min(258,F);U<=B&&--N&&k!=R;){if(e[I+L]==e[I+L-U]){for(var q=0;qL){if(L=q,_=U,q>O)break;var G=Math.min(U,q-2),Q=0;for(P=0;PQ&&(Q=H,R=z)}}}U+=(k=R)-(R=g[k])&32767}if(_){v[D++]=268435456|revfl$1[L]<<18|revfd$1[_];var Y=31&revfl$1[L],W=31&revfd$1[_];C+=fleb$1[Y]+fdeb$1[W],++w[257+Y],++T[W],x=I+L,++y}else v[D++]=e[I],++w[e[I]]}}for(I=Math.max(I,x);I=o&&(l[u/8|0]=c,X=o),u=wfblk$1(l,u+1,e.subarray(I,X))}a.i=o}return slc$1(s,0,r+shft$1(u)+n)},crct$1=function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var i=t,r=9;--r;)i=(1&i&&-306674912)^i>>>1;e[t]=i}return e}(),crc$1=function(){var e=-1;return{p:function(t){for(var i=e,r=0;r>>8;e=i},d:function(){return~e}}},dopt$1=function(e,t,i,r,n){if(!n&&(n={l:1},t.dictionary)){var a=t.dictionary.subarray(-32768),o=new u8$1(a.length+e.length);o.set(a),o.set(e,a.length),e=o,n.w=a.length}return dflt$1(e,null==t.level?6:t.level,null==t.mem?n.l?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(e.length)))):20:12+t.mem,i,r,n)},mrg$1=function(e,t){var i={};for(var r in e)i[r]=e[r];for(var r in t)i[r]=t[r];return i},wcln$1=function(e,t,i){for(var r=e(),n=e.toString(),a=n.slice(n.indexOf("[")+1,n.lastIndexOf("]")).replace(/\s+/g,"").split(","),o=0;o>>0},b8$1=function(e,t){return b4$1(e,t)+4294967296*b4$1(e,t+4)},wbytes$1=function(e,t,i){for(;i;++t)e[t]=i,i>>>=8},gzh$1=function(e,t){var i=t.filename;if(e[0]=31,e[1]=139,e[2]=8,e[8]=t.level<2?4:9==t.level?2:0,e[9]=3,0!=t.mtime&&wbytes$1(e,4,Math.floor(new Date(t.mtime||Date.now())/1e3)),i){e[3]=8;for(var r=0;r<=i.length;++r)e[r+10]=i.charCodeAt(r)}},gzs$1=function(e){(31!=e[0]||139!=e[1]||8!=e[2])&&err$1(6,"invalid gzip data");var t=e[3],i=10;4&t&&(i+=2+(e[10]|e[11]<<8));for(var r=(t>>3&1)+(t>>4&1);r>0;r-=!e[i++]);return i+(2&t)},gzl$1=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0},gzhl$1=function(e){return 10+(e.filename?e.filename.length+1:0)},zls$1=function(e,t){return(8!=(15&e[0])||e[0]>>4>7||(e[0]<<8|e[1])%31)&&err$1(6,"invalid zlib data"),(e[1]>>5&1)==+!t&&err$1(6,"invalid zlib data: "+(32&e[1]?"need":"unexpected")+" dictionary"),2+(e[1]>>3&4)};function StrmOpt$1(e,t){return"function"==typeof e&&(t=e,e={}),this.ondata=t,e}function deflateSync$1(e,t){return dopt$1(e,t||{},0,0)}var Inflate$1=function(){function e(e,t){"function"==typeof e&&(t=e,e={}),this.ondata=t;var i=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:i?i.length:0},this.o=new u8$1(32768),this.p=new u8$1(0),i&&this.o.set(i)}return e.prototype.e=function(e){if(this.ondata||err$1(5),this.d&&err$1(4),this.p.length){if(e.length){var t=new u8$1(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,i=inflt$1(this.p,this.s,this.o);this.ondata(slc$1(i,t,this.s.b),this.d),this.o=slc$1(i,this.s.b-32768),this.s.b=this.o.length,this.p=slc$1(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}();function inflate$3(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err$1(7),cbify$1(e,t,[bInflt$1],(function(e){return pbf$1(inflateSync$1(e.data[0],gopt$1(e.data[1])))}),1,i)}function inflateSync$1(e,t){return inflt$1(e,{i:2},t&&t.out,t&&t.dictionary)}function gzip$1(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err$1(7),cbify$1(e,t,[bDflt$1,gze$1,function(){return[gzipSync$1]}],(function(e){return pbf$1(gzipSync$1(e.data[0],e.data[1]))}),2,i)}function gzipSync$1(e,t){t||(t={});var i=crc$1(),r=e.length;i.p(e);var n=dopt$1(e,t,gzhl$1(t),8),a=n.length;return gzh$1(n,t),wbytes$1(n,a-8,i.d()),wbytes$1(n,a-4,r),n}var Gunzip$1=function(){function e(e,t){this.v=1,this.r=0,Inflate$1.call(this,e,t)}return e.prototype.push=function(e,t){if(Inflate$1.prototype.e.call(this,e),this.r+=e.length,this.v){var i=this.p.subarray(this.v-1),r=i.length>3?gzs$1(i):4;if(r>i.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-i.length);this.p=i.subarray(r),this.v=0}Inflate$1.prototype.c.call(this,t),this.s.f&&!this.s.l&&!t&&(this.v=shft$1(this.s.p)+9,this.s={i:0},this.o=new u8$1(0),this.push(new u8$1(0),t))},e}();function gunzip$1(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err$1(7),cbify$1(e,t,[bInflt$1,guze$1,function(){return[gunzipSync$1]}],(function(e){return pbf$1(gunzipSync$1(e.data[0],e.data[1]))}),3,i)}function gunzipSync$1(e,t){var i=gzs$1(e);return i+8>e.length&&err$1(6,"invalid gzip data"),inflt$1(e.subarray(i,-8),{i:2},t&&t.out||new u8$1(gzl$1(e)),t&&t.dictionary)}var Unzlib$1=function(){function e(e,t){Inflate$1.call(this,e,t),this.v=e&&e.dictionary?2:1}return e.prototype.push=function(e,t){if(Inflate$1.prototype.e.call(this,e),this.v){if(this.p.length<6&&!t)return;this.p=this.p.subarray(zls$1(this.p,this.v-1)),this.v=0}t&&(this.p.length<4&&err$1(6,"invalid zlib data"),this.p=this.p.subarray(0,-4)),Inflate$1.prototype.c.call(this,t)},e}();function unzlib$1(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err$1(7),cbify$1(e,t,[bInflt$1,zule$1,function(){return[unzlibSync$1]}],(function(e){return pbf$1(unzlibSync$1(e.data[0],gopt$1(e.data[1])))}),5,i)}function unzlibSync$1(e,t){return inflt$1(e.subarray(zls$1(e,t&&t.dictionary),-4),{i:2},t&&t.out,t&&t.dictionary)}var Decompress$1=function(){function e(e,t){this.o=StrmOpt$1.call(this,e,t)||{},this.G=Gunzip$1,this.I=Inflate$1,this.Z=Unzlib$1}return e.prototype.i=function(){var e=this;this.s.ondata=function(t,i){e.ondata(t,i)}},e.prototype.push=function(e,t){if(this.ondata||err$1(5),this.s)this.s.push(e,t);else{if(this.p&&this.p.length){var i=new u8$1(this.p.length+e.length);i.set(this.p),i.set(e,this.p.length)}else this.p=e;this.p.length>2&&(this.s=31==this.p[0]&&139==this.p[1]&&8==this.p[2]?new this.G(this.o):8!=(15&this.p[0])||this.p[0]>>4>7||(this.p[0]<<8|this.p[1])%31?new this.I(this.o):new this.Z(this.o),this.i(),this.s.push(this.p,t),this.p=null)}},e}();function decompress$1(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err$1(7),31==e[0]&&139==e[1]&&8==e[2]?gunzip$1(e,t,i):8!=(15&e[0])||e[0]>>4>7||(e[0]<<8|e[1])%31?inflate$3(e,t,i):unzlib$1(e,t,i)}function decompressSync$1(e,t){return 31==e[0]&&139==e[1]&&8==e[2]?gunzipSync$1(e,t):8!=(15&e[0])||e[0]>>4>7||(e[0]<<8|e[1])%31?inflateSync$1(e,t):unzlibSync$1(e,t)}var te$1=typeof TextEncoder<"u"&&new TextEncoder,td$1=typeof TextDecoder<"u"&&new TextDecoder,tds$1=0;try{td$1.decode(et$1,{stream:!0}),tds$1=1}catch(C){}var dutf8$1=function(e){for(var t="",i=0;;){var r=e[i++],n=(r>127)+(r>223)+(r>239);if(i+n>e.length)return{s:t,r:slc$1(e,i-1)};n?3==n?(r=((15&r)<<18|(63&e[i++])<<12|(63&e[i++])<<6|63&e[i++])-65536,t+=String.fromCharCode(55296|r>>10,56320|1023&r)):t+=1&n?String.fromCharCode((31&r)<<6|63&e[i++]):String.fromCharCode((15&r)<<12|(63&e[i++])<<6|63&e[i++]):t+=String.fromCharCode(r)}};function strToU8$1(e,t){if(te$1)return te$1.encode(e);for(var i=e.length,r=new u8$1(e.length+(e.length>>1)),n=0,a=function(e){r[n++]=e},o=0;or.length){var s=new u8$1(n+8+(i-o<<1));s.set(r),r=s}var l=e.charCodeAt(o);l<128||t?a(l):l<2048?(a(192|l>>6),a(128|63&l)):l>55295&&l<57344?(a(240|(l=65536+(1047552&l)|1023&e.charCodeAt(++o))>>18),a(128|l>>12&63),a(128|l>>6&63),a(128|63&l)):(a(224|l>>12),a(128|l>>6&63),a(128|63&l))}return slc$1(r,0,n)}function strFromU8$1(e,t){if(t){for(var i="",r=0;r65558)&&err$1(13);var n=b2$1(e,r+8);if(!n)return{};var a=b4$1(e,r+16),o=4294967295==a||65535==n;if(o){var s=b4$1(e,r-12);(o=101075792==b4$1(e,s))&&(n=b4$1(e,s+32),a=b4$1(e,s+48))}for(var l=t&&t.filter,c=0;c0&&(r[t]=!0);const n=t.length/3;let a=0;for(let e=0;e{document.body.removeChild(n),URL.revokeObjectURL(r)}),0)}static saveMesh(e,t,i=".mz3",r=!1){let n=new ArrayBuffer(0);return/\.obj$/i.test(i)?n=this.createOBJ(e,t):/\.stl$/i.test(i)?n=this.createSTL(e,t):(/\.mz3$/i.test(i)||(i+=".mz3"),n=this.createMZ3(e,t,r)),i.length>4&&this.downloadArrayBuffer(n,i),n}static getClusterBoundary(e,t){const i=new Uint32Array(e.buffer),r=new Array(i.length).fill(!1),n=t.length/3;let a=0;for(let e=0;e0&&(e=1/Math.sqrt(e),i[0]*=e,i[1]*=e,i[2]*=e),m[r]=i[0],m[r+1]=i[1],m[r+2]=i[2]}return m}}var commonjsGlobal=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function getDefaultExportFromCjs(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function getAugmentedNamespace(e){if(e.__esModule)return e;var t=e.default;if("function"==typeof t){var i=function e(){return this instanceof e?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};i.prototype=t.prototype}else i={};return Object.defineProperty(i,"__esModule",{value:!0}),Object.keys(e).forEach((function(t){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(i,t,r.get?r:{enumerable:!0,get:function(){return e[t]}})})),i}var arrayEqual=function(e,t){var i=e.length;if(e===t)return!0;if(i!==t.length)return!1;for(var r=0;r=1&&d<=2)m=4;else if(d>=3&&d<=4)m=2;else if(5===d)m=1;else if(0!==d)throw new Error("impossible Matlab v4 datatype");if(s+=c,e>50)throw new Error("Does not appear to be little-endian V4 Matlab file");const g=s+u*m;l[h]=function(e,t,i){const r=new Uint8Array(o.subarray(t,i));return 1===e?new Float32Array(r.buffer):2===e?new Int32Array(r.buffer):3===e?new Int16Array(r.buffer):4===e?new Uint16Array(r.buffer):5===e?new Uint8Array(r.buffer):new Float64Array(r.buffer)}(d,s,g),s=g}for(;s+20>18,s=(258048&u)>>12,l=(4032&u)>>6,c=63&u,t+=i[o]+i[s]+i[l]+i[c];return 1===n?(u=e[a],o=(252&u)>>2,s=(3&u)<<4,t+=i[o]+i[s]+"=="):2===n&&(u=e[a]<<8|e[a+1],o=(64512&u)>>10,s=(1008&u)>>4,l=(15&u)<<2,t+=i[o]+i[s]+i[l]+"="),t}static download(e,t,i){const r=document.createElement("a"),n=Array.isArray(e)?e:[e],a=new Blob(n,{type:i});r.href=URL.createObjectURL(a),r.download=t,r.click()}static readFileAsync(e){return new Promise(((t,i)=>{const r=new FileReader;r.onload=()=>{t(r.result)},r.onerror=i,r.readAsArrayBuffer(e)}))}static blobToBase64(e){return new Promise((t=>{const i=new FileReader;i.onloadend=()=>t(i.result),i.readAsDataURL(e)}))}static async decompressBase64String(e){const t=atob(e),i=new ArrayBuffer(t.length),r=new Uint8Array(i);for(let e=0;e{gzip$1(strToU8$1(e),((e,r)=>{e?i(e):t(r.buffer)}))}))}static isArrayBufferCompressed(e){if(e&&e.byteLength){const t=new Uint8Array(e);return 8075==(t[0]<<8|t[1])}return!1}static async decompressArrayBuffer(e){return new Promise(((t,i)=>{decompress$1(new Uint8Array(e),((e,r)=>{if(e)i(e);else{const e=strFromU8$1(r);t(e)}}))}))}static arraysAreEqual(e,t){return arrayEqual$1(e,t)}static range(e,t,i){return Array.from({length:(t-e)/i+1},((t,r)=>e+r*i))}static sph2cartDeg(e,t){const i=-t*(Math.PI/180),r=(e-90)%360*(Math.PI/180),n=[Math.cos(i)*Math.cos(r),Math.cos(i)*Math.sin(r),Math.sin(i)],a=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);return a<=0||(n[0]/=a,n[1]/=a,n[2]/=a),n}static vox2mm(e,t){const i=clone$2(t);transpose(i,i);const r=fromValues$1(e[0],e[1],e[2],1);return transformMat4(r,r,i),fromValues$2(r[0],r[1],r[2])}}const utiltiesLogger=log;class NVMeshLoaders{static readTRACT(e){const t=e.byteLength;if(t<20)throw new Error("File too small to be niml.tract: bytes = "+t);const i=new DataView(e),r=new Uint8Array(e);let n=0;function a(){for(;n>10,i=1023&e;return(e>>15?-1:1)*(t?31===t?i?NaN:1/0:Math.pow(2,t-15)*(1+i/1024):i/1024*6103515625e-14)}let i=0,r=0,n=new Float32Array([]);const a=[],o=[],s=[],l=[];let c=[],u=!1;const f=unzipSync$1(new Uint8Array(e),{filter:e=>e.originalSize>0}),h=Object.keys(f);for(let e=0,d=h.length;e2||1e3!==n||1128354388!==i)throw new Error("Not a valid TRK file");const a=t.getInt16(36,!0),o=[];for(let t=0;t0)for(let e=0;e0)for(let e=0;e=a);t++)o[s]=parseFloat(e[t]),s++}const l=[];for(i++;t[i].length<1;)i++;if(t[i].startsWith("METADATA")){for(;t[i].length>1;)i++;i++}if(r=t[i].trim().split(/\s+/),i++,r[0].includes("LINES")){const e=parseInt(r[1]);if(e<1)throw new Error("Corrupted VTK ASCII");let n=t[i].trim();const a=[];let s=[];if(n.startsWith("OFFSETS")){i++;let r=0;for(;r=e));t++);}s=Array.from(o)}else{let r=function(){n=t[i].trim();const e=n.trim().split(/\s+/);c=[];for(let t=0;t=c.length&&r();const e=c[u++];l+=e,a[t+1]=l;for(let t=0;t=c.length&&r();const e=3*c[u++];s.push(o[e+0]),s.push(o[e+1]),s.push(o[e+2])}}}return{pts:Float32Array.from(s),offsetPt0:Uint32Array.from(a)}}if(r[0].includes("TRIANGLE_STRIPS")){const e=parseInt(r[1]);for(let r=0;r1&&n.pop()&&(a=a.split(".").slice(0,-1).join("."));const o=NVMeshLoaders.readTSF(t,r);i.dpv||(i.dpv=[]);const s=o.reduce(((e,t)=>Math.min(e,t))),l=o.reduce(((e,t)=>Math.max(e,t)));return i.dpv.push({id:a,vals:Float32Array.from(o.slice()),global_min:s,global_max:l,cal_min:s,cal_max:l}),u}if(d<3)return void log.error("n_vert < 3 in layer");if("MZ3"===h)u.values=NVMeshLoaders.readMZ3(t,d);else if("ANNOT"===h){const e=NVMeshLoaders.readANNOT(t,d,!0);e instanceof Uint32Array?u.values=e:(u.values=e.scalars,u.colormapLabel=e.colormapLabel)}else if("CRV"===h||"CURV"===h||"THICKNESS"===h||"AREA"===h)u.values=NVMeshLoaders.readCURV(t,d),u.isTransparentBelowCalMin=!1;else if("GII"===h){const e=NVMeshLoaders.readGII(t,d);u.values=e.scalars,u.colormapLabel=e.colormapLabel}else if("MGH"===h||"MGZ"===h){const e=NVMeshLoaders.readMGH(t,d,!0);"scalars"in e?(u.values=e.scalars,u.colormapLabel=e.colormapLabel):u.values=e}else if("NII"===h)u.values=NVMeshLoaders.readNII(t,d,i.anatomicalStructurePrimary);else if("SMP"===h)u.values=NVMeshLoaders.readSMP(t,d);else if("STC"===h)u.values=NVMeshLoaders.readSTC(t,d);else{if(!NVMeshLoaders.isCurv(t))return log.warn("Unknown layer overlay format "+e),u;u.values=NVMeshLoaders.readCURV(t,d),u.isTransparentBelowCalMin=!1}if(!u.values)return void log.error("no values in layer");u.nFrame4D=u.values.length/d,u.frame4D=0,u.outlineBorder=c;let m=u.values[0],g=u.values[0];for(let e=0;e5){const t=decompressSync$1(new Uint8Array(e));r=new DataView(t.buffer),n=r.getUint16(0,!0),e=t.buffer}n>5&&log.error("Unsupported or invalid BrainVoyager SMP version "+n);const a=r.getUint32(2,!0);a!==t&&log.error("SMP file has "+a+" vertices, background mesh has "+t);const o=r.getUint16(6,!0),s=new Float32Array(a*o);let l=9;function c(){const t=l;for(;l=3&&3===i.mapType&&(i.nLags=r.getUint32(l,!0),l+=4,i.mnLag=r.getUint32(l,!0),l+=4,i.mxLag=r.getUint32(l,!0),l+=4,i.ccOverlay=r.getUint32(l,!0),l+=4),i.clusterSize=r.getUint32(l,!0),l+=4,i.clusterCheck=r.getUint8(l),l+=1,i.critThresh=r.getFloat32(l,!0),l+=4,i.maxThresh=r.getFloat32(l,!0),l+=4,n>=4&&(i.includeValuesGreaterThreshMax=r.getUint32(l,!0),l+=4),i.df1=r.getUint32(l,!0),l+=4,i.df2=r.getUint32(l,!0),l+=4,n>=5?(i.posNegFlag=r.getUint32(l,!0),l+=4):i.posNegFlag=3,i.cortexBonferroni=r.getUint32(l,!0),l+=4,i.posMinRGB=[0,0,0],i.posMaxRGB=[0,0,0],i.negMinRGB=[0,0,0],i.negMaxRGB=[0,0,0],n>=2&&(i.posMinRGB[0]=r.getUint8(l),l++,i.posMinRGB[1]=r.getUint8(l),l++,i.posMinRGB[2]=r.getUint8(l),l++,i.posMaxRGB[0]=r.getUint8(l),l++,i.posMaxRGB[1]=r.getUint8(l),l++,i.posMaxRGB[2]=r.getUint8(l),l++,n>=4&&(i.negMinRGB[0]=r.getUint8(l),l++,i.negMinRGB[1]=r.getUint8(l),l++,i.negMinRGB[2]=r.getUint8(l),l++,i.negMaxRGB[0]=r.getUint8(l),l++,i.negMaxRGB[1]=r.getUint8(l),l++,i.negMaxRGB[2]=r.getUint8(l),l++),i.enableSMPColor=r.getUint8(l),l++,n>=4&&(i.lut=c()),i.colorAlpha=r.getFloat32(l,!0),l+=4),i.name=c();const o=new Float32Array(e,l,a);s.set(o,t*a),l+=4*a}return s}static readSTC(e,t){const i=new DataView(e),r=i.getInt32(8,!1);if(r!==t)throw new Error("Overlay has "+r+" vertices, expected "+t);let n=12+4*r;const a=i.getUint32(n,!1);n+=4;const o=new Float32Array(a*r);for(let e=0;e0)return o;const l=r.getInt32(a+=4,!1),c=r.getInt32(a+=4,!1);a+=c;const u=r.getInt32(a+=4,!1);if(u<1)return o;const f={R:Array(l).fill(0),G:Array(l).fill(0),B:Array(l).fill(0),A:Array(l).fill(0),I:Array(l).fill(0),labels:Array(l).fill("")};for(let e=0;e=l?log.warn("annot entry out of range"):(f.R[e]=n,f.G[e]=o,f.B[e]=s,f.A[e]=c,f.I[e]=(c<<24)+(s<<16)+(o<<8)+n,f.labels[e]=i)}const h=new Float32Array(n);h.fill(-1);let d=0;for(let e=0;e0&&log.error(`annot vertex colors do not match ${d} of ${n} vertices.`);for(let e=0;e=3*l)break;o[u+2]=parseInt(t[0])-1,o[u+1]=parseInt(t[1])-1,o[u+0]=parseInt(t[2])-1,u+=3}}return{positions:a,indices:o}}static readASC(e){const t=e.byteLength,i=new Uint8Array(e);let r=0;function n(){for(;r65535)throw new Error("Invalid VTK binary polygons using little-endian data (MRtrix)");r+=4;const i=u.getInt32(r,!1);r+=4;let n=u.getInt32(r,!1);r+=4;for(let t=0;t=0&&(f=new Float32Array(e,s,3*o)),{positions:u,indices:c,colors:f}}static readMZ3(e,t=0){if(e.byteLength<20)throw new Error("File too small to be mz3: bytes = "+e.byteLength);let i=new DataView(e),r=i.getUint16(0,!0),n=e;if(35615===r||8075===r){const t=decompressSync$1(new Uint8Array(e));i=new DataView(t.buffer),r=i.getUint16(0,!0),n=t.buffer}const a=i.getUint16(2,!0),o=i.getUint32(4,!0);let s=i.getUint32(8,!0);const l=i.getUint32(12,!0);if(utiltiesLogger.debug("MZ3 magic %d attr %d face %d vert %d skip %d",r,a,o,s,l),23117!==r)throw new Error("Invalid MZ3 file");const c=!!(1&a),u=!!(2&a),f=!!(4&a);let h=!!(8&a);const d=!!(16&a);if(a>63)throw new Error("Unsupported future version of MZ3 file");let m=4;d&&(m=8);let g=0;if(t>0&&!c&&o<1&&!f&&(h=!0),h){let e=t;0===t&&(e=s);const i=16+l+(c?1:0)*o*12+(u?1:0)*e*12+(f?1:0)*e*4,r=Math.floor((n.byteLength-i)/m);s!==t&&r%t==0&&(log.warn("Issue 729: mz3 mismatch scalar NVERT does not match mesh NVERT"),s=t),g=Math.floor(r/s),g<1&&(log.warn("Corrupt MZ3: file reports NSCALAR but not enough bytes"),h=!1)}if(s<3&&t<3)throw new Error("Not a mesh MZ3 file (maybe scalar)");t>0&&t!==s&&log.warn("Layer has "+s+"vertices, but background mesh has "+t);let p=16+l,A=null;c&&(A=new Uint32Array(n,p,3*o),p+=3*o*4);let S=null;u&&(S=new Float32Array(n,p,3*s),p+=3*s*4);let b=null;if(f){b=new Float32Array(3*s);const e=new Uint8Array(n,p,4*s);p+=4*s;let t=0,i=0;for(let r=0;r0){if(d){const e=new Float64Array(n,p,g*s);v=Float32Array.from(e)}else v=new Float32Array(n,p,g*s);p+=m*g*s}return t>0?v:{positions:S,indices:A,scalars:v,colors:b}}static readPLY(e){const t=e.byteLength,i=new Uint8Array(e);let r=0;function n(){for(;ri.length){const e=new Uint32Array(i.length+i.length);e.set(i),i=e.slice()}const o=parseInt(e[p+1]);let s=parseInt(e[p+2]);for(let n=0;n1&&log.warn("This is not a valid FreeSurfer ICO/TRI mesh.");const r=parseInt(i[0]),n=new Float32Array(3*r);let a=1;for(let e=0;e=r){log.error("ICO vertices corrupted");break}i*=3,n[i]=o,n[i+1]=s,n[i+2]=l}i=t[a].trim().split(/\s+/),a++;const o=parseInt(i[0]),s=new Uint32Array(3*o);for(let e=0;e=o){log.error("ICO indices corrupted");break}i*=3,s[i]=r,s[i+1]=n,s[i+2]=l}for(let e=0;e1||s!==3*o)&&log.warn("Multi-part BYU/GEO header or not a triangular mesh.");const l=[];a*=3;let c=0,u=2;for(;c=a));t++);}const f=[];o*=3;let h=0;for(;h=o));t++);}if(t)for(let e=0;e2)&&log.warn("This is not a valid MNI OBJ mesh.");let l=1;1===s?l=o:1===s&&(l=r),i+=4*l,i+=o;const c=3*o,u=new Uint32Array(c);for(let e=0;e1056964608&&(S[f+0]=(t>>16&255)/255,S[f+1]=(t>>8&255)/255,S[f+2]=(255&t)/255),0===t&&(S[f+0]=h,S[f+1]=d,S[f+2]=m),1===t&&(S[f+0]=g,S[f+1]=p,S[f+2]=A),f+=3}u+=4*n;for(let e=0;e=3e3&&f<=3099&&l>580){let r=function(){for(;b"))return e;for(;b");)e+=r();return e},c=function(e,t=!1){const i=S.indexOf(e);if(i<0)return 1;const r=S.indexOf('"',i)+1,n=S.indexOf('"',r),a=S.slice(r,n);return t?a:parseInt(a)},u=0,f=0,d=0,g="",p=new Uint32Array;const A=new Uint8Array(e);let S,b=552;const v=m[5],w=new Float32Array(t*v);for(;b"));)if(S.includes("")||(S=s()),!S.startsWith("")||!S.endsWith(""))return log.warn("Unable to find CIfTI "),w;S=S.slice(15,-16);const a=S.trim().split(/\s+/);a.length4)&&log.warn("Not a valid MGH file");let d=o*s*l*c,m=[];if(d=this.decimateLayerVertices(d,t),d%t!=0)return log.warn("Vertices in layer ("+d+") is not a multiple of number of vertices ("+t+")"),m;if(3===u){m=new Float32Array(d);for(let e=0;e0)return log.warn("unsupported CTABreadFromBinaryV1"),m;if(e=-e,2!==e)return log.warn("CTABreadFromBinary: unknown version"),m;const t=r.getInt32(f+=4,h);if(t<0)return log.warn("CTABreadFromBinaryV2: nentries was ",t),m;const i=r.getInt32(f+=4,h);f+=i;const n=r.getInt32(f+=4,h);if(n<0)return m;const a={R:[],G:[],B:[],A:[],I:[],labels:[]};for(let e=0;e"))if(a.startsWith(""))for(;r");)a+=n();else for(;r");)a+=n();const e=o("USE");if(e.length>1)return void(e in p?m=p[e]:log.warn("Unable to find DEF for "+e));const i=s("diffuseColor");if(i.length<3)return;m[0]=Math.round(255*i[0]),m[1]=Math.round(255*i[1]),m[2]=Math.round(255*i[2]);const l=o("DEF");l.length<1||(p[l]=m)}for(;r=0?(c.push(o[i]+e),c.push(o[t-1]+e),c.push(o[t-0]+e),t+=1):(t+=3,i=t-2)}else for(;t=0?(c.push(o[t-2]+e),c.push(o[t-1]+e),c.push(o[t-0]+e),t+=1):t+=3;l=[...l,...g];const r=Math.floor(g.length/3),n=Array(r).fill(m).flat();if(f.length===3*r){let e=0,t=0;for(let i=0;i"!==r[n];)n++;if(t="/"===r[n-1],a+1=i)break}const o=(new TextDecoder).decode(e.slice(a+1,n)).trim(),s=o.split(" ")[0].trim(),l=n;let c=n,u=n;if("?"!==r[a+1]&&"!"!==r[a+1]){const e="";c=r.indexOf(e,l),u=c+e.length-1}return{name:o,startPos:a,contentStartPos:l,contentEndPos:c,endPos:u}}let o=a();if(!o.name.startsWith("?xml"))throw new Error("readGII: Invalid XML file");for(;!o.name.startsWith("GIFTI")&&o.endPos1;)if(o=a(),o.name.startsWith("Label Key")&&(T=o.name,I.I.push(y("Key=")),I.R.push(Math.round(255*y("Red=",!0))),I.G.push(Math.round(255*y("Green=",!0))),I.B.push(Math.round(255*y("Blue=",!0))),I.A.push(Math.round(255*y("Alpha",!0))),T=(new TextDecoder).decode(e.slice(o.contentStartPos+1,o.contentEndPos)).trim(),I.labels.push(C(""u"){let e=function(e){const t=atob(e),i=t.length,r=new Uint8Array(i);for(let e=0;e1&&(D=cmapper.makeLabelLut(I)),t>0)return{scalars:c,colormapLabel:D,anatomicalStructurePrimary:u};if(s.length>2&&!w&&(0!==p[0]||0!==p[1]||0!==p[2])){v=Math.floor(s.length/3);let e=0;for(let t=0;t(e.MESH="mesh",e.CONNECTOME="connectome",e.FIBER="fiber",e))(MeshType||{});const NVMeshLayerDefaults={colormap:"gray",opacity:0,nFrame4D:0,frame4D:0,outlineBorder:0,cal_min:0,cal_max:0,cal_minNeg:0,cal_maxNeg:0,values:new Array};class NVMeshFromUrlOptions{constructor(e="",t=null,i="",r=1,n=new Uint8Array([255,255,255,255]),a=!0,o=[],s=!0){g0(this,"url"),g0(this,"gl"),g0(this,"name"),g0(this,"opacity"),g0(this,"rgba255"),g0(this,"visible"),g0(this,"layers"),g0(this,"colorbarVisible"),this.url=e,this.gl=t,this.name=i,this.opacity=r,this.rgba255=n,this.visible=a,this.layers=o,this.colorbarVisible=s}}class NVMesh{constructor(e,t,i="",r=new Uint8Array([255,255,255,255]),n=1,a=!0,o,s=null,l=null,c=null,u=null,f=!0,h=""){g0(this,"id"),g0(this,"name"),g0(this,"anatomicalStructurePrimary"),g0(this,"colorbarVisible"),g0(this,"furthestVertexFromOrigin"),g0(this,"extentsMin"),g0(this,"extentsMax"),g0(this,"opacity"),g0(this,"visible"),g0(this,"meshShaderIndex",0),g0(this,"offsetPt0",null),g0(this,"colormapInvert",!1),g0(this,"fiberGroupColormap",null),g0(this,"indexBuffer"),g0(this,"vertexBuffer"),g0(this,"vao"),g0(this,"vaoFiber"),g0(this,"pts"),g0(this,"tris"),g0(this,"layers"),g0(this,"type","mesh"),g0(this,"data_type"),g0(this,"rgba255"),g0(this,"fiberLength"),g0(this,"fiberLengths"),g0(this,"fiberDensity"),g0(this,"fiberDither",.1),g0(this,"fiberColor","Global"),g0(this,"fiberDecimationStride",1),g0(this,"fiberSides",5),g0(this,"fiberRadius",0),g0(this,"fiberOcclusion",0),g0(this,"f32PerVertex",5),g0(this,"fiberMask"),g0(this,"colormap"),g0(this,"dpg"),g0(this,"dps"),g0(this,"dpv"),g0(this,"hasConnectome",!1),g0(this,"connectome"),g0(this,"indexCount"),g0(this,"vertexCount",1),g0(this,"nodeScale",4),g0(this,"edgeScale",1),g0(this,"legendLineThickness",0),g0(this,"nodeColormap","warm"),g0(this,"edgeColormap","warm"),g0(this,"nodeColormapNegative"),g0(this,"edgeColormapNegative"),g0(this,"nodeMinColor"),g0(this,"nodeMaxColor"),g0(this,"edgeMin"),g0(this,"edgeMax"),g0(this,"nodes"),g0(this,"edges"),g0(this,"points"),this.anatomicalStructurePrimary=h,this.name=i,this.colorbarVisible=f,this.id=v4();const d=NVMeshUtilities.getExtents(e);if(this.furthestVertexFromOrigin=d.mxDx,this.extentsMin=d.extentsMin,this.extentsMax=d.extentsMax,this.opacity=n>1?1:n,this.visible=a,this.meshShaderIndex=0,this.indexBuffer=o.createBuffer(),this.vertexBuffer=o.createBuffer(),this.vao=o.createVertexArray(),o.bindVertexArray(this.vao),o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,this.indexBuffer),o.bindBuffer(o.ARRAY_BUFFER,this.vertexBuffer),o.enableVertexAttribArray(0),o.enableVertexAttribArray(1),7!==this.f32PerVertex?(o.vertexAttribPointer(0,3,o.FLOAT,!1,20,0),o.vertexAttribPointer(1,4,o.BYTE,!0,20,12),o.enableVertexAttribArray(2),o.vertexAttribPointer(2,4,o.UNSIGNED_BYTE,!0,20,16)):(o.vertexAttribPointer(0,3,o.FLOAT,!1,28,0),o.vertexAttribPointer(1,3,o.FLOAT,!1,28,12),o.enableVertexAttribArray(2),o.vertexAttribPointer(2,4,o.UNSIGNED_BYTE,!0,28,24)),o.bindVertexArray(null),this.vaoFiber=o.createVertexArray(),this.offsetPt0=null,this.hasConnectome=!1,this.colormapInvert=!1,this.fiberGroupColormap=null,this.pts=e,this.layers=[],this.type="mesh",this.tris=t,r[3]<1)return this.rgba255=r,this.fiberLength=2,this.fiberDither=.1,this.fiberColor="Global",this.fiberDecimationStride=1,this.fiberMask=[],this.colormap=s,this.dpg=l,this.dps=c,this.dpv=u,l&&this.initValuesArray(l),c&&this.initValuesArray(c),u&&this.initValuesArray(u),this.offsetPt0=new Uint32Array(t),this.tris=new Uint32Array(0),this.updateFibers(o),o.bindVertexArray(this.vaoFiber),o.bindBuffer(o.ELEMENT_ARRAY_BUFFER,this.indexBuffer),o.bindBuffer(o.ARRAY_BUFFER,this.vertexBuffer),o.enableVertexAttribArray(0),o.vertexAttribPointer(0,3,o.FLOAT,!1,16,0),o.enableVertexAttribArray(1),o.vertexAttribPointer(1,4,o.UNSIGNED_BYTE,!0,16,12),void o.bindVertexArray(null);if(s){this.connectome=s,this.hasConnectome=!0;const e=Object.keys(s);for(let t=0,i=e.length;tMath.min(e,t))),r=e[t].vals.reduce(((e,t)=>Math.max(e,t)));e[t].global_min=i,e[t].global_max=r,e[t].cal_min=i,e[t].cal_max=r}return e}linesToCylinders(e,t,i){function r(e){return fromValues$2(e[0],e[1],e[2])}const n=Math.pow(2,32)-1,a=i.length;let o=0,s=0;for(let e=0;e 1 requires f32PerVertex == 5");const f=new Float32Array(c*u),h=new Uint8Array(f.buffer);let d=0,m=create$1(),g=create$1(),p=create$1();const A=create$2();let S=create$2(),b=0;const v=this.fiberRadius;for(let e=0;e=n)&&(e[r]=i[r-1]+i[r]+i[r]+i[r+1]);r=-1,i=e.slice();for(let a=0;a=n)&&(e[r]=i[r-t]+i[r]+i[r]+i[r+t]);const a=t*t;r=-1,i=e.slice();for(let o=0;o=n)&&(e[r]=i[r-a]+i[r]+i[r]+i[a]);return e}o=u(o,r),o=u(o,r);let f=0,h=1/0;const d=r*r*r;for(let e=0;e0){const e=parseInt(d.substring(3));e0){const e=parseInt(d.substring(3));e=this.dpg.length||n.A[i]<1||(t[r]=!0,r*=4,e[r]=n.R[i],e[r+1]=n.G[i],e[r+2]=n.B[i],e[r+3]=255)}p.fill(-1);for(let e=0;e0){let e=function(e,t){return t*(255&e)+(t*(e>>8&255)<<8)+(t*(e>>16&255)<<16)};this.createFiberDensityMap();for(let t=0;t2&&this.fiberRadius>0?this.linesToCylinders(e,a,b):(this.indexCount=b.length,e.bindBuffer(e.ARRAY_BUFFER,this.vertexBuffer),e.bufferData(e.ARRAY_BUFFER,Uint32Array.from(o),e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,this.indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,Uint32Array.from(b),e.STATIC_DRAW))}indexNearestXYZmm(e,t,i){const r=this.pts,n=this.pts.length/3;let a=0,o=1/0,s=0;for(let l=0;l0)for(let e=0;e0)for(let e=0;e0)for(let e=0;e0)for(let e=0;er.cal_max)continue;if(void 0===r.outlineBorder&&(r.outlineBorder=0),void 0===r.isAdditiveBlend&&(r.isAdditiveBlend=!1),r.colormapLabel&&r.colormapLabel.R&&!r.colormapLabel.lut&&(r.colormapLabel=cmapper.makeLabelLut(r.colormapLabel)),r.colormapLabel&&r.colormapLabel.lut){const e=r.colormapLabel.lut,i=Math.floor(e.length/4),o=n*Math.min(Math.max(r.frame4D,0),r.nFrame4D-1),s=new Uint8Array(4*n);let c=0;for(let t=0;t0&&(u=NVMeshUtilities.getClusterBoundary(s,this.tris)),c=0;for(let e=0;e0&&(i=NVMeshUtilities.getClusterBoundary(e,this.tris));let o=0;for(let n=0;n0)for(let e=0;e=t;r--){const e=10*Math.pow(4,r+1)+2,t=10*Math.pow(4,r)+2,n=i.length/3,a=20*Math.pow(4,r);console.log(`order ${r+1} -> ${r} vertices ${e} -> ${t} faces ${n} -> ${a}`);const o=Array.from({length:e},((e,t)=>t+1));for(let e=0;e=i)return log.warn(`Unable to decimate mesh: input order (${i}) must be larger than downsampled order (${t})`),!1;const r=this.pts.length/3,n=10*Math.pow(4,t)+2;if(this.pts=new Float32Array(this.pts.slice(0,3*n)),this.decimateFaces(i,t),this.layers&&this.layers.length>0)for(let e=0;e"u"){o={pts:new Float32Array([0,0,0,0,0,0]),offsetPt0:new Uint32Array([0])},log.error("Creating empty tracts")}return n[3]=0,new NVMesh(o.pts,o.offsetPt0,t,n,r,a,i,"inferno",o.dpg||null,o.dps||null,o.dpv||null)}if("GII"===f)o=NVMeshLoaders.readGII(e);else if("MZ3"===f)o=NVMeshLoaders.readMZ3(e),(o instanceof Float32Array||null===o.positions)&&log.warn("MZ3 does not have positions (statistical overlay?)");else if("ASC"===f)o=NVMeshLoaders.readASC(e);else if("DFS"===f)o=NVMeshLoaders.readDFS(e);else if("BYU"===f||"G"===f)o=NVMeshLoaders.readGEO(e);else if("GEO"===f)o=NVMeshLoaders.readGEO(e,!0);else if("ICO"===f||"TRI"===f)o=NVMeshLoaders.readICO(e);else if("OFF"===f)o=NVMeshLoaders.readOFF(e);else if("NV"===f)o=NVMeshLoaders.readNV(e);else if("OBJ"===f)o=NVMeshLoaders.readOBJ(e);else if("PLY"===f)o=NVMeshLoaders.readPLY(e);else if("X3D"===f)o=NVMeshLoaders.readX3D(e);else if("FIB"===f||"VTK"===f){if(o=NVMeshLoaders.readVTK(e),"offsetPt0"in o)return n[3]=0,new NVMesh(o.pts,o.offsetPt0,t,n,r,a,i,"inferno")}else o="SRF"===f?NVMeshLoaders.readSRF(e):"STL"===f?NVMeshLoaders.readSTL(e):NVMeshLoaders.readFreeSurfer(e);if(o.anatomicalStructurePrimary&&(c=o.anatomicalStructurePrimary),o instanceof Float32Array)throw new Error("fatal: unknown mesh type loaded");if(!o.positions)throw new Error("positions not loaded");if(!o.indices)throw new Error("indices not loaded");if(l=o.positions,s=o.indices,"rgba255"in o&&o.rgba255.length>0&&(n=o.rgba255),"colors"in o&&o.colors&&o.colors.length===l.length){const e=l.length/3;n=new Uint8Array(4*e);let t=0,i=0;for(let r=0;r0&&(NVMeshLoaders.readLayer(t,e,d,r,"gray"),d.updateMesh(i)),d}static async loadLayer(e,t){let i;if(void 0!==e.base64)i=function(e){const t=window.atob(e),i=t.length,r=new Uint8Array(i);for(let e=0;e-1&&(r=r.slice(0,r.indexOf("?")));let a=.5;"opacity"in e&&(a=e.opacity);let o="warm";"colormap"in e&&(o=e.colormap);let s="winter";"colormapNegative"in e&&(s=e.colormapNegative);let l=!1;"useNegativeCmap"in e&&(l=e.useNegativeCmap);let c=null;"cal_min"in e&&(c=e.cal_min);let u=null;"cal_max"in e&&(u=e.cal_max);const f=NVMeshLoaders.readLayer(r,i,t,a,o,s,l,c,u);f&&t.layers.push(f)}static async loadFromUrl({url:e="",headers:t={},gl:i,name:r="",opacity:n=1,rgba255:a=[255,255,255,255],visible:o=!0,layers:s=[],buffer:l=new ArrayBuffer(0)}={}){let c,u=e.split("/");if(""===r){try{u=new URL(e).pathname.split("/")}catch{u=e.split("/")}(r=u.slice(-1)[0]).indexOf("?")>-1&&(r=r.slice(0,r.indexOf("?")))}if(""===e)throw Error("url must not be empty");if(!i)throw Error("gl context is null");if(l.byteLength>0)c=l;else{const i=await fetch(e,{headers:t});if(!i.ok)throw Error(i.statusText);c=await i.arrayBuffer()}const f=await this.readMesh(c,r,i,n,new Uint8Array(a),o);if(!s||s.length<1)return f;for(let e=0;e{const r=new FileReader;r.onload=()=>{t(r.result)},r.onerror=i,r.readAsArrayBuffer(e)}))}static async loadFromFile({file:e,gl:t,name:i="",opacity:r=1,rgba255:n=[255,255,255,255],visible:a=!0,layers:o=[]}={}){if(!e)throw new Error("file must be set");if(!t)throw new Error("rendering context must be set");const s=await NVMesh.readFileAsync(e),l=NVMesh.readMesh(s,i,t,r,new Uint8Array(n),a);if(!o||o.length<1)return l;for(let e=0;e{const i=(t,i)=>(e.set(i,t),t),r=n=>{if(e.has(n))return e.get(n);const[a,o]=t[n];switch(a){case PRIMITIVE:case VOID:return i(o,n);case ARRAY:{const e=i([],n);for(const t of o)e.push(r(t));return e}case OBJECT:{const e=i({},n);for(const[t,i]of o)e[r(t)]=r(i);return e}case DATE:return i(new Date(o),n);case REGEXP:{const{source:e,flags:t}=o;return i(new RegExp(e,t),n)}case MAP:{const e=i(new Map,n);for(const[t,i]of o)e.set(r(t),r(i));return e}case SET:{const e=i(new Set,n);for(const t of o)e.add(r(t));return e}case ERROR:{const{name:e,message:t}=o;return i(new env[e](t),n)}case BIGINT:return i(BigInt(o),n);case"BigInt":return i(Object(BigInt(o)),n)}return i(new env[a](o),n)};return r},deserialize=e=>deserializer(new Map,e)(0),EMPTY="",{toString:toString}={},{keys:keys}=Object,typeOf=e=>{const t=typeof e;if("object"!==t||!e)return[PRIMITIVE,t];const i=toString.call(e).slice(8,-1);switch(i){case"Array":return[ARRAY,EMPTY];case"Object":return[OBJECT,EMPTY];case"Date":return[DATE,EMPTY];case"RegExp":return[REGEXP,EMPTY];case"Map":return[MAP,EMPTY];case"Set":return[SET,EMPTY]}return i.includes("Array")?[ARRAY,i]:i.includes("Error")?[ERROR,i]:[OBJECT,i]},shouldSkip=([e,t])=>e===PRIMITIVE&&("function"===t||"symbol"===t),serializer=(e,t,i,r)=>{const n=(e,t)=>{const n=r.push(e)-1;return i.set(t,n),n},a=r=>{if(i.has(r))return i.get(r);let[o,s]=typeOf(r);switch(o){case PRIMITIVE:{let t=r;switch(s){case"bigint":o=BIGINT,t=r.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+s);t=null;break;case"undefined":return n([VOID],r)}return n([o,t],r)}case ARRAY:{if(s)return n([s,[...r]],r);const e=[],t=n([o,e],r);for(const t of r)e.push(a(t));return t}case OBJECT:{if(s)switch(s){case"BigInt":return n([s,r.toString()],r);case"Boolean":case"Number":case"String":return n([s,r.valueOf()],r)}if(t&&"toJSON"in r)return a(r.toJSON());const i=[],l=n([o,i],r);for(const t of keys(r))(e||!shouldSkip(typeOf(r[t])))&&i.push([a(t),a(r[t])]);return l}case DATE:return n([o,r.toISOString()],r);case REGEXP:{const{source:e,flags:t}=r;return n([o,{source:e,flags:t}],r)}case MAP:{const t=[],i=n([o,t],r);for(const[i,n]of r)(e||!shouldSkip(typeOf(i))&&!shouldSkip(typeOf(n)))&&t.push([a(i),a(n)]);return i}case SET:{const t=[],i=n([o,t],r);for(const i of r)(e||!shouldSkip(typeOf(i)))&&t.push(a(i));return i}}const{message:l}=r;return n([o,{name:s,message:l}],r)};return a},serialize=(e,{json:t,lossy:i}={})=>{const r=[];return serializer(!(t||i),!!t,new Map,r)(e),r};var nifti={},browser$1={},ch2={},node_worker_1={default:function(e,t,i,r,n){var a=new Worker(ch2[t]||(ch2[t]=URL.createObjectURL(new Blob([e+';addEventListener("error",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'],{type:"text/javascript"}))));return a.onmessage=function(e){var t=e.data,i=t.$e$;if(i){var r=new Error(i[0]);r.code=i[1],r.stack=i[2],n(r,null)}else n(null,t)},a.postMessage(i,r),a}},u8=Uint8Array,u16=Uint16Array,i32=Int32Array,fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),freb=function(e,t){for(var i=new u16(31),r=0;r<31;++r)i[r]=t+=1<>1|(21845&i)<<1;x=(52428&x)>>2|(13107&x)<<2,x=(61680&x)>>4|(3855&x)<<4,rev[i]=((65280&x)>>8|(255&x)<<8)>>1}for(var hMap=function(e,t,i){for(var r=e.length,n=0,a=new u16(t);n>l]=c}else for(o=new u16(r),n=0;n>15-e[n]);return o},flt=new u8(288),i=0;i<144;++i)flt[i]=8;for(var i=144;i<256;++i)flt[i]=9;for(var i=256;i<280;++i)flt[i]=7;for(var i=280;i<288;++i)flt[i]=8;for(var fdt=new u8(32),i=0;i<32;++i)fdt[i]=5;var flm=hMap(flt,9,0),flrm=hMap(flt,9,1),fdm=hMap(fdt,5,0),fdrm=hMap(fdt,5,1),max=function(e){for(var t=e[0],i=1;it&&(t=e[i]);return t},bits=function(e,t,i){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&i},bits16=function(e,t){var i=t/8|0;return(e[i]|e[i+1]<<8|e[i+2]<<16)>>(7&t)},shft=function(e){return(e+7)/8|0},slc=function(e,t,i){return(null==t||t<0)&&(t=0),(null==i||i>e.length)&&(i=e.length),new u8(e.subarray(t,i))},FlateErrorCode=browser$1.FlateErrorCode={UnexpectedEOF:0,InvalidBlockType:1,InvalidLengthLiteral:2,InvalidDistance:3,StreamFinished:4,NoStreamHandler:5,InvalidHeader:6,NoCallback:7,InvalidUTF8:8,ExtraFieldTooLong:9,InvalidDate:10,FilenameTooLong:11,StreamFinishing:12,InvalidZipData:13,UnknownCompressionMethod:14},ec=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],err=function(e,t,i){var r=new Error(t||ec[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,err),!i)throw r;return r},inflt=function(e,t,i,r){var n=e.length,a=r?r.length:0;if(!n||t.f&&!t.l)return i||new u8(0);var o=!i,s=o||2!=t.i,l=t.i;o&&(i=new u8(3*n));var c=function(e){var t=i.length;if(e>t){var r=new u8(Math.max(2*t,e));r.set(i),i=r}},u=t.f||0,f=t.p||0,h=t.b||0,d=t.l,m=t.d,g=t.m,p=t.n,A=8*n;do{if(!d){u=bits(e,f,1);var S=bits(e,f+1,3);if(f+=3,!S){var b=e[(k=shft(f)+4)-4]|e[k-3]<<8,v=k+b;if(v>n){l&&err(0);break}s&&c(h+b),i.set(e.subarray(k,v),h),t.b=h+=b,t.p=f=8*v,t.f=u;continue}if(1==S)d=flrm,m=fdrm,g=9,p=5;else if(2==S){var w=bits(e,f,31)+257,T=bits(e,f+10,15)+4,y=w+bits(e,f+5,31)+1;f+=14;for(var C=new u8(y),I=new u8(19),D=0;D>4)<16)C[D++]=k;else{var F=0,P=0;for(16==k?(P=3+bits(e,f,3),f+=2,F=C[D-1]):17==k?(P=3+bits(e,f,7),f+=3):18==k&&(P=11+bits(e,f,127),f+=7);P--;)C[D++]=F}}var L=C.subarray(0,w),_=C.subarray(w);g=max(L),p=max(_),d=hMap(L,g,1),m=hMap(_,p,1)}else err(1);if(f>A){l&&err(0);break}}s&&c(h+131072);for(var N=(1<>4;if((f+=15&F)>A){l&&err(0);break}if(F||err(2),B<256)i[h++]=B;else{if(256==B){O=f,d=null;break}var V=B-254;if(B>264){var q=fleb[D=B-257];V=bits(e,f,(1<>4;G||err(3),f+=15&G;_=fd[Q];if(Q>3){q=fdeb[Q];_+=bits16(e,f)&(1<A){l&&err(0);break}s&&c(h+131072);var z=h+V;if(h<_){var H=a-_,Y=Math.min(_,z);for(H+h<0&&err(3);h>8},wbits16=function(e,t,i){i<<=7&t;var r=t/8|0;e[r]|=i,e[r+1]|=i>>8,e[r+2]|=i>>16},hTree=function(e,t){for(var i=[],r=0;rh&&(h=a[r].s);var d=new u16(h+1),m=ln(i[u-1],d,0);if(m>t){r=0;var g=0,p=m-t,A=1<t))break;g+=A-(1<>=p;g>0;){var b=a[r].s;d[b]=0&&g;--r){var v=a[r].s;d[v]==t&&(--d[v],++g)}m=t}return{t:new u8(d),l:m}},ln=function(e,t,i){return-1==e.s?Math.max(ln(e.l,t,i+1),ln(e.r,t,i+1)):t[e.s]=i},lc=function(e){for(var t=e.length;t&&!e[--t];);for(var i=new u16(++t),r=0,n=e[0],a=1,o=function(e){i[r++]=e},s=1;s<=t;++s)if(e[s]==n&&s!=t)++a;else{if(!n&&a>2){for(;a>138;a-=138)o(32754);a>2&&(o(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(o(n),--a;a>6;a-=6)o(8304);a>2&&(o(a-3<<5|8208),a=0)}for(;a--;)o(n);a=1,n=e[s]}return{c:i.subarray(0,r),n:t}},clen=function(e,t){for(var i=0,r=0;r>8,e[n+2]=255^e[n],e[n+3]=255^e[n+1];for(var a=0;a4&&!D[clim[E-1]];--E);var M,k,R,F,P=c+5<<3,L=clen(n,flt)+clen(a,fdt)+o,_=clen(n,h)+clen(a,g)+o+14+3*E+clen(y,D)+2*y[16]+3*y[17]+7*y[18];if(l>=0&&P<=L&&P<=_)return wfblk(t,u,e.subarray(l,l+c));if(wbits(t,u,1+(_15&&(wbits(t,u,B[C]>>5&127),u+=B[C]>>12)}}}else M=flm,k=flt,R=fdm,F=fdt;for(C=0;C255){wbits16(t,u,M[(V=q>>18&31)+257]),u+=k[V+257],V>7&&(wbits(t,u,q>>23&31),u+=fleb[V]);var G=31&q;wbits16(t,u,R[G]),u+=F[G],G>3&&(wbits16(t,u,q>>5&8191),u+=fdeb[G])}else wbits16(t,u,M[q]),u+=k[q]}return wbits16(t,u,M[256]),u+k[256]},deo=new i32([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),et=new u8(0),dflt=function(e,t,i,r,n,a){var o=a.z||e.length,s=new u8(r+o+5*(1+Math.ceil(o/7e3))+n),l=s.subarray(r,s.length-n),c=a.l,u=7&(a.r||0);if(t){u&&(l[0]=a.r>>3);for(var f=deo[t-1],h=f>>13,d=8191&f,m=(1<7e3||D>24576)&&(F>423||!c)){u=wblk(e,l,0,v,w,T,C,D,E,I-E,u),D=y=C=0,E=I;for(var P=0;P<286;++P)w[P]=0;for(P=0;P<30;++P)T[P]=0}var L=2,_=0,N=d,U=k-R&32767;if(F>2&&M==b(I-U))for(var O=Math.min(h,F)-1,B=Math.min(32767,I),V=Math.min(258,F);U<=B&&--N&&k!=R;){if(e[I+L]==e[I+L-U]){for(var q=0;qL){if(L=q,_=U,q>O)break;var G=Math.min(U,q-2),Q=0;for(P=0;PQ&&(Q=H,R=z)}}}U+=(k=R)-(R=g[k])&32767}if(_){v[D++]=268435456|revfl[L]<<18|revfd[_];var Y=31&revfl[L],W=31&revfd[_];C+=fleb[Y]+fdeb[W],++w[257+Y],++T[W],x=I+L,++y}else v[D++]=e[I],++w[e[I]]}}for(I=Math.max(I,x);I=o&&(l[u/8|0]=c,X=o),u=wfblk(l,u+1,e.subarray(I,X))}a.i=o}return slc(s,0,r+shft(u)+n)},crct=function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var i=t,r=9;--r;)i=(1&i&&-306674912)^i>>>1;e[t]=i}return e}(),crc=function(){var e=-1;return{p:function(t){for(var i=e,r=0;r>>8;e=i},d:function(){return~e}}},adler=function(){var e=1,t=0;return{p:function(i){for(var r=e,n=t,a=0|i.length,o=0;o!=a;){for(var s=Math.min(o+2655,a);o>16),n=(65535&n)+15*(n>>16)}e=r,t=n},d:function(){return(255&(e%=65521))<<24|(65280&e)<<8|(255&(t%=65521))<<8|t>>8}}},dopt=function(e,t,i,r,n){if(!n&&(n={l:1},t.dictionary)){var a=t.dictionary.subarray(-32768),o=new u8(a.length+e.length);o.set(a),o.set(e,a.length),e=o,n.w=a.length}return dflt(e,null==t.level?6:t.level,null==t.mem?n.l?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(e.length)))):20:12+t.mem,i,r,n)},mrg=function(e,t){var i={};for(var r in e)i[r]=e[r];for(var r in t)i[r]=t[r];return i},wcln=function(e,t,i){for(var r=e(),n=e.toString(),a=n.slice(n.indexOf("[")+1,n.lastIndexOf("]")).replace(/\s+/g,"").split(","),o=0;o>>0},b8=function(e,t){return b4(e,t)+4294967296*b4(e,t+4)},wbytes=function(e,t,i){for(;i;++t)e[t]=i,i>>>=8},gzh=function(e,t){var i=t.filename;if(e[0]=31,e[1]=139,e[2]=8,e[8]=t.level<2?4:9==t.level?2:0,e[9]=3,0!=t.mtime&&wbytes(e,4,Math.floor(new Date(t.mtime||Date.now())/1e3)),i){e[3]=8;for(var r=0;r<=i.length;++r)e[r+10]=i.charCodeAt(r)}},gzs=function(e){(31!=e[0]||139!=e[1]||8!=e[2])&&err(6,"invalid gzip data");var t=e[3],i=10;4&t&&(i+=2+(e[10]|e[11]<<8));for(var r=(t>>3&1)+(t>>4&1);r>0;r-=!e[i++]);return i+(2&t)},gzl=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0},gzhl=function(e){return 10+(e.filename?e.filename.length+1:0)},zlh=function(e,t){var i=t.level,r=0==i?0:i<6?1:9==i?3:2;if(e[0]=120,e[1]=r<<6|(t.dictionary&&32),e[1]|=31-(e[0]<<8|e[1])%31,t.dictionary){var n=adler();n.p(t.dictionary),wbytes(e,2,n.d())}},zls=function(e,t){return(8!=(15&e[0])||e[0]>>4>7||(e[0]<<8|e[1])%31)&&err(6,"invalid zlib data"),(e[1]>>5&1)==+!t&&err(6,"invalid zlib data: "+(32&e[1]?"need":"unexpected")+" dictionary"),2+(e[1]>>3&4)};function StrmOpt(e,t){return"function"==typeof e&&(t=e,e={}),this.ondata=t,e}var Deflate=function(){function e(e,t){if("function"==typeof e&&(t=e,e={}),this.ondata=t,this.o=e||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new u8(98304),this.o.dictionary){var i=this.o.dictionary.subarray(-32768);this.b.set(i,32768-i.length),this.s.i=32768-i.length}}return e.prototype.p=function(e,t){this.ondata(dopt(e,this.o,0,0,this.s),t)},e.prototype.push=function(e,t){this.ondata||err(5),this.s.l&&err(4);var i=e.length+this.s.z;if(i>this.b.length){if(i>2*this.b.length-32768){var r=new u8(-32768&i);r.set(this.b.subarray(0,this.s.z)),this.b=r}var n=this.b.length-this.s.z;this.b.set(e.subarray(0,n),this.s.z),this.s.z=this.b.length,this.p(this.b,!1),this.b.set(this.b.subarray(-32768)),this.b.set(e.subarray(n),32768),this.s.z=e.length-n+32768,this.s.i=32766,this.s.w=32768}else this.b.set(e,this.s.z),this.s.z+=e.length;this.s.l=1&t,(this.s.z>this.s.w+8191||t)&&(this.p(this.b,t||!1),this.s.w=this.s.i,this.s.i-=2)},e.prototype.flush=function(){this.ondata||err(5),this.s.l&&err(4),this.p(this.b,!1),this.s.w=this.s.i,this.s.i-=2},e}(),Deflate_1=browser$1.Deflate=Deflate,AsyncDeflate=function(e,t){astrmify([bDflt,function(){return[astrm,Deflate]}],this,StrmOpt.call(this,e,t),(function(e){var t=new Deflate(e.data);onmessage=astrm(t)}),6,1)},AsyncDeflate_1=browser$1.AsyncDeflate=AsyncDeflate;function deflate$2(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err(7),cbify(e,t,[bDflt],(function(e){return pbf(deflateSync(e.data[0],e.data[1]))}),0,i)}var deflate_1=browser$1.deflate=deflate$2;function deflateSync(e,t){return dopt(e,t||{},0,0)}var deflateSync_1=browser$1.deflateSync=deflateSync,Inflate=function(){function e(e,t){"function"==typeof e&&(t=e,e={}),this.ondata=t;var i=e&&e.dictionary&&e.dictionary.subarray(-32768);this.s={i:0,b:i?i.length:0},this.o=new u8(32768),this.p=new u8(0),i&&this.o.set(i)}return e.prototype.e=function(e){if(this.ondata||err(5),this.d&&err(4),this.p.length){if(e.length){var t=new u8(this.p.length+e.length);t.set(this.p),t.set(e,this.p.length),this.p=t}}else this.p=e},e.prototype.c=function(e){this.s.i=+(this.d=e||!1);var t=this.s.b,i=inflt(this.p,this.s,this.o);this.ondata(slc(i,t,this.s.b),this.d),this.o=slc(i,this.s.b-32768),this.s.b=this.o.length,this.p=slc(this.p,this.s.p/8|0),this.s.p&=7},e.prototype.push=function(e,t){this.e(e),this.c(t)},e}(),Inflate_1=browser$1.Inflate=Inflate,AsyncInflate=function(e,t){astrmify([bInflt,function(){return[astrm,Inflate]}],this,StrmOpt.call(this,e,t),(function(e){var t=new Inflate(e.data);onmessage=astrm(t)}),7,0)},AsyncInflate_1=browser$1.AsyncInflate=AsyncInflate;function inflate$2(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err(7),cbify(e,t,[bInflt],(function(e){return pbf(inflateSync(e.data[0],gopt(e.data[1])))}),1,i)}var inflate_1=browser$1.inflate=inflate$2;function inflateSync(e,t){return inflt(e,{i:2},t&&t.out,t&&t.dictionary)}var inflateSync_1=browser$1.inflateSync=inflateSync,Gzip=function(){function e(e,t){this.c=crc(),this.l=0,this.v=1,Deflate.call(this,e,t)}return e.prototype.push=function(e,t){this.c.p(e),this.l+=e.length,Deflate.prototype.push.call(this,e,t)},e.prototype.p=function(e,t){var i=dopt(e,this.o,this.v&&gzhl(this.o),t&&8,this.s);this.v&&(gzh(i,this.o),this.v=0),t&&(wbytes(i,i.length-8,this.c.d()),wbytes(i,i.length-4,this.l)),this.ondata(i,t)},e.prototype.flush=function(){Deflate.prototype.flush.call(this)},e}(),Gzip_1=browser$1.Gzip=Gzip,Compress=browser$1.Compress=Gzip,AsyncGzip=function(e,t){astrmify([bDflt,gze,function(){return[astrm,Deflate,Gzip]}],this,StrmOpt.call(this,e,t),(function(e){var t=new Gzip(e.data);onmessage=astrm(t)}),8,1)},AsyncGzip_1=browser$1.AsyncGzip=AsyncGzip,AsyncCompress=browser$1.AsyncCompress=AsyncGzip;function gzip(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err(7),cbify(e,t,[bDflt,gze,function(){return[gzipSync]}],(function(e){return pbf(gzipSync(e.data[0],e.data[1]))}),2,i)}var gzip_1=browser$1.gzip=gzip,compress=browser$1.compress=gzip;function gzipSync(e,t){t||(t={});var i=crc(),r=e.length;i.p(e);var n=dopt(e,t,gzhl(t),8),a=n.length;return gzh(n,t),wbytes(n,a-8,i.d()),wbytes(n,a-4,r),n}var gzipSync_1=browser$1.gzipSync=gzipSync,compressSync=browser$1.compressSync=gzipSync,Gunzip=function(){function e(e,t){this.v=1,this.r=0,Inflate.call(this,e,t)}return e.prototype.push=function(e,t){if(Inflate.prototype.e.call(this,e),this.r+=e.length,this.v){var i=this.p.subarray(this.v-1),r=i.length>3?gzs(i):4;if(r>i.length){if(!t)return}else this.v>1&&this.onmember&&this.onmember(this.r-i.length);this.p=i.subarray(r),this.v=0}Inflate.prototype.c.call(this,t),this.s.f&&!this.s.l&&!t&&(this.v=shft(this.s.p)+9,this.s={i:0},this.o=new u8(0),this.push(new u8(0),t))},e}(),Gunzip_1=browser$1.Gunzip=Gunzip,AsyncGunzip=function(e,t){var i=this;astrmify([bInflt,guze,function(){return[astrm,Inflate,Gunzip]}],this,StrmOpt.call(this,e,t),(function(e){var t=new Gunzip(e.data);t.onmember=function(e){return postMessage(e)},onmessage=astrm(t)}),9,0,(function(e){return i.onmember&&i.onmember(e)}))},AsyncGunzip_1=browser$1.AsyncGunzip=AsyncGunzip;function gunzip(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err(7),cbify(e,t,[bInflt,guze,function(){return[gunzipSync]}],(function(e){return pbf(gunzipSync(e.data[0],e.data[1]))}),3,i)}var gunzip_1=browser$1.gunzip=gunzip;function gunzipSync(e,t){var i=gzs(e);return i+8>e.length&&err(6,"invalid gzip data"),inflt(e.subarray(i,-8),{i:2},t&&t.out||new u8(gzl(e)),t&&t.dictionary)}var gunzipSync_1=browser$1.gunzipSync=gunzipSync,Zlib=function(){function e(e,t){this.c=adler(),this.v=1,Deflate.call(this,e,t)}return e.prototype.push=function(e,t){this.c.p(e),Deflate.prototype.push.call(this,e,t)},e.prototype.p=function(e,t){var i=dopt(e,this.o,this.v&&(this.o.dictionary?6:2),t&&4,this.s);this.v&&(zlh(i,this.o),this.v=0),t&&wbytes(i,i.length-4,this.c.d()),this.ondata(i,t)},e.prototype.flush=function(){Deflate.prototype.flush.call(this)},e}(),Zlib_1=browser$1.Zlib=Zlib,AsyncZlib=function(e,t){astrmify([bDflt,zle,function(){return[astrm,Deflate,Zlib]}],this,StrmOpt.call(this,e,t),(function(e){var t=new Zlib(e.data);onmessage=astrm(t)}),10,1)},AsyncZlib_1=browser$1.AsyncZlib=AsyncZlib;function zlib(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err(7),cbify(e,t,[bDflt,zle,function(){return[zlibSync]}],(function(e){return pbf(zlibSync(e.data[0],e.data[1]))}),4,i)}var zlib_1=browser$1.zlib=zlib;function zlibSync(e,t){t||(t={});var i=adler();i.p(e);var r=dopt(e,t,t.dictionary?6:2,4);return zlh(r,t),wbytes(r,r.length-4,i.d()),r}var zlibSync_1=browser$1.zlibSync=zlibSync,Unzlib=function(){function e(e,t){Inflate.call(this,e,t),this.v=e&&e.dictionary?2:1}return e.prototype.push=function(e,t){if(Inflate.prototype.e.call(this,e),this.v){if(this.p.length<6&&!t)return;this.p=this.p.subarray(zls(this.p,this.v-1)),this.v=0}t&&(this.p.length<4&&err(6,"invalid zlib data"),this.p=this.p.subarray(0,-4)),Inflate.prototype.c.call(this,t)},e}(),Unzlib_1=browser$1.Unzlib=Unzlib,AsyncUnzlib=function(e,t){astrmify([bInflt,zule,function(){return[astrm,Inflate,Unzlib]}],this,StrmOpt.call(this,e,t),(function(e){var t=new Unzlib(e.data);onmessage=astrm(t)}),11,0)},AsyncUnzlib_1=browser$1.AsyncUnzlib=AsyncUnzlib;function unzlib(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err(7),cbify(e,t,[bInflt,zule,function(){return[unzlibSync]}],(function(e){return pbf(unzlibSync(e.data[0],gopt(e.data[1])))}),5,i)}var unzlib_1=browser$1.unzlib=unzlib;function unzlibSync(e,t){return inflt(e.subarray(zls(e,t&&t.dictionary),-4),{i:2},t&&t.out,t&&t.dictionary)}var unzlibSync_1=browser$1.unzlibSync=unzlibSync,Decompress=function(){function e(e,t){this.o=StrmOpt.call(this,e,t)||{},this.G=Gunzip,this.I=Inflate,this.Z=Unzlib}return e.prototype.i=function(){var e=this;this.s.ondata=function(t,i){e.ondata(t,i)}},e.prototype.push=function(e,t){if(this.ondata||err(5),this.s)this.s.push(e,t);else{if(this.p&&this.p.length){var i=new u8(this.p.length+e.length);i.set(this.p),i.set(e,this.p.length)}else this.p=e;this.p.length>2&&(this.s=31==this.p[0]&&139==this.p[1]&&8==this.p[2]?new this.G(this.o):8!=(15&this.p[0])||this.p[0]>>4>7||(this.p[0]<<8|this.p[1])%31?new this.I(this.o):new this.Z(this.o),this.i(),this.s.push(this.p,t),this.p=null)}},e}(),Decompress_1=browser$1.Decompress=Decompress,AsyncDecompress=function(){function e(e,t){Decompress.call(this,e,t),this.queuedSize=0,this.G=AsyncGunzip,this.I=AsyncInflate,this.Z=AsyncUnzlib}return e.prototype.i=function(){var e=this;this.s.ondata=function(t,i,r){e.ondata(t,i,r)},this.s.ondrain=function(t){e.queuedSize-=t,e.ondrain&&e.ondrain(t)}},e.prototype.push=function(e,t){this.queuedSize+=e.length,Decompress.prototype.push.call(this,e,t)},e}(),AsyncDecompress_1=browser$1.AsyncDecompress=AsyncDecompress;function decompress(e,t,i){return i||(i=t,t={}),"function"!=typeof i&&err(7),31==e[0]&&139==e[1]&&8==e[2]?gunzip(e,t,i):8!=(15&e[0])||e[0]>>4>7||(e[0]<<8|e[1])%31?inflate$2(e,t,i):unzlib(e,t,i)}var decompress_1=browser$1.decompress=decompress;function decompressSync(e,t){return 31==e[0]&&139==e[1]&&8==e[2]?gunzipSync(e,t):8!=(15&e[0])||e[0]>>4>7||(e[0]<<8|e[1])%31?inflateSync(e,t):unzlibSync(e,t)}var decompressSync_1=browser$1.decompressSync=decompressSync,fltn=function(e,t,i,r){for(var n in e){var a=e[n],o=t+n,s=r;Array.isArray(a)&&(s=mrg(r,a[1]),a=a[0]),a instanceof u8?i[o]=[a,s]:(i[o+="/"]=[new u8(0),s],fltn(a,o,i,r))}},te=typeof TextEncoder<"u"&&new TextEncoder,td=typeof TextDecoder<"u"&&new TextDecoder,tds=0;try{td.decode(et,{stream:!0}),tds=1}catch(C){}var dutf8=function(e){for(var t="",i=0;;){var r=e[i++],n=(r>127)+(r>223)+(r>239);if(i+n>e.length)return{s:t,r:slc(e,i-1)};n?3==n?(r=((15&r)<<18|(63&e[i++])<<12|(63&e[i++])<<6|63&e[i++])-65536,t+=String.fromCharCode(55296|r>>10,56320|1023&r)):t+=1&n?String.fromCharCode((31&r)<<6|63&e[i++]):String.fromCharCode((15&r)<<12|(63&e[i++])<<6|63&e[i++]):t+=String.fromCharCode(r)}},DecodeUTF8=function(){function e(e){this.ondata=e,tds?this.t=new TextDecoder:this.p=et}return e.prototype.push=function(e,t){if(this.ondata||err(5),t=!!t,this.t)return this.ondata(this.t.decode(e,{stream:!0}),t),void(t&&(this.t.decode().length&&err(8),this.t=null));this.p||err(4);var i=new u8(this.p.length+e.length);i.set(this.p),i.set(e,this.p.length);var r=dutf8(i),n=r.s,a=r.r;t?(a.length&&err(8),this.p=null):this.p=a,this.ondata(n,t)},e}(),DecodeUTF8_1=browser$1.DecodeUTF8=DecodeUTF8,EncodeUTF8=function(){function e(e){this.ondata=e}return e.prototype.push=function(e,t){this.ondata||err(5),this.d&&err(4),this.ondata(strToU8(e),this.d=t||!1)},e}(),EncodeUTF8_1=browser$1.EncodeUTF8=EncodeUTF8;function strToU8(e,t){if(t){for(var i=new u8(e.length),r=0;r>1)),o=0,s=function(e){a[o++]=e};for(r=0;ra.length){var l=new u8(o+8+(n-r<<1));l.set(a),a=l}var c=e.charCodeAt(r);c<128||t?s(c):c<2048?(s(192|c>>6),s(128|63&c)):c>55295&&c<57344?(s(240|(c=65536+(1047552&c)|1023&e.charCodeAt(++r))>>18),s(128|c>>12&63),s(128|c>>6&63),s(128|63&c)):(s(224|c>>12),s(128|c>>6&63),s(128|63&c))}return slc(a,0,o)}var strToU8_1=browser$1.strToU8=strToU8;function strFromU8(e,t){if(t){for(var i="",r=0;r65535&&err(9),t+=r+4}return t},wzh=function(e,t,i,r,n,a,o,s){var l=r.length,c=i.extra,u=s&&s.length,f=exfl(c);wbytes(e,t,null!=o?33639248:67324752),t+=4,null!=o&&(e[t++]=20,e[t++]=i.os),e[t]=20,t+=2,e[t++]=i.flag<<1|(a<0&&8),e[t++]=n&&8,e[t++]=255&i.compression,e[t++]=i.compression>>8;var h=new Date(null==i.mtime?Date.now():i.mtime),d=h.getFullYear()-1980;if((d<0||d>119)&&err(10),wbytes(e,t,d<<25|h.getMonth()+1<<21|h.getDate()<<16|h.getHours()<<11|h.getMinutes()<<5|h.getSeconds()>>1),t+=4,-1!=a&&(wbytes(e,t,i.crc),wbytes(e,t+4,a<0?-a-2:a),wbytes(e,t+8,i.size)),wbytes(e,t+12,l),wbytes(e,t+14,f),t+=16,null!=o&&(wbytes(e,t,u),wbytes(e,t+6,i.attrs),wbytes(e,t+10,o),t+=14),e.set(r,t),t+=l,f)for(var m in c){var g=c[m],p=g.length;wbytes(e,t,+m),wbytes(e,t+2,p),e.set(g,t+4),t+=4+p}return u&&(e.set(s,t),t+=u),t},wzf=function(e,t,i,r,n){wbytes(e,t,101010256),wbytes(e,t+8,i),wbytes(e,t+10,i),wbytes(e,t+12,r),wbytes(e,t+16,n)},ZipPassThrough=function(){function e(e){this.filename=e,this.c=crc(),this.size=0,this.compression=0}return e.prototype.process=function(e,t){this.ondata(null,e,t)},e.prototype.push=function(e,t){this.ondata||err(5),this.c.p(e),this.size+=e.length,t&&(this.crc=this.c.d()),this.process(e,t||!1)},e}(),ZipPassThrough_1=browser$1.ZipPassThrough=ZipPassThrough,ZipDeflate=function(){function e(e,t){var i=this;t||(t={}),ZipPassThrough.call(this,e),this.d=new Deflate(t,(function(e,t){i.ondata(null,e,t)})),this.compression=8,this.flag=dbf(t.level)}return e.prototype.process=function(e,t){try{this.d.push(e,t)}catch(e){this.ondata(e,null,t)}},e.prototype.push=function(e,t){ZipPassThrough.prototype.push.call(this,e,t)},e}(),ZipDeflate_1=browser$1.ZipDeflate=ZipDeflate,AsyncZipDeflate=function(){function e(e,t){var i=this;t||(t={}),ZipPassThrough.call(this,e),this.d=new AsyncDeflate(t,(function(e,t,r){i.ondata(e,t,r)})),this.compression=8,this.flag=dbf(t.level),this.terminate=this.d.terminate}return e.prototype.process=function(e,t){this.d.push(e,t)},e.prototype.push=function(e,t){ZipPassThrough.prototype.push.call(this,e,t)},e}(),AsyncZipDeflate_1=browser$1.AsyncZipDeflate=AsyncZipDeflate,Zip=function(){function e(e){this.ondata=e,this.u=[],this.d=1}return e.prototype.add=function(e){var t=this;if(this.ondata||err(5),2&this.d)this.ondata(err(4+8*(1&this.d),0,1),null,!1);else{var i=strToU8(e.filename),r=i.length,n=e.comment,a=n&&strToU8(n),o=r!=e.filename.length||a&&n.length!=a.length,s=r+exfl(e.extra)+30;r>65535&&this.ondata(err(11,0,1),null,!1);var l=new u8(s);wzh(l,0,e,i,o,-1);var c=[l],u=function(){for(var e=0,i=c;e65535&&C(err(11,0,1),null),y)if(p<16e4)try{C(null,deflateSync(l,m))}catch(e){C(e,null)}else u.push(deflate$2(l,m,C));else C(null,l)},g=0;g65535&&err(11);var p=u?deflateSync(l,c):l,A=p.length,S=crc();S.p(l),r.push(mrg(c,{size:l.length,crc:S.d(),c:p,f:y,m:d,u:f!=o.length||d&&h.length!=m,o:n,compression:u})),n+=30+f+g+A,a+=76+2*(f+g)+(m||0)+A}for(var b=new u8(a+22),v=n,w=a-n,T=0;T0){var r=Math.min(this.c,e.length),n=e.subarray(0,r);if(this.c-=r,this.d?this.d.push(n,!this.c):this.k[0].push(n),(e=e.subarray(r)).length)return this.push(e,t)}else{var a=0,o=0,s=void 0,l=void 0;this.p.length?e.length?((l=new u8(this.p.length+e.length)).set(this.p),l.set(e,this.p.length)):l=this.p:l=e;for(var c=l.length,u=this.c,f=u&&this.d,h=function(){var e,t=b4(l,o);if(67324752==t){a=1,s=o,d.d=null,d.c=0;var r=b2(l,o+6),n=b2(l,o+8),f=2048&r,h=8&r,m=b2(l,o+26),g=b2(l,o+28);if(c>o+30+m+g){var p=[];d.k.unshift(p),a=2;var A=b4(l,o+18),S=b4(l,o+22),b=strFromU8(l.subarray(o+30,o+=30+m),!f);4294967295==A?(e=h?[-2]:z64e(l,o),A=e[0],S=e[1]):h&&(A=-1),o+=g,d.c=A;var v,w={name:b,compression:n,start:function(){if(w.ondata||err(5),A){var e=i.o[n];e||w.ondata(err(14,"unknown compression type "+n,1),null,!1),(v=A<0?new e(b):new e(b,A,S)).ondata=function(e,t,i){w.ondata(e,t,i)};for(var t=0,r=p;t=0&&(w.size=A,w.originalSize=S),d.onfile(w)}return"break"}if(u){if(134695760==t)return s=o+=12+(-2==u&&8),a=3,d.c=0,"break";if(33639248==t)return s=o-=4,a=3,d.c=0,"break"}},d=this;o65558)return o(err(13,0,1),null),n;var l=b2(e,s+8);if(l){var c=l,u=b4(e,s+16),f=4294967295==u||65535==c;if(f){var h=b4(e,s-12);(f=101075792==b4(e,h))&&(c=l=b4(e,h+32),u=b4(e,h+48))}for(var d=t&&t.filter,m=function(t){var i=zh(e,u,f),s=i[0],c=i[1],h=i[2],m=i[3],g=i[4],p=i[5],A=slzh(e,p);u=g;var S=function(e,t){e?(n(),o(e,null)):(t&&(a[m]=t),--l||o(null,a))};if(!d||d({name:m,size:c,originalSize:h,compression:s}))if(s)if(8==s){var b=e.subarray(A,A+c);if(h<524288||c>.8*h)try{S(null,inflateSync(b,{out:new u8(h)}))}catch(e){S(e,null)}else r.push(inflate$2(b,{size:h},S))}else S(err(14,"unknown compression type "+s,1),null);else S(null,slc(e,A,A+c));else S(null,null)},g=0;g65558)&&err(13);var n=b2(e,r+8);if(!n)return{};var a=b4(e,r+16),o=4294967295==a||65535==n;if(o){var s=b4(e,r-12);(o=101075792==b4(e,s))&&(n=b4(e,s+32),a=b4(e,s+48))}for(var l=t&&t.filter,c=0;c=0;n--)o=256*o+a[n];return o}static getExtensionsAt(t,i,r,n){let a=[],o=i;for(;on&&(i=!i,s=e.getIntAt(t,o,i),s+o>n))throw new Error("This does not appear to be a valid NIFTI extension");if(s%16!=0)throw new Error("This does not appear to be a NIFTI extension");let l=e.getIntAt(t,o+4,i),c=t.buffer.slice(o+8,o+s);console.log("extensionByteIndex: "+(o+8)+" esize: "+s),console.log(c);let u=new nifti_extension_1.NIFTIEXTENSION(s,l,c,i);a.push(u),o+=s}return a}static toArrayBuffer(e){var t,i,r;for(t=new ArrayBuffer(e.length),i=new Uint8Array(t),r=0;r>>1:e>>>1;t[i]=e}return t}static crc32(t){e.crcTable||(e.crcTable=e.makeCRCTable());const i=e.crcTable;let r=-1;for(var n=0;n>>8^i[255&(r^t.getUint8(n))];return~r>>>0}};g0(bt,"crcTable",null),g0(bt,"GUNZIP_MAGIC_COOKIE1",31),g0(bt,"GUNZIP_MAGIC_COOKIE2",139),g0(bt,"getByteAt",(function(e,t){return e.getInt8(t)})),g0(bt,"getShortAt",(function(e,t,i){return e.getInt16(t,i)}));let Utils=bt;Utils_1=utilities$2.Utils=Utils;const utilities$1=_mergeNamespaces({__proto__:null,get Utils(){return Utils_1},default:utilities$2},[utilities$2]),require$$3=getAugmentedNamespace(utilities$1);Object.defineProperty(nifti1$1,"__esModule",{value:!0});var NIFTI1_1=nifti1$1.NIFTI1=void 0;const utilities_1$1=require$$3,Ve=class e{constructor(){g0(this,"littleEndian",!1),g0(this,"dim_info",0),g0(this,"dims",[]),g0(this,"intent_p1",0),g0(this,"intent_p2",0),g0(this,"intent_p3",0),g0(this,"intent_code",0),g0(this,"datatypeCode",0),g0(this,"numBitsPerVoxel",0),g0(this,"slice_start",0),g0(this,"slice_end",0),g0(this,"slice_code",0),g0(this,"pixDims",[]),g0(this,"vox_offset",0),g0(this,"scl_slope",1),g0(this,"scl_inter",0),g0(this,"xyzt_units",0),g0(this,"cal_max",0),g0(this,"cal_min",0),g0(this,"slice_duration",0),g0(this,"toffset",0),g0(this,"description",""),g0(this,"aux_file",""),g0(this,"intent_name",""),g0(this,"qform_code",0),g0(this,"sform_code",0),g0(this,"quatern_a",0),g0(this,"quatern_b",0),g0(this,"quatern_c",0),g0(this,"quatern_d",0),g0(this,"qoffset_x",0),g0(this,"qoffset_y",0),g0(this,"qoffset_z",0),g0(this,"affine",[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]),g0(this,"qfac",1),g0(this,"quatern_R"),g0(this,"magic","0"),g0(this,"isHDR",!1),g0(this,"extensionFlag",[0,0,0,0]),g0(this,"extensionSize",0),g0(this,"extensionCode",0),g0(this,"extensions",[]),g0(this,"getDatatypeCodeString",(function(t){return t===e.TYPE_UINT8?"1-Byte Unsigned Integer":t===e.TYPE_INT16?"2-Byte Signed Integer":t===e.TYPE_INT32?"4-Byte Signed Integer":t===e.TYPE_FLOAT32?"4-Byte Float":t===e.TYPE_FLOAT64?"8-Byte Float":t===e.TYPE_RGB24?"RGB":t===e.TYPE_INT8?"1-Byte Signed Integer":t===e.TYPE_UINT16?"2-Byte Unsigned Integer":t===e.TYPE_UINT32?"4-Byte Unsigned Integer":t===e.TYPE_INT64?"8-Byte Signed Integer":t===e.TYPE_UINT64?"8-Byte Unsigned Integer":"Unknown"})),g0(this,"getTransformCodeString",(function(t){return t===e.XFORM_SCANNER_ANAT?"Scanner":t===e.XFORM_ALIGNED_ANAT?"Aligned":t===e.XFORM_TALAIRACH?"Talairach":t===e.XFORM_MNI_152?"MNI":"Unknown"})),g0(this,"getUnitsCodeString",(function(t){return t===e.UNITS_METER?"Meters":t===e.UNITS_MM?"Millimeters":t===e.UNITS_MICRON?"Microns":t===e.UNITS_SEC?"Seconds":t===e.UNITS_MSEC?"Milliseconds":t===e.UNITS_USEC?"Microseconds":t===e.UNITS_HZ?"Hz":t===e.UNITS_PPM?"PPM":t===e.UNITS_RADS?"Rads":"Unknown"})),g0(this,"nifti_mat33_mul",(function(e,t){var i,r,n=[[0,0,0],[0,0,0],[0,0,0]];for(i=0;i<3;i+=1)for(r=0;r<3;r+=1)n[i][r]=e[i][0]*t[0][r]+e[i][1]*t[1][r]+e[i][2]*t[2][r];return n})),g0(this,"nifti_mat33_determ",(function(e){var t,i,r,n,a,o,s,l,c;return t=e[0][0],i=e[0][1],r=e[0][2],n=e[1][0],a=e[1][1],o=e[1][2],s=e[2][0],l=e[2][1],t*a*(c=e[2][2])-t*l*o-n*i*c+n*l*r+s*i*o-s*a*r}))}readHeader(t){var i,r,n,a,o=new DataView(t),s=utilities_1$1.Utils.getIntAt(o,0,this.littleEndian);if(s!==e.MAGIC_COOKIE&&(this.littleEndian=!0,s=utilities_1$1.Utils.getIntAt(o,0,this.littleEndian)),s!==e.MAGIC_COOKIE)throw new Error("This does not appear to be a NIFTI file!");for(this.dim_info=utilities_1$1.Utils.getByteAt(o,39),i=0;i<8;i+=1)a=40+2*i,this.dims[i]=utilities_1$1.Utils.getShortAt(o,a,this.littleEndian);for(this.intent_p1=utilities_1$1.Utils.getFloatAt(o,56,this.littleEndian),this.intent_p2=utilities_1$1.Utils.getFloatAt(o,60,this.littleEndian),this.intent_p3=utilities_1$1.Utils.getFloatAt(o,64,this.littleEndian),this.intent_code=utilities_1$1.Utils.getShortAt(o,68,this.littleEndian),this.datatypeCode=utilities_1$1.Utils.getShortAt(o,70,this.littleEndian),this.numBitsPerVoxel=utilities_1$1.Utils.getShortAt(o,72,this.littleEndian),this.slice_start=utilities_1$1.Utils.getShortAt(o,74,this.littleEndian),i=0;i<8;i+=1)a=76+4*i,this.pixDims[i]=utilities_1$1.Utils.getFloatAt(o,a,this.littleEndian);if(this.vox_offset=utilities_1$1.Utils.getFloatAt(o,108,this.littleEndian),this.scl_slope=utilities_1$1.Utils.getFloatAt(o,112,this.littleEndian),this.scl_inter=utilities_1$1.Utils.getFloatAt(o,116,this.littleEndian),this.slice_end=utilities_1$1.Utils.getShortAt(o,120,this.littleEndian),this.slice_code=utilities_1$1.Utils.getByteAt(o,122),this.xyzt_units=utilities_1$1.Utils.getByteAt(o,123),this.cal_max=utilities_1$1.Utils.getFloatAt(o,124,this.littleEndian),this.cal_min=utilities_1$1.Utils.getFloatAt(o,128,this.littleEndian),this.slice_duration=utilities_1$1.Utils.getFloatAt(o,132,this.littleEndian),this.toffset=utilities_1$1.Utils.getFloatAt(o,136,this.littleEndian),this.description=utilities_1$1.Utils.getStringAt(o,148,228),this.aux_file=utilities_1$1.Utils.getStringAt(o,228,252),this.qform_code=utilities_1$1.Utils.getShortAt(o,252,this.littleEndian),this.sform_code=utilities_1$1.Utils.getShortAt(o,254,this.littleEndian),this.quatern_b=utilities_1$1.Utils.getFloatAt(o,256,this.littleEndian),this.quatern_c=utilities_1$1.Utils.getFloatAt(o,260,this.littleEndian),this.quatern_d=utilities_1$1.Utils.getFloatAt(o,264,this.littleEndian),this.quatern_a=Math.sqrt(1-(Math.pow(this.quatern_b,2)+Math.pow(this.quatern_c,2)+Math.pow(this.quatern_d,2))),this.qoffset_x=utilities_1$1.Utils.getFloatAt(o,268,this.littleEndian),this.qoffset_y=utilities_1$1.Utils.getFloatAt(o,272,this.littleEndian),this.qoffset_z=utilities_1$1.Utils.getFloatAt(o,276,this.littleEndian),this.qform_code<1&&this.sform_code<1&&(this.affine[0][0]=this.pixDims[1],this.affine[1][1]=this.pixDims[2],this.affine[2][2]=this.pixDims[3]),this.qform_code>0&&this.sform_code0)for(r=0;r<3;r+=1)for(n=0;n<4;n+=1)a=280+4*(4*r+n),this.affine[r][n]=utilities_1$1.Utils.getFloatAt(o,a,this.littleEndian);if(this.affine[3][0]=0,this.affine[3][1]=0,this.affine[3][2]=0,this.affine[3][3]=1,this.intent_name=utilities_1$1.Utils.getStringAt(o,328,344),this.magic=utilities_1$1.Utils.getStringAt(o,344,348),this.isHDR=this.magic===String.fromCharCode.apply(null,e.MAGIC_NUMBER2),o.byteLength>e.MAGIC_COOKIE){this.extensionFlag[0]=utilities_1$1.Utils.getByteAt(o,348),this.extensionFlag[1]=utilities_1$1.Utils.getByteAt(o,349),this.extensionFlag[2]=utilities_1$1.Utils.getByteAt(o,350),this.extensionFlag[3]=utilities_1$1.Utils.getByteAt(o,351);let e=!0;!this.isHDR&&this.vox_offset<=352&&(e=!1),o.byteLength<=368&&(e=!1),e&&this.extensionFlag[0]&&(this.extensions=utilities_1$1.Utils.getExtensionsAt(o,this.getExtensionLocation(),this.littleEndian,this.vox_offset),this.extensionSize=this.extensions[0].esize,this.extensionCode=this.extensions[0].ecode)}}toFormattedString(){var t=utilities_1$1.Utils.formatNumber,i="";return i+="Dim Info = "+this.dim_info+"\n",i+="Image Dimensions (1-8): "+this.dims[0]+", "+this.dims[1]+", "+this.dims[2]+", "+this.dims[3]+", "+this.dims[4]+", "+this.dims[5]+", "+this.dims[6]+", "+this.dims[7]+"\n",i+="Intent Parameters (1-3): "+this.intent_p1+", "+this.intent_p2+", "+this.intent_p3+"\n",i+="Intent Code = "+this.intent_code+"\n",i+="Datatype = "+this.datatypeCode+" ("+this.getDatatypeCodeString(this.datatypeCode)+")\n",i+="Bits Per Voxel = "+this.numBitsPerVoxel+"\n",i+="Slice Start = "+this.slice_start+"\n",i+="Voxel Dimensions (1-8): "+t(this.pixDims[0])+", "+t(this.pixDims[1])+", "+t(this.pixDims[2])+", "+t(this.pixDims[3])+", "+t(this.pixDims[4])+", "+t(this.pixDims[5])+", "+t(this.pixDims[6])+", "+t(this.pixDims[7])+"\n",i+="Image Offset = "+this.vox_offset+"\n",i+="Data Scale: Slope = "+t(this.scl_slope)+" Intercept = "+t(this.scl_inter)+"\n",i+="Slice End = "+this.slice_end+"\n",i+="Slice Code = "+this.slice_code+"\n",i+="Units Code = "+this.xyzt_units+" ("+this.getUnitsCodeString(e.SPATIAL_UNITS_MASK&this.xyzt_units)+", "+this.getUnitsCodeString(e.TEMPORAL_UNITS_MASK&this.xyzt_units)+")\n",i+="Display Range: Max = "+t(this.cal_max)+" Min = "+t(this.cal_min)+"\n",i+="Slice Duration = "+this.slice_duration+"\n",i+="Time Axis Shift = "+this.toffset+"\n",i+='Description: "'+this.description+'"\n',i+='Auxiliary File: "'+this.aux_file+'"\n',i+="Q-Form Code = "+this.qform_code+" ("+this.getTransformCodeString(this.qform_code)+")\n",i+="S-Form Code = "+this.sform_code+" ("+this.getTransformCodeString(this.sform_code)+")\n",i+="Quaternion Parameters: b = "+t(this.quatern_b)+" c = "+t(this.quatern_c)+" d = "+t(this.quatern_d)+"\n",i+="Quaternion Offsets: x = "+this.qoffset_x+" y = "+this.qoffset_y+" z = "+this.qoffset_z+"\n",i+="S-Form Parameters X: "+t(this.affine[0][0])+", "+t(this.affine[0][1])+", "+t(this.affine[0][2])+", "+t(this.affine[0][3])+"\n",i+="S-Form Parameters Y: "+t(this.affine[1][0])+", "+t(this.affine[1][1])+", "+t(this.affine[1][2])+", "+t(this.affine[1][3])+"\n",i+="S-Form Parameters Z: "+t(this.affine[2][0])+", "+t(this.affine[2][1])+", "+t(this.affine[2][2])+", "+t(this.affine[2][3])+"\n",i+='Intent Name: "'+this.intent_name+'"\n',this.extensionFlag[0]&&(i+="Extension: Size = "+this.extensionSize+" Code = "+this.extensionCode+"\n"),i}getQformMat(){return this.convertNiftiQFormToNiftiSForm(this.quatern_b,this.quatern_c,this.quatern_d,this.qoffset_x,this.qoffset_y,this.qoffset_z,this.pixDims[1],this.pixDims[2],this.pixDims[3],this.pixDims[0])}convertNiftiQFormToNiftiSForm(e,t,i,r,n,a,o,s,l,c){var u,f,h,d,m=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],g=e,p=t,A=i;return m[3][0]=m[3][1]=m[3][2]=0,m[3][3]=1,(u=1-(g*g+p*p+A*A))<1e-7?(g*=u=1/Math.sqrt(g*g+p*p+A*A),p*=u,A*=u,u=0):u=Math.sqrt(u),f=o>0?o:1,h=s>0?s:1,d=l>0?l:1,c<0&&(d=-d),m[0][0]=(u*u+g*g-p*p-A*A)*f,m[0][1]=2*(g*p-u*A)*h,m[0][2]=2*(g*A+u*p)*d,m[1][0]=2*(g*p+u*A)*f,m[1][1]=(u*u+p*p-g*g-A*A)*h,m[1][2]=2*(p*A-u*g)*d,m[2][0]=2*(g*A-u*p)*f,m[2][1]=2*(p*A+u*g)*h,m[2][2]=(u*u+A*A-p*p-g*g)*d,m[0][3]=r,m[1][3]=n,m[2][3]=a,m}convertNiftiSFormToNEMA(e){var t,i,r,n,a,o,s,l,c,u,f,h,d,m,g,p,A,S,b,v,w,T,y,C,I,D,x,E,M,k,R,F,P;if(m=0,D=[[0,0,0],[0,0,0],[0,0,0]],x=[[0,0,0],[0,0,0],[0,0,0]],t=e[0][0],i=e[0][1],r=e[0][2],n=e[1][0],a=e[1][1],o=e[1][2],s=e[2][0],l=e[2][1],c=e[2][2],0===(u=Math.sqrt(t*t+n*n+s*s))||(t/=u,n/=u,s/=u,0===(u=Math.sqrt(i*i+a*a+l*l))))return null;if(u=t*(i/=u)+n*(a/=u)+s*(l/=u),Math.abs(u)>1e-4){if(i-=u*t,a-=u*n,l-=u*s,0===(u=Math.sqrt(i*i+a*a+l*l)))return null;i/=u,a/=u,l/=u}if(0===(u=Math.sqrt(r*r+o*o+c*c))?(r=n*l-s*a,o=s*i-l*t,c=t*a-n*i):(r/=u,o/=u,c/=u),u=t*r+n*o+s*c,Math.abs(u)>1e-4){if(r-=u*t,o-=u*n,c-=u*s,0===(u=Math.sqrt(r*r+o*o+c*c)))return null;r/=u,o/=u,c/=u}if(u=i*r+a*o+l*c,Math.abs(u)>1e-4){if(r-=u*i,o-=u*a,c-=u*l,0===(u=Math.sqrt(r*r+o*o+c*c)))return null;r/=u,o/=u,c/=u}if(D[0][0]=t,D[0][1]=i,D[0][2]=r,D[1][0]=n,D[1][1]=a,D[1][2]=o,D[2][0]=s,D[2][1]=l,D[2][2]=c,0===(f=this.nifti_mat33_determ(D)))return null;for(I=-666,S=w=T=y=1,b=2,v=3,h=1;h<=3;h+=1)for(d=1;d<=3;d+=1)if(h!==d)for(m=1;m<=3;m+=1)if(h!==m&&d!==m)for(x[0][0]=x[0][1]=x[0][2]=x[1][0]=x[1][1]=x[1][2]=x[2][0]=x[2][1]=x[2][2]=0,g=-1;g<=1;g+=2)for(p=-1;p<=1;p+=2)for(A=-1;A<=1;A+=2)x[0][h-1]=g,x[1][d-1]=p,x[2][m-1]=A,this.nifti_mat33_determ(x)*f>0&&((u=(C=this.nifti_mat33_mul(x,D))[0][0]+C[1][1]+C[2][2])>I&&(I=u,S=h,b=d,v=m,w=g,T=p,y=A));switch(E=M=k=R=F=P="",S*w){case 1:E="X",R="+";break;case-1:E="X",R="-";break;case 2:E="Y",R="+";break;case-2:E="Y",R="-";break;case 3:E="Z",R="+";break;case-3:E="Z",R="-"}switch(b*T){case 1:M="X",F="+";break;case-1:M="X",F="-";break;case 2:M="Y",F="+";break;case-2:M="Y",F="-";break;case 3:M="Z",F="+";break;case-3:M="Z",F="-"}switch(v*y){case 1:k="X",P="+";break;case-1:k="X",P="-";break;case 2:k="Y",P="+";break;case-2:k="Y",P="-";break;case 3:k="Z",P="+";break;case-3:k="Z",P="-"}return E+M+k+R+F+P}getExtensionLocation(){return e.MAGIC_COOKIE+4}getExtensionSize(e){return utilities_1$1.Utils.getIntAt(e,this.getExtensionLocation(),this.littleEndian)}getExtensionCode(e){return utilities_1$1.Utils.getIntAt(e,this.getExtensionLocation()+4,this.littleEndian)}addExtension(e,t=-1){-1==t?this.extensions.push(e):this.extensions.splice(t,0,e),this.vox_offset+=e.esize}removeExtension(e){let t=this.extensions[e];t&&(this.vox_offset-=t.esize),this.extensions.splice(e,1)}toArrayBuffer(e=!1){let t=352;if(e)for(let e of this.extensions)t+=e.esize;let i=new Uint8Array(t),r=new DataView(i.buffer);r.setInt32(0,348,this.littleEndian),r.setUint8(39,this.dim_info);for(let e=0;e<8;e++)r.setUint16(40+2*e,this.dims[e],this.littleEndian);r.setFloat32(56,this.intent_p1,this.littleEndian),r.setFloat32(60,this.intent_p2,this.littleEndian),r.setFloat32(64,this.intent_p3,this.littleEndian),r.setInt16(68,this.intent_code,this.littleEndian),r.setInt16(70,this.datatypeCode,this.littleEndian),r.setInt16(72,this.numBitsPerVoxel,this.littleEndian),r.setInt16(74,this.slice_start,this.littleEndian);for(let e=0;e<8;e++)r.setFloat32(76+4*e,this.pixDims[e],this.littleEndian);r.setFloat32(108,this.vox_offset,this.littleEndian),r.setFloat32(112,this.scl_slope,this.littleEndian),r.setFloat32(116,this.scl_inter,this.littleEndian),r.setInt16(120,this.slice_end,this.littleEndian),r.setUint8(122,this.slice_code),r.setUint8(123,this.xyzt_units),r.setFloat32(124,this.cal_max,this.littleEndian),r.setFloat32(128,this.cal_min,this.littleEndian),r.setFloat32(132,this.slice_duration,this.littleEndian),r.setFloat32(136,this.toffset,this.littleEndian),i.set(Buffer.from(this.description),148),i.set(Buffer.from(this.aux_file),228),r.setInt16(252,this.qform_code,this.littleEndian),r.setInt16(254,this.sform_code,this.littleEndian),r.setFloat32(256,this.quatern_b,this.littleEndian),r.setFloat32(260,this.quatern_c,this.littleEndian),r.setFloat32(264,this.quatern_d,this.littleEndian),r.setFloat32(268,this.qoffset_x,this.littleEndian),r.setFloat32(272,this.qoffset_y,this.littleEndian),r.setFloat32(276,this.qoffset_z,this.littleEndian);const n=this.affine.flat();for(let e=0;e<12;e++)r.setFloat32(280+4*e,n[e],this.littleEndian);if(i.set(Buffer.from(this.intent_name),328),i.set(Buffer.from(this.magic),344),e){i.set(Uint8Array.from([1,0,0,0]),348);let e=this.getExtensionLocation();for(const t of this.extensions)r.setInt32(e,t.esize,t.littleEndian),r.setInt32(e+4,t.ecode,t.littleEndian),i.set(new Uint8Array(t.edata),e+8),e+=t.esize}else i.set(new Uint8Array(4).fill(0),348);return i.buffer}};g0(Ve,"TYPE_NONE",0),g0(Ve,"TYPE_BINARY",1),g0(Ve,"TYPE_UINT8",2),g0(Ve,"TYPE_INT16",4),g0(Ve,"TYPE_INT32",8),g0(Ve,"TYPE_FLOAT32",16),g0(Ve,"TYPE_COMPLEX64",32),g0(Ve,"TYPE_FLOAT64",64),g0(Ve,"TYPE_RGB24",128),g0(Ve,"TYPE_INT8",256),g0(Ve,"TYPE_UINT16",512),g0(Ve,"TYPE_UINT32",768),g0(Ve,"TYPE_INT64",1024),g0(Ve,"TYPE_UINT64",1280),g0(Ve,"TYPE_FLOAT128",1536),g0(Ve,"TYPE_COMPLEX128",1792),g0(Ve,"TYPE_COMPLEX256",2048),g0(Ve,"XFORM_UNKNOWN",0),g0(Ve,"XFORM_SCANNER_ANAT",1),g0(Ve,"XFORM_ALIGNED_ANAT",2),g0(Ve,"XFORM_TALAIRACH",3),g0(Ve,"XFORM_MNI_152",4),g0(Ve,"SPATIAL_UNITS_MASK",7),g0(Ve,"TEMPORAL_UNITS_MASK",56),g0(Ve,"UNITS_UNKNOWN",0),g0(Ve,"UNITS_METER",1),g0(Ve,"UNITS_MM",2),g0(Ve,"UNITS_MICRON",3),g0(Ve,"UNITS_SEC",8),g0(Ve,"UNITS_MSEC",16),g0(Ve,"UNITS_USEC",24),g0(Ve,"UNITS_HZ",32),g0(Ve,"UNITS_PPM",40),g0(Ve,"UNITS_RADS",48),g0(Ve,"MAGIC_COOKIE",348),g0(Ve,"STANDARD_HEADER_SIZE",348),g0(Ve,"MAGIC_NUMBER_LOCATION",344),g0(Ve,"MAGIC_NUMBER",[110,43,49]),g0(Ve,"MAGIC_NUMBER2",[110,105,49]),g0(Ve,"EXTENSION_HEADER_SIZE",8);let NIFTI1=Ve;NIFTI1_1=nifti1$1.NIFTI1=NIFTI1;const nifti1=_mergeNamespaces({__proto__:null,get NIFTI1(){return NIFTI1_1},default:nifti1$1},[nifti1$1]),require$$1$1=getAugmentedNamespace(nifti1);var nifti2$1={};Object.defineProperty(nifti2$1,"__esModule",{value:!0});var NIFTI2_1=nifti2$1.NIFTI2=void 0;const nifti1_1=require$$1$1,utilities_1=require$$3,di=class e{constructor(){g0(this,"littleEndian",!1),g0(this,"dim_info",0),g0(this,"dims",[]),g0(this,"intent_p1",0),g0(this,"intent_p2",0),g0(this,"intent_p3",0),g0(this,"intent_code",0),g0(this,"datatypeCode",0),g0(this,"numBitsPerVoxel",0),g0(this,"slice_start",0),g0(this,"slice_end",0),g0(this,"slice_code",0),g0(this,"pixDims",[]),g0(this,"vox_offset",0),g0(this,"scl_slope",1),g0(this,"scl_inter",0),g0(this,"xyzt_units",0),g0(this,"cal_max",0),g0(this,"cal_min",0),g0(this,"slice_duration",0),g0(this,"toffset",0),g0(this,"description",""),g0(this,"aux_file",""),g0(this,"intent_name",""),g0(this,"qform_code",0),g0(this,"sform_code",0),g0(this,"quatern_b",0),g0(this,"quatern_c",0),g0(this,"quatern_d",0),g0(this,"qoffset_x",0),g0(this,"qoffset_y",0),g0(this,"qoffset_z",0),g0(this,"affine",[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]),g0(this,"magic","0"),g0(this,"extensionFlag",[0,0,0,0]),g0(this,"extensions",[]),g0(this,"extensionSize",0),g0(this,"extensionCode",0),g0(this,"getExtensionLocation",(function(){return e.MAGIC_COOKIE+4})),g0(this,"getExtensionSize",nifti1_1.NIFTI1.prototype.getExtensionSize),g0(this,"getExtensionCode",nifti1_1.NIFTI1.prototype.getExtensionCode),g0(this,"addExtension",nifti1_1.NIFTI1.prototype.addExtension),g0(this,"removeExtension",nifti1_1.NIFTI1.prototype.removeExtension),g0(this,"getDatatypeCodeString",nifti1_1.NIFTI1.prototype.getDatatypeCodeString),g0(this,"getTransformCodeString",nifti1_1.NIFTI1.prototype.getTransformCodeString),g0(this,"getUnitsCodeString",nifti1_1.NIFTI1.prototype.getUnitsCodeString),g0(this,"getQformMat",nifti1_1.NIFTI1.prototype.getQformMat),g0(this,"convertNiftiQFormToNiftiSForm",nifti1_1.NIFTI1.prototype.convertNiftiQFormToNiftiSForm),g0(this,"convertNiftiSFormToNEMA",nifti1_1.NIFTI1.prototype.convertNiftiSFormToNEMA),g0(this,"nifti_mat33_mul",nifti1_1.NIFTI1.prototype.nifti_mat33_mul),g0(this,"nifti_mat33_determ",nifti1_1.NIFTI1.prototype.nifti_mat33_determ)}readHeader(t){var i,r,n,a,o=new DataView(t),s=utilities_1.Utils.getIntAt(o,0,this.littleEndian);if(s!==e.MAGIC_COOKIE&&(this.littleEndian=!0,s=utilities_1.Utils.getIntAt(o,0,this.littleEndian)),s!==e.MAGIC_COOKIE)throw new Error("This does not appear to be a NIFTI file!");for(this.magic=utilities_1.Utils.getStringAt(o,4,12),this.datatypeCode=utilities_1.Utils.getShortAt(o,12,this.littleEndian),this.numBitsPerVoxel=utilities_1.Utils.getShortAt(o,14,this.littleEndian),i=0;i<8;i+=1)a=16+8*i,this.dims[i]=utilities_1.Utils.getLongAt(o,a,this.littleEndian);for(this.intent_p1=utilities_1.Utils.getDoubleAt(o,80,this.littleEndian),this.intent_p2=utilities_1.Utils.getDoubleAt(o,88,this.littleEndian),this.intent_p3=utilities_1.Utils.getDoubleAt(o,96,this.littleEndian),i=0;i<8;i+=1)a=104+8*i,this.pixDims[i]=utilities_1.Utils.getDoubleAt(o,a,this.littleEndian);for(this.vox_offset=utilities_1.Utils.getLongAt(o,168,this.littleEndian),this.scl_slope=utilities_1.Utils.getDoubleAt(o,176,this.littleEndian),this.scl_inter=utilities_1.Utils.getDoubleAt(o,184,this.littleEndian),this.cal_max=utilities_1.Utils.getDoubleAt(o,192,this.littleEndian),this.cal_min=utilities_1.Utils.getDoubleAt(o,200,this.littleEndian),this.slice_duration=utilities_1.Utils.getDoubleAt(o,208,this.littleEndian),this.toffset=utilities_1.Utils.getDoubleAt(o,216,this.littleEndian),this.slice_start=utilities_1.Utils.getLongAt(o,224,this.littleEndian),this.slice_end=utilities_1.Utils.getLongAt(o,232,this.littleEndian),this.description=utilities_1.Utils.getStringAt(o,240,320),this.aux_file=utilities_1.Utils.getStringAt(o,320,344),this.qform_code=utilities_1.Utils.getIntAt(o,344,this.littleEndian),this.sform_code=utilities_1.Utils.getIntAt(o,348,this.littleEndian),this.quatern_b=utilities_1.Utils.getDoubleAt(o,352,this.littleEndian),this.quatern_c=utilities_1.Utils.getDoubleAt(o,360,this.littleEndian),this.quatern_d=utilities_1.Utils.getDoubleAt(o,368,this.littleEndian),this.qoffset_x=utilities_1.Utils.getDoubleAt(o,376,this.littleEndian),this.qoffset_y=utilities_1.Utils.getDoubleAt(o,384,this.littleEndian),this.qoffset_z=utilities_1.Utils.getDoubleAt(o,392,this.littleEndian),r=0;r<3;r+=1)for(n=0;n<4;n+=1)a=400+8*(4*r+n),this.affine[r][n]=utilities_1.Utils.getDoubleAt(o,a,this.littleEndian);this.affine[3][0]=0,this.affine[3][1]=0,this.affine[3][2]=0,this.affine[3][3]=1,this.slice_code=utilities_1.Utils.getIntAt(o,496,this.littleEndian),this.xyzt_units=utilities_1.Utils.getIntAt(o,500,this.littleEndian),this.intent_code=utilities_1.Utils.getIntAt(o,504,this.littleEndian),this.intent_name=utilities_1.Utils.getStringAt(o,508,524),this.dim_info=utilities_1.Utils.getByteAt(o,524),o.byteLength>e.MAGIC_COOKIE&&(this.extensionFlag[0]=utilities_1.Utils.getByteAt(o,540),this.extensionFlag[1]=utilities_1.Utils.getByteAt(o,541),this.extensionFlag[2]=utilities_1.Utils.getByteAt(o,542),this.extensionFlag[3]=utilities_1.Utils.getByteAt(o,543),this.extensionFlag[0]&&(this.extensions=utilities_1.Utils.getExtensionsAt(o,this.getExtensionLocation(),this.littleEndian,this.vox_offset),this.extensionSize=this.extensions[0].esize,this.extensionCode=this.extensions[0].ecode))}toFormattedString(){var e=utilities_1.Utils.formatNumber,t="";return t+="Datatype = "+ +this.datatypeCode+" ("+this.getDatatypeCodeString(this.datatypeCode)+")\n",t+="Bits Per Voxel = = "+this.numBitsPerVoxel+"\n",t+="Image Dimensions (1-8): "+this.dims[0]+", "+this.dims[1]+", "+this.dims[2]+", "+this.dims[3]+", "+this.dims[4]+", "+this.dims[5]+", "+this.dims[6]+", "+this.dims[7]+"\n",t+="Intent Parameters (1-3): "+this.intent_p1+", "+this.intent_p2+", "+this.intent_p3+"\n",t+="Voxel Dimensions (1-8): "+e(this.pixDims[0])+", "+e(this.pixDims[1])+", "+e(this.pixDims[2])+", "+e(this.pixDims[3])+", "+e(this.pixDims[4])+", "+e(this.pixDims[5])+", "+e(this.pixDims[6])+", "+e(this.pixDims[7])+"\n",t+="Image Offset = "+this.vox_offset+"\n",t+="Data Scale: Slope = "+e(this.scl_slope)+" Intercept = "+e(this.scl_inter)+"\n",t+="Display Range: Max = "+e(this.cal_max)+" Min = "+e(this.cal_min)+"\n",t+="Slice Duration = "+this.slice_duration+"\n",t+="Time Axis Shift = "+this.toffset+"\n",t+="Slice Start = "+this.slice_start+"\n",t+="Slice End = "+this.slice_end+"\n",t+='Description: "'+this.description+'"\n',t+='Auxiliary File: "'+this.aux_file+'"\n',t+="Q-Form Code = "+this.qform_code+" ("+this.getTransformCodeString(this.qform_code)+")\n",t+="S-Form Code = "+this.sform_code+" ("+this.getTransformCodeString(this.sform_code)+")\n",t+="Quaternion Parameters: b = "+e(this.quatern_b)+" c = "+e(this.quatern_c)+" d = "+e(this.quatern_d)+"\n",t+="Quaternion Offsets: x = "+this.qoffset_x+" y = "+this.qoffset_y+" z = "+this.qoffset_z+"\n",t+="S-Form Parameters X: "+e(this.affine[0][0])+", "+e(this.affine[0][1])+", "+e(this.affine[0][2])+", "+e(this.affine[0][3])+"\n",t+="S-Form Parameters Y: "+e(this.affine[1][0])+", "+e(this.affine[1][1])+", "+e(this.affine[1][2])+", "+e(this.affine[1][3])+"\n",t+="S-Form Parameters Z: "+e(this.affine[2][0])+", "+e(this.affine[2][1])+", "+e(this.affine[2][2])+", "+e(this.affine[2][3])+"\n",t+="Slice Code = "+this.slice_code+"\n",t+="Units Code = "+this.xyzt_units+" ("+this.getUnitsCodeString(nifti1_1.NIFTI1.SPATIAL_UNITS_MASK&this.xyzt_units)+", "+this.getUnitsCodeString(nifti1_1.NIFTI1.TEMPORAL_UNITS_MASK&this.xyzt_units)+")\n",t+="Intent Code = "+this.intent_code+"\n",t+='Intent Name: "'+this.intent_name+'"\n',t+="Dim Info = "+this.dim_info+"\n"}toArrayBuffer(e=!1){let t=544;if(e)for(let e of this.extensions)t+=e.esize;let i=new Uint8Array(t),r=new DataView(i.buffer);r.setInt32(0,540,this.littleEndian),i.set(Buffer.from(this.magic),4),r.setInt16(12,this.datatypeCode,this.littleEndian),r.setInt16(14,this.numBitsPerVoxel,this.littleEndian);for(let e=0;e<8;e++)r.setBigInt64(16+8*e,BigInt(this.dims[e]),this.littleEndian);r.setFloat64(80,this.intent_p1,this.littleEndian),r.setFloat64(88,this.intent_p2,this.littleEndian),r.setFloat64(96,this.intent_p3,this.littleEndian);for(let e=0;e<8;e++)r.setFloat64(104+8*e,this.pixDims[e],this.littleEndian);r.setBigInt64(168,BigInt(this.vox_offset),this.littleEndian),r.setFloat64(176,this.scl_slope,this.littleEndian),r.setFloat64(184,this.scl_inter,this.littleEndian),r.setFloat64(192,this.cal_max,this.littleEndian),r.setFloat64(200,this.cal_min,this.littleEndian),r.setFloat64(208,this.slice_duration,this.littleEndian),r.setFloat64(216,this.toffset,this.littleEndian),r.setBigInt64(224,BigInt(this.slice_start),this.littleEndian),r.setBigInt64(232,BigInt(this.slice_end),this.littleEndian),i.set(Buffer.from(this.description),240),i.set(Buffer.from(this.aux_file),320),r.setInt32(344,this.qform_code,this.littleEndian),r.setInt32(348,this.sform_code,this.littleEndian),r.setFloat64(352,this.quatern_b,this.littleEndian),r.setFloat64(360,this.quatern_c,this.littleEndian),r.setFloat64(368,this.quatern_d,this.littleEndian),r.setFloat64(376,this.qoffset_x,this.littleEndian),r.setFloat64(384,this.qoffset_y,this.littleEndian),r.setFloat64(392,this.qoffset_z,this.littleEndian);const n=this.affine.flat();for(let e=0;e<12;e++)r.setFloat64(400+8*e,n[e],this.littleEndian);if(r.setInt32(496,this.slice_code,this.littleEndian),r.setInt32(500,this.xyzt_units,this.littleEndian),r.setInt32(504,this.intent_code,this.littleEndian),i.set(Buffer.from(this.intent_name),508),r.setUint8(524,this.dim_info),e){i.set(Uint8Array.from([1,0,0,0]),540);let e=this.getExtensionLocation();for(const t of this.extensions)r.setInt32(e,t.esize,t.littleEndian),r.setInt32(e+4,t.ecode,t.littleEndian),i.set(new Uint8Array(t.edata),e+8),e+=t.esize}else i.set(new Uint8Array(4).fill(0),540);return i.buffer}};g0(di,"MAGIC_COOKIE",540),g0(di,"MAGIC_NUMBER_LOCATION",4),g0(di,"MAGIC_NUMBER",[110,43,50,0,13,10,26,10]),g0(di,"MAGIC_NUMBER2",[110,105,50,0,13,10,26,10]);let NIFTI2=di;NIFTI2_1=nifti2$1.NIFTI2=NIFTI2;const nifti2=_mergeNamespaces({__proto__:null,get NIFTI2(){return NIFTI2_1},default:nifti2$1},[nifti2$1]),require$$2=getAugmentedNamespace(nifti2);function commonjsRequire(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}!function(e){var t=commonjsGlobal&&commonjsGlobal.__createBinding||(Object.create?function(e,t,i,r){void 0===r&&(r=i);var n=Object.getOwnPropertyDescriptor(t,i);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,r,n)}:function(e,t,i,r){void 0===r&&(r=i),e[r]=t[i]}),i=commonjsGlobal&&commonjsGlobal.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=commonjsGlobal&&commonjsGlobal.__importStar||function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&t(r,e,n);return i(r,e),r};Object.defineProperty(e,"__esModule",{value:!0}),e.readExtensionData=e.readExtension=e.readImage=e.hasExtension=e.readHeader=e.decompress=e.isCompressed=e.isNIFTI=e.isNIFTI2=e.isNIFTI1=e.NIFTIEXTENSION=e.Utils=e.NIFTI2=e.NIFTI1=void 0;const n=r(require$$0),a=require$$1$1,o=require$$2,s=require$$3;var l=require$$1$1;Object.defineProperty(e,"NIFTI1",{enumerable:!0,get:function(){return l.NIFTI1}});var c=require$$2;Object.defineProperty(e,"NIFTI2",{enumerable:!0,get:function(){return c.NIFTI2}});var u=require$$3;Object.defineProperty(e,"Utils",{enumerable:!0,get:function(){return u.Utils}});var f=require$$4;function h(e,t=!1){var i,r,n,o;return!(e.byteLength1)for(var n=Array.prototype.slice.call(arguments,1);r--;)i[e-1-r]=t.Utils.createArray.apply(this,n);return i},t.Utils.getStringAt=function(e,t,i,r,n){var a,o,s="";for(a=0;a0?parseInt(e,10):0},t.Utils.convertCamcelCaseToTitleCase=function(e){var i=e.replace(/([A-Z][a-z])/g," $1");return t.Utils.trim(i.charAt(0).toUpperCase()+i.slice(1))},t.Utils.safeParseFloat=function(e){return(e=t.Utils.stripLeadingZeros(e)).length>0?parseFloat(e):0},t.Utils.bytesToDouble=function(e){var t=(128&e[0])>>7,i=(127&e[0])<<4|(240&e[1])>>4;if(0==i)return 0;if(2047==i)return t?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY;var r=Math.pow(2,i-1023-52),n=e[7]+e[6]*Math.pow(2,8)+e[5]*Math.pow(2,16)+e[4]*Math.pow(2,24)+e[3]*Math.pow(2,32)+e[2]*Math.pow(2,40)+(15&e[1])*Math.pow(2,48)+Math.pow(2,52);return Math.pow(-1,t)*n*r},t.Utils.concatArrayBuffers=function(e,t){var i=new Uint8Array(e.byteLength+t.byteLength);return i.set(new Uint8Array(e),0),i.set(new Uint8Array(t),e.byteLength),i.buffer},t.Utils.concatArrayBuffers2=function(e){var t,i=0,r=0;for(t=0;t>8&65280|e>>24&255},t.Utils.swap16=function(e){return((255&e)<<8|e>>8&255)<<16>>16},t.Utils.makeCRCTable=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var r=0;r<8;r++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t},t.Utils.crc32=function(e){for(var i=t.Utils.crcTable||(t.Utils.crcTable=t.Utils.makeCRCTable()),r=-1,n=0;n>>8^i[255&(r^e.getUint8(n))];return~r>>>0},t.Utils.createBitMask=function(e,t,i){var r=4294967295;return r>>>=8*(4-e)+(8*e-t),i?1==e?r&=255:2==e?r&=65535:4==e?r&=4294967295:8==e&&(r=4294967295):r=4294967295,r},e.exports&&(e.exports=t.Utils)}(utilities)),utilities.exports}function requireDictionary(){return hasRequiredDictionary||(hasRequiredDictionary=1,function(e){var t=t||{};t.Dictionary=t.Dictionary||{},t.Utils=t.Utils||(typeof commonjsRequire<"u"?requireUtilities():null),t.Dictionary.dictPrivate={"0207":{"101F":["FE","ElscintDataScale"]}},t.Dictionary.dict={"0002":{"0001":["OB","FileMetaInformationVersion"],"0002":["UI","MediaStoredSOPClassUID"],"0003":["UI","MediaStoredSOPInstanceUID"],"0010":["UI","TransferSyntaxUID"],"0012":["UI","ImplementationClassUID"],"0013":["SH","ImplementationVersionName"],"0016":["AE","SourceApplicationEntityTitle"],"0100":["UI","PrivateInformationCreatorUID"],"0102":["OB","PrivateInformation"]},"0004":{1130:["CS","FilesetID"],1141:["CS","FilesetDescriptorFileFileID"],1142:["CS","FilesetDescriptorFileFormat"],1200:["UL","RootDirectoryEntitysFirstDirectoryRecordOffset"],1202:["UL","RootDirectoryEntitysLastDirectoryRecordOffset"],1212:["US","File-setConsistenceFlag"],1220:["SQ","DirectoryRecordSequence"],1400:["UL","NextDirectoryRecordOffset"],1410:["US","RecordInuseFlag"],1420:["UL","ReferencedLowerlevelDirectoryEntityOffset"],1430:["CS","DirectoryRecordType"],1432:["UI","PrivateRecordUID"],1500:["CS","ReferencedFileID"],1510:["UI","ReferencedSOPClassUIDInFile"],1511:["UI","ReferencedSOPInstanceUIDInFile"],1600:["UL","NumberOfReferences"]},"0008":{"0001":["UL","LengthToEnd"],"0005":["CS","SpecificCharacterSet"],"0006":["SQ","LanguageCodeSequence"],"0008":["CS","ImageType"],"0010":["SH","RecognitionCode"],"0012":["DA","InstanceCreationDate"],"0013":["TM","InstanceCreationTime"],"0014":["UI","InstanceCreatorUID"],"0016":["UI","SOPClassUID"],"0018":["UI","SOPInstanceUID"],"001A":["UI","RelatedGeneralSOPClassUID"],"001B":["UI","OriginalSpecializedSOPClassUID"],"0020":["DA","StudyDate"],"0021":["DA","SeriesDate"],"0022":["DA","AcquisitionDate"],"0023":["DA","ContentDate"],"0024":["DA","OverlayDate"],"0025":["DA","CurveDate"],"002A":["DT","AcquisitionDateTime"],"0030":["TM","StudyTime"],"0031":["TM","SeriesTime"],"0032":["TM","AcquisitionTime"],"0033":["TM","ContentTime"],"0034":["TM","OverlayTime"],"0035":["TM","CurveTime"],"0040":["US","DataSetType"],"0041":["LO","DataSetSubtype"],"0042":["CS","NuclearMedicineSeriesType"],"0050":["SH","AccessionNumber"],"0051":["SQ","IssuerOfAccessionNumberSequence"],"0052":["CS","QueryRetrieveLevel"],"0054":["AE","RetrieveAETitle"],"0056":["CS","InstanceAvailability"],"0058":["UI","FailedSOPInstanceUIDList"],"0060":["CS","Modality"],"0061":["CS","ModalitiesInStudy"],"0062":["UI","SOPClassesInStudy"],"0064":["CS","ConversionType"],"0068":["CS","PresentationIntentType"],"0070":["LO","Manufacturer"],"0080":["LO","InstitutionName"],"0081":["ST","InstitutionAddress"],"0082":["SQ","InstitutionCodeSequence"],"0090":["PN","ReferringPhysicianName"],"0092":["ST","ReferringPhysicianAddress"],"0094":["SH","ReferringPhysicianTelephoneNumbers"],"0096":["SQ","ReferringPhysicianIdentificationSequence"],"0100":["SH","CodeValue"],"0102":["SH","CodingSchemeDesignator"],"0103":["SH","CodingSchemeVersion"],"0104":["LO","CodeMeaning"],"0105":["CS","MappingResource"],"0106":["DT","ContextGroupVersion"],"0107":["DT","ContextGroupLocalVersion"],"010B":["CS","ContextGroupExtensionFlag"],"010C":["UI","CodingSchemeUID"],"010D":["UI","ContextGroupExtensionCreatorUID"],"010F":["CS","ContextIdentifier"],"0110":["SQ","CodingSchemeIdentificationSequence"],"0112":["LO","CodingSchemeRegistry"],"0114":["ST","CodingSchemeExternalID"],"0115":["ST","CodingSchemeName"],"0116":["ST","CodingSchemeResponsibleOrganization"],"0117":["UI","ContextUID"],"0201":["SH","TimezoneOffsetFromUTC"],1e3:["AE","NetworkID"],1010:["SH","StationName"],1030:["LO","StudyDescription"],1032:["SQ","ProcedureCodeSequence"],"103E":["LO","SeriesDescription"],"103F":["SQ","SeriesDescriptionCodeSequence"],1040:["LO","InstitutionalDepartmentName"],1048:["PN","PhysiciansOfRecord"],1049:["SQ","PhysiciansOfRecordIdentificationSequence"],1050:["PN","PerformingPhysicianName"],1052:["SQ","PerformingPhysicianIdentificationSequence"],1060:["PN","NameOfPhysiciansReadingStudy"],1062:["SQ","PhysiciansReadingStudyIdentificationSequence"],1070:["PN","OperatorsName"],1072:["SQ","OperatorIdentificationSequence"],1080:["LO","AdmittingDiagnosesDescription"],1084:["SQ","AdmittingDiagnosesCodeSequence"],1090:["LO","ManufacturerModelName"],1100:["SQ","ReferencedResultsSequence"],1110:["SQ","ReferencedStudySequence"],1111:["SQ","ReferencedPerformedProcedureStepSequence"],1115:["SQ","ReferencedSeriesSequence"],1120:["SQ","ReferencedPatientSequence"],1125:["SQ","ReferencedVisitSequence"],1130:["SQ","ReferencedOverlaySequence"],1134:["SQ","ReferencedStereometricInstanceSequence"],"113A":["SQ","ReferencedWaveformSequence"],1140:["SQ","ReferencedImageSequence"],1145:["SQ","ReferencedCurveSequence"],"114A":["SQ","ReferencedInstanceSequence"],"114B":["SQ","ReferencedRealWorldValueMappingInstanceSequence"],1150:["UI","ReferencedSOPClassUID"],1155:["UI","ReferencedSOPInstanceUID"],"115A":["UI","SOPClassesSupported"],1160:["IS","ReferencedFrameNumber"],1161:["UL","SimpleFrameList"],1162:["UL","CalculatedFrameList"],1163:["FD","TimeRange"],1164:["SQ","FrameExtractionSequence"],1167:["UI","MultiFrameSourceSOPInstanceUID"],1195:["UI","TransactionUID"],1197:["US","FailureReason"],1198:["SQ","FailedSOPSequence"],1199:["SQ","ReferencedSOPSequence"],1200:["SQ","StudiesContainingOtherReferencedInstancesSequence"],1250:["SQ","RelatedSeriesSequence"],2110:["CS","LossyImageCompressionRetired"],2111:["ST","DerivationDescription"],2112:["SQ","SourceImageSequence"],2120:["SH","StageName"],2122:["IS","StageNumber"],2124:["IS","NumberOfStages"],2127:["SH","ViewName"],2128:["IS","ViewNumber"],2129:["IS","NumberOfEventTimers"],"212A":["IS","NumberOfViewsInStage"],2130:["DS","EventElapsedTimes"],2132:["LO","EventTimerNames"],2133:["SQ","EventTimerSequence"],2134:["FD","EventTimeOffset"],2135:["SQ","EventCodeSequence"],2142:["IS","StartTrim"],2143:["IS","StopTrim"],2144:["IS","RecommendedDisplayFrameRate"],2200:["CS","TransducerPosition"],2204:["CS","TransducerOrientation"],2208:["CS","AnatomicStructure"],2218:["SQ","AnatomicRegionSequence"],2220:["SQ","AnatomicRegionModifierSequence"],2228:["SQ","PrimaryAnatomicStructureSequence"],2229:["SQ","AnatomicStructureSpaceOrRegionSequence"],2230:["SQ","PrimaryAnatomicStructureModifierSequence"],2240:["SQ","TransducerPositionSequence"],2242:["SQ","TransducerPositionModifierSequence"],2244:["SQ","TransducerOrientationSequence"],2246:["SQ","TransducerOrientationModifierSequence"],2251:["SQ","AnatomicStructureSpaceOrRegionCodeSequenceTrial"],2253:["SQ","AnatomicPortalOfEntranceCodeSequenceTrial"],2255:["SQ","AnatomicApproachDirectionCodeSequenceTrial"],2256:["ST","AnatomicPerspectiveDescriptionTrial"],2257:["SQ","AnatomicPerspectiveCodeSequenceTrial"],2258:["ST","AnatomicLocationOfExaminingInstrumentDescriptionTrial"],2259:["SQ","AnatomicLocationOfExaminingInstrumentCodeSequenceTrial"],"225A":["SQ","AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial"],"225C":["SQ","OnAxisBackgroundAnatomicStructureCodeSequenceTrial"],3001:["SQ","AlternateRepresentationSequence"],3010:["UI","IrradiationEventUID"],4e3:["LT","IdentifyingComments"],9007:["CS","FrameType"],9092:["SQ","ReferencedImageEvidenceSequence"],9121:["SQ","ReferencedRawDataSequence"],9123:["UI","CreatorVersionUID"],9124:["SQ","DerivationImageSequence"],9154:["SQ","SourceImageEvidenceSequence"],9205:["CS","PixelPresentation"],9206:["CS","VolumetricProperties"],9207:["CS","VolumeBasedCalculationTechnique"],9208:["CS","ComplexImageComponent"],9209:["CS","AcquisitionContrast"],9215:["SQ","DerivationCodeSequence"],9237:["SQ","ReferencedPresentationStateSequence"],9410:["SQ","ReferencedOtherPlaneSequence"],9458:["SQ","FrameDisplaySequence"],9459:["FL","RecommendedDisplayFrameRateInFloat"],9460:["CS","SkipFrameRangeFlag"]},"0010":{"0010":["PN","PatientName"],"0020":["LO","PatientID"],"0021":["LO","IssuerOfPatientID"],"0022":["CS","TypeOfPatientID"],"0024":["SQ","IssuerOfPatientIDQualifiersSequence"],"0030":["DA","PatientBirthDate"],"0032":["TM","PatientBirthTime"],"0040":["CS","PatientSex"],"0050":["SQ","PatientInsurancePlanCodeSequence"],"0101":["SQ","PatientPrimaryLanguageCodeSequence"],"0102":["SQ","PatientPrimaryLanguageModifierCodeSequence"],1e3:["LO","OtherPatientIDs"],1001:["PN","OtherPatientNames"],1002:["SQ","OtherPatientIDsSequence"],1005:["PN","PatientBirthName"],1010:["AS","PatientAge"],1020:["DS","PatientSize"],1021:["SQ","PatientSizeCodeSequence"],1030:["DS","PatientWeight"],1040:["LO","PatientAddress"],1050:["LO","InsurancePlanIdentification"],1060:["PN","PatientMotherBirthName"],1080:["LO","MilitaryRank"],1081:["LO","BranchOfService"],1090:["LO","MedicalRecordLocator"],2e3:["LO","MedicalAlerts"],2110:["LO","Allergies"],2150:["LO","CountryOfResidence"],2152:["LO","RegionOfResidence"],2154:["SH","PatientTelephoneNumbers"],2160:["SH","EthnicGroup"],2180:["SH","Occupation"],"21A0":["CS","SmokingStatus"],"21B0":["LT","AdditionalPatientHistory"],"21C0":["US","PregnancyStatus"],"21D0":["DA","LastMenstrualDate"],"21F0":["LO","PatientReligiousPreference"],2201:["LO","PatientSpeciesDescription"],2202:["SQ","PatientSpeciesCodeSequence"],2203:["CS","PatientSexNeutered"],2210:["CS","AnatomicalOrientationType"],2292:["LO","PatientBreedDescription"],2293:["SQ","PatientBreedCodeSequence"],2294:["SQ","BreedRegistrationSequence"],2295:["LO","BreedRegistrationNumber"],2296:["SQ","BreedRegistryCodeSequence"],2297:["PN","ResponsiblePerson"],2298:["CS","ResponsiblePersonRole"],2299:["LO","ResponsibleOrganization"],4e3:["LT","PatientComments"],9431:["FL","ExaminedBodyThickness"]},"0012":{"0010":["LO","ClinicalTrialSponsorName"],"0020":["LO","ClinicalTrialProtocolID"],"0021":["LO","ClinicalTrialProtocolName"],"0030":["LO","ClinicalTrialSiteID"],"0031":["LO","ClinicalTrialSiteName"],"0040":["LO","ClinicalTrialSubjectID"],"0042":["LO","ClinicalTrialSubjectReadingID"],"0050":["LO","ClinicalTrialTimePointID"],"0051":["ST","ClinicalTrialTimePointDescription"],"0060":["LO","ClinicalTrialCoordinatingCenterName"],"0062":["CS","PatientIdentityRemoved"],"0063":["LO","DeidentificationMethod"],"0064":["SQ","DeidentificationMethodCodeSequence"],"0071":["LO","ClinicalTrialSeriesID"],"0072":["LO","ClinicalTrialSeriesDescription"],"0081":["LO","ClinicalTrialProtocolEthicsCommitteeName"],"0082":["LO","ClinicalTrialProtocolEthicsCommitteeApprovalNumber"],"0083":["SQ","ConsentForClinicalTrialUseSequence"],"0084":["CS","DistributionType"],"0085":["CS","ConsentForDistributionFlag"]},"0014":{"0023":["ST","CADFileFormat"],"0024":["ST","ComponentReferenceSystem"],"0025":["ST","ComponentManufacturingProcedure"],"0028":["ST","ComponentManufacturer"],"0030":["DS","MaterialThickness"],"0032":["DS","MaterialPipeDiameter"],"0034":["DS","MaterialIsolationDiameter"],"0042":["ST","MaterialGrade"],"0044":["ST","MaterialPropertiesFileID"],"0045":["ST","MaterialPropertiesFileFormat"],"0046":["LT","MaterialNotes"],"0050":["CS","ComponentShape"],"0052":["CS","CurvatureType"],"0054":["DS","OuterDiameter"],"0056":["DS","InnerDiameter"],1010:["ST","ActualEnvironmentalConditions"],1020:["DA","ExpiryDate"],1040:["ST","EnvironmentalConditions"],2002:["SQ","EvaluatorSequence"],2004:["IS","EvaluatorNumber"],2006:["PN","EvaluatorName"],2008:["IS","EvaluationAttempt"],2012:["SQ","IndicationSequence"],2014:["IS","IndicationNumber "],2016:["SH","IndicationLabel"],2018:["ST","IndicationDescription"],"201A":["CS","IndicationType"],"201C":["CS","IndicationDisposition"],"201E":["SQ","IndicationROISequence"],2030:["SQ","IndicationPhysicalPropertySequence"],2032:["SH","PropertyLabel"],2202:["IS","CoordinateSystemNumberOfAxes "],2204:["SQ","CoordinateSystemAxesSequence"],2206:["ST","CoordinateSystemAxisDescription"],2208:["CS","CoordinateSystemDataSetMapping"],"220A":["IS","CoordinateSystemAxisNumber"],"220C":["CS","CoordinateSystemAxisType"],"220E":["CS","CoordinateSystemAxisUnits"],2210:["OB","CoordinateSystemAxisValues"],2220:["SQ","CoordinateSystemTransformSequence"],2222:["ST","TransformDescription"],2224:["IS","TransformNumberOfAxes"],2226:["IS","TransformOrderOfAxes"],2228:["CS","TransformedAxisUnits"],"222A":["DS","CoordinateSystemTransformRotationAndScaleMatrix"],"222C":["DS","CoordinateSystemTransformTranslationMatrix"],3011:["DS","InternalDetectorFrameTime"],3012:["DS","NumberOfFramesIntegrated"],3020:["SQ","DetectorTemperatureSequence"],3022:["DS","SensorName"],3024:["DS","HorizontalOffsetOfSensor"],3026:["DS","VerticalOffsetOfSensor"],3028:["DS","SensorTemperature"],3040:["SQ","DarkCurrentSequence"],3050:["OB","DarkCurrentCounts"],3060:["SQ","GainCorrectionReferenceSequence"],3070:["OB","AirCounts"],3071:["DS","KVUsedInGainCalibration"],3072:["DS","MAUsedInGainCalibration"],3073:["DS","NumberOfFramesUsedForIntegration"],3074:["LO","FilterMaterialUsedInGainCalibration"],3075:["DS","FilterThicknessUsedInGainCalibration"],3076:["DA","DateOfGainCalibration"],3077:["TM","TimeOfGainCalibration"],3080:["OB","BadPixelImage"],3099:["LT","CalibrationNotes"],4002:["SQ","PulserEquipmentSequence"],4004:["CS","PulserType"],4006:["LT","PulserNotes"],4008:["SQ","ReceiverEquipmentSequence"],"400A":["CS","AmplifierType"],"400C":["LT","ReceiverNotes"],"400E":["SQ","PreAmplifierEquipmentSequence"],"400F":["LT","PreAmplifierNotes"],4010:["SQ","TransmitTransducerSequence"],4011:["SQ","ReceiveTransducerSequence"],4012:["US","NumberOfElements"],4013:["CS","ElementShape"],4014:["DS","ElementDimensionA"],4015:["DS","ElementDimensionB"],4016:["DS","ElementPitch"],4017:["DS","MeasuredBeamDimensionA"],4018:["DS","MeasuredBeamDimensionB"],4019:["DS","LocationOfMeasuredBeamDiameter"],"401A":["DS","NominalFrequency"],"401B":["DS","MeasuredCenterFrequency"],"401C":["DS","MeasuredBandwidth"],4020:["SQ","PulserSettingsSequence"],4022:["DS","PulseWidth"],4024:["DS","ExcitationFrequency"],4026:["CS","ModulationType"],4028:["DS","Damping"],4030:["SQ","ReceiverSettingsSequence"],4031:["DS","AcquiredSoundpathLength"],4032:["CS","AcquisitionCompressionType"],4033:["IS","AcquisitionSampleSize"],4034:["DS","RectifierSmoothing"],4035:["SQ","DACSequence"],4036:["CS","DACType"],4038:["DS","DACGainPoints"],"403A":["DS","DACTimePoints"],"403C":["DS","DACAmplitude"],4040:["SQ","PreAmplifierSettingsSequence"],4050:["SQ","TransmitTransducerSettingsSequence"],4051:["SQ","ReceiveTransducerSettingsSequence"],4052:["DS","IncidentAngle"],4054:["ST","CouplingTechnique"],4056:["ST","CouplingMedium"],4057:["DS","CouplingVelocity"],4058:["DS","CrystalCenterLocationX"],4059:["DS","CrystalCenterLocationZ"],"405A":["DS","SoundPathLength"],"405C":["ST","DelayLawIdentifier"],4060:["SQ","GateSettingsSequence"],4062:["DS","GateThreshold"],4064:["DS","VelocityOfSound"],4070:["SQ","CalibrationSettingsSequence"],4072:["ST","CalibrationProcedure"],4074:["SH","ProcedureVersion"],4076:["DA","ProcedureCreationDate"],4078:["DA","ProcedureExpirationDate"],"407A":["DA","ProcedureLastModifiedDate"],"407C":["TM","CalibrationTime"],"407E":["DA","CalibrationDate"],5002:["IS","LINACEnergy"],5004:["IS","LINACOutput"]},"0018":{"0010":["LO","ContrastBolusAgent"],"0012":["SQ","ContrastBolusAgentSequence"],"0014":["SQ","ContrastBolusAdministrationRouteSequence"],"0015":["CS","BodyPartExamined"],"0020":["CS","ScanningSequence"],"0021":["CS","SequenceVariant"],"0022":["CS","ScanOptions"],"0023":["CS","MRAcquisitionType"],"0024":["SH","SequenceName"],"0025":["CS","AngioFlag"],"0026":["SQ","InterventionDrugInformationSequence"],"0027":["TM","InterventionDrugStopTime"],"0028":["DS","InterventionDrugDose"],"0029":["SQ","InterventionDrugCodeSequence"],"002A":["SQ","AdditionalDrugSequence"],"0030":["LO","Radionuclide"],"0031":["LO","Radiopharmaceutical"],"0032":["DS","EnergyWindowCenterline"],"0033":["DS","EnergyWindowTotalWidth"],"0034":["LO","InterventionDrugName"],"0035":["TM","InterventionDrugStartTime"],"0036":["SQ","InterventionSequence"],"0037":["CS","TherapyType"],"0038":["CS","InterventionStatus"],"0039":["CS","TherapyDescription"],"003A":["ST","InterventionDescription"],"0040":["IS","CineRate"],"0042":["CS","InitialCineRunState"],"0050":["DS","SliceThickness"],"0060":["DS","KVP"],"0070":["IS","CountsAccumulated"],"0071":["CS","AcquisitionTerminationCondition"],"0072":["DS","EffectiveDuration"],"0073":["CS","AcquisitionStartCondition"],"0074":["IS","AcquisitionStartConditionData"],"0075":["IS","AcquisitionTerminationConditionData"],"0080":["DS","RepetitionTime"],"0081":["DS","EchoTime"],"0082":["DS","InversionTime"],"0083":["DS","NumberOfAverages"],"0084":["DS","ImagingFrequency"],"0085":["SH","ImagedNucleus"],"0086":["IS","EchoNumbers"],"0087":["DS","MagneticFieldStrength"],"0088":["DS","SpacingBetweenSlices"],"0089":["IS","NumberOfPhaseEncodingSteps"],"0090":["DS","DataCollectionDiameter"],"0091":["IS","EchoTrainLength"],"0093":["DS","PercentSampling"],"0094":["DS","PercentPhaseFieldOfView"],"0095":["DS","PixelBandwidth"],1e3:["LO","DeviceSerialNumber"],1002:["UI","DeviceUID"],1003:["LO","DeviceID"],1004:["LO","PlateID"],1005:["LO","GeneratorID"],1006:["LO","GridID"],1007:["LO","CassetteID"],1008:["LO","GantryID"],1010:["LO","SecondaryCaptureDeviceID"],1011:["LO","HardcopyCreationDeviceID"],1012:["DA","DateOfSecondaryCapture"],1014:["TM","TimeOfSecondaryCapture"],1016:["LO","SecondaryCaptureDeviceManufacturer"],1017:["LO","HardcopyDeviceManufacturer"],1018:["LO","SecondaryCaptureDeviceManufacturerModelName"],1019:["LO","SecondaryCaptureDeviceSoftwareVersions"],"101A":["LO","HardcopyDeviceSoftwareVersion"],"101B":["LO","HardcopyDeviceManufacturerModelName"],1020:["LO","SoftwareVersions"],1022:["SH","VideoImageFormatAcquired"],1023:["LO","DigitalImageFormatAcquired"],1030:["LO","ProtocolName"],1040:["LO","ContrastBolusRoute"],1041:["DS","ContrastBolusVolume"],1042:["TM","ContrastBolusStartTime"],1043:["TM","ContrastBolusStopTime"],1044:["DS","ContrastBolusTotalDose"],1045:["IS","SyringeCounts"],1046:["DS","ContrastFlowRate"],1047:["DS","ContrastFlowDuration"],1048:["CS","ContrastBolusIngredient"],1049:["DS","ContrastBolusIngredientConcentration"],1050:["DS","SpatialResolution"],1060:["DS","TriggerTime"],1061:["LO","TriggerSourceOrType"],1062:["IS","NominalInterval"],1063:["DS","FrameTime"],1064:["LO","CardiacFramingType"],1065:["DS","FrameTimeVector"],1066:["DS","FrameDelay"],1067:["DS","ImageTriggerDelay"],1068:["DS","MultiplexGroupTimeOffset"],1069:["DS","TriggerTimeOffset"],"106A":["CS","SynchronizationTrigger"],"106C":["US","SynchronizationChannel"],"106E":["UL","TriggerSamplePosition"],1070:["LO","RadiopharmaceuticalRoute"],1071:["DS","RadiopharmaceuticalVolume"],1072:["TM","RadiopharmaceuticalStartTime"],1073:["TM","RadiopharmaceuticalStopTime"],1074:["DS","RadionuclideTotalDose"],1075:["DS","RadionuclideHalfLife"],1076:["DS","RadionuclidePositronFraction"],1077:["DS","RadiopharmaceuticalSpecificActivity"],1078:["DT","RadiopharmaceuticalStartDateTime"],1079:["DT","RadiopharmaceuticalStopDateTime"],1080:["CS","BeatRejectionFlag"],1081:["IS","LowRRValue"],1082:["IS","HighRRValue"],1083:["IS","IntervalsAcquired"],1084:["IS","IntervalsRejected"],1085:["LO","PVCRejection"],1086:["IS","SkipBeats"],1088:["IS","HeartRate"],1090:["IS","CardiacNumberOfImages"],1094:["IS","TriggerWindow"],1100:["DS","ReconstructionDiameter"],1110:["DS","DistanceSourceToDetector"],1111:["DS","DistanceSourceToPatient"],1114:["DS","EstimatedRadiographicMagnificationFactor"],1120:["DS","GantryDetectorTilt"],1121:["DS","GantryDetectorSlew"],1130:["DS","TableHeight"],1131:["DS","TableTraverse"],1134:["CS","TableMotion"],1135:["DS","TableVerticalIncrement"],1136:["DS","TableLateralIncrement"],1137:["DS","TableLongitudinalIncrement"],1138:["DS","TableAngle"],"113A":["CS","TableType"],1140:["CS","RotationDirection"],1141:["DS","AngularPosition"],1142:["DS","RadialPosition"],1143:["DS","ScanArc"],1144:["DS","AngularStep"],1145:["DS","CenterOfRotationOffset"],1146:["DS","RotationOffset"],1147:["CS","FieldOfViewShape"],1149:["IS","FieldOfViewDimensions"],1150:["IS","ExposureTime"],1151:["IS","XRayTubeCurrent"],1152:["IS","Exposure"],1153:["IS","ExposureInuAs"],1154:["DS","AveragePulseWidth"],1155:["CS","RadiationSetting"],1156:["CS","RectificationType"],"115A":["CS","RadiationMode"],"115E":["DS","ImageAndFluoroscopyAreaDoseProduct"],1160:["SH","FilterType"],1161:["LO","TypeOfFilters"],1162:["DS","IntensifierSize"],1164:["DS","ImagerPixelSpacing"],1166:["CS","Grid"],1170:["IS","GeneratorPower"],1180:["SH","CollimatorGridName"],1181:["CS","CollimatorType"],1182:["IS","FocalDistance"],1183:["DS","XFocusCenter"],1184:["DS","YFocusCenter"],1190:["DS","FocalSpots"],1191:["CS","AnodeTargetMaterial"],"11A0":["DS","BodyPartThickness"],"11A2":["DS","CompressionForce"],1200:["DA","DateOfLastCalibration"],1201:["TM","TimeOfLastCalibration"],1210:["SH","ConvolutionKernel"],1240:["IS","UpperLowerPixelValues"],1242:["IS","ActualFrameDuration"],1243:["IS","CountRate"],1244:["US","PreferredPlaybackSequencing"],1250:["SH","ReceiveCoilName"],1251:["SH","TransmitCoilName"],1260:["SH","PlateType"],1261:["LO","PhosphorType"],1300:["DS","ScanVelocity"],1301:["CS","WholeBodyTechnique"],1302:["IS","ScanLength"],1310:["US","AcquisitionMatrix"],1312:["CS","InPlanePhaseEncodingDirection"],1314:["DS","FlipAngle"],1315:["CS","VariableFlipAngleFlag"],1316:["DS","SAR"],1318:["DS","dBdt"],1400:["LO","AcquisitionDeviceProcessingDescription"],1401:["LO","AcquisitionDeviceProcessingCode"],1402:["CS","CassetteOrientation"],1403:["CS","CassetteSize"],1404:["US","ExposuresOnPlate"],1405:["IS","RelativeXRayExposure"],1411:["DS","ExposureIndex"],1412:["DS","TargetExposureIndex"],1413:["DS","DeviationIndex"],1450:["DS","ColumnAngulation"],1460:["DS","TomoLayerHeight"],1470:["DS","TomoAngle"],1480:["DS","TomoTime"],1490:["CS","TomoType"],1491:["CS","TomoClass"],1495:["IS","NumberOfTomosynthesisSourceImages"],1500:["CS","PositionerMotion"],1508:["CS","PositionerType"],1510:["DS","PositionerPrimaryAngle"],1511:["DS","PositionerSecondaryAngle"],1520:["DS","PositionerPrimaryAngleIncrement"],1521:["DS","PositionerSecondaryAngleIncrement"],1530:["DS","DetectorPrimaryAngle"],1531:["DS","DetectorSecondaryAngle"],1600:["CS","ShutterShape"],1602:["IS","ShutterLeftVerticalEdge"],1604:["IS","ShutterRightVerticalEdge"],1606:["IS","ShutterUpperHorizontalEdge"],1608:["IS","ShutterLowerHorizontalEdge"],1610:["IS","CenterOfCircularShutter"],1612:["IS","RadiusOfCircularShutter"],1620:["IS","VerticesOfThePolygonalShutter"],1622:["US","ShutterPresentationValue"],1623:["US","ShutterOverlayGroup"],1624:["US","ShutterPresentationColorCIELabValue"],1700:["CS","CollimatorShape"],1702:["IS","CollimatorLeftVerticalEdge"],1704:["IS","CollimatorRightVerticalEdge"],1706:["IS","CollimatorUpperHorizontalEdge"],1708:["IS","CollimatorLowerHorizontalEdge"],1710:["IS","CenterOfCircularCollimator"],1712:["IS","RadiusOfCircularCollimator"],1720:["IS","VerticesOfThePolygonalCollimator"],1800:["CS","AcquisitionTimeSynchronized"],1801:["SH","TimeSource"],1802:["CS","TimeDistributionProtocol"],1803:["LO","NTPSourceAddress"],2001:["IS","PageNumberVector"],2002:["SH","FrameLabelVector"],2003:["DS","FramePrimaryAngleVector"],2004:["DS","FrameSecondaryAngleVector"],2005:["DS","SliceLocationVector"],2006:["SH","DisplayWindowLabelVector"],2010:["DS","NominalScannedPixelSpacing"],2020:["CS","DigitizingDeviceTransportDirection"],2030:["DS","RotationOfScannedFilm"],3100:["CS","IVUSAcquisition"],3101:["DS","IVUSPullbackRate"],3102:["DS","IVUSGatedRate"],3103:["IS","IVUSPullbackStartFrameNumber"],3104:["IS","IVUSPullbackStopFrameNumber"],3105:["IS","LesionNumber"],4e3:["LT","AcquisitionComments"],5e3:["SH","OutputPower"],5010:["LO","TransducerData"],5012:["DS","FocusDepth"],5020:["LO","ProcessingFunction"],5021:["LO","PostprocessingFunction"],5022:["DS","MechanicalIndex"],5024:["DS","BoneThermalIndex"],5026:["DS","CranialThermalIndex"],5027:["DS","SoftTissueThermalIndex"],5028:["DS","SoftTissueFocusThermalIndex"],5029:["DS","SoftTissueSurfaceThermalIndex"],5030:["DS","DynamicRange"],5040:["DS","TotalGain"],5050:["IS","DepthOfScanField"],5100:["CS","PatientPosition"],5101:["CS","ViewPosition"],5104:["SQ","ProjectionEponymousNameCodeSequence"],5210:["DS","ImageTransformationMatrix"],5212:["DS","ImageTranslationVector"],6e3:["DS","Sensitivity"],6011:["SQ","SequenceOfUltrasoundRegions"],6012:["US","RegionSpatialFormat"],6014:["US","RegionDataType"],6016:["UL","RegionFlags"],6018:["UL","RegionLocationMinX0"],"601A":["UL","RegionLocationMinY0"],"601C":["UL","RegionLocationMaxX1"],"601E":["UL","RegionLocationMaxY1"],6020:["SL","ReferencePixelX0"],6022:["SL","ReferencePixelY0"],6024:["US","PhysicalUnitsXDirection"],6026:["US","PhysicalUnitsYDirection"],6028:["FD","ReferencePixelPhysicalValueX"],"602A":["FD","ReferencePixelPhysicalValueY"],"602C":["FD","PhysicalDeltaX"],"602E":["FD","PhysicalDeltaY"],6030:["UL","TransducerFrequency"],6031:["CS","TransducerType"],6032:["UL","PulseRepetitionFrequency"],6034:["FD","DopplerCorrectionAngle"],6036:["FD","SteeringAngle"],6038:["UL","DopplerSampleVolumeXPositionRetired"],6039:["SL","DopplerSampleVolumeXPosition"],"603A":["UL","DopplerSampleVolumeYPositionRetired"],"603B":["SL","DopplerSampleVolumeYPosition"],"603C":["UL","TMLinePositionX0Retired"],"603D":["SL","TMLinePositionX0"],"603E":["UL","TMLinePositionY0Retired"],"603F":["SL","TMLinePositionY0"],6040:["UL","TMLinePositionX1Retired"],6041:["SL","TMLinePositionX1"],6042:["UL","TMLinePositionY1Retired"],6043:["SL","TMLinePositionY1"],6044:["US","PixelComponentOrganization"],6046:["UL","PixelComponentMask"],6048:["UL","PixelComponentRangeStart"],"604A":["UL","PixelComponentRangeStop"],"604C":["US","PixelComponentPhysicalUnits"],"604E":["US","PixelComponentDataType"],6050:["UL","NumberOfTableBreakPoints"],6052:["UL","TableOfXBreakPoints"],6054:["FD","TableOfYBreakPoints"],6056:["UL","NumberOfTableEntries"],6058:["UL","TableOfPixelValues"],"605A":["FL","TableOfParameterValues"],6060:["FL","RWaveTimeVector"],7e3:["CS","DetectorConditionsNominalFlag"],7001:["DS","DetectorTemperature"],7004:["CS","DetectorType"],7005:["CS","DetectorConfiguration"],7006:["LT","DetectorDescription"],7008:["LT","DetectorMode"],"700A":["SH","DetectorID"],"700C":["DA","DateOfLastDetectorCalibration"],"700E":["TM","TimeOfLastDetectorCalibration"],7010:["IS","ExposuresOnDetectorSinceLastCalibration"],7011:["IS","ExposuresOnDetectorSinceManufactured"],7012:["DS","DetectorTimeSinceLastExposure"],7014:["DS","DetectorActiveTime"],7016:["DS","DetectorActivationOffsetFromExposure"],"701A":["DS","DetectorBinning"],7020:["DS","DetectorElementPhysicalSize"],7022:["DS","DetectorElementSpacing"],7024:["CS","DetectorActiveShape"],7026:["DS","DetectorActiveDimensions"],7028:["DS","DetectorActiveOrigin"],"702A":["LO","DetectorManufacturerName"],"702B":["LO","DetectorManufacturerModelName"],7030:["DS","FieldOfViewOrigin"],7032:["DS","FieldOfViewRotation"],7034:["CS","FieldOfViewHorizontalFlip"],7036:["FL","PixelDataAreaOriginRelativeToFOV"],7038:["FL","PixelDataAreaRotationAngleRelativeToFOV"],7040:["LT","GridAbsorbingMaterial"],7041:["LT","GridSpacingMaterial"],7042:["DS","GridThickness"],7044:["DS","GridPitch"],7046:["IS","GridAspectRatio"],7048:["DS","GridPeriod"],"704C":["DS","GridFocalDistance"],7050:["CS","FilterMaterial"],7052:["DS","FilterThicknessMinimum"],7054:["DS","FilterThicknessMaximum"],7056:["FL","FilterBeamPathLengthMinimum"],7058:["FL","FilterBeamPathLengthMaximum"],7060:["CS","ExposureControlMode"],7062:["LT","ExposureControlModeDescription"],7064:["CS","ExposureStatus"],7065:["DS","PhototimerSetting"],8150:["DS","ExposureTimeInuS"],8151:["DS","XRayTubeCurrentInuA"],9004:["CS","ContentQualification"],9005:["SH","PulseSequenceName"],9006:["SQ","MRImagingModifierSequence"],9008:["CS","EchoPulseSequence"],9009:["CS","InversionRecovery"],9010:["CS","FlowCompensation"],9011:["CS","MultipleSpinEcho"],9012:["CS","MultiPlanarExcitation"],9014:["CS","PhaseContrast"],9015:["CS","TimeOfFlightContrast"],9016:["CS","Spoiling"],9017:["CS","SteadyStatePulseSequence"],9018:["CS","EchoPlanarPulseSequence"],9019:["FD","TagAngleFirstAxis"],9020:["CS","MagnetizationTransfer"],9021:["CS","T2Preparation"],9022:["CS","BloodSignalNulling"],9024:["CS","SaturationRecovery"],9025:["CS","SpectrallySelectedSuppression"],9026:["CS","SpectrallySelectedExcitation"],9027:["CS","SpatialPresaturation"],9028:["CS","Tagging"],9029:["CS","OversamplingPhase"],9030:["FD","TagSpacingFirstDimension"],9032:["CS","GeometryOfKSpaceTraversal"],9033:["CS","SegmentedKSpaceTraversal"],9034:["CS","RectilinearPhaseEncodeReordering"],9035:["FD","TagThickness"],9036:["CS","PartialFourierDirection"],9037:["CS","CardiacSynchronizationTechnique"],9041:["LO","ReceiveCoilManufacturerName"],9042:["SQ","MRReceiveCoilSequence"],9043:["CS","ReceiveCoilType"],9044:["CS","QuadratureReceiveCoil"],9045:["SQ","MultiCoilDefinitionSequence"],9046:["LO","MultiCoilConfiguration"],9047:["SH","MultiCoilElementName"],9048:["CS","MultiCoilElementUsed"],9049:["SQ","MRTransmitCoilSequence"],9050:["LO","TransmitCoilManufacturerName"],9051:["CS","TransmitCoilType"],9052:["FD","SpectralWidth"],9053:["FD","ChemicalShiftReference"],9054:["CS","VolumeLocalizationTechnique"],9058:["US","MRAcquisitionFrequencyEncodingSteps"],9059:["CS","Decoupling"],9060:["CS","DecoupledNucleus"],9061:["FD","DecouplingFrequency"],9062:["CS","DecouplingMethod"],9063:["FD","DecouplingChemicalShiftReference"],9064:["CS","KSpaceFiltering"],9065:["CS","TimeDomainFiltering"],9066:["US","NumberOfZeroFills"],9067:["CS","BaselineCorrection"],9069:["FD","ParallelReductionFactorInPlane"],9070:["FD","CardiacRRIntervalSpecified"],9073:["FD","AcquisitionDuration"],9074:["DT","FrameAcquisitionDateTime"],9075:["CS","DiffusionDirectionality"],9076:["SQ","DiffusionGradientDirectionSequence"],9077:["CS","ParallelAcquisition"],9078:["CS","ParallelAcquisitionTechnique"],9079:["FD","InversionTimes"],9080:["ST","MetaboliteMapDescription"],9081:["CS","PartialFourier"],9082:["FD","EffectiveEchoTime"],9083:["SQ","MetaboliteMapCodeSequence"],9084:["SQ","ChemicalShiftSequence"],9085:["CS","CardiacSignalSource"],9087:["FD","DiffusionBValue"],9089:["FD","DiffusionGradientOrientation"],9090:["FD","VelocityEncodingDirection"],9091:["FD","VelocityEncodingMinimumValue"],9092:["SQ","VelocityEncodingAcquisitionSequence"],9093:["US","NumberOfKSpaceTrajectories"],9094:["CS","CoverageOfKSpace"],9095:["UL","SpectroscopyAcquisitionPhaseRows"],9096:["FD","ParallelReductionFactorInPlaneRetired"],9098:["FD","TransmitterFrequency"],9100:["CS","ResonantNucleus"],9101:["CS","FrequencyCorrection"],9103:["SQ","MRSpectroscopyFOVGeometrySequence"],9104:["FD","SlabThickness"],9105:["FD","SlabOrientation"],9106:["FD","MidSlabPosition"],9107:["SQ","MRSpatialSaturationSequence"],9112:["SQ","MRTimingAndRelatedParametersSequence"],9114:["SQ","MREchoSequence"],9115:["SQ","MRModifierSequence"],9117:["SQ","MRDiffusionSequence"],9118:["SQ","CardiacSynchronizationSequence"],9119:["SQ","MRAveragesSequence"],9125:["SQ","MRFOVGeometrySequence"],9126:["SQ","VolumeLocalizationSequence"],9127:["UL","SpectroscopyAcquisitionDataColumns"],9147:["CS","DiffusionAnisotropyType"],9151:["DT","FrameReferenceDateTime"],9152:["SQ","MRMetaboliteMapSequence"],9155:["FD","ParallelReductionFactorOutOfPlane"],9159:["UL","SpectroscopyAcquisitionOutOfPlanePhaseSteps"],9166:["CS","BulkMotionStatus"],9168:["FD","ParallelReductionFactorSecondInPlane"],9169:["CS","CardiacBeatRejectionTechnique"],9170:["CS","RespiratoryMotionCompensationTechnique"],9171:["CS","RespiratorySignalSource"],9172:["CS","BulkMotionCompensationTechnique"],9173:["CS","BulkMotionSignalSource"],9174:["CS","ApplicableSafetyStandardAgency"],9175:["LO","ApplicableSafetyStandardDescription"],9176:["SQ","OperatingModeSequence"],9177:["CS","OperatingModeType"],9178:["CS","OperatingMode"],9179:["CS","SpecificAbsorptionRateDefinition"],9180:["CS","GradientOutputType"],9181:["FD","SpecificAbsorptionRateValue"],9182:["FD","GradientOutput"],9183:["CS","FlowCompensationDirection"],9184:["FD","TaggingDelay"],9185:["ST","RespiratoryMotionCompensationTechniqueDescription"],9186:["SH","RespiratorySignalSourceID"],9195:["FD","ChemicalShiftMinimumIntegrationLimitInHz"],9196:["FD","ChemicalShiftMaximumIntegrationLimitInHz"],9197:["SQ","MRVelocityEncodingSequence"],9198:["CS","FirstOrderPhaseCorrection"],9199:["CS","WaterReferencedPhaseCorrection"],9200:["CS","MRSpectroscopyAcquisitionType"],9214:["CS","RespiratoryCyclePosition"],9217:["FD","VelocityEncodingMaximumValue"],9218:["FD","TagSpacingSecondDimension"],9219:["SS","TagAngleSecondAxis"],9220:["FD","FrameAcquisitionDuration"],9226:["SQ","MRImageFrameTypeSequence"],9227:["SQ","MRSpectroscopyFrameTypeSequence"],9231:["US","MRAcquisitionPhaseEncodingStepsInPlane"],9232:["US","MRAcquisitionPhaseEncodingStepsOutOfPlane"],9234:["UL","SpectroscopyAcquisitionPhaseColumns"],9236:["CS","CardiacCyclePosition"],9239:["SQ","SpecificAbsorptionRateSequence"],9240:["US","RFEchoTrainLength"],9241:["US","GradientEchoTrainLength"],9250:["CS","ArterialSpinLabelingContrast"],9251:["SQ","MRArterialSpinLabelingSequence"],9252:["LO","ASLTechniqueDescription"],9253:["US","ASLSlabNumber"],9254:["FD ","ASLSlabThickness"],9255:["FD ","ASLSlabOrientation"],9256:["FD ","ASLMidSlabPosition"],9257:["CS","ASLContext"],9258:["UL","ASLPulseTrainDuration"],9259:["CS","ASLCrusherFlag"],"925A":["FD","ASLCrusherFlow"],"925B":["LO","ASLCrusherDescription"],"925C":["CS","ASLBolusCutoffFlag"],"925D":["SQ","ASLBolusCutoffTimingSequence"],"925E":["LO","ASLBolusCutoffTechnique"],"925F":["UL","ASLBolusCutoffDelayTime"],9260:["SQ","ASLSlabSequence"],9295:["FD","ChemicalShiftMinimumIntegrationLimitInppm"],9296:["FD","ChemicalShiftMaximumIntegrationLimitInppm"],9301:["SQ","CTAcquisitionTypeSequence"],9302:["CS","AcquisitionType"],9303:["FD","TubeAngle"],9304:["SQ","CTAcquisitionDetailsSequence"],9305:["FD","RevolutionTime"],9306:["FD","SingleCollimationWidth"],9307:["FD","TotalCollimationWidth"],9308:["SQ","CTTableDynamicsSequence"],9309:["FD","TableSpeed"],9310:["FD","TableFeedPerRotation"],9311:["FD","SpiralPitchFactor"],9312:["SQ","CTGeometrySequence"],9313:["FD","DataCollectionCenterPatient"],9314:["SQ","CTReconstructionSequence"],9315:["CS","ReconstructionAlgorithm"],9316:["CS","ConvolutionKernelGroup"],9317:["FD","ReconstructionFieldOfView"],9318:["FD","ReconstructionTargetCenterPatient"],9319:["FD","ReconstructionAngle"],9320:["SH","ImageFilter"],9321:["SQ","CTExposureSequence"],9322:["FD","ReconstructionPixelSpacing"],9323:["CS","ExposureModulationType"],9324:["FD","EstimatedDoseSaving"],9325:["SQ","CTXRayDetailsSequence"],9326:["SQ","CTPositionSequence"],9327:["FD","TablePosition"],9328:["FD","ExposureTimeInms"],9329:["SQ","CTImageFrameTypeSequence"],9330:["FD","XRayTubeCurrentInmA"],9332:["FD","ExposureInmAs"],9333:["CS","ConstantVolumeFlag"],9334:["CS","FluoroscopyFlag"],9335:["FD","DistanceSourceToDataCollectionCenter"],9337:["US","ContrastBolusAgentNumber"],9338:["SQ","ContrastBolusIngredientCodeSequence"],9340:["SQ","ContrastAdministrationProfileSequence"],9341:["SQ","ContrastBolusUsageSequence"],9342:["CS","ContrastBolusAgentAdministered"],9343:["CS","ContrastBolusAgentDetected"],9344:["CS","ContrastBolusAgentPhase"],9345:["FD","CTDIvol"],9346:["SQ","CTDIPhantomTypeCodeSequence"],9351:["FL","CalciumScoringMassFactorPatient"],9352:["FL","CalciumScoringMassFactorDevice"],9353:["FL","EnergyWeightingFactor"],9360:["SQ","CTAdditionalXRaySourceSequence"],9401:["SQ","ProjectionPixelCalibrationSequence"],9402:["FL","DistanceSourceToIsocenter"],9403:["FL","DistanceObjectToTableTop"],9404:["FL","ObjectPixelSpacingInCenterOfBeam"],9405:["SQ","PositionerPositionSequence"],9406:["SQ","TablePositionSequence"],9407:["SQ","CollimatorShapeSequence"],9410:["CS","PlanesInAcquisition"],9412:["SQ","XAXRFFrameCharacteristicsSequence"],9417:["SQ","FrameAcquisitionSequence"],9420:["CS","XRayReceptorType"],9423:["LO","AcquisitionProtocolName"],9424:["LT","AcquisitionProtocolDescription"],9425:["CS","ContrastBolusIngredientOpaque"],9426:["FL","DistanceReceptorPlaneToDetectorHousing"],9427:["CS","IntensifierActiveShape"],9428:["FL","IntensifierActiveDimensions"],9429:["FL","PhysicalDetectorSize"],9430:["FL","PositionOfIsocenterProjection"],9432:["SQ","FieldOfViewSequence"],9433:["LO","FieldOfViewDescription"],9434:["SQ","ExposureControlSensingRegionsSequence"],9435:["CS","ExposureControlSensingRegionShape"],9436:["SS","ExposureControlSensingRegionLeftVerticalEdge"],9437:["SS","ExposureControlSensingRegionRightVerticalEdge"],9438:["SS","ExposureControlSensingRegionUpperHorizontalEdge"],9439:["SS","ExposureControlSensingRegionLowerHorizontalEdge"],9440:["SS","CenterOfCircularExposureControlSensingRegion"],9441:["US","RadiusOfCircularExposureControlSensingRegion"],9442:["SS","VerticesOfThePolygonalExposureControlSensingRegion"],9447:["FL","ColumnAngulationPatient"],9449:["FL","BeamAngle"],9451:["SQ","FrameDetectorParametersSequence"],9452:["FL","CalculatedAnatomyThickness"],9455:["SQ","CalibrationSequence"],9456:["SQ","ObjectThicknessSequence"],9457:["CS","PlaneIdentification"],9461:["FL","FieldOfViewDimensionsInFloat"],9462:["SQ","IsocenterReferenceSystemSequence"],9463:["FL","PositionerIsocenterPrimaryAngle"],9464:["FL","PositionerIsocenterSecondaryAngle"],9465:["FL","PositionerIsocenterDetectorRotationAngle"],9466:["FL","TableXPositionToIsocenter"],9467:["FL","TableYPositionToIsocenter"],9468:["FL","TableZPositionToIsocenter"],9469:["FL","TableHorizontalRotationAngle"],9470:["FL","TableHeadTiltAngle"],9471:["FL","TableCradleTiltAngle"],9472:["SQ","FrameDisplayShutterSequence"],9473:["FL","AcquiredImageAreaDoseProduct"],9474:["CS","CArmPositionerTabletopRelationship"],9476:["SQ","XRayGeometrySequence"],9477:["SQ","IrradiationEventIdentificationSequence"],9504:["SQ","XRay3DFrameTypeSequence"],9506:["SQ","ContributingSourcesSequence"],9507:["SQ","XRay3DAcquisitionSequence"],9508:["FL","PrimaryPositionerScanArc"],9509:["FL","SecondaryPositionerScanArc"],9510:["FL ","PrimaryPositionerScanStartAngle"],9511:["FL","SecondaryPositionerScanStartAngle"],9514:["FL","PrimaryPositionerIncrement"],9515:["FL","SecondaryPositionerIncrement"],9516:["DT","StartAcquisitionDateTime"],9517:["DT","EndAcquisitionDateTime"],9524:["LO","ApplicationName"],9525:["LO","ApplicationVersion"],9526:["LO","ApplicationManufacturer"],9527:["CS","AlgorithmType"],9528:["LO","AlgorithmDescription"],9530:["SQ","XRay3DReconstructionSequence"],9531:["LO","ReconstructionDescription"],9538:["SQ","PerProjectionAcquisitionSequence"],9601:["SQ","DiffusionBMatrixSequence"],9602:["FD","DiffusionBValueXX"],9603:["FD","DiffusionBValueXY"],9604:["FD","DiffusionBValueXZ"],9605:["FD","DiffusionBValueYY"],9606:["FD","DiffusionBValueYZ"],9607:["FD","DiffusionBValueZZ"],9701:["DT","DecayCorrectionDateTime"],9715:["FD","StartDensityThreshold"],9716:["FD","StartRelativeDensityDifferenceThreshold"],9717:["FD","StartCardiacTriggerCountThreshold"],9718:["FD","StartRespiratoryTriggerCountThreshold"],9719:["FD","TerminationCountsThreshold"],9720:["FD","TerminationDensityThreshold"],9721:["FD","TerminationRelativeDensityThreshold"],9722:["FD","TerminationTimeThreshold"],9723:["FD","TerminationCardiacTriggerCountThreshold"],9724:["FD","TerminationRespiratoryTriggerCountThreshold"],9725:["CS","DetectorGeometry"],9726:["FD","TransverseDetectorSeparation"],9727:["FD","AxialDetectorDimension"],9729:["US","RadiopharmaceuticalAgentNumber"],9732:["SQ","PETFrameAcquisitionSequence"],9733:["SQ","PETDetectorMotionDetailsSequence"],9734:["SQ","PETTableDynamicsSequence"],9735:["SQ","PETPositionSequence"],9736:["SQ","PETFrameCorrectionFactorsSequence"],9737:["SQ","RadiopharmaceuticalUsageSequence"],9738:["CS","AttenuationCorrectionSource"],9739:["US","NumberOfIterations"],9740:["US","NumberOfSubsets"],9749:["SQ","PETReconstructionSequence"],9751:["SQ","PETFrameTypeSequence"],9755:["CS","TimeOfFlightInformationUsed"],9756:["CS","ReconstructionType"],9758:["CS","DecayCorrected"],9759:["CS","AttenuationCorrected"],9760:["CS","ScatterCorrected"],9761:["CS","DeadTimeCorrected"],9762:["CS","GantryMotionCorrected"],9763:["CS","PatientMotionCorrected"],9764:["CS","CountLossNormalizationCorrected"],9765:["CS","RandomsCorrected"],9766:["CS","NonUniformRadialSamplingCorrected"],9767:["CS","SensitivityCalibrated"],9768:["CS","DetectorNormalizationCorrection"],9769:["CS","IterativeReconstructionMethod"],9770:["CS","AttenuationCorrectionTemporalRelationship"],9771:["SQ","PatientPhysiologicalStateSequence"],9772:["SQ","PatientPhysiologicalStateCodeSequence"],9801:["FD","DepthsOfFocus"],9803:["SQ","ExcludedIntervalsSequence"],9804:["DT","ExclusionStartDatetime"],9805:["FD","ExclusionDuration"],9806:["SQ","USImageDescriptionSequence"],9807:["SQ","ImageDataTypeSequence"],9808:["CS","DataType"],9809:["SQ","TransducerScanPatternCodeSequence"],"980B":["CS","AliasedDataType"],"980C":["CS","PositionMeasuringDeviceUsed"],"980D":["SQ","TransducerGeometryCodeSequence"],"980E":["SQ","TransducerBeamSteeringCodeSequence"],"980F":["SQ","TransducerApplicationCodeSequence"],A001:["SQ","ContributingEquipmentSequence"],A002:["DT","ContributionDateTime"],A003:["ST","ContributionDescription"]},"0020":{"000D":["UI","StudyInstanceUID"],"000E":["UI","SeriesInstanceUID"],"0010":["SH","StudyID"],"0011":["IS","SeriesNumber"],"0012":["IS","AcquisitionNumber"],"0013":["IS","InstanceNumber"],"0014":["IS","IsotopeNumber"],"0015":["IS","PhaseNumber"],"0016":["IS","IntervalNumber"],"0017":["IS","TimeSlotNumber"],"0018":["IS","AngleNumber"],"0019":["IS","ItemNumber"],"0020":["CS","PatientOrientation"],"0022":["IS","OverlayNumber"],"0024":["IS","CurveNumber"],"0026":["IS","LUTNumber"],"0030":["DS","ImagePosition"],"0032":["DS","ImagePositionPatient"],"0035":["DS","ImageOrientation"],"0037":["DS","ImageOrientationPatient"],"0050":["DS","Location"],"0052":["UI","FrameOfReferenceUID"],"0060":["CS","Laterality"],"0062":["CS","ImageLaterality"],"0070":["LO","ImageGeometryType"],"0080":["CS","MaskingImage"],"00AA":["IS","ReportNumber"],"0100":["IS","TemporalPositionIdentifier"],"0105":["IS","NumberOfTemporalPositions"],"0110":["DS","TemporalResolution"],"0200":["UI","SynchronizationFrameOfReferenceUID"],"0242":["UI","SOPInstanceUIDOfConcatenationSource"],1e3:["IS","SeriesInStudy"],1001:["IS","AcquisitionsInSeries"],1002:["IS","ImagesInAcquisition"],1003:["IS","ImagesInSeries"],1004:["IS","AcquisitionsInStudy"],1005:["IS","ImagesInStudy"],1020:["LO","Reference"],1040:["LO","PositionReferenceIndicator"],1041:["DS","SliceLocation"],1070:["IS","OtherStudyNumbers"],1200:["IS","NumberOfPatientRelatedStudies"],1202:["IS","NumberOfPatientRelatedSeries"],1204:["IS","NumberOfPatientRelatedInstances"],1206:["IS","NumberOfStudyRelatedSeries"],1208:["IS","NumberOfStudyRelatedInstances"],1209:["IS","NumberOfSeriesRelatedInstances"],3401:["CS","ModifyingDeviceID"],3402:["CS","ModifiedImageID"],3403:["DA","ModifiedImageDate"],3404:["LO","ModifyingDeviceManufacturer"],3405:["TM","ModifiedImageTime"],3406:["LO","ModifiedImageDescription"],4e3:["LT","ImageComments"],5e3:["AT","OriginalImageIdentification"],5002:["LO","OriginalImageIdentificationNomenclature"],9056:["SH","StackID"],9057:["UL","InStackPositionNumber"],9071:["SQ","FrameAnatomySequence"],9072:["CS","FrameLaterality"],9111:["SQ","FrameContentSequence"],9113:["SQ","PlanePositionSequence"],9116:["SQ","PlaneOrientationSequence"],9128:["UL","TemporalPositionIndex"],9153:["FD","NominalCardiacTriggerDelayTime"],9154:["FL","NominalCardiacTriggerTimePriorToRPeak"],9155:["FL","ActualCardiacTriggerTimePriorToRPeak"],9156:["US","FrameAcquisitionNumber"],9157:["UL","DimensionIndexValues"],9158:["LT","FrameComments"],9161:["UI","ConcatenationUID"],9162:["US","InConcatenationNumber"],9163:["US","InConcatenationTotalNumber"],9164:["UI","DimensionOrganizationUID"],9165:["AT","DimensionIndexPointer"],9167:["AT","FunctionalGroupPointer"],9213:["LO","DimensionIndexPrivateCreator"],9221:["SQ","DimensionOrganizationSequence"],9222:["SQ","DimensionIndexSequence"],9228:["UL","ConcatenationFrameOffsetNumber"],9238:["LO","FunctionalGroupPrivateCreator"],9241:["FL","NominalPercentageOfCardiacPhase"],9245:["FL","NominalPercentageOfRespiratoryPhase"],9246:["FL","StartingRespiratoryAmplitude"],9247:["CS","StartingRespiratoryPhase"],9248:["FL","EndingRespiratoryAmplitude"],9249:["CS","EndingRespiratoryPhase"],9250:["CS","RespiratoryTriggerType"],9251:["FD","RRIntervalTimeNominal"],9252:["FD","ActualCardiacTriggerDelayTime"],9253:["SQ","RespiratorySynchronizationSequence"],9254:["FD","RespiratoryIntervalTime"],9255:["FD","NominalRespiratoryTriggerDelayTime"],9256:["FD","RespiratoryTriggerDelayThreshold"],9257:["FD","ActualRespiratoryTriggerDelayTime"],9301:["FD","ImagePositionVolume"],9302:["FD","ImageOrientationVolume"],9307:["CS","UltrasoundAcquisitionGeometry"],9308:["FD","ApexPosition"],9309:["FD","VolumeToTransducerMappingMatrix"],"930A":["FD","VolumeToTableMappingMatrix"],"930C":["CS","PatientFrameOfReferenceSource"],"930D":["FD","TemporalPositionTimeOffset"],"930E":["SQ","PlanePositionVolumeSequence"],"930F":["SQ","PlaneOrientationVolumeSequence"],9310:["SQ","TemporalPositionSequence"],9311:["CS","DimensionOrganizationType"],9312:["UI","VolumeFrameOfReferenceUID"],9313:["UI","TableFrameOfReferenceUID"],9421:["LO","DimensionDescriptionLabel"],9450:["SQ","PatientOrientationInFrameSequence"],9453:["LO","FrameLabel"],9518:["US","AcquisitionIndex"],9529:["SQ","ContributingSOPInstancesReferenceSequence"],9536:["US","ReconstructionIndex"]},"0022":{"0001":["US","LightPathFilterPassThroughWavelength"],"0002":["US","LightPathFilterPassBand"],"0003":["US","ImagePathFilterPassThroughWavelength"],"0004":["US","ImagePathFilterPassBand"],"0005":["CS","PatientEyeMovementCommanded"],"0006":["SQ","PatientEyeMovementCommandCodeSequence"],"0007":["FL","SphericalLensPower"],"0008":["FL","CylinderLensPower"],"0009":["FL","CylinderAxis"],"000A":["FL","EmmetropicMagnification"],"000B":["FL","IntraOcularPressure"],"000C":["FL","HorizontalFieldOfView"],"000D":["CS","PupilDilated"],"000E":["FL","DegreeOfDilation"],"0010":["FL","StereoBaselineAngle"],"0011":["FL","StereoBaselineDisplacement"],"0012":["FL","StereoHorizontalPixelOffset"],"0013":["FL","StereoVerticalPixelOffset"],"0014":["FL","StereoRotation"],"0015":["SQ","AcquisitionDeviceTypeCodeSequence"],"0016":["SQ","IlluminationTypeCodeSequence"],"0017":["SQ","LightPathFilterTypeStackCodeSequence"],"0018":["SQ","ImagePathFilterTypeStackCodeSequence"],"0019":["SQ","LensesCodeSequence"],"001A":["SQ","ChannelDescriptionCodeSequence"],"001B":["SQ","RefractiveStateSequence"],"001C":["SQ","MydriaticAgentCodeSequence"],"001D":["SQ","RelativeImagePositionCodeSequence"],"001E":["FL","CameraAngleOfView"],"0020":["SQ","StereoPairsSequence"],"0021":["SQ","LeftImageSequence"],"0022":["SQ","RightImageSequence"],"0030":["FL","AxialLengthOfTheEye"],"0031":["SQ","OphthalmicFrameLocationSequence"],"0032":["FL","ReferenceCoordinates"],"0035":["FL","DepthSpatialResolution"],"0036":["FL","MaximumDepthDistortion"],"0037":["FL","AlongScanSpatialResolution"],"0038":["FL","MaximumAlongScanDistortion"],"0039":["CS","OphthalmicImageOrientation"],"0041":["FL","DepthOfTransverseImage"],"0042":["SQ","MydriaticAgentConcentrationUnitsSequence"],"0048":["FL","AcrossScanSpatialResolution"],"0049":["FL","MaximumAcrossScanDistortion"],"004E":["DS","MydriaticAgentConcentration"],"0055":["FL","IlluminationWaveLength"],"0056":["FL","IlluminationPower"],"0057":["FL","IlluminationBandwidth"],"0058":["SQ","MydriaticAgentSequence"],1007:["SQ","OphthalmicAxialMeasurementsRightEyeSequence"],1008:["SQ","OphthalmicAxialMeasurementsLeftEyeSequence"],1010:["CS","OphthalmicAxialLengthMeasurementsType"],1019:["FL","OphthalmicAxialLength"],1024:["SQ","LensStatusCodeSequence"],1025:["SQ","VitreousStatusCodeSequence"],1028:["SQ","IOLFormulaCodeSequence"],1029:["LO","IOLFormulaDetail"],1033:["FL","KeratometerIndex"],1035:["SQ","SourceOfOphthalmicAxialLengthCodeSequence"],1037:["FL","TargetRefraction"],1039:["CS","RefractiveProcedureOccurred"],1040:["SQ","RefractiveSurgeryTypeCodeSequence"],1044:["SQ","OphthalmicUltrasoundAxialMeasurementsTypeCodeSequence"],1050:["SQ","OphthalmicAxialLengthMeasurementsSequence"],1053:["FL","IOLPower"],1054:["FL","PredictedRefractiveError"],1059:["FL","OphthalmicAxialLengthVelocity"],1065:["LO","LensStatusDescription"],1066:["LO","VitreousStatusDescription"],1090:["SQ","IOLPowerSequence"],1092:["SQ","LensConstantSequence"],1093:["LO","IOLManufacturer"],1094:["LO","LensConstantDescription"],1096:["SQ","KeratometryMeasurementTypeCodeSequence"],1100:["SQ","ReferencedOphthalmicAxialMeasurementsSequence"],1101:["SQ","OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence"],1103:["SQ","RefractiveErrorBeforeRefractiveSurgeryCodeSequence"],1121:["FL","IOLPowerForExactEmmetropia"],1122:["FL","IOLPowerForExactTargetRefraction"],1125:["SQ","AnteriorChamberDepthDefinitionCodeSequence"],1130:["FL","LensThickness"],1131:["FL","AnteriorChamberDepth"],1132:["SQ","SourceOfLensThicknessDataCodeSequence"],1133:["SQ","SourceOfAnteriorChamberDepthDataCodeSequence"],1135:["SQ","SourceOfRefractiveErrorDataCodeSequence"],1140:["CS","OphthalmicAxialLengthMeasurementModified"],1150:["SQ","OphthalmicAxialLengthDataSourceCodeSequence"],1153:["SQ","OphthalmicAxialLengthAcquisitionMethodCodeSequence"],1155:["FL","SignalToNoiseRatio"],1159:["LO","OphthalmicAxialLengthDataSourceDescription"],1210:["SQ","OphthalmicAxialLengthMeasurementsTotalLengthSequence"],1211:["SQ","OphthalmicAxialLengthMeasurementsSegmentalLengthSequence"],1212:["SQ","OphthalmicAxialLengthMeasurementsLengthSummationSequence"],1220:["SQ","UltrasoundOphthalmicAxialLengthMeasurementsSequence"],1225:["SQ","OpticalOphthalmicAxialLengthMeasurementsSequence"],1230:["SQ","UltrasoundSelectedOphthalmicAxialLengthSequence"],1250:["SQ","OphthalmicAxialLengthSelectionMethodCodeSequence"],1255:["SQ","OpticalSelectedOphthalmicAxialLengthSequence"],1257:["SQ","SelectedSegmentalOphthalmicAxialLengthSequence"],1260:["SQ","SelectedTotalOphthalmicAxialLengthSequence"],1262:["SQ","OphthalmicAxialLengthQualityMetricSequence"],1273:["LO","OphthalmicAxialLengthQualityMetricTypeDescription"],1300:["SQ","IntraocularLensCalculationsRightEyeSequence"],1310:["SQ","IntraocularLensCalculationsLeftEyeSequence"],1330:["SQ","ReferencedOphthalmicAxialLengthMeasurementQCImageSequence"]},"0024":{"0010":["FL","VisualFieldHorizontalExtent"],"0011":["FL","VisualFieldVerticalExtent"],"0012":["CS","VisualFieldShape"],"0016":["SQ","ScreeningTestModeCodeSequence"],"0018":["FL","MaximumStimulusLuminance"],"0020":["FL","BackgroundLuminance"],"0021":["SQ","StimulusColorCodeSequence"],"0024":["SQ","BackgroundIlluminationColorCodeSequence"],"0025":["FL","StimulusArea"],"0028":["FL","StimulusPresentationTime"],"0032":["SQ","FixationSequence"],"0033":["SQ","FixationMonitoringCodeSequence"],"0034":["SQ","VisualFieldCatchTrialSequence"],"0035":["US","FixationCheckedQuantity"],"0036":["US","PatientNotProperlyFixatedQuantity"],"0037":["CS","PresentedVisualStimuliDataFlag"],"0038":["US","NumberOfVisualStimuli"],"0039":["CS","ExcessiveFixationLossesDataFlag"],"0040":["CS","ExcessiveFixationLosses"],"0042":["US","StimuliRetestingQuantity"],"0044":["LT","CommentsOnPatientPerformanceOfVisualField"],"0045":["CS","FalseNegativesEstimateFlag"],"0046":["FL","FalseNegativesEstimate"],"0048":["US","NegativeCatchTrialsQuantity"],"0050":["US","FalseNegativesQuantity"],"0051":["CS","ExcessiveFalseNegativesDataFlag"],"0052":["CS","ExcessiveFalseNegatives"],"0053":["CS","FalsePositivesEstimateFlag"],"0054":["FL","FalsePositivesEstimate"],"0055":["CS","CatchTrialsDataFlag"],"0056":["US","PositiveCatchTrialsQuantity"],"0057":["CS","TestPointNormalsDataFlag"],"0058":["SQ","TestPointNormalsSequence"],"0059":["CS","GlobalDeviationProbabilityNormalsFlag"],"0060":["US","FalsePositivesQuantity"],"0061":["CS","ExcessiveFalsePositivesDataFlag"],"0062":["CS","ExcessiveFalsePositives"],"0063":["CS","VisualFieldTestNormalsFlag"],"0064":["SQ","ResultsNormalsSequence"],"0065":["SQ","AgeCorrectedSensitivityDeviationAlgorithmSequence"],"0066":["FL","GlobalDeviationFromNormal"],"0067":["SQ","GeneralizedDefectSensitivityDeviationAlgorithmSequence"],"0068":["FL","LocalizedDeviationfromNormal"],"0069":["LO","PatientReliabilityIndicator"],"0070":["FL","VisualFieldMeanSensitivity"],"0071":["FL","GlobalDeviationProbability"],"0072":["CS","LocalDeviationProbabilityNormalsFlag"],"0073":["FL","LocalizedDeviationProbability"],"0074":["CS","ShortTermFluctuationCalculated"],"0075":["FL","ShortTermFluctuation"],"0076":["CS","ShortTermFluctuationProbabilityCalculated"],"0077":["FL","ShortTermFluctuationProbability"],"0078":["CS","CorrectedLocalizedDeviationFromNormalCalculated"],"0079":["FL","CorrectedLocalizedDeviationFromNormal"],"0080":["CS","CorrectedLocalizedDeviationFromNormalProbabilityCalculated"],"0081":["FL","CorrectedLocalizedDeviationFromNormalProbability"],"0083":["SQ","GlobalDeviationProbabilitySequence"],"0085":["SQ","LocalizedDeviationProbabilitySequence"],"0086":["CS","FovealSensitivityMeasured"],"0087":["FL","FovealSensitivity"],"0088":["FL","VisualFieldTestDuration"],"0089":["SQ","VisualFieldTestPointSequence"],"0090":["FL","VisualFieldTestPointXCoordinate"],"0091":["FL","VisualFieldTestPointYCoordinate"],"0092":["FL","AgeCorrectedSensitivityDeviationValue"],"0093":["CS","StimulusResults"],"0094":["FL","SensitivityValue"],"0095":["CS","RetestStimulusSeen"],"0096":["FL","RetestSensitivityValue"],"0097":["SQ","VisualFieldTestPointNormalsSequence"],"0098":["FL","QuantifiedDefect"],"0100":["FL","AgeCorrectedSensitivityDeviationProbabilityValue"],"0102":["CS","GeneralizedDefectCorrectedSensitivityDeviationFlag "],"0103":["FL","GeneralizedDefectCorrectedSensitivityDeviationValue "],"0104":["FL","GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue"],"0105":["FL ","MinimumSensitivityValue"],"0106":["CS","BlindSpotLocalized"],"0107":["FL","BlindSpotXCoordinate"],"0108":["FL","BlindSpotYCoordinate "],"0110":["SQ","VisualAcuityMeasurementSequence"],"0112":["SQ","RefractiveParametersUsedOnPatientSequence"],"0113":["CS","MeasurementLaterality"],"0114":["SQ","OphthalmicPatientClinicalInformationLeftEyeSequence"],"0115":["SQ","OphthalmicPatientClinicalInformationRightEyeSequence"],"0117":["CS","FovealPointNormativeDataFlag"],"0118":["FL","FovealPointProbabilityValue"],"0120":["CS","ScreeningBaselineMeasured"],"0122":["SQ","ScreeningBaselineMeasuredSequence"],"0124":["CS","ScreeningBaselineType"],"0126":["FL","ScreeningBaselineValue"],"0202":["LO","AlgorithmSource"],"0306":["LO","DataSetName"],"0307":["LO","DataSetVersion"],"0308":["LO","DataSetSource"],"0309":["LO","DataSetDescription"],"0317":["SQ","VisualFieldTestReliabilityGlobalIndexSequence"],"0320":["SQ","VisualFieldGlobalResultsIndexSequence"],"0325":["SQ","DataObservationSequence"],"0338":["CS","IndexNormalsFlag"],"0341":["FL","IndexProbability"],"0344":["SQ","IndexProbabilitySequence"]},"0028":{"0002":["US","SamplesPerPixel"],"0003":["US","SamplesPerPixelUsed"],"0004":["CS","PhotometricInterpretation"],"0005":["US","ImageDimensions"],"0006":["US","PlanarConfiguration"],"0008":["IS","NumberOfFrames"],"0009":["AT","FrameIncrementPointer"],"000A":["AT","FrameDimensionPointer"],"0010":["US","Rows"],"0011":["US","Columns"],"0012":["US","Planes"],"0014":["US","UltrasoundColorDataPresent"],"0030":["DS","PixelSpacing"],"0031":["DS","ZoomFactor"],"0032":["DS","ZoomCenter"],"0034":["IS","PixelAspectRatio"],"0040":["CS","ImageFormat"],"0050":["LO","ManipulatedImage"],"0051":["CS","CorrectedImage"],"005F":["LO","CompressionRecognitionCode"],"0060":["CS","CompressionCode"],"0061":["SH","CompressionOriginator"],"0062":["LO","CompressionLabel"],"0063":["SH","CompressionDescription"],"0065":["CS","CompressionSequence"],"0066":["AT","CompressionStepPointers"],"0068":["US","RepeatInterval"],"0069":["US","BitsGrouped"],"0070":["US","PerimeterTable"],"0071":["SS","PerimeterValue"],"0080":["US","PredictorRows"],"0081":["US","PredictorColumns"],"0082":["US","PredictorConstants"],"0090":["CS","BlockedPixels"],"0091":["US","BlockRows"],"0092":["US","BlockColumns"],"0093":["US","RowOverlap"],"0094":["US","ColumnOverlap"],"0100":["US","BitsAllocated"],"0101":["US","BitsStored"],"0102":["US","HighBit"],"0103":["US","PixelRepresentation"],"0104":["SS","SmallestValidPixelValue"],"0105":["SS","LargestValidPixelValue"],"0106":["SS","SmallestImagePixelValue"],"0107":["SS","LargestImagePixelValue"],"0108":["SS","SmallestPixelValueInSeries"],"0109":["SS","LargestPixelValueInSeries"],"0110":["SS","SmallestImagePixelValueInPlane"],"0111":["SS","LargestImagePixelValueInPlane"],"0120":["SS","PixelPaddingValue"],"0121":["SS","PixelPaddingRangeLimit"],"0200":["US","ImageLocation"],"0300":["CS","QualityControlImage"],"0301":["CS","BurnedInAnnotation"],"0302":["CS","RecognizableVisualFeatures"],"0303":["CS","LongitudinalTemporalInformationModified"],"0400":["LO","TransformLabel"],"0401":["LO","TransformVersionNumber"],"0402":["US","NumberOfTransformSteps"],"0403":["LO","SequenceOfCompressedData"],"0404":["AT","DetailsOfCoefficients"],"0700":["LO","DCTLabel"],"0701":["CS","DataBlockDescription"],"0702":["AT","DataBlock"],"0710":["US","NormalizationFactorFormat"],"0720":["US","ZonalMapNumberFormat"],"0721":["AT","ZonalMapLocation"],"0722":["US","ZonalMapFormat"],"0730":["US","AdaptiveMapFormat"],"0740":["US","CodeNumberFormat"],"0A02":["CS","PixelSpacingCalibrationType"],"0A04":["LO","PixelSpacingCalibrationDescription"],1040:["CS","PixelIntensityRelationship"],1041:["SS","PixelIntensityRelationshipSign"],1050:["DS","WindowCenter"],1051:["DS","WindowWidth"],1052:["DS","RescaleIntercept"],1053:["DS","RescaleSlope"],1054:["LO","RescaleType"],1055:["LO","WindowCenterWidthExplanation"],1056:["CS","VOILUTFunction"],1080:["CS","GrayScale"],1090:["CS","RecommendedViewingMode"],1100:["SS","GrayLookupTableDescriptor"],1101:["SS","RedPaletteColorLookupTableDescriptor"],1102:["SS","GreenPaletteColorLookupTableDescriptor"],1103:["SS","BluePaletteColorLookupTableDescriptor"],1104:["US","AlphaPaletteColorLookupTableDescriptor"],1111:["SS","LargeRedPaletteColorLookupTableDescriptor"],1112:["SS","LargeGreenPaletteColorLookupTableDescriptor"],1113:["SS","LargeBluePaletteColorLookupTableDescriptor"],1199:["UI","PaletteColorLookupTableUID"],1200:["OW","GrayLookupTableData"],1201:["OW","RedPaletteColorLookupTableData"],1202:["OW","GreenPaletteColorLookupTableData"],1203:["OW","BluePaletteColorLookupTableData"],1204:["OW","AlphaPaletteColorLookupTableData"],1211:["OW","LargeRedPaletteColorLookupTableData"],1212:["OW","LargeGreenPaletteColorLookupTableData"],1213:["OW","LargeBluePaletteColorLookupTableData"],1214:["UI","LargePaletteColorLookupTableUID"],1221:["OW","SegmentedRedPaletteColorLookupTableData"],1222:["OW","SegmentedGreenPaletteColorLookupTableData"],1223:["OW","SegmentedBluePaletteColorLookupTableData"],1300:["CS","BreastImplantPresent"],1350:["CS","PartialView"],1351:["ST","PartialViewDescription"],1352:["SQ","PartialViewCodeSequence"],"135A":["CS","SpatialLocationsPreserved"],1401:["SQ","DataFrameAssignmentSequence"],1402:["CS","DataPathAssignment"],1403:["US","BitsMappedToColorLookupTable"],1404:["SQ","BlendingLUT1Sequence"],1405:["CS","BlendingLUT1TransferFunction"],1406:["FD","BlendingWeightConstant"],1407:["US","BlendingLookupTableDescriptor"],1408:["OW","BlendingLookupTableData"],"140B":["SQ","EnhancedPaletteColorLookupTableSequence"],"140C":["SQ","BlendingLUT2Sequence"],"140D":["CS","BlendingLUT2TransferFunction"],"140E":["CS","DataPathID"],"140F":["CS","RGBLUTTransferFunction"],1410:["CS","AlphaLUTTransferFunction"],2e3:["OB","ICCProfile"],2110:["CS","LossyImageCompression"],2112:["DS","LossyImageCompressionRatio"],2114:["CS","LossyImageCompressionMethod"],3e3:["SQ","ModalityLUTSequence"],3002:["SS","LUTDescriptor"],3003:["LO","LUTExplanation"],3004:["LO","ModalityLUTType"],3006:["OW","LUTData"],3010:["SQ","VOILUTSequence"],3110:["SQ","SoftcopyVOILUTSequence"],4e3:["LT","ImagePresentationComments"],5e3:["SQ","BiPlaneAcquisitionSequence"],6010:["US","RepresentativeFrameNumber"],6020:["US","FrameNumbersOfInterest"],6022:["LO","FrameOfInterestDescription"],6023:["CS","FrameOfInterestType"],6030:["US","MaskPointers"],6040:["US","RWavePointer"],6100:["SQ","MaskSubtractionSequence"],6101:["CS","MaskOperation"],6102:["US","ApplicableFrameRange"],6110:["US","MaskFrameNumbers"],6112:["US","ContrastFrameAveraging"],6114:["FL","MaskSubPixelShift"],6120:["SS","TIDOffset"],6190:["ST","MaskOperationExplanation"],"7FE0":["UT","PixelDataProviderURL"],9001:["UL","DataPointRows"],9002:["UL","DataPointColumns"],9003:["CS","SignalDomainColumns"],9099:["US","LargestMonochromePixelValue"],9108:["CS","DataRepresentation"],9110:["SQ","PixelMeasuresSequence"],9132:["SQ","FrameVOILUTSequence"],9145:["SQ","PixelValueTransformationSequence"],9235:["CS","SignalDomainRows"],9411:["FL","DisplayFilterPercentage"],9415:["SQ","FramePixelShiftSequence"],9416:["US","SubtractionItemID"],9422:["SQ","PixelIntensityRelationshipLUTSequence"],9443:["SQ","FramePixelDataPropertiesSequence"],9444:["CS","GeometricalProperties"],9445:["FL","GeometricMaximumDistortion"],9446:["CS","ImageProcessingApplied"],9454:["CS","MaskSelectionMode"],9474:["CS","LUTFunction"],9478:["FL","MaskVisibilityPercentage"],9501:["SQ","PixelShiftSequence"],9502:["SQ","RegionPixelShiftSequence"],9503:["SS","VerticesOfTheRegion"],9505:["SQ","MultiFramePresentationSequence"],9506:["US","PixelShiftFrameRange"],9507:["US","LUTFrameRange"],9520:["DS","ImageToEquipmentMappingMatrix"],9537:["CS","EquipmentCoordinateSystemIdentification"]},"0032":{"000A":["CS","StudyStatusID"],"000C":["CS","StudyPriorityID"],"0012":["LO","StudyIDIssuer"],"0032":["DA","StudyVerifiedDate"],"0033":["TM","StudyVerifiedTime"],"0034":["DA","StudyReadDate"],"0035":["TM","StudyReadTime"],1e3:["DA","ScheduledStudyStartDate"],1001:["TM","ScheduledStudyStartTime"],1010:["DA","ScheduledStudyStopDate"],1011:["TM","ScheduledStudyStopTime"],1020:["LO","ScheduledStudyLocation"],1021:["AE","ScheduledStudyLocationAETitle"],1030:["LO","ReasonForStudy"],1031:["SQ","RequestingPhysicianIdentificationSequence"],1032:["PN","RequestingPhysician"],1033:["LO","RequestingService"],1034:["SQ","RequestingServiceCodeSequence"],1040:["DA","StudyArrivalDate"],1041:["TM","StudyArrivalTime"],1050:["DA","StudyCompletionDate"],1051:["TM","StudyCompletionTime"],1055:["CS","StudyComponentStatusID"],1060:["LO","RequestedProcedureDescription"],1064:["SQ","RequestedProcedureCodeSequence"],1070:["LO","RequestedContrastAgent"],4e3:["LT","StudyComments"]},"0038":{"0004":["SQ","ReferencedPatientAliasSequence"],"0008":["CS","VisitStatusID"],"0010":["LO","AdmissionID"],"0011":["LO","IssuerOfAdmissionID"],"0014":["SQ","IssuerOfAdmissionIDSequence"],"0016":["LO","RouteOfAdmissions"],"001A":["DA","ScheduledAdmissionDate"],"001B":["TM","ScheduledAdmissionTime"],"001C":["DA","ScheduledDischargeDate"],"001D":["TM","ScheduledDischargeTime"],"001E":["LO","ScheduledPatientInstitutionResidence"],"0020":["DA","AdmittingDate"],"0021":["TM","AdmittingTime"],"0030":["DA","DischargeDate"],"0032":["TM","DischargeTime"],"0040":["LO","DischargeDiagnosisDescription"],"0044":["SQ","DischargeDiagnosisCodeSequence"],"0050":["LO","SpecialNeeds"],"0060":["LO","ServiceEpisodeID"],"0061":["LO","IssuerOfServiceEpisodeID"],"0062":["LO","ServiceEpisodeDescription"],"0064":["SQ","IssuerOfServiceEpisodeIDSequence"],"0100":["SQ","PertinentDocumentsSequence"],"0300":["LO","CurrentPatientLocation"],"0400":["LO","PatientInstitutionResidence"],"0500":["LO","PatientState"],"0502":["SQ","PatientClinicalTrialParticipationSequence"],4e3:["LT","VisitComments"]},"003A":{"0004":["CS","WaveformOriginality"],"0005":["US","NumberOfWaveformChannels"],"0010":["UL","NumberOfWaveformSamples"],"001A":["DS","SamplingFrequency"],"0020":["SH","MultiplexGroupLabel"],"0200":["SQ","ChannelDefinitionSequence"],"0202":["IS","WaveformChannelNumber"],"0203":["SH","ChannelLabel"],"0205":["CS","ChannelStatus"],"0208":["SQ","ChannelSourceSequence"],"0209":["SQ","ChannelSourceModifiersSequence"],"020A":["SQ","SourceWaveformSequence"],"020C":["LO","ChannelDerivationDescription"],"0210":["DS","ChannelSensitivity"],"0211":["SQ","ChannelSensitivityUnitsSequence"],"0212":["DS","ChannelSensitivityCorrectionFactor"],"0213":["DS","ChannelBaseline"],"0214":["DS","ChannelTimeSkew"],"0215":["DS","ChannelSampleSkew"],"0218":["DS","ChannelOffset"],"021A":["US","WaveformBitsStored"],"0220":["DS","FilterLowFrequency"],"0221":["DS","FilterHighFrequency"],"0222":["DS","NotchFilterFrequency"],"0223":["DS","NotchFilterBandwidth"],"0230":["FL","WaveformDataDisplayScale"],"0231":["US","WaveformDisplayBackgroundCIELabValue"],"0240":["SQ","WaveformPresentationGroupSequence"],"0241":["US","PresentationGroupNumber"],"0242":["SQ","ChannelDisplaySequence"],"0244":["US","ChannelRecommendedDisplayCIELabValue"],"0245":["FL","ChannelPosition"],"0246":["CS","DisplayShadingFlag"],"0247":["FL","FractionalChannelDisplayScale"],"0248":["FL","AbsoluteChannelDisplayScale"],"0300":["SQ","MultiplexedAudioChannelsDescriptionCodeSequence"],"0301":["IS","ChannelIdentificationCode"],"0302":["CS","ChannelMode"]},"0040":{"0001":["AE","ScheduledStationAETitle"],"0002":["DA","ScheduledProcedureStepStartDate"],"0003":["TM","ScheduledProcedureStepStartTime"],"0004":["DA","ScheduledProcedureStepEndDate"],"0005":["TM","ScheduledProcedureStepEndTime"],"0006":["PN","ScheduledPerformingPhysicianName"],"0007":["LO","ScheduledProcedureStepDescription"],"0008":["SQ","ScheduledProtocolCodeSequence"],"0009":["SH","ScheduledProcedureStepID"],"000A":["SQ","StageCodeSequence"],"000B":["SQ","ScheduledPerformingPhysicianIdentificationSequence"],"0010":["SH","ScheduledStationName"],"0011":["SH","ScheduledProcedureStepLocation"],"0012":["LO","PreMedication"],"0020":["CS","ScheduledProcedureStepStatus"],"0026":["SQ","OrderPlacerIdentifierSequence"],"0027":["SQ","OrderFillerIdentifierSequence"],"0031":["UT","LocalNamespaceEntityID"],"0032":["UT","UniversalEntityID"],"0033":["CS","UniversalEntityIDType"],"0035":["CS","IdentifierTypeCode"],"0036":["SQ","AssigningFacilitySequence"],"0039":["SQ","AssigningJurisdictionCodeSequence"],"003A":["SQ","AssigningAgencyOrDepartmentCodeSequence"],"0100":["SQ","ScheduledProcedureStepSequence"],"0220":["SQ","ReferencedNonImageCompositeSOPInstanceSequence"],"0241":["AE","PerformedStationAETitle"],"0242":["SH","PerformedStationName"],"0243":["SH","PerformedLocation"],"0244":["DA","PerformedProcedureStepStartDate"],"0245":["TM","PerformedProcedureStepStartTime"],"0250":["DA","PerformedProcedureStepEndDate"],"0251":["TM","PerformedProcedureStepEndTime"],"0252":["CS","PerformedProcedureStepStatus"],"0253":["SH","PerformedProcedureStepID"],"0254":["LO","PerformedProcedureStepDescription"],"0255":["LO","PerformedProcedureTypeDescription"],"0260":["SQ","PerformedProtocolCodeSequence"],"0261":["CS","PerformedProtocolType"],"0270":["SQ","ScheduledStepAttributesSequence"],"0275":["SQ","RequestAttributesSequence"],"0280":["ST","CommentsOnThePerformedProcedureStep"],"0281":["SQ","PerformedProcedureStepDiscontinuationReasonCodeSequence"],"0293":["SQ","QuantitySequence"],"0294":["DS","Quantity"],"0295":["SQ","MeasuringUnitsSequence"],"0296":["SQ","BillingItemSequence"],"0300":["US","TotalTimeOfFluoroscopy"],"0301":["US","TotalNumberOfExposures"],"0302":["US","EntranceDose"],"0303":["US","ExposedArea"],"0306":["DS","DistanceSourceToEntrance"],"0307":["DS","DistanceSourceToSupport"],"030E":["SQ","ExposureDoseSequence"],"0310":["ST","CommentsOnRadiationDose"],"0312":["DS","XRayOutput"],"0314":["DS","HalfValueLayer"],"0316":["DS","OrganDose"],"0318":["CS","OrganExposed"],"0320":["SQ","BillingProcedureStepSequence"],"0321":["SQ","FilmConsumptionSequence"],"0324":["SQ","BillingSuppliesAndDevicesSequence"],"0330":["SQ","ReferencedProcedureStepSequence"],"0340":["SQ","PerformedSeriesSequence"],"0400":["LT","CommentsOnTheScheduledProcedureStep"],"0440":["SQ","ProtocolContextSequence"],"0441":["SQ","ContentItemModifierSequence"],"0500":["SQ","ScheduledSpecimenSequence"],"050A":["LO","SpecimenAccessionNumber"],"0512":["LO","ContainerIdentifier"],"0513":["SQ","IssuerOfTheContainerIdentifierSequence"],"0515":["SQ","AlternateContainerIdentifierSequence"],"0518":["SQ","ContainerTypeCodeSequence"],"051A":["LO","ContainerDescription"],"0520":["SQ","ContainerComponentSequence"],"0550":["SQ","SpecimenSequence"],"0551":["LO","SpecimenIdentifier"],"0552":["SQ","SpecimenDescriptionSequenceTrial"],"0553":["ST","SpecimenDescriptionTrial"],"0554":["UI","SpecimenUID"],"0555":["SQ","AcquisitionContextSequence"],"0556":["ST","AcquisitionContextDescription"],"059A":["SQ","SpecimenTypeCodeSequence"],"0560":["SQ","SpecimenDescriptionSequence"],"0562":["SQ","IssuerOfTheSpecimenIdentifierSequence"],"0600":["LO","SpecimenShortDescription"],"0602":["UT","SpecimenDetailedDescription"],"0610":["SQ","SpecimenPreparationSequence"],"0612":["SQ","SpecimenPreparationStepContentItemSequence"],"0620":["SQ","SpecimenLocalizationContentItemSequence"],"06FA":["LO","SlideIdentifier"],"071A":["SQ","ImageCenterPointCoordinatesSequence"],"072A":["DS","XOffsetInSlideCoordinateSystem"],"073A":["DS","YOffsetInSlideCoordinateSystem"],"074A":["DS","ZOffsetInSlideCoordinateSystem"],"08D8":["SQ","PixelSpacingSequence"],"08DA":["SQ","CoordinateSystemAxisCodeSequence"],"08EA":["SQ","MeasurementUnitsCodeSequence"],"09F8":["SQ","VitalStainCodeSequenceTrial"],1001:["SH","RequestedProcedureID"],1002:["LO","ReasonForTheRequestedProcedure"],1003:["SH","RequestedProcedurePriority"],1004:["LO","PatientTransportArrangements"],1005:["LO","RequestedProcedureLocation"],1006:["SH","PlacerOrderNumberProcedure"],1007:["SH","FillerOrderNumberProcedure"],1008:["LO","ConfidentialityCode"],1009:["SH","ReportingPriority"],"100A":["SQ","ReasonForRequestedProcedureCodeSequence"],1010:["PN","NamesOfIntendedRecipientsOfResults"],1011:["SQ","IntendedRecipientsOfResultsIdentificationSequence"],1012:["SQ","ReasonForPerformedProcedureCodeSequence"],1060:["LO","RequestedProcedureDescriptionTrial"],1101:["SQ","PersonIdentificationCodeSequence"],1102:["ST","PersonAddress"],1103:["LO","PersonTelephoneNumbers"],1400:["LT","RequestedProcedureComments"],2001:["LO","ReasonForTheImagingServiceRequest"],2004:["DA","IssueDateOfImagingServiceRequest"],2005:["TM","IssueTimeOfImagingServiceRequest"],2006:["SH","PlacerOrderNumberImagingServiceRequestRetired"],2007:["SH","FillerOrderNumberImagingServiceRequestRetired"],2008:["PN","OrderEnteredBy"],2009:["SH","OrderEntererLocation"],2010:["SH","OrderCallbackPhoneNumber"],2016:["LO","PlacerOrderNumberImagingServiceRequest"],2017:["LO","FillerOrderNumberImagingServiceRequest"],2400:["LT","ImagingServiceRequestComments"],3001:["LO","ConfidentialityConstraintOnPatientDataDescription"],4001:["CS","GeneralPurposeScheduledProcedureStepStatus"],4002:["CS","GeneralPurposePerformedProcedureStepStatus"],4003:["CS","GeneralPurposeScheduledProcedureStepPriority"],4004:["SQ","ScheduledProcessingApplicationsCodeSequence"],4005:["DT","ScheduledProcedureStepStartDateTime"],4006:["CS","MultipleCopiesFlag"],4007:["SQ","PerformedProcessingApplicationsCodeSequence"],4009:["SQ","HumanPerformerCodeSequence"],4010:["DT","ScheduledProcedureStepModificationDateTime"],4011:["DT","ExpectedCompletionDateTime"],4015:["SQ","ResultingGeneralPurposePerformedProcedureStepsSequence"],4016:["SQ","ReferencedGeneralPurposeScheduledProcedureStepSequence"],4018:["SQ","ScheduledWorkitemCodeSequence"],4019:["SQ","PerformedWorkitemCodeSequence"],4020:["CS","InputAvailabilityFlag"],4021:["SQ","InputInformationSequence"],4022:["SQ","RelevantInformationSequence"],4023:["UI","ReferencedGeneralPurposeScheduledProcedureStepTransactionUID"],4025:["SQ","ScheduledStationNameCodeSequence"],4026:["SQ","ScheduledStationClassCodeSequence"],4027:["SQ","ScheduledStationGeographicLocationCodeSequence"],4028:["SQ","PerformedStationNameCodeSequence"],4029:["SQ","PerformedStationClassCodeSequence"],4030:["SQ","PerformedStationGeographicLocationCodeSequence"],4031:["SQ","RequestedSubsequentWorkitemCodeSequence"],4032:["SQ","NonDICOMOutputCodeSequence"],4033:["SQ","OutputInformationSequence"],4034:["SQ","ScheduledHumanPerformersSequence"],4035:["SQ","ActualHumanPerformersSequence"],4036:["LO","HumanPerformerOrganization"],4037:["PN","HumanPerformerName"],4040:["CS","RawDataHandling"],4041:["CS","InputReadinessState"],4050:["DT","PerformedProcedureStepStartDateTime"],4051:["DT","PerformedProcedureStepEndDateTime"],4052:["DT","ProcedureStepCancellationDateTime"],8302:["DS","EntranceDoseInmGy"],9094:["SQ","ReferencedImageRealWorldValueMappingSequence"],9096:["SQ","RealWorldValueMappingSequence"],9098:["SQ","PixelValueMappingCodeSequence"],9210:["SH","LUTLabel"],9211:["SS","RealWorldValueLastValueMapped"],9212:["FD","RealWorldValueLUTData"],9216:["SS","RealWorldValueFirstValueMapped"],9224:["FD","RealWorldValueIntercept"],9225:["FD","RealWorldValueSlope"],A007:["CS","FindingsFlagTrial"],A010:["CS","RelationshipType"],A020:["SQ","FindingsSequenceTrial"],A021:["UI","FindingsGroupUIDTrial"],A022:["UI","ReferencedFindingsGroupUIDTrial"],A023:["DA","FindingsGroupRecordingDateTrial"],A024:["TM","FindingsGroupRecordingTimeTrial"],A026:["SQ","FindingsSourceCategoryCodeSequenceTrial"],A027:["LO","VerifyingOrganization"],A028:["SQ","DocumentingOrganizationIdentifierCodeSequenceTrial"],A030:["DT","VerificationDateTime"],A032:["DT","ObservationDateTime"],A040:["CS","ValueType"],A043:["SQ","ConceptNameCodeSequence"],A047:["LO","MeasurementPrecisionDescriptionTrial"],A050:["CS","ContinuityOfContent"],A057:["CS","UrgencyOrPriorityAlertsTrial"],A060:["LO","SequencingIndicatorTrial"],A066:["SQ","DocumentIdentifierCodeSequenceTrial"],A067:["PN","DocumentAuthorTrial"],A068:["SQ","DocumentAuthorIdentifierCodeSequenceTrial"],A070:["SQ","IdentifierCodeSequenceTrial"],A073:["SQ","VerifyingObserverSequence"],A074:["OB","ObjectBinaryIdentifierTrial"],A075:["PN","VerifyingObserverName"],A076:["SQ","DocumentingObserverIdentifierCodeSequenceTrial"],A078:["SQ","AuthorObserverSequence"],A07A:["SQ","ParticipantSequence"],A07C:["SQ","CustodialOrganizationSequence"],A080:["CS","ParticipationType"],A082:["DT","ParticipationDateTime"],A084:["CS","ObserverType"],A085:["SQ","ProcedureIdentifierCodeSequenceTrial"],A088:["SQ","VerifyingObserverIdentificationCodeSequence"],A089:["OB","ObjectDirectoryBinaryIdentifierTrial"],A090:["SQ","EquivalentCDADocumentSequence"],A0B0:["US","ReferencedWaveformChannels"],A110:["DA","DateOfDocumentOrVerbalTransactionTrial"],A112:["TM","TimeOfDocumentCreationOrVerbalTransactionTrial"],A120:["DT","DateTime"],A121:["DA","Date"],A122:["TM","Time"],A123:["PN","PersonName"],A124:["UI","UID"],A125:["CS","ReportStatusIDTrial"],A130:["CS","TemporalRangeType"],A132:["UL","ReferencedSamplePositions"],A136:["US","ReferencedFrameNumbers"],A138:["DS","ReferencedTimeOffsets"],A13A:["DT","ReferencedDateTime"],A160:["UT","TextValue"],A167:["SQ","ObservationCategoryCodeSequenceTrial"],A168:["SQ","ConceptCodeSequence"],A16A:["ST","BibliographicCitationTrial"],A170:["SQ","PurposeOfReferenceCodeSequence"],A171:["UI","ObservationUIDTrial"],A172:["UI","ReferencedObservationUIDTrial"],A173:["CS","ReferencedObservationClassTrial"],A174:["CS","ReferencedObjectObservationClassTrial"],A180:["US","AnnotationGroupNumber"],A192:["DA","ObservationDateTrial"],A193:["TM","ObservationTimeTrial"],A194:["CS","MeasurementAutomationTrial"],A195:["SQ","ModifierCodeSequence"],A224:["ST","IdentificationDescriptionTrial"],A290:["CS","CoordinatesSetGeometricTypeTrial"],A296:["SQ","AlgorithmCodeSequenceTrial"],A297:["ST","AlgorithmDescriptionTrial"],A29A:["SL","PixelCoordinatesSetTrial"],A300:["SQ","MeasuredValueSequence"],A301:["SQ","NumericValueQualifierCodeSequence"],A307:["PN","CurrentObserverTrial"],A30A:["DS","NumericValue"],A313:["SQ","ReferencedAccessionSequenceTrial"],A33A:["ST","ReportStatusCommentTrial"],A340:["SQ","ProcedureContextSequenceTrial"],A352:["PN","VerbalSourceTrial"],A353:["ST","AddressTrial"],A354:["LO","TelephoneNumberTrial"],A358:["SQ","VerbalSourceIdentifierCodeSequenceTrial"],A360:["SQ","PredecessorDocumentsSequence"],A370:["SQ","ReferencedRequestSequence"],A372:["SQ","PerformedProcedureCodeSequence"],A375:["SQ","CurrentRequestedProcedureEvidenceSequence"],A380:["SQ","ReportDetailSequenceTrial"],A385:["SQ","PertinentOtherEvidenceSequence"],A390:["SQ","HL7StructuredDocumentReferenceSequence"],A402:["UI","ObservationSubjectUIDTrial"],A403:["CS","ObservationSubjectClassTrial"],A404:["SQ","ObservationSubjectTypeCodeSequenceTrial"],A491:["CS","CompletionFlag"],A492:["LO","CompletionFlagDescription"],A493:["CS","VerificationFlag"],A494:["CS","ArchiveRequested"],A496:["CS","PreliminaryFlag"],A504:["SQ","ContentTemplateSequence"],A525:["SQ","IdenticalDocumentsSequence"],A600:["CS","ObservationSubjectContextFlagTrial"],A601:["CS","ObserverContextFlagTrial"],A603:["CS","ProcedureContextFlagTrial"],A730:["SQ","ContentSequence"],A731:["SQ","RelationshipSequenceTrial"],A732:["SQ","RelationshipTypeCodeSequenceTrial"],A744:["SQ","LanguageCodeSequenceTrial"],A992:["ST","UniformResourceLocatorTrial"],B020:["SQ","WaveformAnnotationSequence"],DB00:["CS","TemplateIdentifier"],DB06:["DT","TemplateVersion"],DB07:["DT","TemplateLocalVersion"],DB0B:["CS","TemplateExtensionFlag"],DB0C:["UI","TemplateExtensionOrganizationUID"],DB0D:["UI","TemplateExtensionCreatorUID"],DB73:["UL","ReferencedContentItemIdentifier"],E001:["ST","HL7InstanceIdentifier"],E004:["DT","HL7DocumentEffectiveTime"],E006:["SQ","HL7DocumentTypeCodeSequence"],E008:["SQ","DocumentClassCodeSequence"],E010:["UT","RetrieveURI"],E011:["UI","RetrieveLocationUID"],E020:["CS","TypeOfInstances"],E021:["SQ","DICOMRetrievalSequence"],E022:["SQ","DICOMMediaRetrievalSequence"],E023:["SQ","WADORetrievalSequence"],E024:["SQ","XDSRetrievalSequence"],E030:["UI","RepositoryUniqueID"],E031:["UI","HomeCommunityID"]},"0042":{"0010":["ST","DocumentTitle"],"0011":["OB","EncapsulatedDocument"],"0012":["LO","MIMETypeOfEncapsulatedDocument"],"0013":["SQ","SourceInstanceSequence"],"0014":["LO","ListOfMIMETypes"]},"0044":{"0001":["ST","ProductPackageIdentifier"],"0002":["CS","SubstanceAdministrationApproval"],"0003":["LT","ApprovalStatusFurtherDescription"],"0004":["DT","ApprovalStatusDateTime"],"0007":["SQ","ProductTypeCodeSequence"],"0008":["LO","ProductName"],"0009":["LT","ProductDescription"],"000A":["LO","ProductLotIdentifier"],"000B":["DT","ProductExpirationDateTime"],"0010":["DT","SubstanceAdministrationDateTime"],"0011":["LO","SubstanceAdministrationNotes"],"0012":["LO","SubstanceAdministrationDeviceID"],"0013":["SQ","ProductParameterSequence"],"0019":["SQ","SubstanceAdministrationParameterSequence"]},"0046":{"0012":["LO","LensDescription"],"0014":["SQ","RightLensSequence"],"0015":["SQ","LeftLensSequence"],"0016":["SQ","UnspecifiedLateralityLensSequence"],"0018":["SQ","CylinderSequence"],"0028":["SQ","PrismSequence"],"0030":["FD","HorizontalPrismPower"],"0032":["CS","HorizontalPrismBase"],"0034":["FD","VerticalPrismPower"],"0036":["CS","VerticalPrismBase"],"0038":["CS","LensSegmentType"],"0040":["FD","OpticalTransmittance"],"0042":["FD","ChannelWidth"],"0044":["FD","PupilSize"],"0046":["FD","CornealSize"],"0050":["SQ","AutorefractionRightEyeSequence"],"0052":["SQ","AutorefractionLeftEyeSequence"],"0060":["FD","DistancePupillaryDistance"],"0062":["FD","NearPupillaryDistance"],"0063":["FD","IntermediatePupillaryDistance"],"0064":["FD","OtherPupillaryDistance"],"0070":["SQ","KeratometryRightEyeSequence"],"0071":["SQ","KeratometryLeftEyeSequence"],"0074":["SQ","SteepKeratometricAxisSequence"],"0075":["FD","RadiusOfCurvature"],"0076":["FD","KeratometricPower"],"0077":["FD","KeratometricAxis"],"0080":["SQ","FlatKeratometricAxisSequence"],"0092":["CS","BackgroundColor"],"0094":["CS","Optotype"],"0095":["CS","OptotypePresentation"],"0097":["SQ","SubjectiveRefractionRightEyeSequence"],"0098":["SQ","SubjectiveRefractionLeftEyeSequence"],"0100":["SQ","AddNearSequence"],"0101":["SQ","AddIntermediateSequence"],"0102":["SQ","AddOtherSequence"],"0104":["FD","AddPower"],"0106":["FD","ViewingDistance"],"0121":["SQ","VisualAcuityTypeCodeSequence"],"0122":["SQ","VisualAcuityRightEyeSequence"],"0123":["SQ","VisualAcuityLeftEyeSequence"],"0124":["SQ","VisualAcuityBothEyesOpenSequence"],"0125":["CS","ViewingDistanceType"],"0135":["SS","VisualAcuityModifiers"],"0137":["FD","DecimalVisualAcuity"],"0139":["LO","OptotypeDetailedDefinition"],"0145":["SQ","ReferencedRefractiveMeasurementsSequence"],"0146":["FD","SpherePower"],"0147":["FD","CylinderPower"]},"0048":{"0001":["FL","ImagedVolumeWidth"],"0002":["FL","ImagedVolumeHeight"],"0003":["FL","ImagedVolumeDepth"],"0006":["UL","TotalPixelMatrixColumns"],"0007":["UL","TotalPixelMatrixRows"],"0008":["SQ","TotalPixelMatrixOriginSequence"],"0010":["CS","SpecimenLabelInImage"],"0011":["CS","FocusMethod"],"0012":["CS","ExtendedDepthOfField"],"0013":["US","NumberOfFocalPlanes"],"0014":["FL","DistanceBetweenFocalPlanes"],"0015":["US","RecommendedAbsentPixelCIELabValue"],"0100":["SQ","IlluminatorTypeCodeSequence"],"0102":["DS","ImageOrientationSlide"],"0105":["SQ","OpticalPathSequence"],"0106":["SH","OpticalPathIdentifier"],"0107":["ST","OpticalPathDescription"],"0108":["SQ","IlluminationColorCodeSequence"],"0110":["SQ","SpecimenReferenceSequence"],"0111":["DS","CondenserLensPower"],"0112":["DS","ObjectiveLensPower"],"0113":["DS","ObjectiveLensNumericalAperture"],"0120":["SQ","PaletteColorLookupTableSequence"],"0200":["SQ","ReferencedImageNavigationSequence"],"0201":["US","TopLeftHandCornerOfLocalizerArea"],"0202":["US","BottomRightHandCornerOfLocalizerArea"],"0207":["SQ","OpticalPathIdentificationSequence"],"021A":["SQ","PlanePositionSlideSequence"],"021E":["SL","RowPositionInTotalImagePixelMatrix"],"021F":["SL","ColumnPositionInTotalImagePixelMatrix"],"0301":["CS","PixelOriginInterpretation"]},"0050":{"0004":["CS","CalibrationImage"],"0010":["SQ","DeviceSequence"],"0012":["SQ","ContainerComponentTypeCodeSequence"],"0013":["FD","ContainerComponentThickness"],"0014":["DS","DeviceLength"],"0015":["FD","ContainerComponentWidth"],"0016":["DS","DeviceDiameter"],"0017":["CS","DeviceDiameterUnits"],"0018":["DS","DeviceVolume"],"0019":["DS","InterMarkerDistance"],"001A":["CS","ContainerComponentMaterial"],"001B":["LO","ContainerComponentID"],"001C":["FD","ContainerComponentLength"],"001D":["FD","ContainerComponentDiameter"],"001E":["LO","ContainerComponentDescription"],"0020":["LO","DeviceDescription"]},"0052":{"0001":["FL","ContrastBolusIngredientPercentByVolume"],"0002":["FD","OCTFocalDistance"],"0003":["FD","BeamSpotSize"],"0004":["FD","EffectiveRefractiveIndex"],"0006":["CS","OCTAcquisitionDomain"],"0007":["FD","OCTOpticalCenterWavelength"],"0008":["FD","AxialResolution"],"0009":["FD","RangingDepth"],"0011":["FD","ALineRate"],"0012":["US","ALinesPerFrame"],"0013":["FD","CatheterRotationalRate"],"0014":["FD","ALinePixelSpacing"],"0016":["SQ","ModeOfPercutaneousAccessSequence"],"0025":["SQ","IntravascularOCTFrameTypeSequence"],"0026":["CS","OCTZOffsetApplied"],"0027":["SQ","IntravascularFrameContentSequence"],"0028":["FD","IntravascularLongitudinalDistance"],"0029":["SQ","IntravascularOCTFrameContentSequence"],"0030":["SS","OCTZOffsetCorrection"],"0031":["CS","CatheterDirectionOfRotation"],"0033":["FD","SeamLineLocation"],"0034":["FD","FirstALineLocation"],"0036":["US","SeamLineIndex"],"0038":["US","NumberOfPaddedAlines"],"0039":["CS","InterpolationType"],"003A":["CS","RefractiveIndexApplied"]},"0054":{"0010":["US","EnergyWindowVector"],"0011":["US","NumberOfEnergyWindows"],"0012":["SQ","EnergyWindowInformationSequence"],"0013":["SQ","EnergyWindowRangeSequence"],"0014":["DS","EnergyWindowLowerLimit"],"0015":["DS","EnergyWindowUpperLimit"],"0016":["SQ","RadiopharmaceuticalInformationSequence"],"0017":["IS","ResidualSyringeCounts"],"0018":["SH","EnergyWindowName"],"0020":["US","DetectorVector"],"0021":["US","NumberOfDetectors"],"0022":["SQ","DetectorInformationSequence"],"0030":["US","PhaseVector"],"0031":["US","NumberOfPhases"],"0032":["SQ","PhaseInformationSequence"],"0033":["US","NumberOfFramesInPhase"],"0036":["IS","PhaseDelay"],"0038":["IS","PauseBetweenFrames"],"0039":["CS","PhaseDescription"],"0050":["US","RotationVector"],"0051":["US","NumberOfRotations"],"0052":["SQ","RotationInformationSequence"],"0053":["US","NumberOfFramesInRotation"],"0060":["US","RRIntervalVector"],"0061":["US","NumberOfRRIntervals"],"0062":["SQ","GatedInformationSequence"],"0063":["SQ","DataInformationSequence"],"0070":["US","TimeSlotVector"],"0071":["US","NumberOfTimeSlots"],"0072":["SQ","TimeSlotInformationSequence"],"0073":["DS","TimeSlotTime"],"0080":["US","SliceVector"],"0081":["US","NumberOfSlices"],"0090":["US","AngularViewVector"],"0100":["US","TimeSliceVector"],"0101":["US","NumberOfTimeSlices"],"0200":["DS","StartAngle"],"0202":["CS","TypeOfDetectorMotion"],"0210":["IS","TriggerVector"],"0211":["US","NumberOfTriggersInPhase"],"0220":["SQ","ViewCodeSequence"],"0222":["SQ","ViewModifierCodeSequence"],"0300":["SQ","RadionuclideCodeSequence"],"0302":["SQ","AdministrationRouteCodeSequence"],"0304":["SQ","RadiopharmaceuticalCodeSequence"],"0306":["SQ","CalibrationDataSequence"],"0308":["US","EnergyWindowNumber"],"0400":["SH","ImageID"],"0410":["SQ","PatientOrientationCodeSequence"],"0412":["SQ","PatientOrientationModifierCodeSequence"],"0414":["SQ","PatientGantryRelationshipCodeSequence"],"0500":["CS","SliceProgressionDirection"],1e3:["CS","SeriesType"],1001:["CS","Units"],1002:["CS","CountsSource"],1004:["CS","ReprojectionMethod"],1006:["CS","SUVType"],1100:["CS","RandomsCorrectionMethod"],1101:["LO","AttenuationCorrectionMethod"],1102:["CS","DecayCorrection"],1103:["LO","ReconstructionMethod"],1104:["LO","DetectorLinesOfResponseUsed"],1105:["LO","ScatterCorrectionMethod"],1200:["DS","AxialAcceptance"],1201:["IS","AxialMash"],1202:["IS","TransverseMash"],1203:["DS","DetectorElementSize"],1210:["DS","CoincidenceWindowWidth"],1220:["CS","SecondaryCountsType"],1300:["DS","FrameReferenceTime"],1310:["IS","PrimaryPromptsCountsAccumulated"],1311:["IS","SecondaryCountsAccumulated"],1320:["DS","SliceSensitivityFactor"],1321:["DS","DecayFactor"],1322:["DS","DoseCalibrationFactor"],1323:["DS","ScatterFractionFactor"],1324:["DS","DeadTimeFactor"],1330:["US","ImageIndex"],1400:["CS","CountsIncluded"],1401:["CS","DeadTimeCorrectionFlag"]},"0060":{3e3:["SQ","HistogramSequence"],3002:["US","HistogramNumberOfBins"],3004:["SS","HistogramFirstBinValue"],3006:["SS","HistogramLastBinValue"],3008:["US","HistogramBinWidth"],3010:["LO","HistogramExplanation"],3020:["UL","HistogramData"]},"0062":{"0001":["CS","SegmentationType"],"0002":["SQ","SegmentSequence"],"0003":["SQ","SegmentedPropertyCategoryCodeSequence"],"0004":["US","SegmentNumber"],"0005":["LO","SegmentLabel"],"0006":["ST","SegmentDescription"],"0008":["CS","SegmentAlgorithmType"],"0009":["LO","SegmentAlgorithmName"],"000A":["SQ","SegmentIdentificationSequence"],"000B":["US","ReferencedSegmentNumber"],"000C":["US","RecommendedDisplayGrayscaleValue"],"000D":["US","RecommendedDisplayCIELabValue"],"000E":["US","MaximumFractionalValue"],"000F":["SQ","SegmentedPropertyTypeCodeSequence"],"0010":["CS","SegmentationFractionalType"]},"0064":{"0002":["SQ","DeformableRegistrationSequence"],"0003":["UI","SourceFrameOfReferenceUID"],"0005":["SQ","DeformableRegistrationGridSequence"],"0007":["UL","GridDimensions"],"0008":["FD","GridResolution"],"0009":["OF","VectorGridData"],"000F":["SQ","PreDeformationMatrixRegistrationSequence"],"0010":["SQ","PostDeformationMatrixRegistrationSequence"]},"0066":{"0001":["UL","NumberOfSurfaces"],"0002":["SQ","SurfaceSequence"],"0003":["UL","SurfaceNumber"],"0004":["LT","SurfaceComments"],"0009":["CS","SurfaceProcessing"],"000A":["FL","SurfaceProcessingRatio"],"000B":["LO","SurfaceProcessingDescription"],"000C":["FL","RecommendedPresentationOpacity"],"000D":["CS","RecommendedPresentationType"],"000E":["CS","FiniteVolume"],"0010":["CS","Manifold"],"0011":["SQ","SurfacePointsSequence"],"0012":["SQ","SurfacePointsNormalsSequence"],"0013":["SQ","SurfaceMeshPrimitivesSequence"],"0015":["UL","NumberOfSurfacePoints"],"0016":["OF","PointCoordinatesData"],"0017":["FL","PointPositionAccuracy"],"0018":["FL","MeanPointDistance"],"0019":["FL","MaximumPointDistance"],"001A":["FL","PointsBoundingBoxCoordinates"],"001B":["FL","AxisOfRotation"],"001C":["FL","CenterOfRotation"],"001E":["UL","NumberOfVectors"],"001F":["US","VectorDimensionality"],"0020":["FL","VectorAccuracy"],"0021":["OF","VectorCoordinateData"],"0023":["OW","TrianglePointIndexList"],"0024":["OW","EdgePointIndexList"],"0025":["OW","VertexPointIndexList"],"0026":["SQ","TriangleStripSequence"],"0027":["SQ","TriangleFanSequence"],"0028":["SQ","LineSequence"],"0029":["OW","PrimitivePointIndexList"],"002A":["UL","SurfaceCount"],"002B":["SQ","ReferencedSurfaceSequence"],"002C":["UL","ReferencedSurfaceNumber"],"002D":["SQ","SegmentSurfaceGenerationAlgorithmIdentificationSequence"],"002E":["SQ","SegmentSurfaceSourceInstanceSequence"],"002F":["SQ","AlgorithmFamilyCodeSequence"],"0030":["SQ","AlgorithmNameCodeSequence"],"0031":["LO","AlgorithmVersion"],"0032":["LT","AlgorithmParameters"],"0034":["SQ","FacetSequence"],"0035":["SQ","SurfaceProcessingAlgorithmIdentificationSequence"],"0036":["LO","AlgorithmName"]},"0068":{6210:["LO","ImplantSize"],6221:["LO","ImplantTemplateVersion"],6222:["SQ","ReplacedImplantTemplateSequence"],6223:["CS","ImplantType"],6224:["SQ","DerivationImplantTemplateSequence"],6225:["SQ","OriginalImplantTemplateSequence"],6226:["DT","EffectiveDateTime"],6230:["SQ","ImplantTargetAnatomySequence"],6260:["SQ","InformationFromManufacturerSequence"],6265:["SQ","NotificationFromManufacturerSequence"],6270:["DT","InformationIssueDateTime"],6280:["ST","InformationSummary"],"62A0":["SQ","ImplantRegulatoryDisapprovalCodeSequence"],"62A5":["FD","OverallTemplateSpatialTolerance"],"62C0":["SQ","HPGLDocumentSequence"],"62D0":["US","HPGLDocumentID"],"62D5":["LO","HPGLDocumentLabel"],"62E0":["SQ","ViewOrientationCodeSequence"],"62F0":["FD","ViewOrientationModifier"],"62F2":["FD","HPGLDocumentScaling"],6300:["OB","HPGLDocument"],6310:["US","HPGLContourPenNumber"],6320:["SQ","HPGLPenSequence"],6330:["US","HPGLPenNumber"],6340:["LO","HPGLPenLabel"],6345:["ST","HPGLPenDescription"],6346:["FD","RecommendedRotationPoint"],6347:["FD","BoundingRectangle"],6350:["US","ImplantTemplate3DModelSurfaceNumber"],6360:["SQ","SurfaceModelDescriptionSequence"],6380:["LO","SurfaceModelLabel"],6390:["FD","SurfaceModelScalingFactor"],"63A0":["SQ","MaterialsCodeSequence"],"63A4":["SQ","CoatingMaterialsCodeSequence"],"63A8":["SQ","ImplantTypeCodeSequence"],"63AC":["SQ","FixationMethodCodeSequence"],"63B0":["SQ","MatingFeatureSetsSequence"],"63C0":["US","MatingFeatureSetID"],"63D0":["LO","MatingFeatureSetLabel"],"63E0":["SQ","MatingFeatureSequence"],"63F0":["US","MatingFeatureID"],6400:["SQ","MatingFeatureDegreeOfFreedomSequence"],6410:["US","DegreeOfFreedomID"],6420:["CS","DegreeOfFreedomType"],6430:["SQ","TwoDMatingFeatureCoordinatesSequence"],6440:["US","ReferencedHPGLDocumentID"],6450:["FD","TwoDMatingPoint"],6460:["FD","TwoDMatingAxes"],6470:["SQ","TwoDDegreeOfFreedomSequence"],6490:["FD","ThreeDDegreeOfFreedomAxis"],"64A0":["FD","RangeOfFreedom"],"64C0":["FD","ThreeDMatingPoint"],"64D0":["FD","ThreeDMatingAxes"],"64F0":["FD","TwoDDegreeOfFreedomAxis"],6500:["SQ","PlanningLandmarkPointSequence"],6510:["SQ","PlanningLandmarkLineSequence"],6520:["SQ","PlanningLandmarkPlaneSequence"],6530:["US","PlanningLandmarkID"],6540:["LO","PlanningLandmarkDescription"],6545:["SQ","PlanningLandmarkIdentificationCodeSequence"],6550:["SQ","TwoDPointCoordinatesSequence"],6560:["FD","TwoDPointCoordinates"],6590:["FD","ThreeDPointCoordinates"],"65A0":["SQ","TwoDLineCoordinatesSequence"],"65B0":["FD","TwoDLineCoordinates"],"65D0":["FD","ThreeDLineCoordinates"],"65E0":["SQ","TwoDPlaneCoordinatesSequence"],"65F0":["FD","TwoDPlaneIntersection"],6610:["FD","ThreeDPlaneOrigin"],6620:["FD","ThreeDPlaneNormal"]},"0070":{"0001":["SQ","GraphicAnnotationSequence"],"0002":["CS","GraphicLayer"],"0003":["CS","BoundingBoxAnnotationUnits"],"0004":["CS","AnchorPointAnnotationUnits"],"0005":["CS","GraphicAnnotationUnits"],"0006":["ST","UnformattedTextValue"],"0008":["SQ","TextObjectSequence"],"0009":["SQ","GraphicObjectSequence"],"0010":["FL","BoundingBoxTopLeftHandCorner"],"0011":["FL","BoundingBoxBottomRightHandCorner"],"0012":["CS","BoundingBoxTextHorizontalJustification"],"0014":["FL","AnchorPoint"],"0015":["CS","AnchorPointVisibility"],"0020":["US","GraphicDimensions"],"0021":["US","NumberOfGraphicPoints"],"0022":["FL","GraphicData"],"0023":["CS","GraphicType"],"0024":["CS","GraphicFilled"],"0040":["IS","ImageRotationRetired"],"0041":["CS","ImageHorizontalFlip"],"0042":["US","ImageRotation"],"0050":["US","DisplayedAreaTopLeftHandCornerTrial"],"0051":["US","DisplayedAreaBottomRightHandCornerTrial"],"0052":["SL","DisplayedAreaTopLeftHandCorner"],"0053":["SL","DisplayedAreaBottomRightHandCorner"],"005A":["SQ","DisplayedAreaSelectionSequence"],"0060":["SQ","GraphicLayerSequence"],"0062":["IS","GraphicLayerOrder"],"0066":["US","GraphicLayerRecommendedDisplayGrayscaleValue"],"0067":["US","GraphicLayerRecommendedDisplayRGBValue"],"0068":["LO","GraphicLayerDescription"],"0080":["CS","ContentLabel"],"0081":["LO","ContentDescription"],"0082":["DA","PresentationCreationDate"],"0083":["TM","PresentationCreationTime"],"0084":["PN","ContentCreatorName"],"0086":["SQ","ContentCreatorIdentificationCodeSequence"],"0087":["SQ","AlternateContentDescriptionSequence"],"0100":["CS","PresentationSizeMode"],"0101":["DS","PresentationPixelSpacing"],"0102":["IS","PresentationPixelAspectRatio"],"0103":["FL","PresentationPixelMagnificationRatio"],"0207":["LO","GraphicGroupLabel"],"0208":["ST","GraphicGroupDescription"],"0209":["SQ","CompoundGraphicSequence"],"0226":["UL","CompoundGraphicInstanceID"],"0227":["LO","FontName"],"0228":["CS","FontNameType"],"0229":["LO","CSSFontName"],"0230":["FD","RotationAngle"],"0231":["SQ","TextStyleSequence"],"0232":["SQ","LineStyleSequence"],"0233":["SQ","FillStyleSequence"],"0234":["SQ","GraphicGroupSequence"],"0241":["US","TextColorCIELabValue"],"0242":["CS","HorizontalAlignment"],"0243":["CS","VerticalAlignment"],"0244":["CS","ShadowStyle"],"0245":["FL","ShadowOffsetX"],"0246":["FL","ShadowOffsetY"],"0247":["US","ShadowColorCIELabValue"],"0248":["CS","Underlined"],"0249":["CS","Bold"],"0250":["CS","Italic"],"0251":["US","PatternOnColorCIELabValue"],"0252":["US","PatternOffColorCIELabValue"],"0253":["FL","LineThickness"],"0254":["CS","LineDashingStyle"],"0255":["UL","LinePattern"],"0256":["OB","FillPattern"],"0257":["CS","FillMode"],"0258":["FL","ShadowOpacity"],"0261":["FL","GapLength"],"0262":["FL","DiameterOfVisibility"],"0273":["FL","RotationPoint"],"0274":["CS","TickAlignment"],"0278":["CS","ShowTickLabel"],"0279":["CS","TickLabelAlignment"],"0282":["CS","CompoundGraphicUnits"],"0284":["FL","PatternOnOpacity"],"0285":["FL","PatternOffOpacity"],"0287":["SQ","MajorTicksSequence"],"0288":["FL","TickPosition"],"0289":["SH","TickLabel"],"0294":["CS","CompoundGraphicType"],"0295":["UL","GraphicGroupID"],"0306":["CS","ShapeType"],"0308":["SQ","RegistrationSequence"],"0309":["SQ","MatrixRegistrationSequence"],"030A":["SQ","MatrixSequence"],"030C":["CS","FrameOfReferenceTransformationMatrixType"],"030D":["SQ","RegistrationTypeCodeSequence"],"030F":["ST","FiducialDescription"],"0310":["SH","FiducialIdentifier"],"0311":["SQ","FiducialIdentifierCodeSequence"],"0312":["FD","ContourUncertaintyRadius"],"0314":["SQ","UsedFiducialsSequence"],"0318":["SQ","GraphicCoordinatesDataSequence"],"031A":["UI","FiducialUID"],"031C":["SQ","FiducialSetSequence"],"031E":["SQ","FiducialSequence"],"0401":["US","GraphicLayerRecommendedDisplayCIELabValue"],"0402":["SQ","BlendingSequence"],"0403":["FL","RelativeOpacity"],"0404":["SQ","ReferencedSpatialRegistrationSequence"],"0405":["CS","BlendingPosition"]},"0072":{"0002":["SH","HangingProtocolName"],"0004":["LO","HangingProtocolDescription"],"0006":["CS","HangingProtocolLevel"],"0008":["LO","HangingProtocolCreator"],"000A":["DT","HangingProtocolCreationDateTime"],"000C":["SQ","HangingProtocolDefinitionSequence"],"000E":["SQ","HangingProtocolUserIdentificationCodeSequence"],"0010":["LO","HangingProtocolUserGroupName"],"0012":["SQ","SourceHangingProtocolSequence"],"0014":["US","NumberOfPriorsReferenced"],"0020":["SQ","ImageSetsSequence"],"0022":["SQ","ImageSetSelectorSequence"],"0024":["CS","ImageSetSelectorUsageFlag"],"0026":["AT","SelectorAttribute"],"0028":["US","SelectorValueNumber"],"0030":["SQ","TimeBasedImageSetsSequence"],"0032":["US","ImageSetNumber"],"0034":["CS","ImageSetSelectorCategory"],"0038":["US","RelativeTime"],"003A":["CS","RelativeTimeUnits"],"003C":["SS","AbstractPriorValue"],"003E":["SQ","AbstractPriorCodeSequence"],"0040":["LO","ImageSetLabel"],"0050":["CS","SelectorAttributeVR"],"0052":["AT","SelectorSequencePointer"],"0054":["LO","SelectorSequencePointerPrivateCreator"],"0056":["LO","SelectorAttributePrivateCreator"],"0060":["AT","SelectorATValue"],"0062":["CS","SelectorCSValue"],"0064":["IS","SelectorISValue"],"0066":["LO","SelectorLOValue"],"0068":["LT","SelectorLTValue"],"006A":["PN","SelectorPNValue"],"006C":["SH","SelectorSHValue"],"006E":["ST","SelectorSTValue"],"0070":["UT","SelectorUTValue"],"0072":["DS","SelectorDSValue"],"0074":["FD","SelectorFDValue"],"0076":["FL","SelectorFLValue"],"0078":["UL","SelectorULValue"],"007A":["US","SelectorUSValue"],"007C":["SL","SelectorSLValue"],"007E":["SS","SelectorSSValue"],"0080":["SQ","SelectorCodeSequenceValue"],"0100":["US","NumberOfScreens"],"0102":["SQ","NominalScreenDefinitionSequence"],"0104":["US","NumberOfVerticalPixels"],"0106":["US","NumberOfHorizontalPixels"],"0108":["FD","DisplayEnvironmentSpatialPosition"],"010A":["US","ScreenMinimumGrayscaleBitDepth"],"010C":["US","ScreenMinimumColorBitDepth"],"010E":["US","ApplicationMaximumRepaintTime"],"0200":["SQ","DisplaySetsSequence"],"0202":["US","DisplaySetNumber"],"0203":["LO","DisplaySetLabel"],"0204":["US","DisplaySetPresentationGroup"],"0206":["LO","DisplaySetPresentationGroupDescription"],"0208":["CS","PartialDataDisplayHandling"],"0210":["SQ","SynchronizedScrollingSequence"],"0212":["US","DisplaySetScrollingGroup"],"0214":["SQ","NavigationIndicatorSequence"],"0216":["US","NavigationDisplaySet"],"0218":["US","ReferenceDisplaySets"],"0300":["SQ","ImageBoxesSequence"],"0302":["US","ImageBoxNumber"],"0304":["CS","ImageBoxLayoutType"],"0306":["US","ImageBoxTileHorizontalDimension"],"0308":["US","ImageBoxTileVerticalDimension"],"0310":["CS","ImageBoxScrollDirection"],"0312":["CS","ImageBoxSmallScrollType"],"0314":["US","ImageBoxSmallScrollAmount"],"0316":["CS","ImageBoxLargeScrollType"],"0318":["US","ImageBoxLargeScrollAmount"],"0320":["US","ImageBoxOverlapPriority"],"0330":["FD","CineRelativeToRealTime"],"0400":["SQ","FilterOperationsSequence"],"0402":["CS","FilterByCategory"],"0404":["CS","FilterByAttributePresence"],"0406":["CS","FilterByOperator"],"0420":["US","StructuredDisplayBackgroundCIELabValue"],"0421":["US","EmptyImageBoxCIELabValue"],"0422":["SQ","StructuredDisplayImageBoxSequence"],"0424":["SQ","StructuredDisplayTextBoxSequence"],"0427":["SQ","ReferencedFirstFrameSequence"],"0430":["SQ","ImageBoxSynchronizationSequence"],"0432":["US","SynchronizedImageBoxList"],"0434":["CS","TypeOfSynchronization"],"0500":["CS","BlendingOperationType"],"0510":["CS","ReformattingOperationType"],"0512":["FD","ReformattingThickness"],"0514":["FD","ReformattingInterval"],"0516":["CS","ReformattingOperationInitialViewDirection"],"0520":["CS","ThreeDRenderingType"],"0600":["SQ","SortingOperationsSequence"],"0602":["CS","SortByCategory"],"0604":["CS","SortingDirection"],"0700":["CS","DisplaySetPatientOrientation"],"0702":["CS","VOIType"],"0704":["CS","PseudoColorType"],"0705":["SQ","PseudoColorPaletteInstanceReferenceSequence"],"0706":["CS","ShowGrayscaleInverted"],"0710":["CS","ShowImageTrueSizeFlag"],"0712":["CS","ShowGraphicAnnotationFlag"],"0714":["CS","ShowPatientDemographicsFlag"],"0716":["CS","ShowAcquisitionTechniquesFlag"],"0717":["CS","DisplaySetHorizontalJustification"],"0718":["CS","DisplaySetVerticalJustification"]},"0074":{"0120":["FD","ContinuationStartMeterset"],"0121":["FD","ContinuationEndMeterset"],1e3:["CS","ProcedureStepState"],1002:["SQ","ProcedureStepProgressInformationSequence"],1004:["DS","ProcedureStepProgress"],1006:["ST","ProcedureStepProgressDescription"],1008:["SQ","ProcedureStepCommunicationsURISequence"],"100A":["ST","ContactURI"],"100C":["LO","ContactDisplayName"],"100E":["SQ","ProcedureStepDiscontinuationReasonCodeSequence"],1020:["SQ","BeamTaskSequence"],1022:["CS","BeamTaskType"],1024:["IS","BeamOrderIndexTrial"],1026:["FD","TableTopVerticalAdjustedPosition"],1027:["FD","TableTopLongitudinalAdjustedPosition"],1028:["FD","TableTopLateralAdjustedPosition"],"102A":["FD","PatientSupportAdjustedAngle"],"102B":["FD","TableTopEccentricAdjustedAngle"],"102C":["FD","TableTopPitchAdjustedAngle"],"102D":["FD","TableTopRollAdjustedAngle"],1030:["SQ","DeliveryVerificationImageSequence"],1032:["CS","VerificationImageTiming"],1034:["CS","DoubleExposureFlag"],1036:["CS","DoubleExposureOrdering"],1038:["DS","DoubleExposureMetersetTrial"],"103A":["DS","DoubleExposureFieldDeltaTrial"],1040:["SQ","RelatedReferenceRTImageSequence"],1042:["SQ","GeneralMachineVerificationSequence"],1044:["SQ","ConventionalMachineVerificationSequence"],1046:["SQ","IonMachineVerificationSequence"],1048:["SQ","FailedAttributesSequence"],"104A":["SQ","OverriddenAttributesSequence"],"104C":["SQ","ConventionalControlPointVerificationSequence"],"104E":["SQ","IonControlPointVerificationSequence"],1050:["SQ","AttributeOccurrenceSequence"],1052:["AT","AttributeOccurrencePointer"],1054:["UL","AttributeItemSelector"],1056:["LO","AttributeOccurrencePrivateCreator"],1057:["IS","SelectorSequencePointerItems"],1200:["CS","ScheduledProcedureStepPriority"],1202:["LO","WorklistLabel"],1204:["LO","ProcedureStepLabel"],1210:["SQ","ScheduledProcessingParametersSequence"],1212:["SQ","PerformedProcessingParametersSequence"],1216:["SQ","UnifiedProcedureStepPerformedProcedureSequence"],1220:["SQ","RelatedProcedureStepSequence"],1222:["LO","ProcedureStepRelationshipType"],1224:["SQ","ReplacedProcedureStepSequence"],1230:["LO","DeletionLock"],1234:["AE","ReceivingAE"],1236:["AE","RequestingAE"],1238:["LT","ReasonForCancellation"],1242:["CS","SCPStatus"],1244:["CS","SubscriptionListStatus"],1246:["CS","UnifiedProcedureStepListStatus"],1324:["UL","BeamOrderIndex"],1338:["FD","DoubleExposureMeterset"],"133A":["FD","DoubleExposureFieldDelta"]},"0076":{"0001":["LO","ImplantAssemblyTemplateName"],"0003":["LO","ImplantAssemblyTemplateIssuer"],"0006":["LO","ImplantAssemblyTemplateVersion"],"0008":["SQ","ReplacedImplantAssemblyTemplateSequence"],"000A":["CS","ImplantAssemblyTemplateType"],"000C":["SQ","OriginalImplantAssemblyTemplateSequence"],"000E":["SQ","DerivationImplantAssemblyTemplateSequence"],"0010":["SQ","ImplantAssemblyTemplateTargetAnatomySequence"],"0020":["SQ","ProcedureTypeCodeSequence"],"0030":["LO","SurgicalTechnique"],"0032":["SQ","ComponentTypesSequence"],"0034":["CS","ComponentTypeCodeSequence"],"0036":["CS","ExclusiveComponentType"],"0038":["CS","MandatoryComponentType"],"0040":["SQ","ComponentSequence"],"0055":["US","ComponentID"],"0060":["SQ","ComponentAssemblySequence"],"0070":["US","Component1ReferencedID"],"0080":["US","Component1ReferencedMatingFeatureSetID"],"0090":["US","Component1ReferencedMatingFeatureID"],"00A0":["US","Component2ReferencedID"],"00B0":["US","Component2ReferencedMatingFeatureSetID"],"00C0":["US","Component2ReferencedMatingFeatureID"]},"0078":{"0001":["LO","ImplantTemplateGroupName"],"0010":["ST","ImplantTemplateGroupDescription"],"0020":["LO","ImplantTemplateGroupIssuer"],"0024":["LO","ImplantTemplateGroupVersion"],"0026":["SQ","ReplacedImplantTemplateGroupSequence"],"0028":["SQ","ImplantTemplateGroupTargetAnatomySequence"],"002A":["SQ","ImplantTemplateGroupMembersSequence"],"002E":["US","ImplantTemplateGroupMemberID"],"0050":["FD","ThreeDImplantTemplateGroupMemberMatchingPoint"],"0060":["FD","ThreeDImplantTemplateGroupMemberMatchingAxes"],"0070":["SQ","ImplantTemplateGroupMemberMatching2DCoordinatesSequence"],"0090":["FD","TwoDImplantTemplateGroupMemberMatchingPoint"],"00A0":["FD","TwoDImplantTemplateGroupMemberMatchingAxes"],"00B0":["SQ","ImplantTemplateGroupVariationDimensionSequence"],"00B2":["LO","ImplantTemplateGroupVariationDimensionName"],"00B4":["SQ","ImplantTemplateGroupVariationDimensionRankSequence"],"00B6":["US","ReferencedImplantTemplateGroupMemberID"],"00B8":["US","ImplantTemplateGroupVariationDimensionRank"]},"0088":{"0130":["SH","StorageMediaFileSetID"],"0140":["UI","StorageMediaFileSetUID"],"0200":["SQ","IconImageSequence"],"0904":["LO","TopicTitle"],"0906":["ST","TopicSubject"],"0910":["LO","TopicAuthor"],"0912":["LO","TopicKeywords"]},"0100":{"0410":["CS","SOPInstanceStatus"],"0420":["DT","SOPAuthorizationDateTime"],"0424":["LT","SOPAuthorizationComment"],"0426":["LO","AuthorizationEquipmentCertificationNumber"]},"0400":{"0005":["US","MACIDNumber"],"0010":["UI","MACCalculationTransferSyntaxUID"],"0015":["CS","MACAlgorithm"],"0020":["AT","DataElementsSigned"],"0100":["UI","DigitalSignatureUID"],"0105":["DT","DigitalSignatureDateTime"],"0110":["CS","CertificateType"],"0115":["OB","CertificateOfSigner"],"0120":["OB","Signature"],"0305":["CS","CertifiedTimestampType"],"0310":["OB","CertifiedTimestamp"],"0401":["SQ","DigitalSignaturePurposeCodeSequence"],"0402":["SQ","ReferencedDigitalSignatureSequence"],"0403":["SQ","ReferencedSOPInstanceMACSequence"],"0404":["OB","MAC"],"0500":["SQ","EncryptedAttributesSequence"],"0510":["UI","EncryptedContentTransferSyntaxUID"],"0520":["OB","EncryptedContent"],"0550":["SQ","ModifiedAttributesSequence"],"0561":["SQ","OriginalAttributesSequence"],"0562":["DT","AttributeModificationDateTime"],"0563":["LO","ModifyingSystem"],"0564":["LO","SourceOfPreviousValues"],"0565":["CS","ReasonForTheAttributeModification"]},2e3:{"0010":["IS","NumberOfCopies"],"001E":["SQ","PrinterConfigurationSequence"],"0020":["CS","PrintPriority"],"0030":["CS","MediumType"],"0040":["CS","FilmDestination"],"0050":["LO","FilmSessionLabel"],"0060":["IS","MemoryAllocation"],"0061":["IS","MaximumMemoryAllocation"],"0062":["CS","ColorImagePrintingFlag"],"0063":["CS","CollationFlag"],"0065":["CS","AnnotationFlag"],"0067":["CS","ImageOverlayFlag"],"0069":["CS","PresentationLUTFlag"],"006A":["CS","ImageBoxPresentationLUTFlag"],"00A0":["US","MemoryBitDepth"],"00A1":["US","PrintingBitDepth"],"00A2":["SQ","MediaInstalledSequence"],"00A4":["SQ","OtherMediaAvailableSequence"],"00A8":["SQ","SupportedImageDisplayFormatsSequence"],"0500":["SQ","ReferencedFilmBoxSequence"],"0510":["SQ","ReferencedStoredPrintSequence"]},2010:{"0010":["ST","ImageDisplayFormat"],"0030":["CS","AnnotationDisplayFormatID"],"0040":["CS","FilmOrientation"],"0050":["CS","FilmSizeID"],"0052":["CS","PrinterResolutionID"],"0054":["CS","DefaultPrinterResolutionID"],"0060":["CS","MagnificationType"],"0080":["CS","SmoothingType"],"00A6":["CS","DefaultMagnificationType"],"00A7":["CS","OtherMagnificationTypesAvailable"],"00A8":["CS","DefaultSmoothingType"],"00A9":["CS","OtherSmoothingTypesAvailable"],"0100":["CS","BorderDensity"],"0110":["CS","EmptyImageDensity"],"0120":["US","MinDensity"],"0130":["US","MaxDensity"],"0140":["CS","Trim"],"0150":["ST","ConfigurationInformation"],"0152":["LT","ConfigurationInformationDescription"],"0154":["IS","MaximumCollatedFilms"],"015E":["US","Illumination"],"0160":["US","ReflectedAmbientLight"],"0376":["DS","PrinterPixelSpacing"],"0500":["SQ","ReferencedFilmSessionSequence"],"0510":["SQ","ReferencedImageBoxSequence"],"0520":["SQ","ReferencedBasicAnnotationBoxSequence"]},2020:{"0010":["US","ImageBoxPosition"],"0020":["CS","Polarity"],"0030":["DS","RequestedImageSize"],"0040":["CS","RequestedDecimateCropBehavior"],"0050":["CS","RequestedResolutionID"],"00A0":["CS","RequestedImageSizeFlag"],"00A2":["CS","DecimateCropResult"],"0110":["SQ","BasicGrayscaleImageSequence"],"0111":["SQ","BasicColorImageSequence"],"0130":["SQ","ReferencedImageOverlayBoxSequence"],"0140":["SQ","ReferencedVOILUTBoxSequence"]},2030:{"0010":["US","AnnotationPosition"],"0020":["LO","TextString"]},2040:{"0010":["SQ","ReferencedOverlayPlaneSequence"],"0011":["US","ReferencedOverlayPlaneGroups"],"0020":["SQ","OverlayPixelDataSequence"],"0060":["CS","OverlayMagnificationType"],"0070":["CS","OverlaySmoothingType"],"0072":["CS","OverlayOrImageMagnification"],"0074":["US","MagnifyToNumberOfColumns"],"0080":["CS","OverlayForegroundDensity"],"0082":["CS","OverlayBackgroundDensity"],"0090":["CS","OverlayMode"],"0100":["CS","ThresholdDensity"],"0500":["SQ","ReferencedImageBoxSequenceRetired"]},2050:{"0010":["SQ","PresentationLUTSequence"],"0020":["CS","PresentationLUTShape"],"0500":["SQ","ReferencedPresentationLUTSequence"]},2100:{"0010":["SH","PrintJobID"],"0020":["CS","ExecutionStatus"],"0030":["CS","ExecutionStatusInfo"],"0040":["DA","CreationDate"],"0050":["TM","CreationTime"],"0070":["AE","Originator"],"0140":["AE","DestinationAE"],"0160":["SH","OwnerID"],"0170":["IS","NumberOfFilms"],"0500":["SQ","ReferencedPrintJobSequencePullStoredPrint"]},2110:{"0010":["CS","PrinterStatus"],"0020":["CS","PrinterStatusInfo"],"0030":["LO","PrinterName"],"0099":["SH","PrintQueueID"]},2120:{"0010":["CS","QueueStatus"],"0050":["SQ","PrintJobDescriptionSequence"],"0070":["SQ","ReferencedPrintJobSequence"]},2130:{"0010":["SQ","PrintManagementCapabilitiesSequence"],"0015":["SQ","PrinterCharacteristicsSequence"],"0030":["SQ","FilmBoxContentSequence"],"0040":["SQ","ImageBoxContentSequence"],"0050":["SQ","AnnotationContentSequence"],"0060":["SQ","ImageOverlayBoxContentSequence"],"0080":["SQ","PresentationLUTContentSequence"],"00A0":["SQ","ProposedStudySequence"],"00C0":["SQ","OriginalImageSequence"]},2200:{"0001":["CS","LabelUsingInformationExtractedFromInstances"],"0002":["UT","LabelText"],"0003":["CS","LabelStyleSelection"],"0004":["LT","MediaDisposition"],"0005":["LT","BarcodeValue"],"0006":["CS","BarcodeSymbology"],"0007":["CS","AllowMediaSplitting"],"0008":["CS","IncludeNonDICOMObjects"],"0009":["CS","IncludeDisplayApplication"],"000A":["CS","PreserveCompositeInstancesAfterMediaCreation"],"000B":["US","TotalNumberOfPiecesOfMediaCreated"],"000C":["LO","RequestedMediaApplicationProfile"],"000D":["SQ","ReferencedStorageMediaSequence"],"000E":["AT","FailureAttributes"],"000F":["CS","AllowLossyCompression"],"0020":["CS","RequestPriority"]},3002:{"0002":["SH","RTImageLabel"],"0003":["LO","RTImageName"],"0004":["ST","RTImageDescription"],"000A":["CS","ReportedValuesOrigin"],"000C":["CS","RTImagePlane"],"000D":["DS","XRayImageReceptorTranslation"],"000E":["DS","XRayImageReceptorAngle"],"0010":["DS","RTImageOrientation"],"0011":["DS","ImagePlanePixelSpacing"],"0012":["DS","RTImagePosition"],"0020":["SH","RadiationMachineName"],"0022":["DS","RadiationMachineSAD"],"0024":["DS","RadiationMachineSSD"],"0026":["DS","RTImageSID"],"0028":["DS","SourceToReferenceObjectDistance"],"0029":["IS","FractionNumber"],"0030":["SQ","ExposureSequence"],"0032":["DS","MetersetExposure"],"0034":["DS","DiaphragmPosition"],"0040":["SQ","FluenceMapSequence"],"0041":["CS","FluenceDataSource"],"0042":["DS","FluenceDataScale"],"0050":["SQ","PrimaryFluenceModeSequence"],"0051":["CS","FluenceMode"],"0052":["SH","FluenceModeID"]},3004:{"0001":["CS","DVHType"],"0002":["CS","DoseUnits"],"0004":["CS","DoseType"],"0006":["LO","DoseComment"],"0008":["DS","NormalizationPoint"],"000A":["CS","DoseSummationType"],"000C":["DS","GridFrameOffsetVector"],"000E":["DS","DoseGridScaling"],"0010":["SQ","RTDoseROISequence"],"0012":["DS","DoseValue"],"0014":["CS","TissueHeterogeneityCorrection"],"0040":["DS","DVHNormalizationPoint"],"0042":["DS","DVHNormalizationDoseValue"],"0050":["SQ","DVHSequence"],"0052":["DS","DVHDoseScaling"],"0054":["CS","DVHVolumeUnits"],"0056":["IS","DVHNumberOfBins"],"0058":["DS","DVHData"],"0060":["SQ","DVHReferencedROISequence"],"0062":["CS","DVHROIContributionType"],"0070":["DS","DVHMinimumDose"],"0072":["DS","DVHMaximumDose"],"0074":["DS","DVHMeanDose"]},3006:{"0002":["SH","StructureSetLabel"],"0004":["LO","StructureSetName"],"0006":["ST","StructureSetDescription"],"0008":["DA","StructureSetDate"],"0009":["TM","StructureSetTime"],"0010":["SQ","ReferencedFrameOfReferenceSequence"],"0012":["SQ","RTReferencedStudySequence"],"0014":["SQ","RTReferencedSeriesSequence"],"0016":["SQ","ContourImageSequence"],"0020":["SQ","StructureSetROISequence"],"0022":["IS","ROINumber"],"0024":["UI","ReferencedFrameOfReferenceUID"],"0026":["LO","ROIName"],"0028":["ST","ROIDescription"],"002A":["IS","ROIDisplayColor"],"002C":["DS","ROIVolume"],"0030":["SQ","RTRelatedROISequence"],"0033":["CS","RTROIRelationship"],"0036":["CS","ROIGenerationAlgorithm"],"0038":["LO","ROIGenerationDescription"],"0039":["SQ","ROIContourSequence"],"0040":["SQ","ContourSequence"],"0042":["CS","ContourGeometricType"],"0044":["DS","ContourSlabThickness"],"0045":["DS","ContourOffsetVector"],"0046":["IS","NumberOfContourPoints"],"0048":["IS","ContourNumber"],"0049":["IS","AttachedContours"],"0050":["DS","ContourData"],"0080":["SQ","RTROIObservationsSequence"],"0082":["IS","ObservationNumber"],"0084":["IS","ReferencedROINumber"],"0085":["SH","ROIObservationLabel"],"0086":["SQ","RTROIIdentificationCodeSequence"],"0088":["ST","ROIObservationDescription"],"00A0":["SQ","RelatedRTROIObservationsSequence"],"00A4":["CS","RTROIInterpretedType"],"00A6":["PN","ROIInterpreter"],"00B0":["SQ","ROIPhysicalPropertiesSequence"],"00B2":["CS","ROIPhysicalProperty"],"00B4":["DS","ROIPhysicalPropertyValue"],"00B6":["SQ","ROIElementalCompositionSequence"],"00B7":["US","ROIElementalCompositionAtomicNumber"],"00B8":["FL","ROIElementalCompositionAtomicMassFraction"],"00C0":["SQ","FrameOfReferenceRelationshipSequence"],"00C2":["UI","RelatedFrameOfReferenceUID"],"00C4":["CS","FrameOfReferenceTransformationType"],"00C6":["DS","FrameOfReferenceTransformationMatrix"],"00C8":["LO","FrameOfReferenceTransformationComment"]},3008:{"0010":["SQ","MeasuredDoseReferenceSequence"],"0012":["ST","MeasuredDoseDescription"],"0014":["CS","MeasuredDoseType"],"0016":["DS","MeasuredDoseValue"],"0020":["SQ","TreatmentSessionBeamSequence"],"0021":["SQ","TreatmentSessionIonBeamSequence"],"0022":["IS","CurrentFractionNumber"],"0024":["DA","TreatmentControlPointDate"],"0025":["TM","TreatmentControlPointTime"],"002A":["CS","TreatmentTerminationStatus"],"002B":["SH","TreatmentTerminationCode"],"002C":["CS","TreatmentVerificationStatus"],"0030":["SQ","ReferencedTreatmentRecordSequence"],"0032":["DS","SpecifiedPrimaryMeterset"],"0033":["DS","SpecifiedSecondaryMeterset"],"0036":["DS","DeliveredPrimaryMeterset"],"0037":["DS","DeliveredSecondaryMeterset"],"003A":["DS","SpecifiedTreatmentTime"],"003B":["DS","DeliveredTreatmentTime"],"0040":["SQ","ControlPointDeliverySequence"],"0041":["SQ","IonControlPointDeliverySequence"],"0042":["DS","SpecifiedMeterset"],"0044":["DS","DeliveredMeterset"],"0045":["FL","MetersetRateSet"],"0046":["FL","MetersetRateDelivered"],"0047":["FL","ScanSpotMetersetsDelivered"],"0048":["DS","DoseRateDelivered"],"0050":["SQ","TreatmentSummaryCalculatedDoseReferenceSequence"],"0052":["DS","CumulativeDoseToDoseReference"],"0054":["DA","FirstTreatmentDate"],"0056":["DA","MostRecentTreatmentDate"],"005A":["IS","NumberOfFractionsDelivered"],"0060":["SQ","OverrideSequence"],"0061":["AT","ParameterSequencePointer"],"0062":["AT","OverrideParameterPointer"],"0063":["IS","ParameterItemIndex"],"0064":["IS","MeasuredDoseReferenceNumber"],"0065":["AT","ParameterPointer"],"0066":["ST","OverrideReason"],"0068":["SQ","CorrectedParameterSequence"],"006A":["FL","CorrectionValue"],"0070":["SQ","CalculatedDoseReferenceSequence"],"0072":["IS","CalculatedDoseReferenceNumber"],"0074":["ST","CalculatedDoseReferenceDescription"],"0076":["DS","CalculatedDoseReferenceDoseValue"],"0078":["DS","StartMeterset"],"007A":["DS","EndMeterset"],"0080":["SQ","ReferencedMeasuredDoseReferenceSequence"],"0082":["IS","ReferencedMeasuredDoseReferenceNumber"],"0090":["SQ","ReferencedCalculatedDoseReferenceSequence"],"0092":["IS","ReferencedCalculatedDoseReferenceNumber"],"00A0":["SQ","BeamLimitingDeviceLeafPairsSequence"],"00B0":["SQ","RecordedWedgeSequence"],"00C0":["SQ","RecordedCompensatorSequence"],"00D0":["SQ","RecordedBlockSequence"],"00E0":["SQ","TreatmentSummaryMeasuredDoseReferenceSequence"],"00F0":["SQ","RecordedSnoutSequence"],"00F2":["SQ","RecordedRangeShifterSequence"],"00F4":["SQ","RecordedLateralSpreadingDeviceSequence"],"00F6":["SQ","RecordedRangeModulatorSequence"],"0100":["SQ","RecordedSourceSequence"],"0105":["LO","SourceSerialNumber"],"0110":["SQ","TreatmentSessionApplicationSetupSequence"],"0116":["CS","ApplicationSetupCheck"],"0120":["SQ","RecordedBrachyAccessoryDeviceSequence"],"0122":["IS","ReferencedBrachyAccessoryDeviceNumber"],"0130":["SQ","RecordedChannelSequence"],"0132":["DS","SpecifiedChannelTotalTime"],"0134":["DS","DeliveredChannelTotalTime"],"0136":["IS","SpecifiedNumberOfPulses"],"0138":["IS","DeliveredNumberOfPulses"],"013A":["DS","SpecifiedPulseRepetitionInterval"],"013C":["DS","DeliveredPulseRepetitionInterval"],"0140":["SQ","RecordedSourceApplicatorSequence"],"0142":["IS","ReferencedSourceApplicatorNumber"],"0150":["SQ","RecordedChannelShieldSequence"],"0152":["IS","ReferencedChannelShieldNumber"],"0160":["SQ","BrachyControlPointDeliveredSequence"],"0162":["DA","SafePositionExitDate"],"0164":["TM","SafePositionExitTime"],"0166":["DA","SafePositionReturnDate"],"0168":["TM","SafePositionReturnTime"],"0200":["CS","CurrentTreatmentStatus"],"0202":["ST","TreatmentStatusComment"],"0220":["SQ","FractionGroupSummarySequence"],"0223":["IS","ReferencedFractionNumber"],"0224":["CS","FractionGroupType"],"0230":["CS","BeamStopperPosition"],"0240":["SQ","FractionStatusSummarySequence"],"0250":["DA","TreatmentDate"],"0251":["TM","TreatmentTime"]},"300A":{"0002":["SH","RTPlanLabel"],"0003":["LO","RTPlanName"],"0004":["ST","RTPlanDescription"],"0006":["DA","RTPlanDate"],"0007":["TM","RTPlanTime"],"0009":["LO","TreatmentProtocols"],"000A":["CS","PlanIntent"],"000B":["LO","TreatmentSites"],"000C":["CS","RTPlanGeometry"],"000E":["ST","PrescriptionDescription"],"0010":["SQ","DoseReferenceSequence"],"0012":["IS","DoseReferenceNumber"],"0013":["UI","DoseReferenceUID"],"0014":["CS","DoseReferenceStructureType"],"0015":["CS","NominalBeamEnergyUnit"],"0016":["LO","DoseReferenceDescription"],"0018":["DS","DoseReferencePointCoordinates"],"001A":["DS","NominalPriorDose"],"0020":["CS","DoseReferenceType"],"0021":["DS","ConstraintWeight"],"0022":["DS","DeliveryWarningDose"],"0023":["DS","DeliveryMaximumDose"],"0025":["DS","TargetMinimumDose"],"0026":["DS","TargetPrescriptionDose"],"0027":["DS","TargetMaximumDose"],"0028":["DS","TargetUnderdoseVolumeFraction"],"002A":["DS","OrganAtRiskFullVolumeDose"],"002B":["DS","OrganAtRiskLimitDose"],"002C":["DS","OrganAtRiskMaximumDose"],"002D":["DS","OrganAtRiskOverdoseVolumeFraction"],"0040":["SQ","ToleranceTableSequence"],"0042":["IS","ToleranceTableNumber"],"0043":["SH","ToleranceTableLabel"],"0044":["DS","GantryAngleTolerance"],"0046":["DS","BeamLimitingDeviceAngleTolerance"],"0048":["SQ","BeamLimitingDeviceToleranceSequence"],"004A":["DS","BeamLimitingDevicePositionTolerance"],"004B":["FL","SnoutPositionTolerance"],"004C":["DS","PatientSupportAngleTolerance"],"004E":["DS","TableTopEccentricAngleTolerance"],"004F":["FL","TableTopPitchAngleTolerance"],"0050":["FL","TableTopRollAngleTolerance"],"0051":["DS","TableTopVerticalPositionTolerance"],"0052":["DS","TableTopLongitudinalPositionTolerance"],"0053":["DS","TableTopLateralPositionTolerance"],"0055":["CS","RTPlanRelationship"],"0070":["SQ","FractionGroupSequence"],"0071":["IS","FractionGroupNumber"],"0072":["LO","FractionGroupDescription"],"0078":["IS","NumberOfFractionsPlanned"],"0079":["IS","NumberOfFractionPatternDigitsPerDay"],"007A":["IS","RepeatFractionCycleLength"],"007B":["LT","FractionPattern"],"0080":["IS","NumberOfBeams"],"0082":["DS","BeamDoseSpecificationPoint"],"0084":["DS","BeamDose"],"0086":["DS","BeamMeterset"],"0088":["FL","BeamDosePointDepth"],"0089":["FL","BeamDosePointEquivalentDepth"],"008A":["FL","BeamDosePointSSD"],"00A0":["IS","NumberOfBrachyApplicationSetups"],"00A2":["DS","BrachyApplicationSetupDoseSpecificationPoint"],"00A4":["DS","BrachyApplicationSetupDose"],"00B0":["SQ","BeamSequence"],"00B2":["SH","TreatmentMachineName"],"00B3":["CS","PrimaryDosimeterUnit"],"00B4":["DS","SourceAxisDistance"],"00B6":["SQ","BeamLimitingDeviceSequence"],"00B8":["CS","RTBeamLimitingDeviceType"],"00BA":["DS","SourceToBeamLimitingDeviceDistance"],"00BB":["FL","IsocenterToBeamLimitingDeviceDistance"],"00BC":["IS","NumberOfLeafJawPairs"],"00BE":["DS","LeafPositionBoundaries"],"00C0":["IS","BeamNumber"],"00C2":["LO","BeamName"],"00C3":["ST","BeamDescription"],"00C4":["CS","BeamType"],"00C6":["CS","RadiationType"],"00C7":["CS","HighDoseTechniqueType"],"00C8":["IS","ReferenceImageNumber"],"00CA":["SQ","PlannedVerificationImageSequence"],"00CC":["LO","ImagingDeviceSpecificAcquisitionParameters"],"00CE":["CS","TreatmentDeliveryType"],"00D0":["IS","NumberOfWedges"],"00D1":["SQ","WedgeSequence"],"00D2":["IS","WedgeNumber"],"00D3":["CS","WedgeType"],"00D4":["SH","WedgeID"],"00D5":["IS","WedgeAngle"],"00D6":["DS","WedgeFactor"],"00D7":["FL","TotalWedgeTrayWaterEquivalentThickness"],"00D8":["DS","WedgeOrientation"],"00D9":["FL","IsocenterToWedgeTrayDistance"],"00DA":["DS","SourceToWedgeTrayDistance"],"00DB":["FL","WedgeThinEdgePosition"],"00DC":["SH","BolusID"],"00DD":["ST","BolusDescription"],"00E0":["IS","NumberOfCompensators"],"00E1":["SH","MaterialID"],"00E2":["DS","TotalCompensatorTrayFactor"],"00E3":["SQ","CompensatorSequence"],"00E4":["IS","CompensatorNumber"],"00E5":["SH","CompensatorID"],"00E6":["DS","SourceToCompensatorTrayDistance"],"00E7":["IS","CompensatorRows"],"00E8":["IS","CompensatorColumns"],"00E9":["DS","CompensatorPixelSpacing"],"00EA":["DS","CompensatorPosition"],"00EB":["DS","CompensatorTransmissionData"],"00EC":["DS","CompensatorThicknessData"],"00ED":["IS","NumberOfBoli"],"00EE":["CS","CompensatorType"],"00F0":["IS","NumberOfBlocks"],"00F2":["DS","TotalBlockTrayFactor"],"00F3":["FL","TotalBlockTrayWaterEquivalentThickness"],"00F4":["SQ","BlockSequence"],"00F5":["SH","BlockTrayID"],"00F6":["DS","SourceToBlockTrayDistance"],"00F7":["FL","IsocenterToBlockTrayDistance"],"00F8":["CS","BlockType"],"00F9":["LO","AccessoryCode"],"00FA":["CS","BlockDivergence"],"00FB":["CS","BlockMountingPosition"],"00FC":["IS","BlockNumber"],"00FE":["LO","BlockName"],"0100":["DS","BlockThickness"],"0102":["DS","BlockTransmission"],"0104":["IS","BlockNumberOfPoints"],"0106":["DS","BlockData"],"0107":["SQ","ApplicatorSequence"],"0108":["SH","ApplicatorID"],"0109":["CS","ApplicatorType"],"010A":["LO","ApplicatorDescription"],"010C":["DS","CumulativeDoseReferenceCoefficient"],"010E":["DS","FinalCumulativeMetersetWeight"],"0110":["IS","NumberOfControlPoints"],"0111":["SQ","ControlPointSequence"],"0112":["IS","ControlPointIndex"],"0114":["DS","NominalBeamEnergy"],"0115":["DS","DoseRateSet"],"0116":["SQ","WedgePositionSequence"],"0118":["CS","WedgePosition"],"011A":["SQ","BeamLimitingDevicePositionSequence"],"011C":["DS","LeafJawPositions"],"011E":["DS","GantryAngle"],"011F":["CS","GantryRotationDirection"],"0120":["DS","BeamLimitingDeviceAngle"],"0121":["CS","BeamLimitingDeviceRotationDirection"],"0122":["DS","PatientSupportAngle"],"0123":["CS","PatientSupportRotationDirection"],"0124":["DS","TableTopEccentricAxisDistance"],"0125":["DS","TableTopEccentricAngle"],"0126":["CS","TableTopEccentricRotationDirection"],"0128":["DS","TableTopVerticalPosition"],"0129":["DS","TableTopLongitudinalPosition"],"012A":["DS","TableTopLateralPosition"],"012C":["DS","IsocenterPosition"],"012E":["DS","SurfaceEntryPoint"],"0130":["DS","SourceToSurfaceDistance"],"0134":["DS","CumulativeMetersetWeight"],"0140":["FL","TableTopPitchAngle"],"0142":["CS","TableTopPitchRotationDirection"],"0144":["FL","TableTopRollAngle"],"0146":["CS","TableTopRollRotationDirection"],"0148":["FL","HeadFixationAngle"],"014A":["FL","GantryPitchAngle"],"014C":["CS","GantryPitchRotationDirection"],"014E":["FL","GantryPitchAngleTolerance"],"0180":["SQ","PatientSetupSequence"],"0182":["IS","PatientSetupNumber"],"0183":["LO","PatientSetupLabel"],"0184":["LO","PatientAdditionalPosition"],"0190":["SQ","FixationDeviceSequence"],"0192":["CS","FixationDeviceType"],"0194":["SH","FixationDeviceLabel"],"0196":["ST","FixationDeviceDescription"],"0198":["SH","FixationDevicePosition"],"0199":["FL","FixationDevicePitchAngle"],"019A":["FL","FixationDeviceRollAngle"],"01A0":["SQ","ShieldingDeviceSequence"],"01A2":["CS","ShieldingDeviceType"],"01A4":["SH","ShieldingDeviceLabel"],"01A6":["ST","ShieldingDeviceDescription"],"01A8":["SH","ShieldingDevicePosition"],"01B0":["CS","SetupTechnique"],"01B2":["ST","SetupTechniqueDescription"],"01B4":["SQ","SetupDeviceSequence"],"01B6":["CS","SetupDeviceType"],"01B8":["SH","SetupDeviceLabel"],"01BA":["ST","SetupDeviceDescription"],"01BC":["DS","SetupDeviceParameter"],"01D0":["ST","SetupReferenceDescription"],"01D2":["DS","TableTopVerticalSetupDisplacement"],"01D4":["DS","TableTopLongitudinalSetupDisplacement"],"01D6":["DS","TableTopLateralSetupDisplacement"],"0200":["CS","BrachyTreatmentTechnique"],"0202":["CS","BrachyTreatmentType"],"0206":["SQ","TreatmentMachineSequence"],"0210":["SQ","SourceSequence"],"0212":["IS","SourceNumber"],"0214":["CS","SourceType"],"0216":["LO","SourceManufacturer"],"0218":["DS","ActiveSourceDiameter"],"021A":["DS","ActiveSourceLength"],"0222":["DS","SourceEncapsulationNominalThickness"],"0224":["DS","SourceEncapsulationNominalTransmission"],"0226":["LO","SourceIsotopeName"],"0228":["DS","SourceIsotopeHalfLife"],"0229":["CS","SourceStrengthUnits"],"022A":["DS","ReferenceAirKermaRate"],"022B":["DS","SourceStrength"],"022C":["DA","SourceStrengthReferenceDate"],"022E":["TM","SourceStrengthReferenceTime"],"0230":["SQ","ApplicationSetupSequence"],"0232":["CS","ApplicationSetupType"],"0234":["IS","ApplicationSetupNumber"],"0236":["LO","ApplicationSetupName"],"0238":["LO","ApplicationSetupManufacturer"],"0240":["IS","TemplateNumber"],"0242":["SH","TemplateType"],"0244":["LO","TemplateName"],"0250":["DS","TotalReferenceAirKerma"],"0260":["SQ","BrachyAccessoryDeviceSequence"],"0262":["IS","BrachyAccessoryDeviceNumber"],"0263":["SH","BrachyAccessoryDeviceID"],"0264":["CS","BrachyAccessoryDeviceType"],"0266":["LO","BrachyAccessoryDeviceName"],"026A":["DS","BrachyAccessoryDeviceNominalThickness"],"026C":["DS","BrachyAccessoryDeviceNominalTransmission"],"0280":["SQ","ChannelSequence"],"0282":["IS","ChannelNumber"],"0284":["DS","ChannelLength"],"0286":["DS","ChannelTotalTime"],"0288":["CS","SourceMovementType"],"028A":["IS","NumberOfPulses"],"028C":["DS","PulseRepetitionInterval"],"0290":["IS","SourceApplicatorNumber"],"0291":["SH","SourceApplicatorID"],"0292":["CS","SourceApplicatorType"],"0294":["LO","SourceApplicatorName"],"0296":["DS","SourceApplicatorLength"],"0298":["LO","SourceApplicatorManufacturer"],"029C":["DS","SourceApplicatorWallNominalThickness"],"029E":["DS","SourceApplicatorWallNominalTransmission"],"02A0":["DS","SourceApplicatorStepSize"],"02A2":["IS","TransferTubeNumber"],"02A4":["DS","TransferTubeLength"],"02B0":["SQ","ChannelShieldSequence"],"02B2":["IS","ChannelShieldNumber"],"02B3":["SH","ChannelShieldID"],"02B4":["LO","ChannelShieldName"],"02B8":["DS","ChannelShieldNominalThickness"],"02BA":["DS","ChannelShieldNominalTransmission"],"02C8":["DS","FinalCumulativeTimeWeight"],"02D0":["SQ","BrachyControlPointSequence"],"02D2":["DS","ControlPointRelativePosition"],"02D4":["DS","ControlPoint3DPosition"],"02D6":["DS","CumulativeTimeWeight"],"02E0":["CS","CompensatorDivergence"],"02E1":["CS","CompensatorMountingPosition"],"02E2":["DS","SourceToCompensatorDistance"],"02E3":["FL","TotalCompensatorTrayWaterEquivalentThickness"],"02E4":["FL","IsocenterToCompensatorTrayDistance"],"02E5":["FL","CompensatorColumnOffset"],"02E6":["FL","IsocenterToCompensatorDistances"],"02E7":["FL","CompensatorRelativeStoppingPowerRatio"],"02E8":["FL","CompensatorMillingToolDiameter"],"02EA":["SQ","IonRangeCompensatorSequence"],"02EB":["LT","CompensatorDescription"],"0302":["IS","RadiationMassNumber"],"0304":["IS","RadiationAtomicNumber"],"0306":["SS","RadiationChargeState"],"0308":["CS","ScanMode"],"030A":["FL","VirtualSourceAxisDistances"],"030C":["SQ","SnoutSequence"],"030D":["FL","SnoutPosition"],"030F":["SH","SnoutID"],"0312":["IS","NumberOfRangeShifters"],"0314":["SQ","RangeShifterSequence"],"0316":["IS","RangeShifterNumber"],"0318":["SH","RangeShifterID"],"0320":["CS","RangeShifterType"],"0322":["LO","RangeShifterDescription"],"0330":["IS","NumberOfLateralSpreadingDevices"],"0332":["SQ","LateralSpreadingDeviceSequence"],"0334":["IS","LateralSpreadingDeviceNumber"],"0336":["SH","LateralSpreadingDeviceID"],"0338":["CS","LateralSpreadingDeviceType"],"033A":["LO","LateralSpreadingDeviceDescription"],"033C":["FL","LateralSpreadingDeviceWaterEquivalentThickness"],"0340":["IS","NumberOfRangeModulators"],"0342":["SQ","RangeModulatorSequence"],"0344":["IS","RangeModulatorNumber"],"0346":["SH","RangeModulatorID"],"0348":["CS","RangeModulatorType"],"034A":["LO","RangeModulatorDescription"],"034C":["SH","BeamCurrentModulationID"],"0350":["CS","PatientSupportType"],"0352":["SH","PatientSupportID"],"0354":["LO","PatientSupportAccessoryCode"],"0356":["FL","FixationLightAzimuthalAngle"],"0358":["FL","FixationLightPolarAngle"],"035A":["FL","MetersetRate"],"0360":["SQ","RangeShifterSettingsSequence"],"0362":["LO","RangeShifterSetting"],"0364":["FL","IsocenterToRangeShifterDistance"],"0366":["FL","RangeShifterWaterEquivalentThickness"],"0370":["SQ","LateralSpreadingDeviceSettingsSequence"],"0372":["LO","LateralSpreadingDeviceSetting"],"0374":["FL","IsocenterToLateralSpreadingDeviceDistance"],"0380":["SQ","RangeModulatorSettingsSequence"],"0382":["FL","RangeModulatorGatingStartValue"],"0384":["FL","RangeModulatorGatingStopValue"],"0386":["FL","RangeModulatorGatingStartWaterEquivalentThickness"],"0388":["FL","RangeModulatorGatingStopWaterEquivalentThickness"],"038A":["FL","IsocenterToRangeModulatorDistance"],"0390":["SH","ScanSpotTuneID"],"0392":["IS","NumberOfScanSpotPositions"],"0394":["FL","ScanSpotPositionMap"],"0396":["FL","ScanSpotMetersetWeights"],"0398":["FL","ScanningSpotSize"],"039A":["IS","NumberOfPaintings"],"03A0":["SQ","IonToleranceTableSequence"],"03A2":["SQ","IonBeamSequence"],"03A4":["SQ","IonBeamLimitingDeviceSequence"],"03A6":["SQ","IonBlockSequence"],"03A8":["SQ","IonControlPointSequence"],"03AA":["SQ","IonWedgeSequence"],"03AC":["SQ","IonWedgePositionSequence"],"0401":["SQ","ReferencedSetupImageSequence"],"0402":["ST","SetupImageComment"],"0410":["SQ","MotionSynchronizationSequence"],"0412":["FL","ControlPointOrientation"],"0420":["SQ","GeneralAccessorySequence"],"0421":["SH","GeneralAccessoryID"],"0422":["ST","GeneralAccessoryDescription"],"0423":["CS","GeneralAccessoryType"],"0424":["IS","GeneralAccessoryNumber"],"0431":["SQ","ApplicatorGeometrySequence"],"0432":["CS","ApplicatorApertureShape"],"0433":["FL","ApplicatorOpening"],"0434":["FL","ApplicatorOpeningX"],"0435":["FL","ApplicatorOpeningY"],"0436":["FL","SourceToApplicatorMountingPositionDistance"]},"300C":{"0002":["SQ","ReferencedRTPlanSequence"],"0004":["SQ","ReferencedBeamSequence"],"0006":["IS","ReferencedBeamNumber"],"0007":["IS","ReferencedReferenceImageNumber"],"0008":["DS","StartCumulativeMetersetWeight"],"0009":["DS","EndCumulativeMetersetWeight"],"000A":["SQ","ReferencedBrachyApplicationSetupSequence"],"000C":["IS","ReferencedBrachyApplicationSetupNumber"],"000E":["IS","ReferencedSourceNumber"],"0020":["SQ","ReferencedFractionGroupSequence"],"0022":["IS","ReferencedFractionGroupNumber"],"0040":["SQ","ReferencedVerificationImageSequence"],"0042":["SQ","ReferencedReferenceImageSequence"],"0050":["SQ","ReferencedDoseReferenceSequence"],"0051":["IS","ReferencedDoseReferenceNumber"],"0055":["SQ","BrachyReferencedDoseReferenceSequence"],"0060":["SQ","ReferencedStructureSetSequence"],"006A":["IS","ReferencedPatientSetupNumber"],"0080":["SQ","ReferencedDoseSequence"],"00A0":["IS","ReferencedToleranceTableNumber"],"00B0":["SQ","ReferencedBolusSequence"],"00C0":["IS","ReferencedWedgeNumber"],"00D0":["IS","ReferencedCompensatorNumber"],"00E0":["IS","ReferencedBlockNumber"],"00F0":["IS","ReferencedControlPointIndex"],"00F2":["SQ","ReferencedControlPointSequence"],"00F4":["IS","ReferencedStartControlPointIndex"],"00F6":["IS","ReferencedStopControlPointIndex"],"0100":["IS","ReferencedRangeShifterNumber"],"0102":["IS","ReferencedLateralSpreadingDeviceNumber"],"0104":["IS","ReferencedRangeModulatorNumber"]},"300E":{"0002":["CS","ApprovalStatus"],"0004":["DA","ReviewDate"],"0005":["TM","ReviewTime"],"0008":["PN","ReviewerName"]},4e3:{"0010":["LT","Arbitrary"],4e3:["LT","TextComments"]},4008:{"0040":["SH","ResultsID"],"0042":["LO","ResultsIDIssuer"],"0050":["SQ","ReferencedInterpretationSequence"],"00FF":["CS","ReportProductionStatusTrial"],"0100":["DA","InterpretationRecordedDate"],"0101":["TM","InterpretationRecordedTime"],"0102":["PN","InterpretationRecorder"],"0103":["LO","ReferenceToRecordedSound"],"0108":["DA","InterpretationTranscriptionDate"],"0109":["TM","InterpretationTranscriptionTime"],"010A":["PN","InterpretationTranscriber"],"010B":["ST","InterpretationText"],"010C":["PN","InterpretationAuthor"],"0111":["SQ","InterpretationApproverSequence"],"0112":["DA","InterpretationApprovalDate"],"0113":["TM","InterpretationApprovalTime"],"0114":["PN","PhysicianApprovingInterpretation"],"0115":["LT","InterpretationDiagnosisDescription"],"0117":["SQ","InterpretationDiagnosisCodeSequence"],"0118":["SQ","ResultsDistributionListSequence"],"0119":["PN","DistributionName"],"011A":["LO","DistributionAddress"],"0200":["SH","InterpretationID"],"0202":["LO","InterpretationIDIssuer"],"0210":["CS","InterpretationTypeID"],"0212":["CS","InterpretationStatusID"],"0300":["ST","Impressions"],4e3:["ST","ResultsComments"]},4010:{"0001":["CS","LowEnergyDetectors"],"0002":["CS","HighEnergyDetectors"],"0004":["SQ","DetectorGeometrySequence"],1001:["SQ","ThreatROIVoxelSequence"],1004:["FL","ThreatROIBase"],1005:["FL","ThreatROIExtents"],1006:["OB","ThreatROIBitmap"],1007:["SH","RouteSegmentID"],1008:["CS","GantryType"],1009:["CS","OOIOwnerType"],"100A":["SQ","RouteSegmentSequence"],1010:["US","PotentialThreatObjectID"],1011:["SQ","ThreatSequence"],1012:["CS","ThreatCategory"],1013:["LT","ThreatCategoryDescription"],1014:["CS","ATDAbilityAssessment"],1015:["CS","ATDAssessmentFlag"],1016:["FL","ATDAssessmentProbability"],1017:["FL","Mass"],1018:["FL","Density"],1019:["FL","ZEffective"],"101A":["SH","BoardingPassID"],"101B":["FL","CenterOfMass"],"101C":["FL","CenterOfPTO"],"101D":["FL","BoundingPolygon"],"101E":["SH","RouteSegmentStartLocationID"],"101F":["SH","RouteSegmentEndLocationID"],1020:["CS","RouteSegmentLocationIDType"],1021:["CS","AbortReason"],1023:["FL","VolumeOfPTO"],1024:["CS","AbortFlag"],1025:["DT","RouteSegmentStartTime"],1026:["DT","RouteSegmentEndTime"],1027:["CS","TDRType"],1028:["CS","InternationalRouteSegment"],1029:["LO","ThreatDetectionAlgorithmandVersion"],"102A":["SH","AssignedLocation"],"102B":["DT","AlarmDecisionTime"],1031:["CS","AlarmDecision"],1033:["US","NumberOfTotalObjects"],1034:["US","NumberOfAlarmObjects"],1037:["SQ","PTORepresentationSequence"],1038:["SQ","ATDAssessmentSequence"],1039:["CS","TIPType"],"103A":["CS","DICOSVersion"],1041:["DT","OOIOwnerCreationTime"],1042:["CS","OOIType"],1043:["FL","OOISize"],1044:["CS","AcquisitionStatus"],1045:["SQ","BasisMaterialsCodeSequence"],1046:["CS","PhantomType"],1047:["SQ","OOIOwnerSequence"],1048:["CS","ScanType"],1051:["LO","ItineraryID"],1052:["SH","ItineraryIDType"],1053:["LO","ItineraryIDAssigningAuthority"],1054:["SH","RouteID"],1055:["SH","RouteIDAssigningAuthority"],1056:["CS","InboundArrivalType"],1058:["SH","CarrierID"],1059:["CS","CarrierIDAssigningAuthority"],1060:["FL","SourceOrientation"],1061:["FL","SourcePosition"],1062:["FL","BeltHeight"],1064:["SQ","AlgorithmRoutingCodeSequence"],1067:["CS","TransportClassification"],1068:["LT","OOITypeDescriptor"],1069:["FL","TotalProcessingTime"],"106C":["OB","DetectorCalibrationData"]}},t.Dictionary.getVR=function(e,i){var r,n,a;return(a=t.Dictionary.dict[t.Utils.dec2hex(e)])&&((n=a[t.Utils.dec2hex(i)])?r=n[0]:0===i&&(r="UL")),r||(a=t.Dictionary.dictPrivate[t.Utils.dec2hex(e)])&&((n=a[t.Utils.dec2hex(i)])&&(r=n[0])),r||(r="OB"),r},t.Dictionary.getDescription=function(e,i){var r,n,a;return(a=t.Dictionary.dict[t.Utils.dec2hex(e)])&&((n=a[t.Utils.dec2hex(i)])?r=n[1]:0===i&&(r="Group "+t.Utils.dec2hex(e)+" Length")),r||(a=t.Dictionary.dictPrivate[t.Utils.dec2hex(e)])&&((n=a[t.Utils.dec2hex(i)])&&(r=n[1])),r||(r="PrivateData"),r},e.exports&&(e.exports=t.Dictionary)}(dictionary)),dictionary.exports}var image={exports:{}},tag={exports:{}},lib$1={exports:{}},_default$1={},lib={exports:{}},_default={},hasRequired_default$1,util$1,hasRequiredUtil$1,parser$2,hasRequiredParser$2,css,hasRequiredCss,hasRequiredLib$1,util,hasRequiredUtil,hasRequired_default;function require_default$1(){if(hasRequired_default$1)return _default;function e(){var e={"align-content":!1,"align-items":!1,"align-self":!1,"alignment-adjust":!1,"alignment-baseline":!1,all:!1,"anchor-point":!1,animation:!1,"animation-delay":!1,"animation-direction":!1,"animation-duration":!1,"animation-fill-mode":!1,"animation-iteration-count":!1,"animation-name":!1,"animation-play-state":!1,"animation-timing-function":!1,azimuth:!1,"backface-visibility":!1,background:!0,"background-attachment":!0,"background-clip":!0,"background-color":!0,"background-image":!0,"background-origin":!0,"background-position":!0,"background-repeat":!0,"background-size":!0,"baseline-shift":!1,binding:!1,bleed:!1,"bookmark-label":!1,"bookmark-level":!1,"bookmark-state":!1,border:!0,"border-bottom":!0,"border-bottom-color":!0,"border-bottom-left-radius":!0,"border-bottom-right-radius":!0,"border-bottom-style":!0,"border-bottom-width":!0,"border-collapse":!0,"border-color":!0,"border-image":!0,"border-image-outset":!0,"border-image-repeat":!0,"border-image-slice":!0,"border-image-source":!0,"border-image-width":!0,"border-left":!0,"border-left-color":!0,"border-left-style":!0,"border-left-width":!0,"border-radius":!0,"border-right":!0,"border-right-color":!0,"border-right-style":!0,"border-right-width":!0,"border-spacing":!0,"border-style":!0,"border-top":!0,"border-top-color":!0,"border-top-left-radius":!0,"border-top-right-radius":!0,"border-top-style":!0,"border-top-width":!0,"border-width":!0,bottom:!1,"box-decoration-break":!0,"box-shadow":!0,"box-sizing":!0,"box-snap":!0,"box-suppress":!0,"break-after":!0,"break-before":!0,"break-inside":!0,"caption-side":!1,chains:!1,clear:!0,clip:!1,"clip-path":!1,"clip-rule":!1,color:!0,"color-interpolation-filters":!0,"column-count":!1,"column-fill":!1,"column-gap":!1,"column-rule":!1,"column-rule-color":!1,"column-rule-style":!1,"column-rule-width":!1,"column-span":!1,"column-width":!1,columns:!1,contain:!1,content:!1,"counter-increment":!1,"counter-reset":!1,"counter-set":!1,crop:!1,cue:!1,"cue-after":!1,"cue-before":!1,cursor:!1,direction:!1,display:!0,"display-inside":!0,"display-list":!0,"display-outside":!0,"dominant-baseline":!1,elevation:!1,"empty-cells":!1,filter:!1,flex:!1,"flex-basis":!1,"flex-direction":!1,"flex-flow":!1,"flex-grow":!1,"flex-shrink":!1,"flex-wrap":!1,float:!1,"float-offset":!1,"flood-color":!1,"flood-opacity":!1,"flow-from":!1,"flow-into":!1,font:!0,"font-family":!0,"font-feature-settings":!0,"font-kerning":!0,"font-language-override":!0,"font-size":!0,"font-size-adjust":!0,"font-stretch":!0,"font-style":!0,"font-synthesis":!0,"font-variant":!0,"font-variant-alternates":!0,"font-variant-caps":!0,"font-variant-east-asian":!0,"font-variant-ligatures":!0,"font-variant-numeric":!0,"font-variant-position":!0,"font-weight":!0,grid:!1,"grid-area":!1,"grid-auto-columns":!1,"grid-auto-flow":!1,"grid-auto-rows":!1,"grid-column":!1,"grid-column-end":!1,"grid-column-start":!1,"grid-row":!1,"grid-row-end":!1,"grid-row-start":!1,"grid-template":!1,"grid-template-areas":!1,"grid-template-columns":!1,"grid-template-rows":!1,"hanging-punctuation":!1,height:!0,hyphens:!1,icon:!1,"image-orientation":!1,"image-resolution":!1,"ime-mode":!1,"initial-letters":!1,"inline-box-align":!1,"justify-content":!1,"justify-items":!1,"justify-self":!1,left:!1,"letter-spacing":!0,"lighting-color":!0,"line-box-contain":!1,"line-break":!1,"line-grid":!1,"line-height":!1,"line-snap":!1,"line-stacking":!1,"line-stacking-ruby":!1,"line-stacking-shift":!1,"line-stacking-strategy":!1,"list-style":!0,"list-style-image":!0,"list-style-position":!0,"list-style-type":!0,margin:!0,"margin-bottom":!0,"margin-left":!0,"margin-right":!0,"margin-top":!0,"marker-offset":!1,"marker-side":!1,marks:!1,mask:!1,"mask-box":!1,"mask-box-outset":!1,"mask-box-repeat":!1,"mask-box-slice":!1,"mask-box-source":!1,"mask-box-width":!1,"mask-clip":!1,"mask-image":!1,"mask-origin":!1,"mask-position":!1,"mask-repeat":!1,"mask-size":!1,"mask-source-type":!1,"mask-type":!1,"max-height":!0,"max-lines":!1,"max-width":!0,"min-height":!0,"min-width":!0,"move-to":!1,"nav-down":!1,"nav-index":!1,"nav-left":!1,"nav-right":!1,"nav-up":!1,"object-fit":!1,"object-position":!1,opacity:!1,order:!1,orphans:!1,outline:!1,"outline-color":!1,"outline-offset":!1,"outline-style":!1,"outline-width":!1,overflow:!1,"overflow-wrap":!1,"overflow-x":!1,"overflow-y":!1,padding:!0,"padding-bottom":!0,"padding-left":!0,"padding-right":!0,"padding-top":!0,page:!1,"page-break-after":!1,"page-break-before":!1,"page-break-inside":!1,"page-policy":!1,pause:!1,"pause-after":!1,"pause-before":!1,perspective:!1,"perspective-origin":!1,pitch:!1,"pitch-range":!1,"play-during":!1,position:!1,"presentation-level":!1,quotes:!1,"region-fragment":!1,resize:!1,rest:!1,"rest-after":!1,"rest-before":!1,richness:!1,right:!1,rotation:!1,"rotation-point":!1,"ruby-align":!1,"ruby-merge":!1,"ruby-position":!1,"shape-image-threshold":!1,"shape-outside":!1,"shape-margin":!1,size:!1,speak:!1,"speak-as":!1,"speak-header":!1,"speak-numeral":!1,"speak-punctuation":!1,"speech-rate":!1,stress:!1,"string-set":!1,"tab-size":!1,"table-layout":!1,"text-align":!0,"text-align-last":!0,"text-combine-upright":!0,"text-decoration":!0,"text-decoration-color":!0,"text-decoration-line":!0,"text-decoration-skip":!0,"text-decoration-style":!0,"text-emphasis":!0,"text-emphasis-color":!0,"text-emphasis-position":!0,"text-emphasis-style":!0,"text-height":!0,"text-indent":!0,"text-justify":!0,"text-orientation":!0,"text-overflow":!0,"text-shadow":!0,"text-space-collapse":!0,"text-transform":!0,"text-underline-position":!0,"text-wrap":!0,top:!1,transform:!1,"transform-origin":!1,"transform-style":!1,transition:!1,"transition-delay":!1,"transition-duration":!1,"transition-property":!1,"transition-timing-function":!1,"unicode-bidi":!1,"vertical-align":!1,visibility:!1,"voice-balance":!1,"voice-duration":!1,"voice-family":!1,"voice-pitch":!1,"voice-range":!1,"voice-rate":!1,"voice-stress":!1,"voice-volume":!1,volume:!1,"white-space":!1,widows:!1,width:!0,"will-change":!1,"word-break":!0,"word-spacing":!0,"word-wrap":!0,"wrap-flow":!1,"wrap-through":!1,"writing-mode":!1,"z-index":!1};return e}hasRequired_default$1=1;var t=/javascript\s*\:/gim;return _default.whiteList=e(),_default.getDefaultWhiteList=e,_default.onAttr=function(e,t,i){},_default.onIgnoreAttr=function(e,t,i){},_default.safeAttrValue=function(e,i){return t.test(i)?"":i},_default}function requireUtil$1(){return hasRequiredUtil$1||(hasRequiredUtil$1=1,util$1={indexOf:function(e,t){var i,r;if(Array.prototype.indexOf)return e.indexOf(t);for(i=0,r=e.length;i/g,l=/"/g,c=/"/g,u=/&#([a-zA-Z0-9]*);?/gim,f=/:?/gim,h=/&newline;?/gim,d=/((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a):/gi,m=/e\s*x\s*p\s*r\s*e\s*s\s*s\s*i\s*o\s*n\s*\(.*/gi,g=/u\s*r\s*l\s*\(.*/gi;function p(e){return e.replace(l,""")}function A(e){return e.replace(c,'"')}function S(e){return e.replace(u,(function(e,t){return"x"===t[0]||"X"===t[0]?String.fromCharCode(parseInt(t.substr(1),16)):String.fromCharCode(parseInt(t,10))}))}function b(e){return e.replace(f,":").replace(h," ")}function v(e){for(var t="",r=0,n=e.length;r0;t--){var i=e[t];if(" "!==i)return"="===i?t:-1}}function s(e){return function(e){return'"'===e[0]&&'"'===e[e.length-1]||"'"===e[0]&&"'"===e[e.length-1]}(e)?e.substr(1,e.length-2):e}return parser$1.parseTag=function(e,r,n){var a="",o=0,s=!1,l=!1,c=0,u=e.length,f="",h="";e:for(c=0;c"===d||c===u-1){a+=n(e.slice(o,s)),f=t(h=e.slice(s,c+1)),a+=r(s,a.length,f,h,i(h)),o=c+1,s=!1;continue}if('"'===d||"'"===d)for(var m=1,g=e.charAt(c-m);""===g.trim()||"="===g;){if("="===g){l=d;continue e}g=e.charAt(c-++m)}}else if(d===l){l=!1;continue}}return o";var S=function(e){var t=a.spaceIndex(e);if(-1===t)return{html:"",closing:"/"===e[e.length-2]};var i="/"===(e=a.trim(e.slice(t+1,-1)))[e.length-1];return i&&(e=a.trim(e.slice(0,-1))),{html:e,closing:i}}(r),b=s[i],v=n(S.html,(function(e,t){var r=-1!==a.indexOf(b,e),n=u(i,e,t,r);return o(n)?r?(t=h(i,e,t,m))?e+'="'+t+'"':e:o(n=f(i,e,t,r))?void 0:n:n}));return r="<"+i,v&&(r+=" "+v),S.closing&&(r+=" /"),r+=">"}return o(A=c(i,r,p))?d(r):A}),d);return g&&(p=g.remove(p)),p},xss=s}function requireLib(){return hasRequiredLib||(hasRequiredLib=1,function(e,t){var i=require_default(),r=requireParser$1(),n=requireXss();function a(e,t){return new n(t).process(e)}(t=e.exports=a).filterXSS=a,t.FilterXSS=n,function(){for(var e in i)t[e]=i[e];for(var n in r)t[n]=r[n]}(),typeof window<"u"&&(window.filterXSS=e.exports),typeof self<"u"&&typeof DedicatedWorkerGlobalScope<"u"&&self instanceof DedicatedWorkerGlobalScope&&(self.filterXSS=e.exports)}(lib$1,lib$1.exports)),lib$1.exports}var siemens={exports:{}},hasRequiredSiemens,hasRequiredTag;function requireSiemens(){return hasRequiredSiemens||(hasRequiredSiemens=1,function(e){var t=t||{};t.Utils=t.Utils||(typeof commonjsRequire<"u"?requireUtilities():null),t.Siemens=t.Siemens||function(e){this.output="",this.data=new DataView(e,0)},t.Siemens.CSA2_MAGIC_NUMBER=[83,86,49,48],t.Siemens.NAME_LENGTH=64,t.Siemens.ELEMENT_CSA1=4112,t.Siemens.ELEMENT_CSA2=4128,t.Siemens.GROUP_CSA=41,t.Siemens.prototype.readHeader=function(){var e,i;try{if(this.data.byteLength>t.Siemens.CSA2_MAGIC_NUMBER.length){for(i=!0,e=0;e128)return this.output;for(e+=4,e+=4,r=0;rthis.data.buffer.length?-1:(e+=16,i>0&&(this.output+=this.readString(e,i)+" "),e+i)},t.Siemens.prototype.canRead=function(e,i){return e===t.Siemens.GROUP_CSA&&(i===t.Siemens.ELEMENT_CSA1||i===t.Siemens.ELEMENT_CSA2)},e.exports&&(e.exports=t.Siemens)}(siemens)),siemens.exports}function requireTag(){return hasRequiredTag||(hasRequiredTag=1,function(e){var t=requireLib(),i=i||{};i.Utils=i.Utils||(typeof commonjsRequire<"u"?requireUtilities():null),i.Dictionary=i.Dictionary||(typeof commonjsRequire<"u"?requireDictionary():null),i.Siemens=i.Siemens||(typeof commonjsRequire<"u"?requireSiemens():null),i.Tag=i.Tag||function(e,t,r,n,a,o,s,l,c){if(this.group=e,this.element=t,this.vr=r,this.offsetStart=a,this.offsetValue=o,this.offsetEnd=s,this.sublist=!1,this.preformatted=!1,this.id=i.Tag.createId(e,t),n instanceof Array)this.value=n,this.sublist=!0;else if(null!==n){var u=new DataView(n);this.value=i.Tag.convertValue(r,u,l,c),this.value===u&&this.isPrivateData()&&(this.value=i.Tag.convertPrivateValue(e,t,u),this.preformatted=this.value!==u)}else this.value=null},i.Tag.PRIVATE_DATA_READERS=[i.Siemens],i.Tag.VR_AE_MAX_LENGTH=16,i.Tag.VR_AS_MAX_LENGTH=4,i.Tag.VR_AT_MAX_LENGTH=4,i.Tag.VR_CS_MAX_LENGTH=16,i.Tag.VR_DA_MAX_LENGTH=8,i.Tag.VR_DS_MAX_LENGTH=16,i.Tag.VR_DT_MAX_LENGTH=26,i.Tag.VR_FL_MAX_LENGTH=4,i.Tag.VR_FD_MAX_LENGTH=8,i.Tag.VR_IS_MAX_LENGTH=12,i.Tag.VR_LO_MAX_LENGTH=64,i.Tag.VR_LT_MAX_LENGTH=10240,i.Tag.VR_OB_MAX_LENGTH=-1,i.Tag.VR_OD_MAX_LENGTH=-1,i.Tag.VR_OF_MAX_LENGTH=-1,i.Tag.VR_OW_MAX_LENGTH=-1,i.Tag.VR_PN_MAX_LENGTH=320,i.Tag.VR_SH_MAX_LENGTH=16,i.Tag.VR_SL_MAX_LENGTH=4,i.Tag.VR_SS_MAX_LENGTH=2,i.Tag.VR_ST_MAX_LENGTH=1024,i.Tag.VR_TM_MAX_LENGTH=16,i.Tag.VR_UI_MAX_LENGTH=64,i.Tag.VR_UL_MAX_LENGTH=4,i.Tag.VR_UN_MAX_LENGTH=-1,i.Tag.VR_US_MAX_LENGTH=2,i.Tag.VR_UT_MAX_LENGTH=-1,i.Tag.VR_UC_MAX_LENGTH=-1,i.Tag.TAG_TRANSFER_SYNTAX=[2,16],i.Tag.TAG_META_LENGTH=[2,0],i.Tag.TAG_SUBLIST_ITEM=[65534,57344],i.Tag.TAG_SUBLIST_ITEM_DELIM=[65534,57357],i.Tag.TAG_SUBLIST_SEQ_DELIM=[65534,57565],i.Tag.TAG_ROWS=[40,16],i.Tag.TAG_COLS=[40,17],i.Tag.TAG_ACQUISITION_MATRIX=[24,4880],i.Tag.TAG_NUMBER_OF_FRAMES=[40,8],i.Tag.TAG_NUMBER_TEMPORAL_POSITIONS=[32,261],i.Tag.TAG_PIXEL_SPACING=[40,48],i.Tag.TAG_SLICE_THICKNESS=[24,80],i.Tag.TAG_SLICE_GAP=[24,136],i.Tag.TAG_TR=[24,128],i.Tag.TAG_FRAME_TIME=[24,4195],i.Tag.TAG_BITS_ALLOCATED=[40,256],i.Tag.TAG_BITS_STORED=[40,257],i.Tag.TAG_PIXEL_REPRESENTATION=[40,259],i.Tag.TAG_HIGH_BIT=[40,258],i.Tag.TAG_PHOTOMETRIC_INTERPRETATION=[40,4],i.Tag.TAG_SAMPLES_PER_PIXEL=[40,2],i.Tag.TAG_PLANAR_CONFIG=[40,6],i.Tag.TAG_PALETTE_RED=[40,4609],i.Tag.TAG_PALETTE_GREEN=[40,4610],i.Tag.TAG_PALETTE_BLUE=[40,4611],i.Tag.TAG_DATA_SCALE_SLOPE=[40,4179],i.Tag.TAG_DATA_SCALE_INTERCEPT=[40,4178],i.Tag.TAG_DATA_SCALE_ELSCINT=[519,4127],i.Tag.TAG_PIXEL_BANDWIDTH=[24,149],i.Tag.TAG_IMAGE_MIN=[40,262],i.Tag.TAG_IMAGE_MAX=[40,263],i.Tag.TAG_WINDOW_CENTER=[40,4176],i.Tag.TAG_WINDOW_WIDTH=[40,4177],i.Tag.TAG_SPECIFIC_CHAR_SET=[8,5],i.Tag.TAG_PATIENT_NAME=[16,16],i.Tag.TAG_PATIENT_ID=[16,32],i.Tag.TAG_STUDY_DATE=[8,32],i.Tag.TAG_STUDY_TIME=[8,48],i.Tag.TAG_STUDY_DES=[8,4144],i.Tag.TAG_IMAGE_TYPE=[8,8],i.Tag.TAG_IMAGE_COMMENTS=[32,16384],i.Tag.TAG_SEQUENCE_NAME=[24,36],i.Tag.TAG_MODALITY=[8,96],i.Tag.TAG_FRAME_OF_REF_UID=[32,82],i.Tag.TAG_STUDY_UID=[32,13],i.Tag.TAG_SERIES_DESCRIPTION=[8,4158],i.Tag.TAG_SERIES_INSTANCE_UID=[32,14],i.Tag.TAG_SERIES_NUMBER=[32,17],i.Tag.TAG_ECHO_NUMBER=[24,134],i.Tag.TAG_TEMPORAL_POSITION=[32,256],i.Tag.TAG_IMAGE_NUM=[32,19],i.Tag.TAG_SLICE_LOCATION=[32,4161],i.Tag.TAG_IMAGE_ORIENTATION=[32,55],i.Tag.TAG_IMAGE_POSITION=[32,50],i.Tag.TAG_SLICE_LOCATION_VECTOR=[24,8197],i.Tag.TAG_LUT_SHAPE=[8272,32],i.Tag.TAG_PIXEL_DATA=[32736,16],i.Tag.createId=function(e,t){return i.Utils.dec2hex(e)+i.Utils.dec2hex(t)},i.Tag.getUnsignedInteger16=function(e,t){var i,r,n;for(r=e.byteLength/2,i=[],n=0;n=4?(a=parseInt(r[t].substring(0,4),10),r[t].length>=6&&(o=i.Utils.safeParseInt(r[t].substring(4,6))-1),r[t].length>=8&&(s=i.Utils.safeParseInt(r[t].substring(6,8))),r[t].length>=10&&(l=i.Utils.safeParseInt(r[t].substring(8,10))),r[t].length>=12&&(c=i.Utils.safeParseInt(r[t].substring(10,12))),r[t].length>=14&&(u=i.Utils.safeParseInt(r[t].substring(12,14))),n[t]=new Date(a,o,s,l,c,u)):n[t]=Date.parse(r[t]),i.Utils.isValidDate(n[t])||(n[t]=r[t]);return n},i.Tag.getTimeStringValue=function(e,t){var r=i.Tag.getStringValue(e),n=[];if(t){var a,o=null,s=0,l=0,c=0;for(a=0;a1&&(l=i.Utils.safeParseInt(o[1])),o.length>2&&(c=i.Utils.safeParseFloat(o[2]))):(r[a].length>=2&&(s=i.Utils.safeParseInt(r[a].substring(0,2))),r[a].length>=4&&(l=i.Utils.safeParseInt(r[a].substring(2,4))),r[a].length>=6&&(c=i.Utils.safeParseFloat(r[a].substring(4)))),n[a]=Math.round(60*s*60*1e3+60*l*1e3+1e3*c);return n}return r},i.Tag.getDoubleStringValue=function(e){var t,r=i.Tag.getStringValue(e),n=[];for(t=0;t"+this.value+"]":"["+this.value+"]":"";return this.isSublistItem()?s="Sequence Item":this.isSublistItemDelim()?s="Sequence Item Delimiter":this.isSequenceDelim()?s="Sequence Delimiter":this.isPixelData()?s="Pixel Data":l=i.Utils.convertCamcelCaseToTitleCase(i.Dictionary.getDescription(this.group,this.element)),o=t(o),r?a+""+s+"   "+l+"   "+o:a+" "+s+" "+l+" "+o},i.Tag.prototype.toHTMLString=function(e){return this.toString(e,!0)},i.Tag.prototype.isTransformSyntax=function(){return this.group===i.Tag.TAG_TRANSFER_SYNTAX[0]&&this.element===i.Tag.TAG_TRANSFER_SYNTAX[1]},i.Tag.prototype.isCharset=function(){return this.group===i.Tag.TAG_SPECIFIC_CHAR_SET[0]&&this.element===i.Tag.TAG_SPECIFIC_CHAR_SET[1]},i.Tag.prototype.isPixelData=function(){return this.group===i.Tag.TAG_PIXEL_DATA[0]&&this.element===i.Tag.TAG_PIXEL_DATA[1]},i.Tag.prototype.isPrivateData=function(){return!(1&~this.group)},i.Tag.prototype.hasInterpretedPrivateData=function(){return this.isPrivateData()&&i.Utils.isString(this.value)},i.Tag.prototype.isSublistItem=function(){return this.group===i.Tag.TAG_SUBLIST_ITEM[0]&&this.element===i.Tag.TAG_SUBLIST_ITEM[1]},i.Tag.prototype.isSublistItemDelim=function(){return this.group===i.Tag.TAG_SUBLIST_ITEM_DELIM[0]&&this.element===i.Tag.TAG_SUBLIST_ITEM_DELIM[1]},i.Tag.prototype.isSequenceDelim=function(){return this.group===i.Tag.TAG_SUBLIST_SEQ_DELIM[0]&&this.element===i.Tag.TAG_SUBLIST_SEQ_DELIM[1]},i.Tag.prototype.isMetaLength=function(){return this.group===i.Tag.TAG_META_LENGTH[0]&&this.element===i.Tag.TAG_META_LENGTH[1]},e.exports&&(e.exports=i.Tag)}(tag)),tag.exports}var rle={exports:{}},hasRequiredRle;function requireRle(){return hasRequiredRle||(hasRequiredRle=1,function(e){var t=t||{};t.RLE=t.RLE||function(){this.rawData=null,this.bytesRead=0,this.bytesPut=0,this.segElemPut=0,this.numSegments=0,this.segmentOffsets=[],this.littleEndian=!0,this.segmentIndex=0,this.numElements=0,this.size=0,this.output=null},t.RLE.HEADER_SIZE=64,t.RLE.prototype.decode=function(e,t,i){var r;for(this.rawData=new DataView(e),this.littleEndian=t,this.numElements=i,this.readHeader(),this.output=new DataView(new ArrayBuffer(this.size)),r=0;r=0&&e<128?this.readLiteral(e):e<=-1&&e>-128?this.readEncoded(e):-128===e&&console.warn("RLE: unsupported code!");this.segmentIndex+=1},t.RLE.prototype.readLiteral=function(e){var t,i=e+1;if(this.hasValidInput())for(t=0;t1)for(var n=Array.prototype.slice.call(arguments,1);r--;)i[e-1-r]=t.lossless.Utils.createArray.apply(this,n);return i},t.lossless.Utils.makeCRCTable=function(){for(var e,t=[],i=0;i<256;i++){e=i;for(var r=0;r<8;r++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t},t.lossless.Utils.crc32=function(e){for(var i=new Uint8Array(e.buffer),r=t.lossless.Utils.crcTable||(t.lossless.Utils.crcTable=t.lossless.Utils.makeCRCTable()),n=-1,a=0;a>>8^r[255&(n^i[a])];return~n>>>0},e.exports&&(e.exports=t.lossless.Utils)}(utils)),utils.exports}function requireHuffmanTable(){return hasRequiredHuffmanTable||(hasRequiredHuffmanTable=1,function(e){var t=t||{};t.lossless=t.lossless||{},t.lossless.DataStream=t.lossless.DataStream||(typeof commonjsRequire<"u"?requireDataStream():null),t.lossless.Utils=t.lossless.Utils||(typeof commonjsRequire<"u"?requireUtils():null),t.lossless.HuffmanTable=t.lossless.HuffmanTable||function(){this.l=t.lossless.Utils.createArray(4,2,16),this.th=[],this.v=t.lossless.Utils.createArray(4,2,16,200),this.tc=t.lossless.Utils.createArray(4,2),this.tc[0][0]=0,this.tc[1][0]=0,this.tc[2][0]=0,this.tc[3][0]=0,this.tc[0][1]=0,this.tc[1][1]=0,this.tc[2][1]=0,this.tc[3][1]=0,this.th[0]=0,this.th[1]=0,this.th[2]=0,this.th[3]=0},t.lossless.HuffmanTable.MSB=2147483648,t.lossless.HuffmanTable.prototype.read=function(e,t){var i,r,n,a,o,s,l=0;for(i=e.get16(),l+=2;l3)throw new Error("ERROR: Huffman table ID > 3");if((a=r>>4)>2)throw new Error("ERROR: Huffman table [Table class > 2 ]");for(this.th[n]=1,this.tc[n][a]=1,o=0;o<16;o+=1)this.l[n][a][o]=e.get8(),l+=1;for(o=0;o<16;o+=1)for(s=0;si)throw new Error("ERROR: Huffman table format error [count>Lh]");this.v[n][a][o][s]=e.get8(),l+=1}}if(l!==i)throw new Error("ERROR: Huffman table format error [count!=Lf]");for(o=0;o<4;o+=1)for(s=0;s<2;s+=1)0!==this.tc[o][s]&&this.buildHuffTable(t[o][s],this.l[o][s],this.v[o][s]);return 1},t.lossless.HuffmanTable.prototype.buildHuffTable=function(e,i,r){var n,a,o,s,l;for(a=0,o=0;o<8;o+=1)for(s=0;s>o+1;l+=1)e[a]=r[o][s]|o+1<<8,a+=1;for(o=1;a<256;o+=1,a+=1)e[a]=o|t.lossless.HuffmanTable.MSB;for(n=1,a=0,o=8;o<16;o+=1)for(s=0;s>o-7;l+=1)e[256*n+a]=r[o][s]|o+1<<8,a+=1;if(a>=256){if(a>256)throw new Error("ERROR: Huffman table error(1)!");a=0,n+=1}}},e.exports&&(e.exports=t.lossless.HuffmanTable)}(huffmanTable)),huffmanTable.exports}var quantizationTable={exports:{}},hasRequiredQuantizationTable;function requireQuantizationTable(){return hasRequiredQuantizationTable||(hasRequiredQuantizationTable=1,function(e){var t=t||{};t.lossless=t.lossless||{},t.lossless.DataStream=t.lossless.DataStream||(typeof commonjsRequire<"u"?requireDataStream():null),t.lossless.Utils=t.lossless.Utils||(typeof commonjsRequire<"u"?requireUtils():null),t.lossless.QuantizationTable=t.lossless.QuantizationTable||function(){this.precision=[],this.tq=[],this.quantTables=t.lossless.Utils.createArray(4,64),this.tq[0]=0,this.tq[1]=0,this.tq[2]=0,this.tq[3]=0},t.lossless.QuantizationTable.enhanceQuantizationTable=function(e,t){var i;for(i=0;i<8;i+=1)e[t[0+i]]*=90,e[t[32+i]]*=90,e[t[16+i]]*=118,e[t[48+i]]*=49,e[t[40+i]]*=71,e[t[8+i]]*=126,e[t[56+i]]*=25,e[t[24+i]]*=106;for(i=0;i<8;i+=1)e[t[0+8*i]]*=90,e[t[4+8*i]]*=90,e[t[2+8*i]]*=118,e[t[6+8*i]]*=49,e[t[5+8*i]]*=71,e[t[1+8*i]]*=126,e[t[7+8*i]]*=25,e[t[3+8*i]]*=106;for(i=0;i<64;i+=1)e[i]>>=6},t.lossless.QuantizationTable.prototype.read=function(e,i){var r,n,a,o,s=0;for(r=e.get16(),s+=2;s3)throw new Error("ERROR: Quantization table ID > 3");if(this.precision[a]=n>>4,0===this.precision[a])this.precision[a]=8;else{if(1!==this.precision[a])throw new Error("ERROR: Quantization table precision error");this.precision[a]=16}if(this.tq[a]=1,8===this.precision[a]){for(o=0;o<64;o+=1){if(s>r)throw new Error("ERROR: Quantization table format error");this.quantTables[a][o]=e.get8(),s+=1}t.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[a],i)}else{for(o=0;o<64;o+=1){if(s>r)throw new Error("ERROR: Quantization table format error");this.quantTables[a][o]=e.get16(),s+=2}t.lossless.QuantizationTable.enhanceQuantizationTable(this.quantTables[a],i)}}if(s!==r)throw new Error("ERROR: Quantization table error [count!=Lq]");return 1},e.exports&&(e.exports=t.lossless.QuantizationTable)}(quantizationTable)),quantizationTable.exports}var scanHeader={exports:{}},scanComponent={exports:{}},hasRequiredScanComponent,hasRequiredScanHeader;function requireScanComponent(){return hasRequiredScanComponent||(hasRequiredScanComponent=1,function(e){var t=t||{};t.lossless=t.lossless||{},t.lossless.ScanComponent=t.lossless.ScanComponent||function(){this.acTabSel=0,this.dcTabSel=0,this.scanCompSel=0},e.exports&&(e.exports=t.lossless.ScanComponent)}(scanComponent)),scanComponent.exports}function requireScanHeader(){return hasRequiredScanHeader||(hasRequiredScanHeader=1,function(e){var t=t||{};t.lossless=t.lossless||{},t.lossless.DataStream=t.lossless.DataStream||(typeof commonjsRequire<"u"?requireDataStream():null),t.lossless.ScanComponent=t.lossless.ScanComponent||(typeof commonjsRequire<"u"?requireScanComponent():null),t.lossless.ScanHeader=t.lossless.ScanHeader||function(){this.ah=0,this.al=0,this.numComp=0,this.selection=0,this.spectralEnd=0,this.components=[]},t.lossless.ScanHeader.prototype.read=function(e){var i,r,n,a=0;for(i=e.get16(),a+=2,this.numComp=e.get8(),a+=1,r=0;ri)throw new Error("ERROR: scan header format error");this.components[r].scanCompSel=e.get8(),a+=1,n=e.get8(),a+=1,this.components[r].dcTabSel=n>>4,this.components[r].acTabSel=15&n}if(this.selection=e.get8(),a+=1,this.spectralEnd=e.get8(),a+=1,n=e.get8(),this.ah=n>>4,this.al=15&n,(a+=1)!==i)throw new Error("ERROR: scan header format error [count!=Ns]");return 1},e.exports&&(e.exports=t.lossless.ScanHeader)}(scanHeader)),scanHeader.exports}var frameHeader={exports:{}},hasRequiredFrameHeader,hasRequiredDecoder,hasRequiredMain;function requireFrameHeader(){return hasRequiredFrameHeader||(hasRequiredFrameHeader=1,function(e){var t=t||{};t.lossless=t.lossless||{},t.lossless.ComponentSpec=t.lossless.ComponentSpec||(typeof commonjsRequire<"u"?requireComponentSpec():null),t.lossless.DataStream=t.lossless.DataStream||(typeof commonjsRequire<"u"?requireDataStream():null),t.lossless.FrameHeader=t.lossless.FrameHeader||function(){this.components=[],this.dimX=0,this.dimY=0,this.numComp=0,this.precision=0},t.lossless.FrameHeader.prototype.read=function(e){var i,r,n,a,o=0;for(i=e.get16(),o+=2,this.precision=e.get8(),o+=1,this.dimY=e.get16(),o+=2,this.dimX=e.get16(),o+=2,this.numComp=e.get8(),o+=1,r=1;r<=this.numComp;r+=1){if(o>i)throw new Error("ERROR: frame format error");if(n=e.get8(),(o+=1)>=i)throw new Error("ERROR: frame format error [c>=Lf]");a=e.get8(),o+=1,this.components[n]||(this.components[n]=new t.lossless.ComponentSpec),this.components[n].hSamp=a>>4,this.components[n].vSamp=15&a,this.components[n].quantTableSel=e.get8(),o+=1}if(o!==i)throw new Error("ERROR: frame format error [Lf!=count]");return 1},e.exports&&(e.exports=t.lossless.FrameHeader)}(frameHeader)),frameHeader.exports}function requireDecoder(){return hasRequiredDecoder||(hasRequiredDecoder=1,function(e){var t,i=i||{};i.lossless=i.lossless||{},i.lossless.DataStream=i.lossless.DataStream||(typeof commonjsRequire<"u"?requireDataStream():null),i.lossless.HuffmanTable=i.lossless.HuffmanTable||(typeof commonjsRequire<"u"?requireHuffmanTable():null),i.lossless.QuantizationTable=i.lossless.QuantizationTable||(typeof commonjsRequire<"u"?requireQuantizationTable():null),i.lossless.ScanHeader=i.lossless.ScanHeader||(typeof commonjsRequire<"u"?requireScanHeader():null),i.lossless.FrameHeader=i.lossless.FrameHeader||(typeof commonjsRequire<"u"?requireFrameHeader():null),i.lossless.Utils=i.lossless.Utils||(typeof commonjsRequire<"u"?requireUtils():null),i.lossless.Decoder=i.lossless.Decoder||function(e,t){this.buffer=e,this.frame=new i.lossless.FrameHeader,this.huffTable=new i.lossless.HuffmanTable,this.quantTable=new i.lossless.QuantizationTable,this.scan=new i.lossless.ScanHeader,this.DU=i.lossless.Utils.createArray(10,4,64),this.HuffTab=i.lossless.Utils.createArray(4,2,12800),this.IDCT_Source=[],this.nBlock=[],this.acTab=i.lossless.Utils.createArray(10,1),this.dcTab=i.lossless.Utils.createArray(10,1),this.qTab=i.lossless.Utils.createArray(10,1),this.marker=0,this.markerIndex=0,this.numComp=0,this.restartInterval=0,this.selection=0,this.xDim=0,this.yDim=0,this.xLoc=0,this.yLoc=0,this.numBytes=0,this.outputData=null,this.restarting=!1,this.mask=0,typeof t<"u"&&(this.numBytes=t)},i.lossless.Decoder.IDCT_P=[0,5,40,16,45,2,7,42,21,56,8,61,18,47,1,4,41,23,58,13,32,24,37,10,63,17,44,3,6,43,20,57,15,34,29,48,53,26,39,9,60,19,46,22,59,12,33,31,50,55,25,36,11,62,14,35,28,49,52,27,38,30,51,54],i.lossless.Decoder.TABLE=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],i.lossless.Decoder.MAX_HUFFMAN_SUBTREE=50,i.lossless.Decoder.MSB=2147483648,i.lossless.Decoder.RESTART_MARKER_BEGIN=65488,i.lossless.Decoder.RESTART_MARKER_END=65495,i.lossless.Decoder.prototype.decompress=function(e,t,i){return this.decode(e,t,i).buffer},i.lossless.Decoder.prototype.decode=function(e,t,r,n){var a,o,s,l,c=0,u=[],f=[],h=[];if(typeof e<"u"&&(this.buffer=e),typeof n<"u"&&(this.numBytes=n),this.stream=new i.lossless.DataStream(this.buffer,t,r),this.buffer=null,this.xLoc=0,this.yLoc=0,65496!==(a=this.stream.get16()))throw new Error("Not a JPEG file");for(a=this.stream.get16();a>>4!=4092||65476===a;){switch(a){case 65476:this.huffTable.read(this.stream,this.HuffTab);break;case 65484:throw new Error("Program doesn't support arithmetic coding. (format throw new IOException)");case 65499:this.quantTable.read(this.stream,i.lossless.Decoder.TABLE);break;case 65501:this.restartInterval=this.readNumber();break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:this.readApp();break;case 65534:this.readComment();break;default:if(a>>8!=255)throw new Error("ERROR: format throw new IOException! (decode)")}a=this.stream.get16()}if(a<65472||a>65479)throw new Error("ERROR: could not handle arithmetic code!");this.frame.read(this.stream),a=this.stream.get16();do{for(;65498!==a;){switch(a){case 65476:this.huffTable.read(this.stream,this.HuffTab);break;case 65484:throw new Error("Program doesn't support arithmetic coding. (format throw new IOException)");case 65499:this.quantTable.read(this.stream,i.lossless.Decoder.TABLE);break;case 65501:this.restartInterval=this.readNumber();break;case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:this.readApp();break;case 65534:this.readComment();break;default:if(a>>8!=255)throw new Error("ERROR: format throw new IOException! (Parser.decode)")}a=this.stream.get16()}switch(this.precision=this.frame.precision,this.components=this.frame.components,this.numBytes||(this.numBytes=parseInt(Math.ceil(this.precision/8))),1==this.numBytes?this.mask=255:this.mask=65535,this.scan.read(this.stream),this.numComp=this.scan.numComp,this.selection=this.scan.selection,1===this.numBytes?3===this.numComp?(this.getter=this.getValueRGB,this.setter=this.setValueRGB,this.output=this.outputRGB):(this.getter=this.getValue8,this.setter=this.setValue8,this.output=this.outputSingle):(this.getter=this.getValue16,this.setter=this.setValue16,this.output=this.outputSingle),this.selection){case 2:this.selector=this.select2;break;case 3:this.selector=this.select3;break;case 4:this.selector=this.select4;break;case 5:this.selector=this.select5;break;case 6:this.selector=this.select6;break;case 7:this.selector=this.select7;break;default:this.selector=this.select1}for(this.scanComps=this.scan.components,this.quantTables=this.quantTable.quantTables,o=0;o=i.lossless.Decoder.RESTART_MARKER_BEGIN&&a<=i.lossless.Decoder.RESTART_MARKER_END))break}65500===a&&1===c&&(this.readNumber(),a=this.stream.get16())}while(65497!==a&&this.xLoc>1)},i.lossless.Decoder.prototype.select6=function(e){return this.getPreviousY(e)+(this.getPreviousX(e)-this.getPreviousXY(e)>>1)},i.lossless.Decoder.prototype.select7=function(e){return(this.getPreviousX(e)+this.getPreviousY(e))/2},i.lossless.Decoder.prototype.decodeRGB=function(e,t,r){var n,a,o,s,l,c,u,f;for(e[0]=this.selector(0),e[1]=this.selector(1),e[2]=this.selector(2),l=0;l=65280)return n;for(e[l]=this.IDCT_Source[0]=e[l]+this.getn(r,n,t,r),this.IDCT_Source[0]*=s[0],f=1;f<64;f+=1){if((n=this.getHuffmanValue(a,t,r))>=65280)return n;if(f+=n>>4,15&n)this.IDCT_Source[i.lossless.Decoder.IDCT_P[f]]=this.getn(r,15&n,t,r)*s[f];else if(!(n>>4))break}}return 0},i.lossless.Decoder.prototype.decodeSingle=function(e,t,r){var n,a,o,s;for(this.restarting?(this.restarting=!1,e[0]=1<=65280)return n;if((s=(o=this.getn(e,n,t,r))>>8)>=i.lossless.Decoder.RESTART_MARKER_BEGIN&&s<=i.lossless.Decoder.RESTART_MARKER_END)return s;e[0]+=o}return 0},i.lossless.Decoder.prototype.getHuffmanValue=function(e,t,r){var n,a;if(r[0]<8?(t[0]<<=8,255===(a=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),t[0]|=a):r[0]-=8,(n=e[t[0]>>r[0]])&i.lossless.Decoder.MSB){if(0!==this.markerIndex)return this.markerIndex=0,65280|this.marker;t[0]&=65535>>16-r[0],t[0]<<=8,255===(a=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),t[0]|=a,n=e[256*(255&n)+(t[0]>>r[0])],r[0]+=8}if(r[0]+=8-(n>>8),r[0]<0)throw new Error("index="+r[0]+" temp="+t[0]+" code="+n+" in HuffmanValue()");return r[0]>16-r[0],255&n)},i.lossless.Decoder.prototype.getn=function(e,t,i,r){var n,a;if(0===t)return 0;if(16===t)return e[0]>=0?-32768:32768;if(r[0]-=t,r[0]>=0){if(r[0]>r[0],i[0]&=65535>>16-r[0]}else{if(i[0]<<=8,255===(a=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),i[0]|=a,r[0]+=8,r[0]<0){if(0!==this.markerIndex)return this.markerIndex=0,(65280|this.marker)<<8;i[0]<<=8,255===(a=this.stream.get8())&&(this.marker=this.stream.get8(),0!==this.marker&&(this.markerIndex=9)),i[0]|=a,r[0]+=8}if(r[0]<0)throw new Error("index="+r[0]+" in getn()");if(r[0]>r[0],i[0]&=65535>>16-r[0]}return n<1<0?this.getter(this.yLoc*this.xDim+this.xLoc-1,e):this.yLoc>0?this.getPreviousY(e):1<0&&this.yLoc>0?this.getter((this.yLoc-1)*this.xDim+this.xLoc-1,e):this.getPreviousY(e)},i.lossless.Decoder.prototype.getPreviousY=function(e){return this.yLoc>0?this.getter((this.yLoc-1)*this.xDim+this.xLoc,e):this.getPreviousX(e)},i.lossless.Decoder.prototype.isLastPixel=function(){return this.xLoc===this.xDim-1&&this.yLoc===this.yDim-1},i.lossless.Decoder.prototype.outputSingle=function(e){this.xLoc=this.xDim&&(this.yLoc+=1,this.xLoc=0))},i.lossless.Decoder.prototype.outputRGB=function(e){var t=this.yLoc*this.xDim+this.xLoc;this.xLoc=this.xDim&&(this.yLoc+=1,this.xLoc=0))},i.lossless.Decoder.prototype.setValue8=function(e,t){this.outputData[e]=t},i.lossless.Decoder.prototype.getValue8=function(e){return this.outputData[e]},(t=new ArrayBuffer(2),new DataView(t).setInt16(0,256,!0),256===new Int16Array(t)[0])?(i.lossless.Decoder.prototype.setValue16=i.lossless.Decoder.prototype.setValue8,i.lossless.Decoder.prototype.getValue16=i.lossless.Decoder.prototype.getValue8):(i.lossless.Decoder.prototype.setValue16=function(e,t){this.outputData[e]=(255&t)<<8|t>>8&255},i.lossless.Decoder.prototype.getValue16=function(e){var t=this.outputData[e];return(255&t)<<8|t>>8&255}),i.lossless.Decoder.prototype.setValueRGB=function(e,t,i){this.outputData[3*e+i]=t},i.lossless.Decoder.prototype.getValueRGB=function(e,t){return this.outputData[3*e+t]},i.lossless.Decoder.prototype.readApp=function(){var e=0,t=this.stream.get16();for(e+=2;e0&&!e[o-1];)o--;a.push({children:[],index:0});var s,l=a[0];for(i=0;i0;)l=a.pop();for(l.index++,a.push(l);a.length<=i;)a.push(s={children:[],index:0}),l.children[l.index]=s.children,l=s;n++}i+10)return g--,m>>g&1;if(255==(m=t[i++])){var e=t[i++];if(e)throw"unexpected marker: "+(m<<8|e).toString(16)}return g=7,m>>>7}function A(e){for(var t,i=e;null!==(t=p());){if("number"==typeof(i=i[t]))return i;if("object"!=typeof i)throw"invalid huffman sequence"}return null}function S(e){for(var t=0;e>0;){var i=p();if(null===i)return;t=t<<1|i,e--}return t}function b(e){var t=S(e);return t>=1<0)v--;else for(var r=o,n=s;r<=n;){var a=A(t.huffmanTableAC),l=15&a,u=a>>4;if(0!==l){var f=e[r+=u];t.blockData[i+f]=b(l)*(1<>4,0===f)a<15?(v=S(a)+(1<>4;if(0!==s){var c=e[a+=l];t.blockData[i+c]=b(s),a++}else{if(l<15)break;a+=16}}};var R,F,P,L,_,N,U=0;for(F=1==k?n[0].blocksPerLine*n[0].blocksPerColumn:u*r.mcusPerColumn,a||(a=F);U=65488&&R<=65495))break;i+=2}return i-d}function m(e,t,u){var f,h,d,m,g,p,A,S,b,v,w=e.quantizationTable;for(v=0;v<64;v++)u[v]=e.blockData[t+v]*w[v];for(v=0;v<8;++v){var T=8*v;0!==u[1+T]||0!==u[2+T]||0!==u[3+T]||0!==u[4+T]||0!==u[5+T]||0!==u[6+T]||0!==u[7+T]?(f=l*u[0+T]+128>>8,h=l*u[4+T]+128>>8,d=u[2+T],m=u[6+T],g=c*(u[1+T]-u[7+T])+128>>8,S=c*(u[1+T]+u[7+T])+128>>8,p=u[3+T]<<4,A=u[5+T]<<4,b=f-h+1>>1,f=f+h+1>>1,h=b,b=d*s+m*o+128>>8,d=d*o-m*s+128>>8,m=b,b=g-A+1>>1,g=g+A+1>>1,A=b,b=S+p+1>>1,p=S-p+1>>1,S=b,b=f-m+1>>1,f=f+m+1>>1,m=b,b=h-d+1>>1,h=h+d+1>>1,d=b,b=g*a+S*n+2048>>12,g=g*n-S*a+2048>>12,S=b,b=p*r+A*i+2048>>12,p=p*i-A*r+2048>>12,A=b,u[0+T]=f+S,u[7+T]=f-S,u[1+T]=h+A,u[6+T]=h-A,u[2+T]=d+p,u[5+T]=d-p,u[3+T]=m+g,u[4+T]=m-g):(b=l*u[0+T]+512>>10,u[0+T]=b,u[1+T]=b,u[2+T]=b,u[3+T]=b,u[4+T]=b,u[5+T]=b,u[6+T]=b,u[7+T]=b)}for(v=0;v<8;++v){var y=v;0!==u[8+y]||0!==u[16+y]||0!==u[24+y]||0!==u[32+y]||0!==u[40+y]||0!==u[48+y]||0!==u[56+y]?(f=l*u[0+y]+2048>>12,h=l*u[32+y]+2048>>12,d=u[16+y],m=u[48+y],g=c*(u[8+y]-u[56+y])+2048>>12,S=c*(u[8+y]+u[56+y])+2048>>12,p=u[24+y],A=u[40+y],b=f-h+1>>1,f=f+h+1>>1,h=b,b=d*s+m*o+2048>>12,d=d*o-m*s+2048>>12,m=b,b=g-A+1>>1,g=g+A+1>>1,A=b,b=S+p+1>>1,p=S-p+1>>1,S=b,b=f-m+1>>1,f=f+m+1>>1,m=b,b=h-d+1>>1,h=h+d+1>>1,d=b,b=g*a+S*n+2048>>12,g=g*n-S*a+2048>>12,S=b,b=p*r+A*i+2048>>12,p=p*i-A*r+2048>>12,A=b,u[0+y]=f+S,u[56+y]=f-S,u[8+y]=h+A,u[48+y]=h-A,u[16+y]=d+p,u[40+y]=d-p,u[24+y]=m+g,u[32+y]=m-g):(b=l*u[v+0]+8192>>14,u[0+y]=b,u[8+y]=b,u[16+y]=b,u[24+y]=b,u[32+y]=b,u[40+y]=b,u[48+y]=b,u[56+y]=b)}for(v=0;v<64;++v){var C=t+v,I=u[v];I=I<=-2056/e.bitConversion?0:I>=2024/e.bitConversion?255/e.bitConversion:I+2056/e.bitConversion>>4,e.blockData[C]=I}}function g(e,t){for(var i=t.blocksPerLine,r=t.blocksPerColumn,n=new Int32Array(64),a=0;a=255?255:0|e}return u.prototype={load:function(e){var t=function(e){this.parse(e),this.onload&&this.onload()}.bind(this);if(e.indexOf("data:")>-1){for(var i=e.indexOf("base64,")+7,r=atob(e.substring(i)),n=new Uint8Array(r.length),a=r.length-1;a>=0;a--)n[a]=r.charCodeAt(a);t(r)}else{var o=new XMLHttpRequest;o.open("GET",e,!0),o.responseType="arraybuffer",o.onload=function(){var e=new Uint8Array(o.response);t(e)}.bind(this),o.send(null)}},parse:function(i){function r(){var e=i[a]<<8|i[a+1];return a+=2,e}function n(e){for(var t=Math.ceil(e.samplesPerLine/8/e.maxH),i=Math.ceil(e.scanLines/8/e.maxV),r=0;r>4){if(y>>4!=1)throw"DQT: invalid table spec";for(b=0;b<64;b++){C[e[b]]=r()}}else for(b=0;b<64;b++){C[e[b]]=i[a++]}m[15&y]=C}break;case 65472:case 65473:case 65474:if(o)throw"Only single frame JPEGs supported";r(),(o={}).extended=65473===S,o.progressive=65474===S,o.precision=i[a++],o.scanLines=r(),o.samplesPerLine=r(),o.components=[],o.componentIds={};var I,D=i[a++],x=0,E=0;for(H=0;H>4,k=15&i[a+1];x>4?p:A)[15&P]=f(L,N)}break;case 65501:r(),s=r();break;case 65498:r();var U=i[a++],O=[];for(H=0;H>4],Y.huffmanTableAC=p[15&V],O.push(Y)}var q=i[a++],G=i[a++],Q=i[a++],z=d(i,a,o,O,s,q,G,Q>>4,15&Q);a+=z;break;default:if(255==i[a-3]&&i[a-2]>=192&&i[a-2]<=254){a-=3;break}throw"unknown JPEG marker "+S.toString(16)}S=r()}switch(this.width=o.samplesPerLine,this.height=o.scanLines,this.jfif=u,this.adobe=h,this.components=[],o.components.length){case 1:this.colorspace=t.Grayscale;break;case 3:this.adobe?this.colorspace=t.AdobeRGB:this.colorspace=t.RGB;break;case 4:this.colorspace=t.CYMK;break;default:this.colorspace=t.Unknown}for(var H=0;H0?Math.min(r.xcb,n.PPx-1):Math.min(r.xcb,n.PPx),n.ycb_=i>0?Math.min(r.ycb,n.PPy-1):Math.min(r.ycb,n.PPy),n}function l(e,t,i){var r=1<t.trx0?Math.ceil(t.trx1/r)-Math.floor(t.trx0/r):0,c=t.try1>t.try0?Math.ceil(t.try1/n)-Math.floor(t.try0/n):0,u=l*c;t.precinctParameters={precinctWidth:r,precinctHeight:n,numprecinctswide:l,numprecinctshigh:c,numprecincts:u,precinctWidthInSubband:o,precinctHeightInSubband:s}}function c(e,t,i){var r,n,a,o,s=i.xcb_,l=i.ycb_,c=1<>s,h=t.tby0>>l,d=t.tbx1+c-1>>s,m=t.tby1+u-1>>l,g=t.resolution.precinctParameters,p=[],A=[];for(n=h;nS.cbxMax&&(S.cbxMax=r),nS.cbyMax&&(S.cbyMax=n)):A[o]=S={cbxMin:r,cbyMin:n,cbxMax:r,cbyMax:n},a.precinct=S}}t.codeblockParameters={codeblockWidth:s,codeblockHeight:l,numcodeblockwide:d-f+1,numcodeblockhigh:m-h+1},t.codeblocks=p,t.precincts=A}function u(e,t,i){for(var r=[],n=e.subbands,a=0,o=n.length;ae.codingStyleParameters.decompositionLevelsCount)){for(var t=e.resolutions[c],i=t.precinctParameters.numprecincts;he.codingStyleParameters.decompositionLevelsCount)){for(var t=e.resolutions[l],i=t.precinctParameters.numprecincts;he.codingStyleParameters.decompositionLevelsCount)){var a=e.resolutions[i],o=a.precinctParameters.numprecincts;if(!(n>=o)){for(;t=0;--p){var A=l.resolutions[p],S=g*A.precinctParameters.precinctWidth,b=g*A.precinctParameters.precinctHeight;f=Math.min(f,S),h=Math.min(h,b),d=Math.max(d,A.precinctParameters.numprecinctswide),m=Math.max(m,A.precinctParameters.numprecinctshigh),u[p]={width:S,height:b},g<<=1}i=Math.min(i,f),r=Math.min(r,h),n=Math.max(n,d),a=Math.max(a,m),o[s]={resolutions:u,minWidth:f,minHeight:h,maxNumWide:d,maxNumHigh:m}}return{components:o,minWidth:i,minHeight:r,maxNumWide:n,maxNumHigh:a}}function w(e){for(var t=e.SIZ,i=e.currentTile.index,r=e.tiles[i],n=t.Csiz,a=0;a=t.length)throw new Error("Unexpected EOF");var r=t[i+a];a++,s?(n=n<<7|r,o+=7,s=!1):(n=n<<8|r,o+=8),255===r&&(s=!0)}return n>>>(o-=e)&(1<=t.length)return;if(F.isAboveThreshold())break;if(F.isKnown())F.nextLevel();else if(l(1)){if(F.setKnown(),F.isLeaf()){v.included=!0,k=R=!0;break}F.nextLevel()}else F.incrementValue()}}if(k){if(R){for((P=I.zeroBitPlanesTree).reset(E,M);;){if(a>=t.length)return;if(l(1)){if(!P.nextLevel())break}else P.incrementValue()}v.zeroBitPlanes=P.value}for(var N=h();l(1);)v.Lblock++;var U=d(N),O=l((N<1<0;){var B=T.shift();void 0===(v=B.codeblock).data&&(v.data=[]),v.data.push({data:t,start:i+a,end:i+a+B.dataLength,codingpasses:B.codingpasses}),a+=B.dataLength}}catch{return}return a}function y(e,t,r,n,a,o,s,l){for(var c=n.tbx0,u=n.tby0,f=n.tbx1-n.tbx0,h=n.codeblocks,d="H"===n.type.charAt(0)?1:0,m="H"===n.type.charAt(1)?t:0,g=0,p=h.length;g=o?L:L*(1<0?1-A:0));var x=S.subbands[T],E=e[x.type];y(w,b,0,x,d?1:Math.pow(2,h+E-D)*(1+I/2048),u+D-1,d,f)}g.push({width:b,height:v,items:w})}var M=m.calculate(g,n.tcx0,n.tcy0);return{left:n.tcx0,top:n.tcy0,width:M.width,height:M.height,items:M.items}}function I(e,t){for(var i=e.SIZ.Csiz,r=e.tiles[t],n=0;n=a.VERBOSITY_LEVELS.infos&&console.log("Info: "+t));break;case 1785737827:this.parseCodestream(e,i,i+c);break;case 1783636e3:218793738!==g(e,i)&&o("Invalid JP2 signature");break;case 1783634458:case 1718909296:case 1920099697:case 1919251232:case 1768449138:break;default:o("Unsupported header type "+l+" ("+String.fromCharCode(l>>24&255,l>>16&255,l>>8&255,255&l)+")")}u&&(i+=c)}else this.parseCodestream(e,0,e.length)},parseImageProperties:function(e){for(var t=e.getByte();t>=0;){if(65361===(t<<8|(t=e.getByte()))){e.skip(4);var i=e.getInt32()>>>0,r=e.getInt32()>>>0,n=e.getInt32()>>>0,a=e.getInt32()>>>0;e.skip(16);var o=e.getUint16();return this.width=i-n,this.height=r-a,this.componentsCount=o,void(this.bitsPerComponent=8)}}throw new Error("JPX Error: No size marker found in JPX stream")},parseCodestream:function(e,t,i){var a={};try{for(var s=!1,l=t;l+1>5,h=[];u>3,M.mu=0):(M.epsilon=e[u]>>3,M.mu=(7&e[u])<<8|e[u+1],u+=2),h.push(M)}E.SPqcds=h,a.mainHeader?a.QCD=E:(a.currentTile.QCD=E,a.currentTile.QCC=[]);break;case 65373:S=m(e,l);var k,R={};switch(u=l+2,a.SIZ.Csiz<257?k=e[u++]:(k=m(e,u),u+=2),31&(f=e[u++])){case 0:d=8,p=!0;break;case 1:d=16,p=!1;break;case 2:d=16,p=!0;break;default:throw new Error("JPX Error: Invalid SQcd value "+f)}for(R.noQuantization=8===d,R.scalarExpounded=p,R.guardBits=f>>5,h=[];u>3,M.mu=0):(M.epsilon=e[u]>>3,M.mu=(7&e[u])<<8|e[u+1],u+=2),h.push(M);R.SPqcds=h,a.mainHeader?a.QCC[k]=R:a.currentTile.QCC[k]=R;break;case 65362:S=m(e,l);var F={};u=l+2;var P=e[u++];F.entropyCoderWithCustomPrecincts=!!(1&P),F.sopMarkerUsed=!!(2&P),F.ephMarkerUsed=!!(4&P),F.progressionOrder=e[u++],F.layersCount=m(e,u),u+=2,F.multipleComponentTransform=e[u++],F.decompositionLevelsCount=e[u++],F.xcb=2+(15&e[u++]),F.ycb=2+(15&e[u++]);var L=e[u++];if(F.selectiveArithmeticCodingBypass=!!(1&L),F.resetContextProbabilities=!!(2&L),F.terminationOnEachCodingPass=!!(4&L),F.verticalyStripe=!!(8&L),F.predictableTermination=!!(16&L),F.segmentationSymbolUsed=!!(32&L),F.reversibleTransformation=e[u++],F.entropyCoderWithCustomPrecincts){for(var _=[];u>4})}F.precinctsSizes=_}var U=[];if(F.selectiveArithmeticCodingBypass&&U.push("selectiveArithmeticCodingBypass"),F.resetContextProbabilities&&U.push("resetContextProbabilities"),F.terminationOnEachCodingPass&&U.push("terminationOnEachCodingPass"),F.verticalyStripe&&U.push("verticalyStripe"),F.predictableTermination&&U.push("predictableTermination"),U.length>0)throw s=!0,new Error("JPX Error: Unsupported COD options ("+U.join(", ")+")");a.mainHeader?a.COD=F:(a.currentTile.COD=F,a.currentTile.COC=[]);break;case 65424:S=m(e,l),(A={}).index=m(e,l+2),A.length=g(e,l+4),A.dataEnd=A.length+l-2,A.partIndex=e[l+8],A.partsCount=e[l+9],a.mainHeader=!1,0===A.partIndex&&(A.COD=a.COD,A.COC=a.COC.slice(0),A.QCD=a.QCD,A.QCC=a.QCC.slice(0)),a.currentTile=A;break;case 65427:0===(A=a.currentTile).partIndex&&(I(a,A.index),w(a)),T(a,e,l,S=A.dataEnd-l);break;case 65365:case 65367:case 65368:case 65380:S=m(e,l);break;case 65363:throw new Error("JPX Error: Codestream code 0xFF53 (COC) is not implemented");default:throw new Error("JPX Error: Unknown codestream code: "+c.toString(16))}l+=S}}catch(e){if(s||this.failOnCorruptedImage)throw e;o("Trying to recover from "+e.message)}this.tiles=function(e){for(var t=e.SIZ,i=e.components,r=t.Csiz,n=[],a=0,o=e.tiles.length;a>2))+w,I=y+v,f[M++]=T<=0?0:T>=m?255:T>>h,f[M++]=y<=0?0:y>=m?255:y>>h,f[M++]=I<=0?0:I>=m?255:I>>h;else for(A=0;A=m?255:T>>h,f[M++]=y<=0?0:y>=m?255:y>>h,f[M++]=I<=0?0:I>=m?255:I>>h;if(k)for(A=0,M=3;A=p?255:D+d>>h}else for(s=0;s=m?255:x+d>>h,M+=r}else{var O=i[s].isSigned;U=c[s].items;if(O)for(M=s,A=0,S=U.length;A>=1,t>>=1,r++}r--,(i=this.levels[r]).items[i.index]=n,this.currentLevel=r,delete this.value},incrementValue:function(){var e=this.levels[this.currentLevel];e.items[e.index]++},nextLevel:function(){var e=this.currentLevel,t=this.levels[e],i=t.items[t.index];return--e<0?(this.value=i,!1):(this.currentLevel=e,(t=this.levels[e]).items[t.index]=i,!0)}},e}(),x=function(){function e(e,t){var i=d(Math.max(e,t))+1;this.levels=[];for(var r=0;r>=1,t>>=1,r++}this.currentLevel=this.levels.length-1,this.minValue=this.levels[this.currentLevel].items[0]},incrementValue:function(){var e=this.levels[this.currentLevel];e.items[e.index]=e.items[e.index]+1,e.items[e.index]>this.minValue&&(this.minValue=e.items[e.index])},nextLevel:function(){var e=this.currentLevel;if(--e<0)return!1;this.currentLevel=e;var t=this.levels[e];return t.items[t.index]this.minValue&&(this.minValue=t.items[t.index]),!0},isLeaf:function(){return 0===this.currentLevel},isAboveThreshold:function(){var e=this.currentLevel,t=this.levels[e];return t.items[t.index]>this.currentStopValue},isKnown:function(){var e=this.currentLevel,t=this.levels[e];return t.status[t.index]>0},setKnown:function(){var e=this.currentLevel,t=this.levels[e];t.status[t.index]=1}},e}(),E=function(){var e=17,t=new Uint8Array([0,5,8,0,3,7,8,0,4,7,8,0,0,0,0,0,1,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8]),i=new Uint8Array([0,3,4,0,5,7,7,0,8,8,8,0,0,0,0,0,1,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8]),r=new Uint8Array([0,1,2,0,1,2,2,0,2,2,2,0,0,0,0,0,3,4,5,0,4,5,5,0,5,5,5,0,0,0,0,0,6,7,7,0,7,7,7,0,7,7,7,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8]);function n(e,n,a,o,s){this.width=e,this.height=n,this.contextLabelTable="HH"===a?r:"HL"===a?i:t;var l=e*n;this.neighborsSignificance=new Uint8Array(l),this.coefficentsSign=new Uint8Array(l),this.coefficentsMagnitude=s>14?new Uint32Array(l):s>6?new Uint16Array(l):new Uint8Array(l),this.processingFlags=new Uint8Array(l);var c=new Uint8Array(l);if(0!==o)for(var u=0;u0,l=t+10&&(r=i-a,s&&(n[r-1]+=16),l&&(n[r+1]+=16),n[r]+=4),e+1=i)break;if(o[h]&=-2,!r[h]&&a[h]){var g=l[a[h]];if(e.readBit(s,g)){var p=this.decodeSignBit(m,f,h);n[h]=p,r[h]=1,this.setNeighborsSignificance(m,f,h),o[h]|=2}c[h]++,o[h]|=1}}},decodeSignBit:function(e,t,i){var r,n,a,o,s,l,c=this.width,u=this.height,f=this.coefficentsMagnitude,h=this.coefficentsSign;o=t>0&&0!==f[i-1],t+10&&0!==f[i-c],e+1=0?(s=9+r,l=this.decoder.readBit(this.contexts,s)):(s=9-r,l=1^this.decoder.readBit(this.contexts,s)),l},runMagnitudeRefinementPass:function(){for(var e,t=this.decoder,i=this.width,r=this.height,n=this.coefficentsMagnitude,a=this.neighborsSignificance,o=this.contexts,s=this.bitsDecoded,l=this.processingFlags,c=i*r,u=4*i,f=0;f>1,l=-1.586134342059924,c=-.052980118572961,u=.882911075530934,f=.443506852043971,h=1.230174104914001,d=1/h;for(r=(t|=0)-3,n=s+4;n--;r+=2)e[r]*=d;for(a=f*e[(r=t-2)-1],n=s+3;n--&&(o=f*e[r+1],e[r]=h*e[r]-a-o,n--);r+=2)a=f*e[(r+=2)+1],e[r]=h*e[r]-a-o;for(a=u*e[(r=t-1)-1],n=s+2;n--&&(o=u*e[r+1],e[r]-=a+o,n--);r+=2)a=u*e[(r+=2)+1],e[r]-=a+o;for(a=c*e[(r=t)-1],n=s+1;n--&&(o=c*e[r+1],e[r]-=a+o,n--);r+=2)a=c*e[(r+=2)+1],e[r]-=a+o;if(0!==s)for(a=l*e[(r=t+1)-1],n=s;n--&&(o=l*e[r+1],e[r]-=a+o,n--);r+=2)a=l*e[(r+=2)+1],e[r]-=a+o},e}(),R=function(){function e(){M.call(this)}return e.prototype=Object.create(M.prototype),e.prototype.filter=function(e,t,i){var r,n,a=i>>1;for(r=t|=0,n=a+1;n--;r+=2)e[r]-=e[r-1]+e[r+1]+2>>2;for(r=t+1,n=a;n--;r+=2)e[r]+=e[r-1]+e[r+1]>>1},e}();return t}(),i=function(){var e=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},{qe:6145,nmps:3,nlps:9,switchFlag:0},{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},{qe:21505,nmps:16,nlps:14,switchFlag:0},{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},{qe:4609,nmps:29,nlps:26,switchFlag:0},{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,nmps:42,nlps:39,switchFlag:0},{qe:21,nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];function t(e,t,i){this.data=e,this.bp=t,this.dataEnd=i,this.chigh=e[t],this.clow=0,this.byteIn(),this.chigh=this.chigh<<7&65535|this.clow>>9&127,this.clow=this.clow<<7&65535,this.ct-=7,this.a=32768}return t.prototype={byteIn:function(){var e=this.data,t=this.bp;255===e[t]?e[t+1]>143?(this.clow+=65280,this.ct=8):(t++,this.clow+=e[t]<<9,this.ct=7,this.bp=t):(t++,this.clow+=t65535&&(this.chigh+=this.clow>>16,this.clow&=65535)},readBit:function(t,i){var r,n=t[i]>>1,a=1&t[i],o=e[n],s=o.qe,l=this.a-s;if(this.chigh>15&1,this.clow=this.clow<<1&65535,this.ct--}while(!(32768&l));return this.a=l,t[i]=n<<1|a,r}},t}(),r=typeof window>"u"?commonjsGlobal:window;r.PDFJS||(r.PDFJS={});var n,a=a||{};function o(e){a.verbosity>=a.VERBOSITY_LEVELS.warnings&&console.log("Warning: "+e)}function s(e,t,i){return Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!1}),i}a.VERBOSITY_LEVELS={errors:0,warnings:1,infos:5},a.OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91},a.UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"},a.UnsupportedManager=(n=[],{listen:function(e){n.push(e)},notify:function(e){o('Unsupported feature "'+e+'"');for(var t=0,i=n.length;tt;)t<<=1,i++;return i}function m(e,t){return e[t]<<8|e[t+1]}function g(e,t){return(e[t]<<24|e[t+1]<<16|e[t+2]<<8|e[t+3])>>>0}a.UnexpectedResponseException=h,function(){function e(e){this.message=e}e.prototype=new Error,e.prototype.name="NotImplementedException",e.constructor=e}(),function(){function e(e,t){this.begin=e,this.end=t,this.message="Missing data ["+e+", "+t+")"}e.prototype=new Error,e.prototype.name="MissingDataException",e.constructor=e}(),function(){function e(e){this.message=e}e.prototype=new Error,e.prototype.name="XRefParseException",e.constructor=e}(),Object.defineProperty(a,"isLittleEndian",{configurable:!0,get:function(){return s(a,"isLittleEndian",((e=new Uint8Array(2))[0]=1,1===new Uint16Array(e.buffer)[0]));var e}}),Object.defineProperty(a,"hasCanvasTypedArrays",{configurable:!0,get:function(){return s(a,"hasCanvasTypedArrays",((e=document.createElement("canvas")).width=e.height=1,typeof e.getContext("2d").createImageData(1,1).data.buffer<"u"));var e}});var p=a.Util=function(){function e(){}var t=["rgb(",0,",",0,",",0,")"];return e.makeCssRgb=function(e,i,r){return t[1]=e,t[3]=i,t[5]=r,t.join("")},e.transform=function(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]},e.applyTransform=function(e,t){return[e[0]*t[0]+e[1]*t[2]+t[4],e[0]*t[1]+e[1]*t[3]+t[5]]},e.applyInverseTransform=function(e,t){var i=t[0]*t[3]-t[1]*t[2];return[(e[0]*t[3]-e[1]*t[2]+t[2]*t[5]-t[4]*t[3])/i,(-e[0]*t[1]+e[1]*t[0]+t[4]*t[1]-t[5]*t[0])/i]},e.getAxialAlignedBoundingBox=function(t,i){var r=e.applyTransform(t,i),n=e.applyTransform(t.slice(2,4),i),a=e.applyTransform([t[0],t[3]],i),o=e.applyTransform([t[2],t[1]],i);return[Math.min(r[0],n[0],a[0],o[0]),Math.min(r[1],n[1],a[1],o[1]),Math.max(r[0],n[0],a[0],o[0]),Math.max(r[1],n[1],a[1],o[1])]},e.inverseTransform=function(e){var t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]},e.apply3dTransform=function(e,t){return[e[0]*t[0]+e[1]*t[1]+e[2]*t[2],e[3]*t[0]+e[4]*t[1]+e[5]*t[2],e[6]*t[0]+e[7]*t[1]+e[8]*t[2]]},e.singularValueDecompose2dScale=function(e){var t=[e[0],e[2],e[1],e[3]],i=e[0]*t[0]+e[1]*t[2],r=e[0]*t[1]+e[1]*t[3],n=e[2]*t[0]+e[3]*t[2],a=e[2]*t[1]+e[3]*t[3],o=(i+a)/2,s=Math.sqrt((i+a)*(i+a)-4*(i*a-n*r))/2,l=o+s||1,c=o-s||1;return[Math.sqrt(l),Math.sqrt(c)]},e.normalizeRect=function(e){var t=e.slice(0);return e[0]>e[2]&&(t[0]=e[2],t[2]=e[0]),e[1]>e[3]&&(t[1]=e[3],t[3]=e[1]),t},e.intersect=function(t,i){function r(e,t){return e-t}var n=[t[0],t[2],i[0],i[2]].sort(r),a=[t[1],t[3],i[1],i[3]].sort(r),o=[];return t=e.normalizeRect(t),i=e.normalizeRect(i),(n[0]===t[0]&&n[1]===i[0]||n[0]===i[0]&&n[1]===t[0])&&(o[0]=n[1],o[2]=n[2],(a[0]===t[1]&&a[1]===i[1]||a[0]===i[1]&&a[1]===t[1])&&(o[1]=a[1],o[3]=a[2],o))},e.sign=function(e){return e<0?-1:1},e.appendToArray=function(e,t){Array.prototype.push.apply(e,t)},e.prependToArray=function(e,t){Array.prototype.unshift.apply(e,t)},e.extendObj=function(e,t){for(var i in t)e[i]=t[i]},e.getInheritableProperty=function(e,t){for(;e&&!e.has(t);)e=e.get("Parent");return e?e.get(t):null},e.inherit=function(e,t,i){for(var r in e.prototype=Object.create(t.prototype),e.prototype.constructor=e,i)e.prototype[r]=i[r]},e.loadScript=function(e,t){var i=document.createElement("script"),r=!1;i.setAttribute("src",e),t&&(i.onload=function(){r||t(),r=!0}),document.getElementsByTagName("head")[0].appendChild(i)},e}();a.PageViewport=function(){function e(e,t,i,r,n,a){this.viewBox=e,this.scale=t,this.rotation=i,this.offsetX=r,this.offsetY=n;var o,s,l,c,u,f,h,d,m=(e[2]+e[0])/2,g=(e[3]+e[1])/2;switch(i=(i%=360)<0?i+360:i){case 180:o=-1,s=0,l=0,c=1;break;case 90:o=0,s=1,l=1,c=0;break;case 270:o=0,s=-1,l=-1,c=0;break;default:o=1,s=0,l=0,c=-1}a&&(l=-l,c=-c),0===o?(u=Math.abs(g-e[1])*t+r,f=Math.abs(m-e[0])*t+n,h=Math.abs(e[3]-e[1])*t,d=Math.abs(e[2]-e[0])*t):(u=Math.abs(m-e[0])*t+r,f=Math.abs(g-e[1])*t+n,h=Math.abs(e[2]-e[0])*t,d=Math.abs(e[3]-e[1])*t),this.transform=[o*t,s*t,l*t,c*t,u-o*t*m-l*t*g,f-s*t*m-c*t*g],this.width=h,this.height=d,this.fontScale=t}return e.prototype={clone:function(t){var i="scale"in(t=t||{})?t.scale:this.scale,r="rotation"in t?t.rotation:this.rotation;return new e(this.viewBox.slice(),i,r,this.offsetX,this.offsetY,t.dontFlip)},convertToViewportPoint:function(e,t){return p.applyTransform([e,t],this.transform)},convertToViewportRectangle:function(e){var t=p.applyTransform([e[0],e[1]],this.transform),i=p.applyTransform([e[2],e[3]],this.transform);return[t[0],t[1],i[0],i[1]]},convertToPdfPoint:function(e,t){return p.applyInverseTransform([e,t],this.transform)}},e}(),a.createPromiseCapability=function(){var e={};return e.promise=new Promise((function(t,i){e.resolve=t,e.reject=i})),e},function(){if(r.Promise)return"function"!=typeof r.Promise.all&&(r.Promise.all=function(e){var t,i,n=0,a=[],o=new r.Promise((function(e,r){t=e,i=r}));return e.forEach((function(e,r){n++,e.then((function(e){a[r]=e,0===--n&&t(a)}),i)})),0===n&&t(a),o}),"function"!=typeof r.Promise.resolve&&(r.Promise.resolve=function(e){return new r.Promise((function(t){t(e)}))}),"function"!=typeof r.Promise.reject&&(r.Promise.reject=function(e){return new r.Promise((function(t,i){i(e)}))}),void("function"!=typeof r.Promise.prototype.catch2&&(r.Promise.prototype.catch2=function(e){return r.Promise.prototype.then(void 0,e)}));var e={handlers:[],running:!1,unhandledRejections:[],pendingRejectionCheck:!1,scheduleHandlers:function(e){0!==e._status&&(this.handlers=this.handlers.concat(e._handlers),e._handlers=[],!this.running&&(this.running=!0,setTimeout(this.runHandlers.bind(this),0)))},runHandlers:function(){for(var e=Date.now()+1;this.handlers.length>0;){var t=this.handlers.shift(),i=t.thisPromise._status,r=t.thisPromise._value;try{1===i?"function"==typeof t.onResolve&&(r=t.onResolve(r)):"function"==typeof t.onReject&&(r=t.onReject(r),i=1,t.thisPromise._unhandledRejection&&this.removeUnhandeledRejection(t.thisPromise))}catch(e){i=2,r=e}if(t.nextPromise._updateStatus(i,r),Date.now()>=e)break}this.handlers.length>0?setTimeout(this.runHandlers.bind(this),0):this.running=!1},addUnhandledRejection:function(e){this.unhandledRejections.push({promise:e,time:Date.now()}),this.scheduleRejectionCheck()},removeUnhandeledRejection:function(e){e._unhandledRejection=!1;for(var t=0;t500){var i=this.unhandledRejections[t].promise._value,r="Unhandled rejection: "+i;i.stack&&(r+="\n"+i.stack),o(r),this.unhandledRejections.splice(t),t--}this.unhandledRejections.length&&this.scheduleRejectionCheck()}.bind(this),500))}};function t(e){this._status=0,this._handlers=[];try{e.call(this,this._resolve.bind(this),this._reject.bind(this))}catch(e){this._reject(e)}}t.all=function(e){var i,r,n=new t((function(e,t){i=e,r=t})),a=e.length,o=[];if(0===a)return i(o),n;function s(e){2!==n._status&&(o=[],r(e))}for(var l=0,c=e.length;l>2]+e[(3&l)<<4|c>>4]+e[o+1>6:64]+e[o+21?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),module.exports=Module,process.on("uncaughtException",(function(e){if(!(e instanceof ExitStatus))throw e})),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available (jsc?)"},Module.readBinary=function(e){if("function"==typeof readbuffer)return new Uint8Array(readbuffer(e));var t=read(e,"binary");return assert("object"==typeof t),t},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments);else{if(!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER)throw"Unknown runtime environment. Where are we?";if(Module.read=function(e){var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.log(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<"u"?function(e){dump(e)}:function(e){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(e){document.title=e})}function globalEval(e){eval.call(null,e)}for(var key in!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[],moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);var Runtime={setTempRet0:function(e){tempRet0=e},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(e){STACKTOP=e},getNativeTypeSize:function(e){switch(e){case"i1":case"i8":return 1;case"i16":return 2;case"i32":case"float":return 4;case"i64":case"double":return 8;default:if("*"===e[e.length-1])return Runtime.QUANTUM_SIZE;if("i"===e[0]){var t=parseInt(e.substr(1));return assert(t%8==0),t/8}return 0}},getNativeFieldSize:function(e){return Math.max(Runtime.getNativeTypeSize(e),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(e,t){return"double"===t||"i64"===t?7&e&&(assert(4==(7&e)),e+=4):assert(!(3&e)),e},getAlignSize:function(e,t,i){return i||"i64"!=e&&"double"!=e?e?Math.min(t||(e?Runtime.getNativeFieldSize(e):0),Runtime.QUANTUM_SIZE):Math.min(t,8):8},dynCall:function(e,t,i){return i&&i.length?(i.splice||(i=Array.prototype.slice.call(i)),i.splice(0,0,t),Module["dynCall_"+e].apply(null,i)):Module["dynCall_"+e].call(null,t)},functionPointers:[],addFunction:function(e){for(var t=0;t=TOTAL_MEMORY&&!enlargeMemory())return DYNAMICTOP=t,0;return t},alignMemory:function(e,t){return e=Math.ceil(e/(t||16))*(t||16)},makeBigInt:function(e,t,i){return i?+(e>>>0)+4294967296*+(t>>>0):+(e>>>0)+4294967296*+(0|t)},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=!1,tempDouble,tempI64,tempRet0,cwrap,ccall;function assert(e,t){e||abort("Assertion failed: "+t)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(e){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}function setValue(e,t,i,r){switch("*"===(i=i||"i8").charAt(i.length-1)&&(i="i32"),i){case"i1":case"i8":HEAP8[e|0]=t;break;case"i16":HEAP16[e>>1]=t;break;case"i32":HEAP32[e>>2]=t;break;case"i64":tempI64=[t>>>0,(tempDouble=t,+Math_abs(tempDouble)>=1?tempDouble>0?(0|Math_min(+Math_floor(tempDouble/4294967296),4294967295))>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[e>>2]=tempI64[0],HEAP32[e+4>>2]=tempI64[1];break;case"float":HEAPF32[e>>2]=t;break;case"double":HEAPF64[e>>3]=t;break;default:abort("invalid type for setValue: "+i)}}function getValue(e,t,i){switch("*"===(t=t||"i8").charAt(t.length-1)&&(t="i32"),t){case"i1":case"i8":return HEAP8[e|0];case"i16":return HEAP16[e>>1];case"i32":case"i64":return HEAP32[e>>2];case"float":return HEAPF32[e>>2];case"double":return HEAPF64[e>>3];default:abort("invalid type for setValue: "+t)}return null}(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(e){var t=Runtime.stackAlloc(e.length);return writeArrayToMemory(e,t),t},stringToC:function(e){var t=0;return null!=e&&0!==e&&writeStringToMemory(e,t=Runtime.stackAlloc(1+(e.length<<2))),t}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,t,i,r,n){var a=getCFunc(e),o=[],s=0;if(r)for(var l=0;l>2]=0;for(l=o+a;r0;)o=String.fromCharCode.apply(String,HEAPU8.subarray(e,e+Math.min(t,s))),a=a?a+o:o,e+=s,t-=s;return a}return Module.UTF8ToString(e)}function AsciiToString(e){for(var t="";;){var i=HEAP8[e++|0];if(!i)return t;t+=String.fromCharCode(i)}}function stringToAscii(e,t){return writeAsciiToMemory(e,t,!1)}function UTF8ArrayToString(e,t){for(var i,r,n,a,o,s="";;){if(!(i=e[t++]))return s;if(128&i)if(r=63&e[t++],192!=(224&i))if(n=63&e[t++],224==(240&i)?i=(15&i)<<12|r<<6|n:(a=63&e[t++],240==(248&i)?i=(7&i)<<18|r<<12|n<<6|a:(o=63&e[t++],248==(252&i)?i=(3&i)<<24|r<<18|n<<12|a<<6|o:i=(1&i)<<30|r<<24|n<<18|a<<12|o<<6|63&e[t++])),i<65536)s+=String.fromCharCode(i);else{var l=i-65536;s+=String.fromCharCode(55296|l>>10,56320|1023&l)}else s+=String.fromCharCode((31&i)<<6|r);else s+=String.fromCharCode(i)}}function UTF8ToString(e){return UTF8ArrayToString(HEAPU8,e)}function stringToUTF8Array(e,t,i,r){if(!(r>0))return 0;for(var n=i,a=i+r-1,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),s<=127){if(i>=a)break;t[i++]=s}else if(s<=2047){if(i+1>=a)break;t[i++]=192|s>>6,t[i++]=128|63&s}else if(s<=65535){if(i+2>=a)break;t[i++]=224|s>>12,t[i++]=128|s>>6&63,t[i++]=128|63&s}else if(s<=2097151){if(i+3>=a)break;t[i++]=240|s>>18,t[i++]=128|s>>12&63,t[i++]=128|s>>6&63,t[i++]=128|63&s}else if(s<=67108863){if(i+4>=a)break;t[i++]=248|s>>24,t[i++]=128|s>>18&63,t[i++]=128|s>>12&63,t[i++]=128|s>>6&63,t[i++]=128|63&s}else{if(i+5>=a)break;t[i++]=252|s>>30,t[i++]=128|s>>24&63,t[i++]=128|s>>18&63,t[i++]=128|s>>12&63,t[i++]=128|s>>6&63,t[i++]=128|63&s}}return t[i]=0,i-n}function stringToUTF8(e,t,i){return stringToUTF8Array(e,HEAPU8,t,i)}function lengthBytesUTF8(e){for(var t=0,i=0;i=55296&&r<=57343&&(r=65536+((1023&r)<<10)|1023&e.charCodeAt(++i)),r<=127?++t:t+=r<=2047?2:r<=65535?3:r<=2097151?4:r<=67108863?5:6}return t}function UTF16ToString(e){for(var t=0,i="";;){var r=HEAP16[e+2*t>>1];if(0==r)return i;++t,i+=String.fromCharCode(r)}}function stringToUTF16(e,t,i){if(void 0===i&&(i=2147483647),i<2)return 0;for(var r=t,n=(i-=2)<2*e.length?i/2:e.length,a=0;a>1]=o,t+=2}return HEAP16[t>>1]=0,t-r}function lengthBytesUTF16(e){return 2*e.length}function UTF32ToString(e){for(var t=0,i="";;){var r=HEAP32[e+4*t>>2];if(0==r)return i;if(++t,r>=65536){var n=r-65536;i+=String.fromCharCode(55296|n>>10,56320|1023&n)}else i+=String.fromCharCode(r)}}function stringToUTF32(e,t,i){if(void 0===i&&(i=2147483647),i<4)return 0;for(var r=t,n=r+i-4,a=0;a=55296&&o<=57343)o=65536+((1023&o)<<10)|1023&e.charCodeAt(++a);if(HEAP32[t>>2]=o,(t+=4)+4>n)break}return HEAP32[t>>2]=0,t-r}function lengthBytesUTF32(e){for(var t=0,i=0;i=55296&&r<=57343&&++i,t+=4}return t}function demangle(e){var t=!!Module.___cxa_demangle;if(t)try{var i=_malloc(e.length);writeStringToMemory(e.substr(1),i);var r=_malloc(4),n=Module.___cxa_demangle(i,0,0,r);if(0===getValue(r,"i32")&&n)return Pointer_stringify(n)}catch{}finally{i&&_free(i),r&&_free(r),n&&_free(n)}var a=3,o={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},s=[],l=!0;var c=e;try{if("Object._main"==e||"_main"==e)return"main()";if("number"==typeof e&&(e=Pointer_stringify(e)),"_"!==e[0]||"_"!==e[1]||"Z"!==e[2])return e;switch(e[3]){case"n":return"operator new()";case"d":return"operator delete()"}c=function t(i,r,n){r=r||1/0;var c,u="",f=[];if("N"===e[a]){if(c=function(){a++,"K"===e[a]&&a++;for(var t=[];"E"!==e[a];)if("S"!==e[a])if("C"!==e[a]){var i=parseInt(e.substr(a)),r=i.toString().length;if(!i||!r){a--;break}var n=e.substr(a+r,i);t.push(n),s.push(n),a+=r+i}else t.push(t[t.length-1]),a+=2;else{a++;var o=e.indexOf("_",a),l=e.substring(a,o)||0;t.push(s[l]||"?"),a=o+1}return a++,t}().join("::"),0==--r)return i?[c]:c}else if(("K"===e[a]||l&&"L"===e[a])&&a++,g=parseInt(e.substr(a))){var h=g.toString().length;c=e.substr(a+h,g),a+=h+g}if(l=!1,"I"===e[a]){a++;var d=t(!0);u+=t(!0,1,!0)[0]+" "+c+"<"+d.join(", ")+">"}else u=c;e:for(;a0;){var m=e[a++];if(m in o)f.push(o[m]);else switch(m){case"P":f.push(t(!0,1,!0)[0]+"*");break;case"R":f.push(t(!0,1,!0)[0]+"&");break;case"L":a++;var g=e.indexOf("E",a)-a;f.push(e.substr(a,g)),a+=g+2;break;case"A":if(g=parseInt(e.substr(a)),a+=g.toString().length,"_"!==e[a])throw"?";a++,f.push(t(!0,1,!0)[0]+" ["+g+"]");break;case"E":break e;default:u+="?"+m;break e}}return!n&&1===f.length&&"void"===f[0]&&(f=[]),i?(u&&f.push(u+"?"),f):u+"("+f.join(", ")+")"}()}catch{c+="?"}return c.indexOf("?")>=0&&!t&&Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),c}function demangleAll(e){return e.replace(/__Z[\w\d_]+/g,(function(e){var t=demangle(e);return e===t?e:e+" ["+t+"]"}))}function jsStackTrace(){var e=new Error;if(!e.stack){try{throw new Error(0)}catch(t){e=t}if(!e.stack)return"(no stack trace available)"}return e.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE,Module.allocate=allocate,Module.getMemory=getMemory,Module.Pointer_stringify=Pointer_stringify,Module.AsciiToString=AsciiToString,Module.stringToAscii=stringToAscii,Module.UTF8ArrayToString=UTF8ArrayToString,Module.UTF8ToString=UTF8ToString,Module.stringToUTF8Array=stringToUTF8Array,Module.stringToUTF8=stringToUTF8,Module.lengthBytesUTF8=lengthBytesUTF8,Module.UTF16ToString=UTF16ToString,Module.stringToUTF16=stringToUTF16,Module.lengthBytesUTF16=lengthBytesUTF16,Module.UTF32ToString=UTF32ToString,Module.stringToUTF32=stringToUTF32,Module.lengthBytesUTF32=lengthBytesUTF32,Module.stackTrace=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(e){return e%4096>0&&(e+=4096-e%4096),e}var HEAP,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64,STATIC_BASE=0,STATICTOP=0,staticSealed=!1,STACK_BASE=0,STACKTOP=0,STACK_MAX=0,DYNAMIC_BASE=0,DYNAMICTOP=0,byteLength,buffer;function enlargeMemory(){var e=Math.pow(2,31);if(DYNAMICTOP>=e)return!1;for(;TOTAL_MEMORY<=DYNAMICTOP;)if(TOTAL_MEMORY=e)return!1;try{if(ArrayBuffer.transfer)buffer=ArrayBuffer.transfer(buffer,TOTAL_MEMORY);else{var i=HEAP8;buffer=new ArrayBuffer(TOTAL_MEMORY)}}catch{return!1}return!!_emscripten_replace_memory(buffer)&&(Module.buffer=buffer,Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer),ArrayBuffer.transfer||HEAP8.set(i),!0)}try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get),byteLength(new ArrayBuffer(4))}catch(e){byteLength=function(e){return e.byteLength}}for(var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||16777216,totalMemory=65536;totalMemory0;){var t=e.shift();if("function"!=typeof t){var i=t.func;"number"==typeof i?void 0===t.arg?Runtime.dynCall("v",i):Runtime.dynCall("vi",i,[t.arg]):i(void 0===t.arg?null:t.arg)}else t()}}totalMemory=Math.max(totalMemory,16777216),totalMemory!==TOTAL_MEMORY&&(TOTAL_MEMORY=totalMemory),assert(typeof Int32Array<"u"&&typeof Float64Array<"u"&&!!new Int32Array(1).subarray&&!!new Int32Array(1).set,"JS engine does not provide full typed array support"),buffer=new ArrayBuffer(TOTAL_MEMORY),HEAP8=new Int8Array(buffer),HEAP16=new Int16Array(buffer),HEAP32=new Int32Array(buffer),HEAPU8=new Uint8Array(buffer),HEAPU16=new Uint16Array(buffer),HEAPU32=new Uint32Array(buffer),HEAPF32=new Float32Array(buffer),HEAPF64=new Float64Array(buffer),HEAP32[0]=255,assert(255===HEAPU8[0]&&0===HEAPU8[3],"Typed arrays 2 must be run on a little-endian system"),Module.HEAP=HEAP,Module.buffer=buffer,Module.HEAP8=HEAP8,Module.HEAP16=HEAP16,Module.HEAP32=HEAP32,Module.HEAPU8=HEAPU8,Module.HEAPU16=HEAPU16,Module.HEAPU32=HEAPU32,Module.HEAPF32=HEAPF32,Module.HEAPF64=HEAPF64;var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1;function preRun(){if(Module.preRun)for("function"==typeof Module.preRun&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__)}function postRun(){if(Module.postRun)for("function"==typeof Module.postRun&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(e){__ATPRERUN__.unshift(e)}function addOnInit(e){__ATINIT__.unshift(e)}function addOnPreMain(e){__ATMAIN__.unshift(e)}function addOnExit(e){__ATEXIT__.unshift(e)}function addOnPostRun(e){__ATPOSTRUN__.unshift(e)}function intArrayFromString(e,t,i){var r=i>0?i:lengthBytesUTF8(e)+1,n=new Array(r),a=stringToUTF8Array(e,n,0,n.length);return t&&(n.length=a),n}function intArrayToString(e){for(var t=[],i=0;i255&&(r&=255),t.push(String.fromCharCode(r))}return t.join("")}function writeStringToMemory(e,t,i){for(var r=intArrayFromString(e,i),n=0;n>>16)*r+i*(t>>>16)<<16)|0}),Math.imul=Math.imul,Math.clz32||(Math.clz32=function(e){e>>>=0;for(var t=0;t<32;t++)if(e&1<<31-t)return t;return 32}),Math.clz32=Math.clz32;var Math_abs=Math.abs,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_min=Math.min,runDependencies=0,dependenciesFulfilled=null;function addRunDependency(e){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}function removeRunDependency(e){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),0==runDependencies&&dependenciesFulfilled){var t=dependenciesFulfilled;dependenciesFulfilled=null,t()}}Module.addRunDependency=addRunDependency,Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={},STATIC_BASE=8,STATICTOP=STATIC_BASE+59744,__ATINIT__.push({func:function(){__GLOBAL__I_000101()}},{func:function(){__GLOBAL__sub_I_jpegls_cpp()}},{func:function(){}}),allocate([0,0,0,0,0,0,0,0,84,144,0,0,31,194,0,0,216,0,0,0,0,0,0,0,84,144,0,0,237,191,0,0,48,0,0,0,0,0,0,0,44,144,0,0,41,192,0,0,84,144,0,0,55,192,0,0,48,0,0,0,0,0,0,0,84,144,0,0,115,192,0,0,48,0,0,0,0,0,0,0,84,144,0,0,175,192,0,0,152,3,0,0,0,0,0,0,84,144,0,0,241,192,0,0,216,3,0,0,0,0,0,0,84,144,0,0,55,193,0,0,48,0,0,0,0,0,0,0,84,144,0,0,95,193,0,0,48,0,0,0,0,0,0,0,84,144,0,0,135,193,0,0,48,0,0,0,0,0,0,0,84,144,0,0,175,193,0,0,48,0,0,0,0,0,0,0,84,144,0,0,216,193,0,0,48,0,0,0,0,0,0,0,84,144,0,0,241,193,0,0,48,0,0,0,0,0,0,0,44,144,0,0,13,194,0,0,84,144,0,0,80,194,0,0,216,0,0,0,0,0,0,0,84,144,0,0,44,195,0,0,216,0,0,0,0,0,0,0,84,144,0,0,139,194,0,0,48,0,0,0,0,0,0,0,84,144,0,0,179,194,0,0,48,0,0,0,0,0,0,0,84,144,0,0,219,194,0,0,48,0,0,0,0,0,0,0,84,144,0,0,3,195,0,0,48,0,0,0,0,0,0,0,84,144,0,0,103,195,0,0,216,0,0,0,0,0,0,0,84,144,0,0,157,195,0,0,216,0,0,0,0,0,0,0,84,144,0,0,211,195,0,0,216,0,0,0,0,0,0,0,84,144,0,0,8,196,0,0,216,0,0,0,0,0,0,0,84,144,0,0,71,196,0,0,216,0,0,0,0,0,0,0,84,144,0,0,138,196,0,0,160,1,0,0,0,0,0,0,44,144,0,0,120,196,0,0,84,144,0,0,187,196,0,0,160,1,0,0,0,0,0,0,84,144,0,0,246,196,0,0,160,1,0,0,0,0,0,0,84,144,0,0,49,197,0,0,160,1,0,0,0,0,0,0,84,144,0,0,103,197,0,0,160,1,0,0,0,0,0,0,84,144,0,0,157,197,0,0,160,1,0,0,0,0,0,0,84,144,0,0,210,197,0,0,160,1,0,0,0,0,0,0,84,144,0,0,17,198,0,0,160,1,0,0,0,0,0,0,84,144,0,0,86,198,0,0,72,3,0,0,0,0,0,0,84,144,0,0,162,198,0,0,56,2,0,0,0,0,0,0,44,144,0,0,182,198,0,0,84,144,0,0,196,198,0,0,56,2,0,0,0,0,0,0,84,144,0,0,112,199,0,0,96,2,0,0,0,0,0,0,44,144,0,0,125,199,0,0,84,144,0,0,138,199,0,0,96,2,0,0,0,0,0,0,44,144,0,0,156,199,0,0,84,144,0,0,169,199,0,0,96,2,0,0,0,0,0,0,84,144,0,0,181,199,0,0,120,2,0,0,0,0,0,0,84,144,0,0,214,199,0,0,144,2,0,0,0,0,0,0,84,144,0,0,28,200,0,0,144,2,0,0,0,0,0,0,84,144,0,0,248,199,0,0,176,2,0,0,0,0,0,0,84,144,0,0,62,200,0,0,160,2,0,0,0,0,0,0,84,144,0,0,99,200,0,0,160,2,0,0,0,0,0,0,84,144,0,0,182,221,0,0,160,3,0,0,0,0,0,0,84,144,0,0,245,221,0,0,160,3,0,0,0,0,0,0,84,144,0,0,13,222,0,0,152,3,0,0,0,0,0,0,84,144,0,0,38,222,0,0,152,3,0,0,0,0,0,0,44,144,0,0,62,222,0,0,84,144,0,0,87,222,0,0,104,2,0,0,0,0,0,0,44,144,0,0,110,222,0,0,84,144,0,0,135,222,0,0,72,3,0,0,0,0,0,0,84,144,0,0,161,222,0,0,56,3,0,0,0,0,0,0,44,144,0,0,187,222,0,0,84,144,0,0,205,222,0,0,112,3,0,0,0,0,0,0,84,144,0,0,247,222,0,0,112,3,0,0,0,0,0,0,44,144,0,0,33,223,0,0,44,144,0,0,82,223,0,0,124,144,0,0,131,223,0,0,0,0,0,0,1,0,0,0,120,3,0,0,3,244,255,255,124,144,0,0,178,223,0,0,0,0,0,0,1,0,0,0,136,3,0,0,3,244,255,255,124,144,0,0,225,223,0,0,0,0,0,0,1,0,0,0,120,3,0,0,3,244,255,255,124,144,0,0,16,224,0,0,0,0,0,0,1,0,0,0,136,3,0,0,3,244,255,255,84,144,0,0,63,224,0,0,80,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,144,0,0,187,224,0,0,48,3,0,0,0,0,0,0,124,144,0,0,209,224,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,64,10,0,0,2,0,0,0,124,144,0,0,227,224,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,72,10,0,0,2,0,0,0,124,144,0,0,5,225,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,72,10,0,0,2,0,0,0,124,144,0,0,40,225,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,72,10,0,0,2,0,0,0,84,144,0,0,75,225,0,0,144,4,0,0,0,0,0,0,84,144,0,0,109,225,0,0,144,4,0,0,0,0,0,0,124,144,0,0,144,225,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,72,10,0,0,2,0,0,0,84,144,0,0,178,225,0,0,32,4,0,0,0,0,0,0,84,144,0,0,200,225,0,0,32,4,0,0,0,0,0,0,84,144,0,0,220,225,0,0,32,4,0,0,0,0,0,0,124,144,0,0,240,225,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,64,10,0,0,2,0,0,0,84,144,0,0,2,226,0,0,32,4,0,0,0,0,0,0,84,144,0,0,23,226,0,0,32,4,0,0,0,0,0,0,124,144,0,0,44,226,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,80,10,0,0,0,0,0,0,124,144,0,0,112,226,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,104,10,0,0,0,0,0,0,124,144,0,0,180,226,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,128,10,0,0,0,0,0,0,124,144,0,0,248,226,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,152,10,0,0,0,0,0,0,124,144,0,0,60,227,0,0,0,0,0,0,3,0,0,0,32,4,0,0,2,0,0,0,176,10,0,0,2,0,0,0,184,10,0,0,0,8,0,0,124,144,0,0,129,227,0,0,0,0,0,0,3,0,0,0,32,4,0,0,2,0,0,0,176,10,0,0,2,0,0,0,192,10,0,0,0,8,0,0,124,144,0,0,198,227,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,200,10,0,0,0,8,0,0,124,144,0,0,11,228,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,200,10,0,0,0,8,0,0,124,144,0,0,80,228,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,208,10,0,0,2,0,0,0,124,144,0,0,108,228,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,208,10,0,0,2,0,0,0,124,144,0,0,136,228,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,208,10,0,0,2,0,0,0,124,144,0,0,164,228,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,208,10,0,0,2,0,0,0,124,144,0,0,192,228,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,216,10,0,0,0,0,0,0,124,144,0,0,6,229,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,224,10,0,0,0,0,0,0,124,144,0,0,76,229,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,232,10,0,0,0,0,0,0,124,144,0,0,146,229,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,240,10,0,0,0,0,0,0,124,144,0,0,216,229,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,248,10,0,0,2,0,0,0,124,144,0,0,237,229,0,0,0,0,0,0,2,0,0,0,32,4,0,0,2,0,0,0,248,10,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,144,0,0,73,233,0,0,44,144,0,0,50,233,0,0,124,144,0,0,28,233,0,0,0,0,0,0,1,0,0,0,8,11,0,0,0,0,0,0,124,144,0,0,237,232,0,0,0,0,0,0,1,0,0,0,8,11,0,0,0,0,0,0,124,144,0,0,215,232,0,0,0,0,0,0,1,0,0,0,0,11,0,0,0,0,0,0,124,144,0,0,168,232,0,0,0,0,0,0,1,0,0,0,0,11,0,0,0,0,0,0,44,144,0,0,149,232,0,0,44,144,0,0,115,232,0,0,44,144,0,0,81,232,0,0,44,144,0,0,60,232,0,0,44,144,0,0,39,232,0,0,44,144,0,0,14,232,0,0,44,144,0,0,245,231,0,0,44,144,0,0,220,231,0,0,44,144,0,0,195,231,0,0,44,144,0,0,171,231,0,0,44,144,0,0,190,232,0,0,44,144,0,0,3,233],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE),allocate([156,143,0,0,0,0,0,0,8,2,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,248,1,0,0,3,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,232,1,0,0,5,0,0,0,6,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,216,1,0,0,7,0,0,0,8,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,200,1,0,0,9,0,0,0,10,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,184,1,0,0,11,0,0,0,12,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,168,1,0,0,13,0,0,0,14,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,144,1,0,0,15,0,0,0,16,0,0,0,8,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,128,1,0,0,17,0,0,0,18,0,0,0,9,0,0,0,1,0,0,0,9,0,0,0,0,0,0,0,112,1,0,0,19,0,0,0,20,0,0,0,10,0,0,0,2,0,0,0,10,0,0,0,0,0,0,0,96,1,0,0,21,0,0,0,22,0,0,0,11,0,0,0,3,0,0,0,11,0,0,0,0,0,0,0,80,1,0,0,23,0,0,0,24,0,0,0,12,0,0,0,4,0,0,0,12,0,0,0,0,0,0,0,64,1,0,0,25,0,0,0,26,0,0,0,13,0,0,0,5,0,0,0,13,0,0,0,0,0,0,0,240,0,0,0,27,0,0,0,28,0,0,0,14,0,0,0,6,0,0,0,14,0,0,0,0,0,0,0,224,0,0,0,29,0,0,0,30,0,0,0,15,0,0,0,7,0,0,0,15,0,0,0,0,0,0,0,16,0,0,0,31,0,0,0,32,0,0,0,16,0,0,0,8,0,0,0,16,0,0,0,0,0,0,0,200,0,0,0,33,0,0,0,34,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,184,0,0,0,33,0,0,0,35,0,0,0,3,0,0,0,4,0,0,0,56,0,0,0,0,0,0,0,216,3,0,0,36,0,0,0,37,0,0,0,200,255,255,255,200,255,255,255,216,3,0,0,38,0,0,0,39,0,0,0,56,0,0,0,0,0,0,0,104,0,0,0,40,0,0,0,41,0,0,0,200,255,255,255,200,255,255,255,104,0,0,0,42,0,0,0,43,0,0,0,0,0,0,0,88,0,0,0,44,0,0,0,45,0,0,0,17,0,0,0,1,0,0,0,1,0,0,0,5,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,17,0,0,0,3,0,0,0,18,0,0,0,104,141,0,0,64,141,0,0,84,141,0,0,124,141,0,0,0,0,0,0,32,0,0,0,46,0,0,0,47,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,56,0,0,0,48,0,0,0,49,0,0,0,8,0,0,0,9,0,0,0,0,0,0,0,72,0,0,0,50,0,0,0,51,0,0,0,10,0,0,0,11,0,0,0,0,0,0,0,120,0,0,0,52,0,0,0,53,0,0,0,12,0,0,0,13,0,0,0,0,0,0,0,136,0,0,0,54,0,0,0,55,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,152,0,0,0,56,0,0,0,57,0,0,0,16,0,0,0,17,0,0,0,0,0,0,0,168,0,0,0,58,0,0,0,59,0,0,0,18,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,7,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,216,0,0,0,60,0,0,0,61,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,62,0,0,0,63,0,0,0,20,0,0,0,21,0,0,0,0,0,0,0,16,1,0,0,64,0,0,0,65,0,0,0,22,0,0,0,23,0,0,0,0,0,0,0,32,1,0,0,66,0,0,0,67,0,0,0,24,0,0,0,25,0,0,0,0,0,0,0,48,1,0,0,68,0,0,0,69,0,0,0,26,0,0,0,27,0,0,0,0,0,0,0,160,1,0,0,70,0,0,0,71,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,24,2,0,0,72,0,0,0,73,0,0,0,5,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,2,0,0,0,0,0,0,0,40,2,0,0,74,0,0,0,75,0,0,0,18,0,0,0,0,0,0,0,64,2,0,0,76,0,0,0,77,0,0,0,19,0,0,0,2,0,0,0,0,0,0,0,80,2,0,0,78,0,0,0,79,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,104,2,0,0,80,0,0,0,81,0,0,0,7,0,0,0,0,0,0,0,128,2,0,0,82,0,0,0,83,0,0,0,8,0,0,0,0,0,0,0,160,2,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,6,0,0,0,2,0,0,0,9,0,0,0,28,0,0,0,0,0,0,0,208,2,0,0,84,0,0,0,88,0,0,0,86,0,0,0,87,0,0,0,6,0,0,0,3,0,0,0,10,0,0,0,29,0,0,0,0,0,0,0,224,2,0,0,84,0,0,0,89,0,0,0,86,0,0,0,87,0,0,0,6,0,0,0,4,0,0,0,11,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,1,203,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,192,3,0,0,192,4,0,0,192,5,0,0,192,6,0,0,192,7,0,0,192,8,0,0,192,9,0,0,192,10,0,0,192,11,0,0,192,12,0,0,192,13,0,0,192,14,0,0,192,15,0,0,192,16,0,0,192,17,0,0,192,18,0,0,192,19,0,0,192,20,0,0,192,21,0,0,192,22,0,0,192,23,0,0,192,24,0,0,192,25,0,0,192,26,0,0,192,27,0,0,192,28,0,0,192,29,0,0,192,30,0,0,192,31,0,0,192,0,0,0,179,1,0,0,195,2,0,0,195,3,0,0,195,4,0,0,195,5,0,0,195,6,0,0,195,7,0,0,195,8,0,0,195,9,0,0,195,10,0,0,195,11,0,0,195,12,0,0,195,13,0,0,211,14,0,0,195,15,0,0,195,0,0,12,187,1,0,12,195,2,0,12,195,3,0,12,195,4,0,12,211,88,146,0,0,200,146,0,0,56,147,0,0,56,147,0,0,120,187,0,0,168,155,0,0,168,149,0,0,0,0,0,0,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0,0,0,159,219,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,9,0,0,0,151,215,0,0,0,4,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,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,9,0,0,0,143,211,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,59,0,0,0,60,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,68,0,0,0,69,0,0,0,70,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,79,0,0,0,80,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,89,0,0,0,90,0,0,0,91,0,0,0,92,0,0,0,93,0,0,0,94,0,0,0,95,0,0,0,96,0,0,0,65,0,0,0,66,0,0,0,67,0,0,0,68,0,0,0,69,0,0,0,70,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,79,0,0,0,80,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,89,0,0,0,90,0,0,0,123,0,0,0,124,0,0,0,125,0,0,0,126,0,0,0,127],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+35640),allocate([1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,49,0,0,0,50,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,59,0,0,0,60,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,97,0,0,0,98,0,0,0,99,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,103,0,0,0,104,0,0,0,105,0,0,0,106,0,0,0,107,0,0,0,108,0,0,0,109,0,0,0,110,0,0,0,111,0,0,0,112,0,0,0,113,0,0,0,114,0,0,0,115,0,0,0,116,0,0,0,117,0,0,0,118,0,0,0,119,0,0,0,120,0,0,0,121,0,0,0,122,0,0,0,91,0,0,0,92,0,0,0,93,0,0,0,94,0,0,0,95,0,0,0,96,0,0,0,97,0,0,0,98,0,0,0,99,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,103,0,0,0,104,0,0,0,105,0,0,0,106,0,0,0,107,0,0,0,108,0,0,0,109,0,0,0,110,0,0,0,111,0,0,0,112,0,0,0,113,0,0,0,114,0,0,0,115,0,0,0,116,0,0,0,117,0,0,0,118,0,0,0,119,0,0,0,120,0,0,0,121,0,0,0,122,0,0,0,123,0,0,0,124,0,0,0,125,0,0,0,126,0,0,0,127],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+39844),allocate([240,2,0,0,90,0,0,0,91,0,0,0,20,0,0,0,12,0,0,0,5,0,0,0,31,0,0,0,10,0,0,0,11,0,0,0,13,0,0,0,12,0,0,0,13,0,0,0,19,0,0,0,14,0,0,0,20,0,0,0,0,0,0,0,0,3,0,0,90,0,0,0,92,0,0,0,21,0,0,0,12,0,0,0,5,0,0,0,31,0,0,0,14,0,0,0,11,0,0,0,13,0,0,0,15,0,0,0,16,0,0,0,21,0,0,0,15,0,0,0,22,0,0,0,0,0,0,0,16,3,0,0,93,0,0,0,94,0,0,0,22,0,0,0,1,0,0,0,6,0,0,0,32,0,0,0,17,0,0,0,2,0,0,0,2,0,0,0,18,0,0,0,4,0,0,0,23,0,0,0,16,0,0,0,24,0,0,0,0,0,0,0,32,3,0,0,93,0,0,0,95,0,0,0,23,0,0,0,1,0,0,0,6,0,0,0,32,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,19,0,0,0,20,0,0,0,25,0,0,0,3,0,0,0,26,0,0,0,0,0,0,0,56,3,0,0,96,0,0,0,97,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,3,0,0,93,0,0,0,98,0,0,0,17,0,0,0,1,0,0,0,6,0,0,0,32,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,18,0,0,0,4,0,0,0,23,0,0,0,3,0,0,0,26,0,0,0,0,0,0,0,160,3,0,0,90,0,0,0,99,0,0,0,24,0,0,0,12,0,0,0,5,0,0,0,31,0,0,0,14,0,0,0,11,0,0,0,13,0,0,0,12,0,0,0,13,0,0,0,19,0,0,0,15,0,0,0,22,0,0,0,8,0,0,0,0,0,0,0,168,3,0,0,100,0,0,0,101,0,0,0,248,255,255,255,248,255,255,255,168,3,0,0,102,0,0,0,103,0,0,0,8,0,0,0,0,0,0,0,192,3,0,0,104,0,0,0,105,0,0,0,248,255,255,255,248,255,255,255,192,3,0,0,106,0,0,0,107,0,0,0,4,0,0,0,0,0,0,0,216,3,0,0,36,0,0,0,37,0,0,0,252,255,255,255,252,255,255,255,216,3,0,0,38,0,0,0,39,0,0,0,4,0,0,0,0,0,0,0,240,3,0,0,108,0,0,0,109,0,0,0,252,255,255,255,252,255,255,255,240,3,0,0,110,0,0,0,111,0,0,0,0,0,0,0,96,3,0,0,112,0,0,0,113,0,0,0,7,0,0,0,0,0,0,0,112,3,0,0,114,0,0,0,115,0,0,0,0,0,0,0,8,4,0,0,72,0,0,0,116,0,0,0,21,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,117,0,0,0,118,0,0,0,119,0,0,0,1,0,0,0,33,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,5,0,0,120,0,0,0,121,0,0,0,119,0,0,0,2,0,0,0,34,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,5,0,0,122,0,0,0,123,0,0,0,119,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,5,0,0,124,0,0,0,125,0,0,0,119,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,5,0,0,126,0,0,0,127,0,0,0,119,0,0,0,3,0,0,0,4,0,0,0,23,0,0,0,5,0,0,0,24,0,0,0,1,0,0,0,2,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,5,0,0,128,0,0,0,129,0,0,0,119,0,0,0,7,0,0,0,8,0,0,0,25,0,0,0,9,0,0,0,26,0,0,0,3,0,0,0,4,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,5,0,0,130,0,0,0,131,0,0,0,119,0,0,0,22,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,30,0,0,0,31,0,0,0,1,0,0,0,248,255,255,255,224,5,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,132,0,0,0,133,0,0,0,119,0,0,0,30,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,2,0,0,0,248,255,255,255,8,6,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,6,0,0,134,0,0,0,135,0,0,0,119,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,6,0,0,136,0,0,0,137,0,0,0,119,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,6,0,0,138,0,0,0,139,0,0,0,119,0,0,0,38,0,0,0,39,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,40,0,0,0,29,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,6,0,0,140,0,0,0,141,0,0,0,119,0,0,0,41,0,0,0,42,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,43,0,0,0,35,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,6,0,0,142,0,0,0,143,0,0,0,119,0,0,0,44,0,0,0,45,0,0,0,37,0,0,0,38,0,0,0,39,0,0,0,40,0,0,0,46,0,0,0,41,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,6,0,0,144,0,0,0,145,0,0,0,119,0,0,0,47,0,0,0,48,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,49,0,0,0,47,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,6,0,0,146,0,0,0,147,0,0,0,119,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,7,0,0,148,0,0,0,149,0,0,0,119,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,7,0,0,150,0,0,0,151,0,0,0,119,0,0,0,1,0,0,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,7,0,0,152,0,0,0,153,0,0,0,119,0,0,0,2,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,7,0,0,154,0,0,0,155,0,0,0,119,0,0,0,19,0,0,0,7,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,7,0,0,156,0,0,0,157,0,0,0,119,0,0,0,20,0,0,0,8,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,4,0,0,158,0,0,0,159,0,0,0,119,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,32,5,0,0,160,0,0,0,161,0,0,0,119,0,0,0,27,0,0,0,21,0,0,0,28,0,0,0,22,0,0,0,29,0,0,0,9,0,0,0,23,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,4,0,0,162,0,0,0,163,0,0,0,119,0,0,0,3,0,0,0,4,0,0,0,12,0,0,0,50,0,0,0,51,0,0,0,13,0,0,0,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,5,0,0,164,0,0,0,165,0,0,0,119,0,0,0,53,0,0,0,54,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,0,0,0,0,80,5,0,0,166,0,0,0,167,0,0,0,119,0,0,0,55,0,0,0,56,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,0,0,0,0,32,4,0,0,168,0,0,0,169,0,0,0,119,0,0,0,0,0,0,0,48,4,0,0,168,0,0,0,170,0,0,0,119,0,0,0,24,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,30,0,0,0,25,0,0,0,31,0,0,0,26,0,0,0,32,0,0,0,13,0,0,0,27,0,0,0,14,0,0,0,0,0,0,0,80,4,0,0,168,0,0,0,171,0,0,0,119,0,0,0,5,0,0,0,6,0,0,0,15,0,0,0,57,0,0,0,58,0,0,0,16,0,0,0,59,0,0,0,0,0,0,0,112,4,0,0,168,0,0,0,172,0,0,0,119,0,0,0,7,0,0,0,8,0,0,0,17,0,0,0,60,0,0,0,61,0,0,0,18,0,0,0,62,0,0,0,0,0,0,0,144,4,0,0,168,0,0,0,173,0,0,0,119,0,0,0,9,0,0,0,10,0,0,0,19,0,0,0,63,0,0,0,64,0,0,0,20,0,0,0,65,0,0,0,0,0,0,0,176,4,0,0,168,0,0,0,174,0,0,0,119,0,0,0,9,0,0,0,10,0,0,0,19,0,0,0,63,0,0,0,64,0,0,0,20,0,0,0,65,0,0,0,0,0,0,0,192,4,0,0,168,0,0,0,175,0,0,0,119,0,0,0,9,0,0,0,10,0,0,0,19,0,0,0,63,0,0,0,64,0,0,0,20,0,0,0,65,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,37,0,0,0,89,0,0,0,45,0,0,0,37,0,0,0,109,0,0,0,45,0,0,0,37,0,0,0,100,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,0,0,0,114,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,102,0,0,0,97,0,0,0,108,0,0,0,115,0,0,0,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,110,0,0,0,101,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,114,0,0,0,115,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,117,0,0,0,114,0,0,0,100,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,83,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,77,0,0,0,111,0,0,0,110,0,0,0,0,0,0,0,84,0,0,0,117,0,0,0,101,0,0,0,0,0,0,0,87,0,0,0,101,0,0,0,100,0,0,0,0,0,0,0,84,0,0,0,104,0,0,0,117,0,0,0,0,0,0,0,70,0,0,0,114,0,0,0,105,0,0,0,0,0,0,0,83,0,0,0,97,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,114,0,0,0,117,0,0,0,97,0,0,0,114,0,0,0,121,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,99,0,0,0,104,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,105,0,0,0,108,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,121,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,101,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,121,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,117,0,0,0,115,0,0,0,116,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,116,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,111,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99,0,0,0,101,0,0,0,109,0,0,0,98,0,0,0,101,0,0,0,114,0,0,0,0,0,0,0,74,0,0,0,97,0,0,0,110,0,0,0,0,0,0,0,70,0,0,0,101,0,0,0,98,0,0,0,0,0,0,0,77,0,0,0,97,0,0,0,114,0,0,0,0,0,0,0,65,0,0,0,112,0,0,0,114,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,110,0,0,0,0,0,0,0,74,0,0,0,117,0,0,0,108,0,0,0,0,0,0,0,65,0,0,0,117,0,0,0,103,0,0,0,0,0,0,0,83,0,0,0,101,0,0,0,112,0,0,0,0,0,0,0,79,0,0,0,99,0,0,0,116,0,0,0,0,0,0,0,78,0,0,0,111,0,0,0,118,0,0,0,0,0,0,0,68,0,0,0,101,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,0,0,77,0,0,0,0,0,0,0,80,0,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,109,0,0,0,47,0,0,0,37,0,0,0,100,0,0,0,47,0,0,0,37,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,97,0,0,0,32,0,0,0,37,0,0,0,98,0,0,0,32,0,0,0,37,0,0,0,100,0,0,0,32,0,0,0,37,0,0,0,72,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,0,0,0,73,0,0,0,58,0,0,0,37,0,0,0,77,0,0,0,58,0,0,0,37,0,0,0,83,0,0,0,32,0,0,0,37,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,3,32,2,32,2,32,2,32,2,32,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,96,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,4,192,8,216,8,216,8,216,8,216,8,216,8,216,8,216,8,216,8,216,8,216,4,192,4,192,4,192,4,192,4,192,4,192,4,192,8,213,8,213,8,213,8,213,8,213,8,213,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,8,197,4,192,4,192,4,192,4,192,4,192,4,192,8,214,8,214,8,214,8,214,8,214,8,214,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,8,198,4,192,4,192,4,192,4,192,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,97,119,83,116,114,101,97,109,32,111,114,32,114,97,119,68,97,116,97,32,110,101,101,100,115,32,116,111,32,114,101,102,101,114,101,110,99,101,32,116,111,32,115,111,109,101,116,104,105,110,103,0,119,105,100,116,104,32,110,101,101,100,115,32,116,111,32,98,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,91,49,44,32,54,53,53,51,53,93,0,104,101,105,103,104,116,32,110,101,101,100,115,32,116,111,32,98,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,91,49,44,32,54,53,53,51,53,93,0,98,105,116,115,112,101,114,115,97,109,112,108,101,32,110,101,101,100,115,32,116,111,32,98,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,91,50,44,32,49,54,93,0,105,110,116,101,114,108,101,97,118,101,77,111,100,101,32,110,101,101,100,115,32,116,111,32,98,101,32,115,101,116,32,116,111,32,97,32,118,97,108,117,101,32,111,102,32,123,78,111,110,101,44,32,83,97,109,112,108,101,44,32,76,105,110,101,125,0,99,111,109,112,111,110,101,110,116,115,32,110,101,101,100,115,32,116,111,32,98,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,91,49,44,32,50,53,53,93,0,117,110,99,111,109,112,114,101,115,115,101,100,32,115,105,122,101,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,119,105,116,104,32,116,104,101,32,111,116,104,101,114,32,112,97,114,97,109,101,116,101,114,115,0,105,110,116,101,114,108,101,97,118,101,77,111,100,101,32,99,97,110,110,111,116,32,98,101,32,115,101,116,32,116,111,32,83,97,109,112,108,101,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,99,111,109,112,111,110,101,110,116,115,32,61,32,52,0,105,110,116,101,114,108,101,97,118,101,77,111,100,101,32,99,97,110,32,111,110,108,121,32,98,101,32,115,101,116,32,116,111,32,78,111,110,101,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,99,111,109,112,111,110,101,110,116,115,32,61,32,49,0,67,111,108,111,114,32,116,114,97,110,115,102,111,114,109,97,116,105,111,110,32,0,78,111,32,109,111,114,101,32,98,121,116,101,115,32,97,118,97,105,108,97,98,108,101,32,105,110,32,105,110,112,117,116,32,98,117,102,102,101,114,44,32,115,116,105,108,108,32,110,101,101,100,101,100,105,110,103,32,0,65,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,40,0,41,32,99,97,110,110,111,116,32,98,101,32,115,119,97,112,112,101,100,46,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,54,84,114,97,110,115,102,111,114,109,83,104,105,102,116,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,51,73,116,69,69,69,0,49,49,80,114,111,99,101,115,115,76,105,110,101,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,54,84,114,97,110,115,102,111,114,109,83,104,105,102,116,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,50,73,116,69,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,54,84,114,97,110,115,102,111,114,109,83,104,105,102,116,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,49,73,116,69,69,69,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,105,110,103,98,117,102,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,78,83,116,51,95,95,49,49,57,98,97,115,105,99,95,111,115,116,114,105,110,103,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,78,83,95,57,97,108,108,111,99,97,116,111,114,73,99,69,69,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,51,73,116,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,50,73,116,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,49,73,116,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,51,84,114,97,110,115,102,111,114,109,78,111,110,101,73,116,69,69,0,50,50,80,111,115,116,80,114,111,99,101,115,83,105,110,103,108,101,83,116,114,101,97,109,0,50,53,80,111,115,116,80,114,111,99,101,115,83,105,110,103,108,101,67,111,109,112,111,110,101,110,116,0,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,116,116,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,116,55,84,114,105,112,108,101,116,73,116,69,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,51,73,104,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,50,73,104,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,50,84,114,97,110,115,102,111,114,109,72,112,49,73,104,69,69,0,49,56,80,114,111,99,101,115,115,84,114,97,110,115,102,111,114,109,101,100,73,49,51,84,114,97,110,115,102,111,114,109,78,111,110,101,73,104,69,69,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,104,55,84,114,105,112,108,101,116,73,104,69,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,116,76,105,49,54,69,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,116,76,105,49,50,69,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,104,76,105,56,69,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,55,84,114,105,112,108,101,116,73,104,69,76,105,56,69,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,104,104,69,49,53,69,110,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,116,116,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,116,55,84,114,105,112,108,101,116,73,116,69,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,104,55,84,114,105,112,108,101,116,73,104,69,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,116,76,105,49,54,69,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,116,76,105,49,50,69,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,104,76,105,56,69,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,53,76,111,115,115,108,101,115,115,84,114,97,105,116,115,84,73,55,84,114,105,112,108,101,116,73,104,69,76,105,56,69,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,56,74,108,115,67,111,100,101,99,73,49,52,68,101,102,97,117,108,116,84,114,97,105,116,115,84,73,104,104,69,49,53,68,101,99,111,100,101,114,83,116,114,97,116,101,103,121,69,0,67,104,97,114,76,83,32,101,114,114,111,114,0,99,104,97,114,108,115,0,49,53,99,104,97,114,108,115,95,99,97,116,101,103,111,114,121,0,112,97,114,97,109,115,46,88,116,104,117,109,98,110,97,105,108,32,105,115,32,62,32,48,32,98,117,116,32,112,97,114,97,109,115,46,116,104,117,109,98,110,97,105,108,32,61,61,32,110,117,108,108,95,112,116,114,0,49,55,74,112,101,103,77,97,114,107,101,114,83,101,103,109,101,110,116,0,49,49,74,112,101,103,83,101,103,109,101,110,116,0,50,48,74,112,101,103,73,109,97,103,101,68,97,116,97,83,101,103,109,101,110,116,0,69,120,112,101,99,116,101,100,32,74,80,69,71,32,77,97,114,107,101,114,32,115,116,97,114,116,32,98,121,116,101,32,48,120,70,70,32,98,117,116,32,116,104,101,32,98,121,116,101,32,118,97,108,117,101,32,119,97,115,32,48,120,0,74,80,69,71,32,101,110,99,111,100,105,110,103,32,119,105,116,104,32,109,97,114,107,101,114,32,0,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46,0,85,110,107,110,111,119,110,32,74,80,69,71,32,109,97,114,107,101,114,32,0,32,101,110,99,111,117,110,116,101,114,101,100,46,0,109,114,102,120,0,83,116,57,98,97,100,95,97,108,108,111,99,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,49,51,114,117,110,116,105,109,101,95,101,114,114,111,114,0,83,116,57,116,121,112,101,95,105,110,102,111,0,83,116,56,98,97,100,95,99,97,115,116,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,49,95,95,118,109,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,33,34,98,97,115,105,99,95,115,116,114,105,110,103,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,99,104,97,102,101,121,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,115,116,114,105,110,103,0,95,95,116,104,114,111,119,95,108,101,110,103,116,104,95,101,114,114,111,114,0,33,34,118,101,99,116,111,114,32,108,101,110,103,116,104,95,101,114,114,111,114,34,0,47,85,115,101,114,115,47,99,104,97,102,101,121,47,101,109,115,100,107,95,112,111,114,116,97,98,108,101,47,101,109,115,99,114,105,112,116,101,110,47,49,46,51,53,46,48,47,115,121,115,116,101,109,47,105,110,99,108,117,100,101,47,108,105,98,99,120,120,47,118,101,99,116,111,114,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,115,116,100,58,58,98,97,100,95,97,108,108,111,99,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,116,104,114,101,119,32,97,110,32,101,120,99,101,112,116,105,111,110,0,115,116,100,58,58,98,97,100,95,99,97,115,116,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,116,101,114,109,105,110,97,116,105,110,103,0,117,110,99,97,117,103,104,116,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+42396),allocate([32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,105,110,102,105,110,105,116,121,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,4,7,3,6,5,0,80,79,83,73,88],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+52636),allocate([17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,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,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,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,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,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,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,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,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,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,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,119,69,69,0,117,110,115,117,112,112,111,114,116,101,100,32,108,111,99,97,108,101,32,102,111,114,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,119,69,69,0,78,83,116,51,95,95,49,49,49,95,95,115,116,100,111,117,116,98,117,102,73,99,69,69,0,78,83,116,51,95,95,49,49,48,95,95,115,116,100,105,110,98,117,102,73,99,69,69,0,78,83,116,51,95,95,49,49,52,95,95,115,104,97,114,101,100,95,99,111,117,110,116,69,0,78,83,116,51,95,95,49,49,50,115,121,115,116,101,109,95,101,114,114,111,114,69,0,78,83,116,51,95,95,49,49,52,101,114,114,111,114,95,99,97,116,101,103,111,114,121,69,0,78,83,116,51,95,95,49,49,50,95,95,100,111,95,109,101,115,115,97,103,101,69,0,58,32,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,55,102,97,105,108,117,114,101,69,0,78,83,116,51,95,95,49,56,105,111,115,95,98,97,115,101,69,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,78,83,116,51,95,95,49,57,98,97,115,105,99,95,105,111,115,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,78,83,116,51,95,95,49,49,53,98,97,115,105,99,95,115,116,114,101,97,109,98,117,102,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,105,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,0,78,83,116,51,95,95,49,49,51,98,97,115,105,99,95,111,115,116,114,101,97,109,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,0,78,83,116,51,95,95,49,49,57,95,95,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,69,0,105,111,115,95,98,97,115,101,58,58,99,108,101,97,114,0,105,111,115,116,114,101,97,109,0,117,110,115,112,101,99,105,102,105,101,100,32,105,111,115,116,114,101,97,109,95,99,97,116,101,103,111,114,121,32,101,114,114,111,114,0,48,49,50,51,52,53,54,55,56,57,97,98,99,100,101,102,65,66,67,68,69,70,120,88,43,45,112,80,105,73,110,78,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,102,97,99,101,116,69,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,119,69,69,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,99,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,115,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,68,105,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,78,83,116,51,95,95,49,49,54,95,95,110,97,114,114,111,119,95,116,111,95,117,116,102,56,73,76,106,51,50,69,69,69,0,78,83,116,51,95,95,49,49,55,95,95,119,105,100,101,110,95,102,114,111,109,95,117,116,102,56,73,76,106,51,50,69,69,69,0,78,83,116,51,95,95,49,55,99,111,100,101,99,118,116,73,119,99,49,49,95,95,109,98,115,116,97,116,101,95,116,69,69,0,78,83,116,51,95,95,49,54,108,111,99,97,108,101,53,95,95,105,109,112,69,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,99,69,69,0,78,83,116,51,95,95,49,55,99,111,108,108,97,116,101,73,119,69,69,0,78,83,116,51,95,95,49,53,99,116,121,112,101,73,99,69,69,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,99,69,69,0,78,83,116,51,95,95,49,56,110,117,109,112,117,110,99,116,73,119,69,69,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,78,83,116,51,95,95,49,55,110,117,109,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,78,83,116,51,95,95,49,55,110,117,109,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,78,83,116,51,95,95,49,56,116,105,109,101,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,78,83,116,51,95,95,49,56,116,105,109,101,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,48,69,69,69,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,99,76,98,49,69,69,69,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,48,69,69,69,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,112,117,110,99,116,73,119,76,98,49,69,69,69,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,99,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,103,101,116,73,119,78,83,95,49,57,105,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,99,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,99,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,99,69,69,69,69,69,69,0,78,83,116,51,95,95,49,57,109,111,110,101,121,95,112,117,116,73,119,78,83,95,49,57,111,115,116,114,101,97,109,98,117,102,95,105,116,101,114,97,116,111,114,73,119,78,83,95,49,49,99,104,97,114,95,116,114,97,105,116,115,73,119,69,69,69,69,69,69,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,99,69,69,0,78,83,116,51,95,95,49,56,109,101,115,115,97,103,101,115,73,119,69,69,0,37,112,0,67,0,37,0,0,0,0,0,108,0,108,108,0,0,76,0,37,112,0,0,0,0,37,72,58,37,77,58,37,83,37,109,47,37,100,47,37,121,37,89,45,37,109,45,37,100,37,73,58,37,77,58,37,83,32,37,112,37,72,58,37,77,37,72,58,37,77,58,37,83,108,111,99,97,108,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,48,49,50,51,52,53,54,55,56,57,0,37,76,102,0,109,111,110,101,121,95,103,101,116,32,101,114,114,111,114,0,48,49,50,51,52,53,54,55,56,57,0,37,46,48,76,102,0,116,114,117,101,0,102,97,108,115,101,0,83,117,110,100,97,121,0,77,111,110,100,97,121,0,84,117,101,115,100,97,121,0,87,101,100,110,101,115,100,97,121,0,84,104,117,114,115,100,97,121,0,70,114,105,100,97,121,0,83,97,116,117,114,100,97,121,0,83,117,110,0,77,111,110,0,84,117,101,0,87,101,100,0,84,104,117,0,70,114,105,0,83,97,116,0,74,97,110,117,97,114,121,0,70,101,98,114,117,97,114,121,0,77,97,114,99,104,0,65,112,114,105,108,0,77,97,121,0,74,117,110,101,0,74,117,108,121,0,65,117,103,117,115,116,0,83,101,112,116,101,109,98,101,114,0,79,99,116,111,98,101,114,0,78,111,118,101,109,98,101,114,0,68,101,99,101,109,98,101,114,0,74,97,110,0,70,101,98,0,77,97,114,0,65,112,114,0,74,117,110,0,74,117,108,0,65,117,103,0,83,101,112,0,79,99,116,0,78,111,118,0,68,101,99,0,65,77,0,80,77,0,37,109,47,37,100,47,37,121,0,37,72,58,37,77,58,37,83,0,37,97,32,37,98,32,37,100,32,37,72,58,37,77,58,37,83,32,37,89,0,37,73,58,37,77,58,37,83,32,37,112,0,78,83,116,51,95,95,49,49,51,109,101,115,115,97,103,101,115,95,98,97,115,101,69,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,119,69,69,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,112,117,116,73,99,69,69,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,119,69,69,0,78,83,116,51,95,95,49,49,49,95,95,109,111,110,101,121,95,103,101,116,73,99,69,69,0,78,83,116,51,95,95,49,49,48,109,111,110,101,121,95,98,97,115,101,69,0,78,83,116,51,95,95,49,49,48,95,95,116,105,109,101,95,112,117,116,69,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,119,69,69,0,78,83,116,51,95,95,49,50,48,95,95,116,105,109,101,95,103,101,116,95,99,95,115,116,111,114,97,103,101,73,99,69,69,0,78,83,116,51,95,95,49,57,116,105,109,101,95,98,97,115,101,69,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,119,69,69,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,112,117,116,95,98,97,115,101,69,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,112,117,116,73,99,69,69,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,119,69,69,0,78,83,116,51,95,95,49,49,52,95,95,110,117,109,95,103,101,116,95,98,97,115,101,69,0,78,83,116,51,95,95,49,57,95,95,110,117,109,95,103,101,116,73,99,69,69,0,78,83,116,51,95,95,49,49,50,99,111,100,101,99,118,116,95,98,97,115,101,69,0,78,83,116,51,95,95,49,49,48,99,116,121,112,101,95,98,97,115,101,69,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE+56215);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);function _atexit(e,t){__ATEXIT__.unshift({func:e,arg:t})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function ___assert_fail(e,t,i,r){throw ABORT=!0,"Assertion failed: "+Pointer_stringify(e)+", at: "+[t?Pointer_stringify(t):"unknown filename",i,r?Pointer_stringify(r):"unknown function"]+" at "+stackTrace()}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}assert(tempDoublePtr%8==0),Module._i64Subtract=_i64Subtract;var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:function(e){if(!e||EXCEPTIONS.infos[e])return e;for(var t in EXCEPTIONS.infos){if(EXCEPTIONS.infos[t].adjusted===e)return t}return e},addRef:function(e){e&&EXCEPTIONS.infos[e].refcount++},decRef:function(e){if(e){var t=EXCEPTIONS.infos[e];assert(t.refcount>0),t.refcount--,0===t.refcount&&(t.destructor&&Runtime.dynCall("vi",t.destructor,[e]),delete EXCEPTIONS.infos[e],___cxa_free_exception(e))}},clearRef:function(e){e&&(EXCEPTIONS.infos[e].refcount=0)}};function ___resumeException(e){throw EXCEPTIONS.last||(EXCEPTIONS.last=e),EXCEPTIONS.clearRef(EXCEPTIONS.deAdjust(e)),e}function ___cxa_find_matching_catch(){var e=EXCEPTIONS.last;if(!e)return asm.setTempRet0(0),0;var t=EXCEPTIONS.infos[e],i=t.type;if(!i)return asm.setTempRet0(0),0|e;var r=Array.prototype.slice.call(arguments);Module.___cxa_is_pointer_type(i),___cxa_find_matching_catch.buffer||(___cxa_find_matching_catch.buffer=_malloc(4)),HEAP32[___cxa_find_matching_catch.buffer>>2]=e,e=___cxa_find_matching_catch.buffer;for(var n=0;n>2],t.adjusted=e,asm.setTempRet0(r[n]),0|e;return e=HEAP32[e>>2],asm.setTempRet0(i),0|e}function ___cxa_throw(e,t,i){throw EXCEPTIONS.infos[e]={ptr:e,adjusted:e,type:t,destructor:i,refcount:0},EXCEPTIONS.last=e,"uncaught_exception"in __ZSt18uncaught_exceptionv?__ZSt18uncaught_exceptionv.uncaught_exception++:__ZSt18uncaught_exceptionv.uncaught_exception=1,e}function ___gxx_personality_v0(){}function __isLeapYear(e){return e%4==0&&(e%100!=0||e%400==0)}function __arraySum(e,t){for(var i=0,r=0;r<=t;i+=e[r++]);return i}Module._memset=_memset;var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31],__MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(e,t){for(var i=new Date(e.getTime());t>0;){var r=__isLeapYear(i.getFullYear()),n=i.getMonth(),a=(r?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[n];if(!(t>a-i.getDate()))return i.setDate(i.getDate()+t),i;t-=a-i.getDate()+1,i.setDate(1),n<11?i.setMonth(n+1):(i.setMonth(0),i.setFullYear(i.getFullYear()+1))}return i}function _strftime(e,t,i,r){var n=HEAP32[r+40>>2],a={tm_sec:HEAP32[r>>2],tm_min:HEAP32[r+4>>2],tm_hour:HEAP32[r+8>>2],tm_mday:HEAP32[r+12>>2],tm_mon:HEAP32[r+16>>2],tm_year:HEAP32[r+20>>2],tm_wday:HEAP32[r+24>>2],tm_yday:HEAP32[r+28>>2],tm_isdst:HEAP32[r+32>>2],tm_gmtoff:HEAP32[r+36>>2],tm_zone:n?Pointer_stringify(n):""},o=Pointer_stringify(i),s={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var l in s)o=o.replace(new RegExp(l,"g"),s[l]);var c=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],u=["January","February","March","April","May","June","July","August","September","October","November","December"];function f(e,t,i){for(var r="number"==typeof e?e.toString():e||"";r.length0?1:0}var r;return 0===(r=i(e.getFullYear()-t.getFullYear()))&&0===(r=i(e.getMonth()-t.getMonth()))&&(r=i(e.getDate()-t.getDate())),r}function m(e){switch(e.getDay()){case 0:return new Date(e.getFullYear()-1,11,29);case 1:return e;case 2:return new Date(e.getFullYear(),0,3);case 3:return new Date(e.getFullYear(),0,2);case 4:return new Date(e.getFullYear(),0,1);case 5:return new Date(e.getFullYear()-1,11,31);case 6:return new Date(e.getFullYear()-1,11,30)}}function g(e){var t=__addDays(new Date(e.tm_year+1900,0,1),e.tm_yday),i=new Date(t.getFullYear(),0,4),r=new Date(t.getFullYear()+1,0,4),n=m(i),a=m(r);return d(n,t)<=0?d(a,t)<=0?t.getFullYear()+1:t.getFullYear():t.getFullYear()-1}var p={"%a":function(e){return c[e.tm_wday].substring(0,3)},"%A":function(e){return c[e.tm_wday]},"%b":function(e){return u[e.tm_mon].substring(0,3)},"%B":function(e){return u[e.tm_mon]},"%C":function(e){return h((e.tm_year+1900)/100|0,2)},"%d":function(e){return h(e.tm_mday,2)},"%e":function(e){return f(e.tm_mday,2," ")},"%g":function(e){return g(e).toString().substring(2)},"%G":function(e){return g(e)},"%H":function(e){return h(e.tm_hour,2)},"%I":function(e){return h(e.tm_hour<13?e.tm_hour:e.tm_hour-12,2)},"%j":function(e){return h(e.tm_mday+__arraySum(__isLeapYear(e.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,e.tm_mon-1),3)},"%m":function(e){return h(e.tm_mon+1,2)},"%M":function(e){return h(e.tm_min,2)},"%n":function(){return"\n"},"%p":function(e){return e.tm_hour>0&&e.tm_hour<13?"AM":"PM"},"%S":function(e){return h(e.tm_sec,2)},"%t":function(){return"\t"},"%u":function(e){return new Date(e.tm_year+1900,e.tm_mon+1,e.tm_mday,0,0,0,0).getDay()||7},"%U":function(e){var t=new Date(e.tm_year+1900,0,1),i=0===t.getDay()?t:__addDays(t,7-t.getDay()),r=new Date(e.tm_year+1900,e.tm_mon,e.tm_mday);if(d(i,r)<0){var n=__arraySum(__isLeapYear(r.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,r.getMonth()-1)-31,a=31-i.getDate()+n+r.getDate();return h(Math.ceil(a/7),2)}return 0===d(i,t)?"01":"00"},"%V":function(e){var t,i=new Date(e.tm_year+1900,0,4),r=new Date(e.tm_year+1901,0,4),n=m(i),a=m(r),o=__addDays(new Date(e.tm_year+1900,0,1),e.tm_yday);return d(o,n)<0?"53":d(a,o)<=0?"01":(t=n.getFullYear()=0?"+":"-")+("0000"+(t=(t=Math.abs(t)/60)/60*100+t%60)).slice(-4)},"%Z":function(e){return e.tm_zone},"%%":function(){return"%"}};for(var l in p)o.indexOf(l)>=0&&(o=o.replace(new RegExp(l,"g"),p[l](a)));var A=intArrayFromString(o,!1);return A.length>t?0:(writeArrayToMemory(A,e),A.length-1)}function _strftime_l(e,t,i,r){return _strftime(e,t,i,r)}function _abort(){Module.abort()}function _free(){}function ___cxa_free_exception(e){try{return _free(e)}catch{}}function ___cxa_end_catch(){if(___cxa_end_catch.rethrown)___cxa_end_catch.rethrown=!1;else{asm.setThrew(0);var e=EXCEPTIONS.caught.pop();e&&(EXCEPTIONS.decRef(EXCEPTIONS.deAdjust(e)),EXCEPTIONS.last=0)}}function _pthread_once(e,t){_pthread_once.seen||(_pthread_once.seen={}),!(e in _pthread_once.seen)&&(Runtime.dynCall("v",t),_pthread_once.seen[e]=1)}function ___lock(){}function ___unlock(){}Module._free=_free;var PTHREAD_SPECIFIC={};function _pthread_getspecific(e){return PTHREAD_SPECIFIC[e]||0}function ___setErrNo(e){return Module.___errno_location&&(HEAP32[Module.___errno_location()>>2]=e),e}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(e){switch(e){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"==typeof navigator&&navigator.hardwareConcurrency||1}return ___setErrNo(ERRNO_CODES.EINVAL),-1}var _fabs=Math_abs,PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(e,t){return 0==e?ERRNO_CODES.EINVAL:(HEAP32[e>>2]=PTHREAD_SPECIFIC_NEXT_KEY,PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0,PTHREAD_SPECIFIC_NEXT_KEY++,0)}function _emscripten_set_main_loop_timing(e,t){if(Browser.mainLoop.timingMode=e,Browser.mainLoop.timingValue=t,!Browser.mainLoop.func)return 1;if(0==e)Browser.mainLoop.scheduler=function(){setTimeout(Browser.mainLoop.runner,t)},Browser.mainLoop.method="timeout";else if(1==e)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(2==e){if(!window.setImmediate){let e=function(e){e.source===window&&e.data===r&&(e.stopPropagation(),i.shift()())};var i=[],r="__emcc";window.addEventListener("message",e,!0),window.setImmediate=function(e){i.push(e),window.postMessage(r,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(e,t,i,r,n){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=e,Browser.mainLoop.arg=r;var a=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var t=Date.now(),i=Browser.mainLoop.queue.shift();if(i.func(i.arg),Browser.mainLoop.remainingBlockers){var n=Browser.mainLoop.remainingBlockers,o=n%1==0?n-1:Math.floor(n);i.counted?Browser.mainLoop.remainingBlockers=o:(o+=.5,Browser.mainLoop.remainingBlockers=(8*n+o)/9)}return console.log('main loop blocker "'+i.name+'" took '+(Date.now()-t)+" ms"),Browser.mainLoop.updateStatus(),void setTimeout(Browser.mainLoop.runner,0)}if(!(a1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0)return void Browser.mainLoop.scheduler();"timeout"===Browser.mainLoop.method&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter((function(){typeof r<"u"?Runtime.dynCall("vi",e,[r]):Runtime.dynCall("v",e)})),!(a0?_emscripten_set_main_loop_timing(0,1e3/t):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),i)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var e=Browser.mainLoop.timingMode,t=Browser.mainLoop.timingValue,i=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(i,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(e,t),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var e=Module.statusMessage||"Please wait...",t=Browser.mainLoop.remainingBlockers,i=Browser.mainLoop.expectedBlockers;t?t"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var e={canHandle:function(e){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(e)},handle:function(e,t,i,r){var n=null;if(Browser.hasBlobConstructor)try{(n=new Blob([e],{type:Browser.getMimetype(t)})).size!==e.length&&(n=new Blob([new Uint8Array(e).buffer],{type:Browser.getMimetype(t)}))}catch(e){Runtime.warnOnce("Blob constructor present but fails: "+e+"; falling back to blob builder")}if(!n){var a=new Browser.BlobBuilder;a.append(new Uint8Array(e).buffer),n=a.getBlob()}var o=Browser.URLObject.createObjectURL(n),s=new Image;s.onload=function(){assert(s.complete,"Image "+t+" could not be decoded");var r=document.createElement("canvas");r.width=s.width,r.height=s.height,r.getContext("2d").drawImage(s,0,0),Module.preloadedImages[t]=r,Browser.URLObject.revokeObjectURL(o),i&&i(e)},s.onerror=function(e){console.log("Image "+o+" could not be decoded"),r&&r()},s.src=o}};Module.preloadPlugins.push(e);var t={canHandle:function(e){return!Module.noAudioDecoding&&e.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},handle:function(e,t,i,r){var n=!1;function a(r){n||(n=!0,Module.preloadedAudios[t]=r,i&&i(e))}function o(){n||(n=!0,Module.preloadedAudios[t]=new Audio,r&&r())}if(!Browser.hasBlobConstructor)return o();try{var s=new Blob([e],{type:Browser.getMimetype(t)})}catch{return o()}var l=Browser.URLObject.createObjectURL(s),c=new Audio;c.addEventListener("canplaythrough",(function(){a(c)}),!1),c.onerror=function(i){n||(console.log("warning: browser could not fully decode audio "+t+", trying slower base64 approach"),c.src="data:audio/x-"+t.substr(-3)+";base64,"+function(e){for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i="",r=0,n=0,a=0;a=6;){var o=r>>n-6&63;n-=6,i+=t[o]}return 2==n?(i+=t[(3&r)<<4],i+="=="):4==n&&(i+=t[(15&r)<<2],i+="="),i}(e),a(c))},c.src=l,Browser.safeSetTimeout((function(){a(c)}),1e4)}};Module.preloadPlugins.push(t);var i=Module.canvas;i&&(i.requestPointerLock=i.requestPointerLock||i.mozRequestPointerLock||i.webkitRequestPointerLock||i.msRequestPointerLock||function(){},i.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},i.exitPointerLock=i.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&i.addEventListener("click",(function(e){!Browser.pointerLock&&i.requestPointerLock&&(i.requestPointerLock(),e.preventDefault())}),!1))}function r(){Browser.pointerLock=document.pointerLockElement===i||document.mozPointerLockElement===i||document.webkitPointerLockElement===i||document.msPointerLockElement===i}},createContext:function(e,t,i,r){if(t&&Module.ctx&&e==Module.canvas)return Module.ctx;var n,a;if(t){var o={antialias:!1,alpha:!1};if(r)for(var s in r)o[s]=r[s];(a=GL.createContext(e,o))&&(n=GL.getContext(a).GLctx),e.style.backgroundColor="black"}else n=e.getContext("2d");return n?(i&&(t||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=n,t&&GL.makeContextCurrent(a),Module.useWebGL=t,Browser.moduleContextCreatedCallbacks.forEach((function(e){e()})),Browser.init()),n):null},destroyContext:function(e,t,i){},fullScreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullScreen:function(e,t,i){Browser.lockPointer=e,Browser.resizeCanvas=t,Browser.vrDevice=i,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var r=Module.canvas;function n(){Browser.isFullScreen=!1;var e=r.parentNode;(document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement||document.msFullScreenElement||document.msFullscreenElement||document.webkitCurrentFullScreenElement)===e?(r.cancelFullScreen=document.cancelFullScreen||document.mozCancelFullScreen||document.webkitCancelFullScreen||document.msExitFullscreen||document.exitFullscreen||function(){},r.cancelFullScreen=r.cancelFullScreen.bind(document),Browser.lockPointer&&r.requestPointerLock(),Browser.isFullScreen=!0,Browser.resizeCanvas&&Browser.setFullScreenCanvasSize()):(e.parentNode.insertBefore(r,e),e.parentNode.removeChild(e),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullScreen),Browser.updateCanvasDimensions(r)}Browser.fullScreenHandlersInstalled||(Browser.fullScreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",n,!1),document.addEventListener("mozfullscreenchange",n,!1),document.addEventListener("webkitfullscreenchange",n,!1),document.addEventListener("MSFullscreenChange",n,!1));var a=document.createElement("div");r.parentNode.insertBefore(a,r),a.appendChild(r),a.requestFullScreen=a.requestFullScreen||a.mozRequestFullScreen||a.msRequestFullscreen||(a.webkitRequestFullScreen?function(){a.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),i?a.requestFullScreen({vrDisplay:i}):a.requestFullScreen()},nextRAF:0,fakeRequestAnimationFrame:function(e){var t=Date.now();if(0===Browser.nextRAF)Browser.nextRAF=t+1e3/60;else for(;t+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var i=Math.max(Browser.nextRAF-t,0);setTimeout(e,i)},requestAnimationFrame:function(e){typeof window>"u"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(e){return function(){if(!ABORT)return e.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var e=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],e.forEach((function(e){e()}))}},safeRequestAnimationFrame:function(e){return Browser.requestAnimationFrame((function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))}))},safeSetTimeout:function(e,t){return Module.noExitRuntime=!0,setTimeout((function(){ABORT||(Browser.allowAsyncCallbacks?e():Browser.queuedAsyncCallbacks.push(e))}),t)},safeSetInterval:function(e,t){return Module.noExitRuntime=!0,setInterval((function(){ABORT||Browser.allowAsyncCallbacks&&e()}),t)},getMimetype:function(e){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[e.substr(e.lastIndexOf(".")+1)]},getUserMedia:function(e){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(e)},getMovementX:function(e){return e.movementX||e.mozMovementX||e.webkitMovementX||0},getMovementY:function(e){return e.movementY||e.mozMovementY||e.webkitMovementY||0},getMouseWheelDelta:function(e){var t=0;switch(e.type){case"DOMMouseScroll":t=e.detail;break;case"mousewheel":t=e.wheelDelta;break;case"wheel":t=e.deltaY;break;default:throw"unrecognized mouse wheel event: "+e.type}return t},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(e){if(Browser.pointerLock)"mousemove"!=e.type&&"mozMovementX"in e?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(e),Browser.mouseMovementY=Browser.getMovementY(e)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var t=Module.canvas.getBoundingClientRect(),i=Module.canvas.width,r=Module.canvas.height,n=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,a=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if("touchstart"===e.type||"touchend"===e.type||"touchmove"===e.type){var o=e.touch;if(void 0===o)return;var s=o.pageX-(n+t.left),l=o.pageY-(a+t.top),c={x:s*=i/t.width,y:l*=r/t.height};if("touchstart"===e.type)Browser.lastTouches[o.identifier]=c,Browser.touches[o.identifier]=c;else if("touchend"===e.type||"touchmove"===e.type){var u=Browser.touches[o.identifier];u||(u=c),Browser.lastTouches[o.identifier]=u,Browser.touches[o.identifier]=c}return}var f=e.pageX-(n+t.left),h=e.pageY-(a+t.top);f*=i/t.width,h*=r/t.height,Browser.mouseMovementX=f-Browser.mouseX,Browser.mouseMovementY=h-Browser.mouseY,Browser.mouseX=f,Browser.mouseY=h}},xhrLoad:function(e,t,i){var r=new XMLHttpRequest;r.open("GET",e,!0),r.responseType="arraybuffer",r.onload=function(){200==r.status||0==r.status&&r.response?t(r.response):i()},r.onerror=i,r.send(null)},asyncLoad:function(e,t,i,r){Browser.xhrLoad(e,(function(i){assert(i,'Loading data file "'+e+'" failed (no arrayBuffer).'),t(new Uint8Array(i)),r||removeRunDependency()}),(function(t){if(!i)throw'Loading data file "'+e+'" failed.';i()})),r||addRunDependency()},resizeListeners:[],updateResizeListeners:function(){var e=Module.canvas;Browser.resizeListeners.forEach((function(t){t(e.width,e.height)}))},setCanvasSize:function(e,t,i){var r=Module.canvas;Browser.updateCanvasDimensions(r,e,t),i||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function(){if(typeof SDL<"u"){var e=HEAPU32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2];e|=8388608,HEAP32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2]=e}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var e=HEAPU32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2];e&=-8388609,HEAP32[SDL.screen+0*Runtime.QUANTUM_SIZE>>2]=e}Browser.updateResizeListeners()},updateCanvasDimensions:function(e,t,i){t&&i?(e.widthNative=t,e.heightNative=i):(t=e.widthNative,i=e.heightNative);var r=t,n=i;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(r/n>2]},getStr:function(){return Pointer_stringify(SYSCALLS.get())},get64:function(){var e=SYSCALLS.get(),t=SYSCALLS.get();return assert(e>=0?0===t:-1===t),e},getZero:function(){assert(0===SYSCALLS.get())}};function ___syscall54(e,t){SYSCALLS.varargs=t;try{return 0}catch(e){return(typeof FS>"u"||!(e instanceof FS.ErrnoError))&&abort(e),-e.errno}}function ___cxa_pure_virtual(){throw ABORT=!0,"Pure virtual function called!"}function _pthread_cleanup_push(e,t){__ATEXIT__.push((function(){Runtime.dynCall("vi",e,[t])})),_pthread_cleanup_push.level=__ATEXIT__.length}function _pthread_cond_broadcast(){return 0}function ___cxa_guard_acquire(e){return HEAP8[e|0]?0:(HEAP8[e|0]=1,1)}function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!"),__ATEXIT__.pop(),_pthread_cleanup_push.level=__ATEXIT__.length}function ___cxa_guard_release(){}function ___cxa_begin_catch(e){return __ZSt18uncaught_exceptionv.uncaught_exception--,EXCEPTIONS.caught.push(e),EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(e)),e}function _llvm_eh_typeid_for(e){return e}function _emscripten_memcpy_big(e,t,i){return HEAPU8.set(HEAPU8.subarray(t,t+i),e),e}function ___syscall6(e,t){SYSCALLS.varargs=t;try{var i=SYSCALLS.getStreamFromFD();return FS.close(i),0}catch(e){return(typeof FS>"u"||!(e instanceof FS.ErrnoError))&&abort(e),-e.errno}}function _pthread_mutex_lock(){}function _sbrk(e){var t=_sbrk;t.called||(DYNAMICTOP=alignMemoryPage(DYNAMICTOP),t.called=!0,assert(Runtime.dynamicAlloc),t.alloc=Runtime.dynamicAlloc,Runtime.dynamicAlloc=function(){abort("cannot dynamically allocate, sbrk now has control")});var i=DYNAMICTOP;if(0!=e&&!t.alloc(e))return 4294967295;return i}function ___cxa_guard_abort(){}function _pthread_cond_wait(){return 0}function ___cxa_rethrow(){___cxa_end_catch.rethrown=!0;var e=EXCEPTIONS.caught.pop();throw EXCEPTIONS.last=e,e}function _pthread_mutex_unlock(){}function _time(e){var t=Date.now()/1e3|0;return e&&(HEAP32[e>>2]=t),t}function _pthread_self(){return 0}function ___syscall140(e,t){SYSCALLS.varargs=t;try{var i=SYSCALLS.getStreamFromFD(),r=SYSCALLS.get(),n=SYSCALLS.get(),a=SYSCALLS.get(),o=SYSCALLS.get(),s=n;return assert(0===r),FS.llseek(i,s,o),HEAP32[a>>2]=i.position,i.getdents&&0===s&&0===o&&(i.getdents=null),0}catch(e){return(typeof FS>"u"||!(e instanceof FS.ErrnoError))&&abort(e),-e.errno}}function ___syscall146(e,t){SYSCALLS.varargs=t;try{SYSCALLS.get();var i=SYSCALLS.get(),r=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffer=[]);for(var a=___syscall146.buffer,o=0;o>2],l=HEAP32[i+(8*o+4)>>2],c=0;c"u"||!(e instanceof FS.ErrnoError))&&abort(e),-e.errno}}function ___syscall145(e,t){SYSCALLS.varargs=t;try{var i=SYSCALLS.getStreamFromFD(),r=SYSCALLS.get(),n=SYSCALLS.get();return SYSCALLS.doReadv(i,r,n)}catch(e){return(typeof FS>"u"||!(e instanceof FS.ErrnoError))&&abort(e),-e.errno}}Module._i64Add=_i64Add,Module._bitshift64Lshr=_bitshift64Lshr,Module._memcpy=_memcpy,Module._bitshift64Shl=_bitshift64Shl,Module._memmove=_memmove;var ___dso_handle=allocate(1,"i32*",ALLOC_STATIC);Module.requestFullScreen=function(e,t,i){Browser.requestFullScreen(e,t,i)},Module.requestAnimationFrame=function(e){Browser.requestAnimationFrame(e)},Module.setCanvasSize=function(e,t,i){Browser.setCanvasSize(e,t,i)},Module.pauseMainLoop=function(){Browser.mainLoop.pause()},Module.resumeMainLoop=function(){Browser.mainLoop.resume()},Module.getUserMedia=function(){Browser.getUserMedia()},Module.createContext=function(e,t,i,r){return Browser.createContext(e,t,i,r)},STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP),staticSealed=!0,STACK_MAX=STACK_BASE+TOTAL_STACK,DYNAMIC_BASE=DYNAMICTOP=Runtime.alignMemory(STACK_MAX),assert(DYNAMIC_BASE>2],!!(0|t))&&(1126902528==(-256&d[(i=t+48|0)>>2])?1129074247==(0|d[i+4>>2]):0)&&Va(0|d[t+12>>2]),i=0|d[9208],d[9208]=i+0,Va(i)}()}function Oe(e,t,i,r,n,a,o){t|=0,n|=0,o|=0;var s,l,c,u,h;return h=b,b=b+48|0,l=h+36|0,s=h+24|0,c=h+12|0,u=h,!!(0|(e|=0))&!!(0|(i|=0))&!!(0|(r|=0))&!!(0|(a|=0))?(d[c>>2]=0,d[c+4>>2]=e,d[c+8>>2]=t,d[u>>2]=0,d[u+4>>2]=r,d[u+8>>2]=n,d[s>>2]=d[c>>2],d[s+4>>2]=d[c+4>>2],d[s+8>>2]=d[c+8>>2],d[l>>2]=d[u>>2],d[l+4>>2]=d[u+4>>2],d[l+8>>2]=d[u+8>>2],n=0|function(e,t,i,r,n){e|=0,t|=0,r|=0,n|=0;var a,o,s,l,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0;if(w=b,b=b+128|0,o=w+44|0,p=w+8|0,m=w+4|0,a=w,s=4+(i|=0)|0,l=i+8|0,y=0,j(35,0|d[i>>2],0|d[s>>2],0|d[l>>2],0|r),g=y,y=0,1&g)A=5;else{c=(u=o)+84|0;do{d[u>>2]=d[r>>2],u=u+4|0,r=r+4|0}while((0|u)<(0|c));if(!(0|d[(r=o+12|0)>>2])&&(h=0|E((7+(0|d[o+8>>2])|0)/8|0,0|d[o>>2]),d[r>>2]=h,!!(0|d[o+24>>2]))&&(g=0|E(0|d[o+16>>2],h),d[r>>2]=g),y=0,P(176,0|p),g=y,y=0,1&g)A=5;else{r=o+56|0;do{if(0|d[r>>2]){if(y=0,r=0|N(66,0|r),g=y,y=0,!(1&g)){if(d[m>>2]=r,(u=0|d[(c=p+28|0)>>2])>>>0<(0|d[p+32>>2])>>>0){d[u>>2]=r,d[c>>2]=u+4,d[m>>2]=0,A=19;break}if(y=0,L(57,p+24|0,0|m),g=y,y=0,1&g){if(c=0|ae(824,0),r=D,u=0|d[m>>2],d[m>>2]=0,!u)break;Jo[255&d[4+(0|d[u>>2])>>2]](u);break}if(r=0|d[m>>2],d[m>>2]=0,!r){A=19;break}Jo[255&d[4+(0|d[r>>2])>>2]](r),A=19;break}A=15}else A=19}while(0);e:do{if(19==(0|A))if(u=o+4|0,h=o+8|0,m=o+16|0,y=0,r=0|Y(14,0|d[o>>2],0|d[u>>2],0|d[h>>2],0|d[m>>2]),g=y,y=0,1&g)A=15;else{d[a>>2]=r,c=0|d[(g=p+28|0)>>2];do{if(c>>>0>=(0|d[p+32>>2])>>>0){if(y=0,L(57,p+24|0,0|a),c=y,y=0,1&c){if(c=0|ae(824,0),r=D,u=0|d[a>>2],d[a>>2]=0,!u)break e;Jo[255&d[4+(0|d[u>>2])>>2]](u);break e}if(r=0|d[a>>2],d[a>>2]=0,!r)break;Jo[255&d[4+(0|d[r>>2])>>2]](r);break}d[c>>2]=r,d[g>>2]=c+4,d[a>>2]=0}while(0);if(0|(r=0|d[o+28>>2])&&(y=0,L(58,0|p,0|r),A=y,y=0,1&A)){A=15;break}t:do{if(0|d[o+24>>2]){if(y=0,W(4,0|p,0|i,0|o),A=y,y=0,1&A){A=15;break e}}else if(r=0|E(0|d[u>>2],0|d[o>>2]),r=0|E(r,(7+(0|d[h>>2])|0)/8|0),(0|d[m>>2])>0){for(u=0;y=0,W(4,0|p,0|i,0|o),A=y,y=0,!(1&A);)if((c=0|d[s>>2])&&(d[s>>2]=c+r,d[l>>2]=(0|d[l>>2])-r),(0|(u=u+1|0))>=(0|d[m>>2]))break t;c=0|ae(824,0),r=D,A=16;break e}}while(0);if(y=0,G(33,0|p,0|e),A=y,y=0,!(1&A)){if(d[t>>2]=d[p+16>>2],n&&(f[0|n]=0),r=0|d[(u=p+24|0)>>2]){if((0|(c=0|d[g>>2]))!=(0|r)){do{n=c+-4|0,d[g>>2]=n,c=0|d[n>>2],d[n>>2]=0,c&&Jo[255&d[4+(0|d[c>>2])>>2]](c),c=0|d[g>>2]}while((0|c)!=(0|r));r=0|d[u>>2]}Ba(r)}return b=w,0}A=15}}while(0);if(15==(0|A)&&(c=0|ae(824,0),r=D,A=16),u=0|d[(g=p+24|0)>>2]){if((0|(h=0|d[(m=p+28|0)>>2]))!=(0|u)){do{p=h+-4|0,d[m>>2]=p,h=0|d[p>>2],d[p>>2]=0,h&&Jo[255&d[4+(0|d[h>>2])>>2]](h),h=0|d[m>>2]}while((0|h)!=(0|u));u=0|d[g>>2]}Ba(u)}}}if(5==(0|A)&&(c=0|ae(824,0),r=D),p=(0|r)==(0|le(824)),h=0|ue(0|c),r=!(0|n),!p)return r||(f[0|n]=0),he(),b=w,14;u=h+12|0;do{if(r)A=60;else if(r=0|d[u>>2],y=0,c=0|H(1),p=y,y=0,!(1&p)){if((0|r)==(0|c)){qo(n,0|ts[127&d[8+(0|d[h>>2])>>2]](h)),A=60;break}f[0|n]=0,A=60;break}}while(0);return 60!=(0|A)||(S=0|d[u>>2],y=0,v=0|H(1),n=y,y=0,1&n)?(r=0|ae(),y=0,X(3),w=y,y=0,1&w?Ue(w=0|ae(0)):de(0|r),0):(n=(0|S)==(0|v)?0|d[h+8>>2]:13,he(),b=w,0|n)}(s,i,l,a,o),b=h,0|n):(b=h,0|(n=1))}function Be(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o,s;return n=b,b=b+32|0,a=n+12|0,d[(s=o=n)>>2]=0,d[s+4>>2]=0,d[o+4>>2]=e,d[o+8>>2]=t,d[a>>2]=d[o>>2],d[a+4>>2]=d[o+4>>2],d[a+8>>2]=d[o+8>>2],i=0|function(e,t,i){e|=0,t|=0,i|=0;var r,n=0,a=0,o=0,s=0,l=0,c=0;if(r=b,b=b+128|0,n=r,y=0,d[(a=r+116|0)>>2]=d[e>>2],d[a+4>>2]=d[e+4>>2],d[a+8>>2]=d[e+8>>2],L(59,0|n,0|a),a=y,y=0,!(1&a||(y=0,P(177,0|n),a=y,y=0,1&a)||(y=0,L(61,0|n,1),a=y,y=0,1&a))){e=n+16|0,n=t+84|0;do{d[t>>2]=d[e>>2],t=t+4|0,e=e+4|0}while((0|t)<(0|n));return i&&(f[0|i]=0),b=r,0}if(a=0|ae(824,0),t=(0|(t=D))==(0|le(824)),a=0|ue(0|a),e=!(0|i),!t)return e||(f[0|i]=0),he(),b=r,14;t=a+12|0;do{if(e)l=13;else if(e=0|d[t>>2],y=0,n=0|H(1),c=y,y=0,!(1&c)){if((0|e)==(0|n)){qo(i,0|ts[127&d[8+(0|d[a>>2])>>2]](a)),l=13;break}f[0|i]=0,l=13;break}}while(0);return 13!=(0|l)||(o=0|d[t>>2],y=0,s=0|H(1),c=y,y=0,1&c)?(e=0|ae(),y=0,X(3),c=y,y=0,1&c?Ue(c=0|ae(0)):de(0|e),0):(c=(0|o)==(0|s)?0|d[a+8>>2]:13,he(),b=r,0|c)}(a,i,r),b=n,0|i}function Ve(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u;return o=b,b=b+48|0,s=o+36|0,l=o+24|0,c=o,d[(u=o+12|0)>>2]=0,d[u+4>>2]=e,d[u+8>>2]=t,d[c>>2]=0,d[c+4>>2]=i,d[c+8>>2]=r,d[l>>2]=d[u>>2],d[l+4>>2]=d[u+4>>2],d[l+8>>2]=d[u+8>>2],d[s>>2]=d[c>>2],d[s+4>>2]=d[c+4>>2],d[s+8>>2]=d[c+8>>2],r=0|function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(u=b,b=b+128|0,o=u,y=0,d[(n=u+116|0)>>2]=d[t>>2],d[n+4>>2]=d[t+4>>2],d[n+8>>2]=d[t+8>>2],L(59,0|o,0|n),a=y,y=0,!(1&a)){if(i){t=84+(a=o+16|0)|0;do{d[a>>2]=d[i>>2],a=a+4|0,i=i+4|0}while((0|a)<(0|t))}if(y=0,d[n>>2]=d[e>>2],d[n+4>>2]=d[e+4>>2],d[n+8>>2]=d[e+8>>2],L(60,0|o,0|n),o=y,y=0,!(1&o))return r&&(f[0|r]=0),b=u,0}if(e=0|ae(824,0),o=(0|(o=D))==(0|le(824)),e=0|ue(0|e),t=!(0|r),!o)return t||(f[0|r]=0),he(),b=u,14;a=e+12|0;do{if(t)c=10;else if(t=0|d[a>>2],y=0,i=0|H(1),o=y,y=0,!(1&o)){if((0|t)==(0|i)){qo(r,0|ts[127&d[8+(0|d[e>>2])>>2]](e)),c=10;break}f[0|r]=0,c=10;break}}while(0);return 10!=(0|c)||(s=0|d[a>>2],y=0,l=0|H(1),c=y,y=0,1&c)?(t=0|ae(),y=0,X(3),u=y,y=0,1&u?Ue(u=0|ae(0)):de(0|t),0):(c=(0|s)==(0|l)?0|d[e+8>>2]:13,he(),b=u,0|c)}(l,s,n,a),b=o,0|r}function qe(e,t){e|=0;var i,r,n,a=0,o=0,s=0,l=0,c=0,u=0;n=b,b=b+32|0,Ea(i=n,(1<<(t|=0))-1|0,0),a=(r=(l=0|d[i>>2])+1|0)<<1,d[e>>2]=0,d[(c=e+4|0)>>2]=0,d[e+8>>2]=0;e:do{if(r){if((0|l)<-1&&(y=0,P(178,0|e),u=y,y=0,1&u)||(o=4),4==(0|o)&&(y=0,s=0|N(67,0|a),u=y,y=0,!(1&u)))for(d[c>>2]=s,d[e>>2]=s,d[e+8>>2]=s+a,t=s;;)if(f[t|0]=0,t=1+(0|d[c>>2])|0,d[c>>2]=t,!(a=a+-1|0))break e;a=0|ae(),(t=0|d[e>>2])||de(0|a),(0|d[c>>2])!=(0|t)&&(d[c>>2]=t),Ba(t),de(0|a)}}while(0);if((0|l)<(0|(t=~l)))b=n;else{c=i+12|0,u=i+8|0,l=i+4|0,s=t;do{(0|s)>(0-(t=0|d[c>>2])|0)?(0|s)>(0-(a=0|d[u>>2])|0)?t=(0|s)>(0-(o=0|d[l>>2])|0)?(0|s)>=0?(0|s)>0?(0|o)<=(0|s)?(0|a)>(0|s)?2:(0|t)>(0|s)?3:4:1:0:-1:-2:t=-3:t=-4,f[(0|d[e>>2])+(s+r)|0]=t,s=s+1|0}while((0|s)<(0|r));b=n}}function Ge(e,t,i){e|=0,t|=0;var r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,g=0,p=0;switch(0|(r=0|d[(i|=0)+16>>2])){case 64:case 0:y=0,e=0|G(34,0|e,0|t),t=y,y=0,1&t?p=16:n=e;break;default:for(a=(1<>2])-1|0,m=1+(((m=(g=0|d[t+20>>2])<<1)+a|0)/(1|m)|0)|0,e=0;1<>2],y=0,n=0|N(67,4624),u=y,y=0,1&u)p=16;else{o=((0|s)<8?8:s)+s<<1,c=t,u=(l=n+4|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=n+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[n>>2]=35660,d[n+128>>2]=a,d[n+132>>2]=m,d[n+136>>2]=g,d[n+140>>2]=e,d[n+144>>2]=s,d[n+148>>2]=o,d[n+152>>2]=r,d[(e=n+156|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[n+172>>2]=d[t>>2],d[n+176>>2]=0,d[n+180>>2]=0,d[n+184>>2]=0,e=n+4568|0,a=n+188|0;do{d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,h[a+10>>1]=1,a=a+12|0}while((0|a)!=(0|e));d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=n+4580|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=n+4592|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[n+28>>2]||(d[n+20>>2]=1)}}return 16==(0|p)&&(p=0|ae(),de(0|p)),n&&(y=0,L(0|d[12+(0|d[n>>2])>>2],0|n,0|i),p=y,y=0,1&p)?(e=0|ae(),n||de(0|(p=e)),Jo[255&d[4+(0|d[n>>2])>>2]](n),de(0|(p=e)),0):0|n}function Qe(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,m=0;a=0|d[(l=(e|=0)+4|0)>>2];do{if(0|f[a+32|0]){if(Wn(0|d[(o=e+8|0)>>2],0|t,6*r|0),a=0|d[l>>2],s=0|d[a+16>>2],(0|r)<=0){c=0|d[o>>2];break}for(a=t=0|d[o>>2],o=0;c=a+4|0,u=0|h[a>>1],h[a>>1]=0|h[c>>1],h[c>>1]=u,(0|(o=o+1|0))!=(0|r);)a=a+(s<<1)|0;c=t,a=0|d[l>>2]}else c=t}while(0);switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if((0|r)<=0)return;a=e+32|0,t=0;do{u=0|d[a>>2],e=(n=32768-(l=g[c+(6*t|0)+2>>1]<>1]<>1]<>1]=(l+49152+((e+n|0)>>>2)&65535)>>>u,h[i+(6*t|0)+2>>1]=e>>>u,h[i+(6*t|0)+4>>1]=n>>>u,t=t+1|0}while((0|t)!=(0|r));return}if((0|(o=(0|n)<(0|r)?n:r))<=0)return;s=n<<1,a=0|d[e+32>>2],t=0;do{e=(u=32768-(r=g[c+(6*t|0)+2>>1]<>1]<>1]<>1]=(r+49152+((e+u|0)>>>2)&65535)>>>a,h[i+(t+n<<1)>>1]=e>>>a,h[i+(t+s<<1)>>1]=u>>>a,t=t+1|0}while((0|t)!=(0|o));return;case 4:if(1!=(0|d[a+24>>2])||(0|(o=(0|n)<(0|r)?n:r))<=0)return;s=n<<1,l=3*n|0,a=0|d[e+32>>2],t=0;do{u=0|h[c+(t<<3)+6>>1],r=(e=32768-(m=g[c+(t<<3)+2>>1]<>1]<>1]<>1]=(m+49152+((r+e|0)>>>2)&65535)>>>a,h[i+(t+n<<1)>>1]=r>>>a,h[i+(t+s<<1)>>1]=e>>>a,h[i+(t+l<<1)>>1]=u,t=t+1|0}while((0|t)!=(0|o));return;default:return}}function ze(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0;if(a=b,b=b+176|0,r=a+152|0,l=a+16|0,o=a,!(1&(t|=0))){if(r=(0|t)/4|0,(0|t)>3){n=0;do{s=0|d[(l=e+(n<<2)|0)>>2],d[l>>2]=s>>>8&16711935|s<<8&-16711936,n=n+1|0}while((0|n)<(0|r))}return 3&t?(l=e+(t+-1)|0,s=0|f[(o=e+(t+-2)|0)|0],f[o|0]=0|f[l|0],f[l|0]=s,void(b=a)):void(b=a)}s=l+56|0,i=l+4|0,d[l>>2]=36160,d[s>>2]=36180,y=0,L(62,l+56|0,0|i),a=y,y=0,1&a&&(l=0|ae(),tn(s),de(0|l)),d[l+128>>2]=0,d[l+132>>2]=-1,d[l>>2]=36200,d[l+56>>2]=36220,y=0,P(180,0|i),a=y,y=0;do{if(1&a)r=0|ae();else{if(d[i>>2]=36236,d[(a=l+36|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[l+52>>2]=16,d[r>>2]=0,d[r+4>>2]=0,d[r+8>>2]=0,y=0,L(63,0|i,0|r),e=y,y=0,1&e){l=0|ae(),qr(r),qr(a),an(i),r=l;break}qr(r),y=0,r=0|O(28,0|l,49087,24),e=y,y=0,!(1&e)&&(y=0,n=0|G(36,0|r,0|t),t=y,y=0,!(1&t))&&(y=0,O(28,0|n,49112,20),t=y,y=0,!(1&t))&&(e=0|ne(16),y=0,L(64,0|o,0|i),t=y,y=0,1&t?r=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|e,1,35648,0|o),t=y,y=0,1&t?n=1:(y=0,W(6,0|e,824,96),y=0,n=0),r=0|ae(),qr(o),n||(o=r,d[l>>2]=36200,d[s>>2]=36220,d[i>>2]=36236,qr(a),an(i),tn(s),de(0|o))),re(0|e),o=r,d[l>>2]=36200,d[s>>2]=36220,d[i>>2]=36236,qr(a),an(i),tn(s),de(0|o)),o=0|ae(),d[l>>2]=36200,d[s>>2]=36220,d[i>>2]=36236,qr(a),an(i),tn(s),de(0|o)}}while(0);l=r,tn(s),de(0|l)}function He(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0,b=0;o=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[o+16>>2]){case 3:if(2==(0|d[o+24>>2])){if((0|r)<=0)break e;o=e+40|0,e=0;do{n=0|d[o>>2],l=g[t+(6*e|0)+2>>1]<>1]<>1]<>2)+16384|0,h[i+(6*e|0)>>1]=(s+32768+c&65535)>>>n,h[i+(6*e|0)+2>>1]=(65535&c)>>>n,h[i+(6*e|0)+4>>1]=(l+32768+c&65535)>>>n,e=e+1|0}while((0|e)!=(0|r))}else{if((0|(s=(0|r)<(0|n)?r:n))<=0)break e;l=n<<1,o=e+40|0,e=0;do{c=0|d[o>>2],m=g[t+(e+n<<1)>>1]<>1]<>1]<>2)+16384|0,h[i+(6*e|0)>>1]=(p+32768+u&65535)>>>c,h[i+(6*e|0)+2>>1]=(65535&u)>>>c,h[i+(6*e|0)+4>>1]=(m+32768+u&65535)>>>c,e=e+1|0}while((0|e)!=(0|s))}break;case 4:if(1==(0|d[o+24>>2])&&(0|(c=(0|r)<(0|n)?r:n))>0){l=n<<1,o=e+40|0,e=3*n|0,s=0;do{p=0|d[o>>2],m=g[t+(s+n<<1)>>1]<>1]<>1]<>2)+16384|0,A=0|h[t+(s+e<<1)>>1],b=0|Xn((65535&u)>>>p&65535,0,16),m=(m+32768+u&65535)>>>p|D,A=0|Xn(65535&A,0,48),A|=b|(S+32768+u&65535)>>>p&65535,m=65535&m|D,h[(u=p=i+(s<<3)|0)>>1]=A,h[u+2>>1]=A>>>16,h[(p=p+4|0)>>1]=m,h[p+2>>1]=m>>>16,s=s+1|0}while((0|s)!=(0|c))}}}while(0);if(o=0|d[a>>2],0|f[o+32|0]&&(s=0|d[o+16>>2],!((0|r)<=0)))for(o=i,e=0;b=o+4|0,S=0|h[o>>1],h[o>>1]=0|h[b>>1],h[b>>1]=S,(0|(e=e+1|0))!=(0|r);)o=o+(s<<1)|0}function Ye(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,m=0;a=0|d[(l=(e|=0)+4|0)>>2];do{if(0|f[a+32|0]){if(Wn(0|d[(o=e+8|0)>>2],0|t,6*r|0),a=0|d[l>>2],s=0|d[a+16>>2],(0|r)<=0){c=0|d[o>>2];break}for(a=t=0|d[o>>2],o=0;c=a+4|0,u=0|h[a>>1],h[a>>1]=0|h[c>>1],h[c>>1]=u,(0|(o=o+1|0))!=(0|r);)a=a+(s<<1)|0;c=t,a=0|d[l>>2]}else c=t}while(0);switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if((0|r)<=0)return;a=e+32|0,t=0;do{n=0|d[a>>2],l=g[c+(6*t|0)>>1]<>1]<>1]<>>1)&65535)>>>n&65535,h[i+(6*t|0)>>1]=(l+32768-e&65535)>>>n,h[i+(6*t|0)+2>>1]=(65535&e)>>>n,h[i+(6*t|0)+4>>1]=u,t=t+1|0}while((0|t)!=(0|r));return}if((0|(o=(0|n)<(0|r)?n:r))<=0)return;s=n<<1,a=0|d[e+32>>2],t=0;do{r=g[c+(6*t|0)>>1]<>1]<>1]<>>1)&65535)>>>a&65535,h[i+(t<<1)>>1]=(r+32768-e&65535)>>>a,h[i+(t+n<<1)>>1]=(65535&e)>>>a,h[i+(t+s<<1)>>1]=u,t=t+1|0}while((0|t)!=(0|o));return;case 4:if(1!=(0|d[a+24>>2])||(0|(o=(0|n)<(0|r)?n:r))<=0)return;s=n<<1,l=3*n|0,a=0|d[e+32>>2],t=0;do{u=0|h[c+(t<<3)+6>>1],m=g[c+(t<<3)>>1]<>1]<>1]<>>1)&65535)>>>a&65535,h[i+(t<<1)>>1]=(m+32768-r&65535)>>>a,h[i+(t+n<<1)>>1]=(65535&r)>>>a,h[i+(t+s<<1)>>1]=e,h[i+(t+l<<1)>>1]=u,t=t+1|0}while((0|t)!=(0|o));return;default:return}}function We(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0;o=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[o+16>>2]){case 3:if(2==(0|d[o+24>>2])){if((0|r)<=0)break e;o=e+40|0,e=0;do{c=0|d[o>>2],l=g[t+(6*e|0)+2>>1]<>1]<>1]<>>1)&65535)>>>c&65535,h[i+(6*e|0)>>1]=s>>>c,h[i+(6*e|0)+2>>1]=l>>>c,h[i+(6*e|0)+4>>1]=n,e=e+1|0}while((0|e)!=(0|r))}else{if((0|(s=(0|r)<(0|n)?r:n))<=0)break e;l=n<<1,o=e+40|0,e=0;do{u=0|d[o>>2],m=g[t+(e+n<<1)>>1]<>1]<>1]<>>1)&65535)>>>u&65535,h[i+(6*e|0)>>1]=p>>>u,h[i+(6*e|0)+2>>1]=m>>>u,h[i+(6*e|0)+4>>1]=c,e=e+1|0}while((0|e)!=(0|s))}break;case 4:if(1==(0|d[o+24>>2])&&(0|(c=(0|r)<(0|n)?r:n))>0){l=n<<1,o=e+40|0,e=3*n|0,s=0;do{u=0|d[o>>2],p=g[t+(s+n<<1)>>1]<>1]<>1]<>>1)&65535)>>>u,A=0|h[t+(s+e<<1)>>1],p=0|Xn(p>>>u&65535,0,16),m|=D,A=0|Xn(65535&A,0,48),A|=S>>>u&65535|p,m=65535&m|D,h[(u=p=i+(s<<3)|0)>>1]=A,h[u+2>>1]=A>>>16,h[(p=p+4|0)>>1]=m,h[p+2>>1]=m>>>16,s=s+1|0}while((0|s)!=(0|c))}}}while(0);if(o=0|d[a>>2],0|f[o+32|0]&&(s=0|d[o+16>>2],!((0|r)<=0)))for(o=i,e=0;S=o+4|0,A=0|h[o>>1],h[o>>1]=0|h[S>>1],h[S>>1]=A,(0|(e=e+1|0))!=(0|r);)o=o+(s<<1)|0}function Xe(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0;a=0|d[(l=(e|=0)+4|0)>>2];do{if(0|f[a+32|0]){if(Wn(0|d[(o=e+8|0)>>2],0|t,6*r|0),a=0|d[l>>2],s=0|d[a+16>>2],(0|r)<=0){c=0|d[o>>2];break}for(a=t=0|d[o>>2],o=0;c=a+4|0,u=0|h[a>>1],h[a>>1]=0|h[c>>1],h[c>>1]=u,(0|(o=o+1|0))!=(0|r);)a=a+(s<<1)|0;c=t,a=0|d[l>>2]}else c=t}while(0);switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if((0|r)<=0)return;a=e+32|0,t=0;do{n=0|d[a>>2],u=(32768-(e=g[c+(6*t|0)+2>>1]<>1]<>>n&65535,h[i+(6*t|0)>>1]=(32768+(g[c+(6*t|0)>>1]<>>n,h[i+(6*t|0)+2>>1]=(65535&e)>>>n,h[i+(6*t|0)+4>>1]=u,t=t+1|0}while((0|t)!=(0|r));return}if((0|(o=(0|n)<(0|r)?n:r))<=0)return;s=n<<1,a=0|d[e+32>>2],t=0;do{u=(32768-(e=g[c+(6*t|0)+2>>1]<>1]<>>a&65535,h[i+(t<<1)>>1]=(32768+(g[c+(6*t|0)>>1]<>>a,h[i+(t+n<<1)>>1]=(65535&e)>>>a,h[i+(t+s<<1)>>1]=u,t=t+1|0}while((0|t)!=(0|o));return;case 4:if(1!=(0|d[a+24>>2])||(0|(s=(0|n)<(0|r)?n:r))<=0)return;l=n<<1,o=3*n|0,a=0|d[e+32>>2],t=0;do{u=0|h[c+(t<<3)+6>>1],e=(32768-(r=g[c+(t<<3)+2>>1]<>1]<>>a&65535,h[i+(t<<1)>>1]=(32768+(g[c+(t<<3)>>1]<>>a,h[i+(t+n<<1)>>1]=(65535&r)>>>a,h[i+(t+l<<1)>>1]=e,h[i+(t+o<<1)>>1]=u,t=t+1|0}while((0|t)!=(0|s));return;default:return}}function Ke(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0;o=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[o+16>>2]){case 3:if(2==(0|d[o+24>>2])){if((0|r)<=0)break e;o=e+40|0,e=0;do{c=0|d[o>>2],n=((l=g[t+(6*e|0)+2>>1]<>1]<>>c&65535,h[i+(6*e|0)>>1]=(32768+(g[t+(6*e|0)>>1]<>>c,h[i+(6*e|0)+2>>1]=(65535&l)>>>c,h[i+(6*e|0)+4>>1]=n,e=e+1|0}while((0|e)!=(0|r))}else{if((0|(s=(0|r)<(0|n)?r:n))<=0)break e;l=n<<1,o=e+40|0,e=0;do{u=0|d[o>>2],c=((m=g[t+(e+n<<1)>>1]<>1]<>>u&65535,h[i+(6*e|0)>>1]=(32768+(g[t+(e<<1)>>1]<>>u,h[i+(6*e|0)+2>>1]=(65535&m)>>>u,h[i+(6*e|0)+4>>1]=c,e=e+1|0}while((0|e)!=(0|s))}break;case 4:if(1==(0|d[o+24>>2])&&(0|(c=(0|r)<(0|n)?r:n))>0){l=n<<1,o=e+40|0,e=3*n|0,s=0;do{p=0|d[o>>2],S=g[t+(s+n<<1)>>1]<>1]<>>p,u=(S+32768+(g[t+(s+l<<1)>>1]<>>p,A=0|h[t+(s+e<<1)>>1],p=0|Xn((65535&S)>>>p&65535,0,16),u|=D,A=0|Xn(65535&A,0,48),A|=p|65535&m,u=65535&u|D,h[(p=m=i+(s<<3)|0)>>1]=A,h[p+2>>1]=A>>>16,h[(m=m+4|0)>>1]=u,h[m+2>>1]=u>>>16,s=s+1|0}while((0|s)!=(0|c))}}}while(0);if(o=0|d[a>>2],0|f[o+32|0]&&(s=0|d[o+16>>2],!((0|r)<=0)))for(o=i,e=0;S=o+4|0,A=0|h[o>>1],h[o>>1]=0|h[S>>1],h[S>>1]=A,(0|(e=e+1|0))!=(0|r);)o=o+(s<<1)|0}function je(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u=0,h=0,m=0;if(c=b,b=b+16|0,s=c,!(l=0|d[(e|=0)>>2]))return b=c,0|(e=0);if(h=r-(m=t)|0,h=(0|(u=0|d[(o=n+12|0)>>2]))>(0|h)?u-h|0:0,(0|(n=(u=i)-m|0))>0&&(0|rs[63&d[48+(0|d[l>>2])>>2]](l,t,n))!=(0|n))return d[e>>2]=0,b=c,0|(m=0);do{if((0|h)>0){if(Vr(s,h,a),y=0,n=0|O(0|d[48+(0|d[l>>2])>>2],0|l,0|(1&f[s|0]?d[s+8>>2]:s+1),0|h),m=y,y=0,1&m&&(m=0|ae(),qr(s),de(0|m)),(0|n)==(0|h)){qr(s);break}return d[e>>2]=0,qr(s),b=c,0|(m=0)}}while(0);return(0|(r=r-u|0))>0&&(0|rs[63&d[48+(0|d[l>>2])>>2]](l,i,r))!=(0|r)?(d[e>>2]=0,b=c,0|(m=0)):(d[o>>2]=0,b=c,0|(m=l))}function Ze(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0;a=0|d[(s=(e|=0)+4|0)>>2];do{if(0|f[a+32|0]){if(Wn(0|d[(e=e+8|0)>>2],0|t,6*r|0),a=0|d[s>>2],o=0|d[a+16>>2],(0|r)<=0){l=0|d[e>>2];break}for(a=e=0|d[e>>2],t=0;l=a+4|0,c=0|h[a>>1],h[a>>1]=0|h[l>>1],h[l>>1]=c,(0|(t=t+1|0))!=(0|r);)a=a+(o<<1)|0;l=e,a=0|d[s>>2]}else l=t}while(0);switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{n=32768-(s=0|g[l+(6*a|0)+2>>1])+(0|g[l+(6*a|0)+4>>1])|0,c=(0|g[l+(6*a|0)>>1])-s+32768|0,h[i+(6*a|0)>>1]=s+49152+(((65535&n)+(65535&c)|0)>>>2),h[i+(6*a|0)+2>>1]=n,h[i+(6*a|0)+4>>1]=c,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{r=32768-(s=0|g[l+(6*t|0)+2>>1])+(0|g[l+(6*t|0)+4>>1])|0,c=(0|g[l+(6*t|0)>>1])-s+32768|0,h[i+(t<<1)>>1]=s+49152+(((65535&r)+(65535&c)|0)>>>2),h[i+(t+n<<1)>>1]=r,h[i+(t+e<<1)>>1]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{c=0|h[l+(o<<3)+6>>1],s=32768-(u=0|g[l+(o<<3)+2>>1])+(0|g[l+(o<<3)+4>>1])|0,r=(0|g[l+(o<<3)>>1])-u+32768|0,h[i+(o<<1)>>1]=u+49152+(((65535&s)+(65535&r)|0)>>>2),h[i+(o+n<<1)>>1]=s,h[i+(o+e<<1)>>1]=r,h[i+(o+t<<1)>>1]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function Je(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(l=0|g[t+(6*e|0)+2>>1],s=0|g[t+(6*e|0)+4>>1],n=(0|g[t+(6*e|0)>>1])-((s+l|0)>>>2)+16384|0,h[i+(6*e|0)>>1]=s+32768+n,h[i+(6*e|0)+2>>1]=n,h[i+(6*e|0)+4>>1]=l+32768+n,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{c=0|g[t+(s+n<<1)>>1],u=0|g[t+(s+o<<1)>>1],l=(0|g[t+(s<<1)>>1])-((u+c|0)>>>2)+16384|0,h[i+(6*s|0)>>1]=u+32768+l,h[i+(6*s|0)+2>>1]=l,h[i+(6*s|0)+4>>1]=c+32768+l,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{c=0|g[t+(s+n<<1)>>1],m=0|g[t+(s+e<<1)>>1],u=(0|g[t+(s<<1)>>1])-((m+c|0)>>>2)+16384|0,p=0|h[t+(s+o<<1)>>1],A=0|Xn(65535&u,0,16),c=c+32768+u|D,p=0|Xn(65535&p,0,48),p|=A|m+32768+u&65535,c=65535&c|D,h[(m=u=i+(s<<3)|0)>>1]=p,h[m+2>>1]=p>>>16,h[(u=u+4|0)>>1]=c,h[u+2>>1]=c>>>16,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]&&(s=0|d[e+16>>2],!((0|r)<=0)))for(e=i,o=0;A=e+4|0,p=0|h[e>>1],h[e>>1]=0|h[A>>1],h[A>>1]=p,(0|(o=o+1|0))!=(0|r);)e=e+(s<<1)|0}function $e(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,m=0;a=0|d[(s=(e|=0)+4|0)>>2];do{if(0|f[a+32|0]){if(Wn(0|d[(e=e+8|0)>>2],0|t,6*r|0),a=0|d[s>>2],o=0|d[a+16>>2],(0|r)<=0){l=0|d[e>>2];break}for(a=e=0|d[e>>2],t=0;l=a+4|0,c=0|h[a>>1],h[a>>1]=0|h[l>>1],h[l>>1]=c,(0|(t=t+1|0))!=(0|r);)a=a+(o<<1)|0;l=e,a=0|d[s>>2]}else l=t}while(0);switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{o=0|g[l+(6*a|0)>>1],s=65535&(n=0|h[l+(6*a|0)+2>>1]),c=32768+(0|g[l+(6*a|0)+4>>1])-((s+o|0)>>>1)&65535,h[i+(6*a|0)>>1]=o+32768-s,h[i+(6*a|0)+2>>1]=n,h[i+(6*a|0)+4>>1]=c,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{r=0|h[l+(6*t|0)+2>>1],o=0|g[l+(6*t|0)>>1],s=65535&r,c=32768+(0|g[l+(6*t|0)+4>>1])-((s+o|0)>>>1)&65535,h[i+(t<<1)>>1]=o+32768-s,h[i+(t+n<<1)>>1]=r,h[i+(t+e<<1)>>1]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{s=0|h[l+(o<<3)+2>>1],c=0|h[l+(o<<3)+6>>1],m=0|g[l+(o<<3)>>1],u=65535&s,r=32768+(0|g[l+(o<<3)+4>>1])-((u+m|0)>>>1)&65535,h[i+(o<<1)>>1]=m+32768-u,h[i+(o+n<<1)>>1]=s,h[i+(o+e<<1)>>1]=r,h[i+(o+t<<1)>>1]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function et(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,m=0,p=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(n=65535&(l=0|h[t+(6*e|0)+2>>1]),s=32768+(0|g[t+(6*e|0)>>1])+n|0,n=32768+(0|g[t+(6*e|0)+4>>1])+(((65535&s)+n|0)>>>1)&65535,h[i+(6*e|0)>>1]=s,h[i+(6*e|0)+2>>1]=l,h[i+(6*e|0)+4>>1]=n,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{l=65535&(c=0|h[t+(s+n<<1)>>1]),u=32768+(0|g[t+(s<<1)>>1])+l|0,l=32768+(0|g[t+(s+o<<1)>>1])+(((65535&u)+l|0)>>>1)&65535,h[i+(6*s|0)>>1]=u,h[i+(6*s|0)+2>>1]=c,h[i+(6*s|0)+4>>1]=l,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{c=65535&(u=0|h[t+(s+n<<1)>>1]),m=32768+(0|g[t+(s<<1)>>1])+c&65535,c=32768+(0|g[t+(s+e<<1)>>1])+((m+c|0)>>>1)|0,p=0|h[t+(s+o<<1)>>1],u=0|Xn(65535&u,0,16),c|=D,p=0|Xn(65535&p,0,48),p|=m|u,c=65535&c|D,h[(m=u=i+(s<<3)|0)>>1]=p,h[m+2>>1]=p>>>16,h[(u=u+4|0)>>1]=c,h[u+2>>1]=c>>>16,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]&&(s=0|d[e+16>>2],!((0|r)<=0)))for(e=i,o=0;p=e+4|0,m=0|h[e>>1],h[e>>1]=0|h[p>>1],h[p>>1]=m,(0|(o=o+1|0))!=(0|r);)e=e+(s<<1)|0}function tt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0;a=0|d[(s=(e|=0)+4|0)>>2];do{if(0|f[a+32|0]){if(Wn(0|d[(e=e+8|0)>>2],0|t,6*r|0),a=0|d[s>>2],o=0|d[a+16>>2],(0|r)<=0){l=0|d[e>>2];break}for(a=e=0|d[e>>2],t=0;l=a+4|0,c=0|h[a>>1],h[a>>1]=0|h[l>>1],h[l>>1]=c,(0|(t=t+1|0))!=(0|r);)a=a+(o<<1)|0;l=e,a=0|d[s>>2]}else l=t}while(0);switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{c=32768-(s=65535&(n=0|h[l+(6*a|0)+2>>1]))+(0|g[l+(6*a|0)+4>>1])&65535,h[i+(6*a|0)>>1]=32768+(0|g[l+(6*a|0)>>1])-s,h[i+(6*a|0)+2>>1]=n,h[i+(6*a|0)+4>>1]=c,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{c=32768-(s=65535&(r=0|h[l+(6*t|0)+2>>1]))+(0|g[l+(6*t|0)+4>>1])&65535,h[i+(t<<1)>>1]=32768+(0|g[l+(6*t|0)>>1])-s,h[i+(t+n<<1)>>1]=r,h[i+(t+e<<1)>>1]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{s=0|h[l+(o<<3)+2>>1],c=0|h[l+(o<<3)+6>>1],r=32768-(u=65535&s)+(0|g[l+(o<<3)+4>>1])&65535,h[i+(o<<1)>>1]=32768+(0|g[l+(o<<3)>>1])-u,h[i+(o+n<<1)>>1]=s,h[i+(o+e<<1)>>1]=r,h[i+(o+t<<1)>>1]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function it(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,m=0,p=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(n=(s=65535&(l=0|h[t+(6*e|0)+2>>1]))+32768+(0|g[t+(6*e|0)+4>>1])&65535,h[i+(6*e|0)>>1]=32768+(0|g[t+(6*e|0)>>1])+s,h[i+(6*e|0)+2>>1]=l,h[i+(6*e|0)+4>>1]=n,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{l=(u=65535&(c=0|h[t+(s+n<<1)>>1]))+32768+(0|g[t+(s+o<<1)>>1])&65535,h[i+(6*s|0)>>1]=32768+(0|g[t+(s<<1)>>1])+u,h[i+(6*s|0)+2>>1]=c,h[i+(6*s|0)+4>>1]=l,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{c=65535&(u=0|h[t+(s+n<<1)>>1]),m=32768+(0|g[t+(s<<1)>>1])+c|0,c=c+32768+(0|g[t+(s+e<<1)>>1])|0,p=0|h[t+(s+o<<1)>>1],u=0|Xn(65535&u,0,16),c|=D,p=0|Xn(65535&p,0,48),p|=65535&m|u,c=65535&c|D,h[(m=u=i+(s<<3)|0)>>1]=p,h[m+2>>1]=p>>>16,h[(u=u+4|0)>>1]=c,h[u+2>>1]=c>>>16,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]&&(s=0|d[e+16>>2],!((0|r)<=0)))for(e=i,o=0;p=e+4|0,m=0|h[e>>1],h[e>>1]=0|h[p>>1],h[p>>1]=m,(0|(o=o+1|0))!=(0|r);)e=e+(s<<1)|0}function rt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0;a=0|d[(s=(e|=0)+4|0)>>2];do{if(0|f[a+32|0]){if(Wn(0|d[(e=e+8|0)>>2],0|t,6*r|0),a=0|d[s>>2],o=0|d[a+16>>2],(0|r)<=0){l=0|d[e>>2];break}for(a=e=0|d[e>>2],t=0;l=a+4|0,c=0|h[a>>1],h[a>>1]=0|h[l>>1],h[l>>1]=c,(0|(t=t+1|0))!=(0|r);)a=a+(o<<1)|0;l=e,a=0|d[s>>2]}else l=t}while(0);switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{n=0|h[l+(6*a|0)+2>>1],c=0|h[l+(6*a|0)+4>>1],h[i+(6*a|0)>>1]=0|h[l+(6*a|0)>>1],h[i+(6*a|0)+2>>1]=n,h[i+(6*a|0)+4>>1]=c,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{r=0|h[l+(6*t|0)+2>>1],c=0|h[l+(6*t|0)+4>>1],h[i+(t<<1)>>1]=0|h[l+(6*t|0)>>1],h[i+(t+n<<1)>>1]=r,h[i+(t+e<<1)>>1]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{s=0|h[l+(o<<3)+2>>1],r=0|h[l+(o<<3)+4>>1],c=0|h[l+(o<<3)+6>>1],h[i+(o<<1)>>1]=0|h[l+(o<<3)>>1],h[i+(o+n<<1)>>1]=s,h[i+(o+e<<1)>>1]=r,h[i+(o+t<<1)>>1]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function nt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,m=0,p=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(l=0|h[t+(6*e|0)+2>>1],n=0|h[t+(6*e|0)+4>>1],h[i+(6*e|0)>>1]=0|h[t+(6*e|0)>>1],h[i+(6*e|0)+2>>1]=l,h[i+(6*e|0)+4>>1]=n,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{c=0|h[t+(s+n<<1)>>1],l=0|h[t+(s+o<<1)>>1],h[i+(6*s|0)>>1]=0|h[t+(s<<1)>>1],h[i+(6*s|0)+2>>1]=c,h[i+(6*s|0)+4>>1]=l,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{c=0|h[t+(s<<1)>>1],p=0|h[t+(s+o<<1)>>1],u=0|g[t+(s+e<<1)>>1],m=0|Xn(0|g[t+(s+n<<1)>>1],0,16),u|=D,p=0|Xn(65535&p,0,48),p|=m|65535&c,u=65535&u|D,h[(m=c=i+(s<<3)|0)>>1]=p,h[m+2>>1]=p>>>16,h[(c=c+4|0)>>1]=u,h[c+2>>1]=u>>>16,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]&&(s=0|d[e+16>>2],!((0|r)<=0)))for(e=i,o=0;p=e+4|0,m=0|h[e>>1],h[e>>1]=0|h[p>>1],h[p>>1]=m,(0|(o=o+1|0))!=(0|r);)e=e+(s<<1)|0}function at(e,t){t|=0;var i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0;d[(e|=0)+112>>2]=0,d[e+108>>2]=0,n=c=0|d[t>>2];do{if(c)if(o=e+92|0,(r=(s=0|d[(c=e+96|0)>>2])-(i=l=0|d[o>>2])|0)>>>0>=4e4?(r>>>0>4e4&&(0|s)!=(0|(a=l+4e4|0))&&(d[c>>2]=a),a=i):(ot(o,4e4-r|0),a=0|d[o>>2],n=0|d[t>>2]),d[(i=e+116|0)>>2]=a,d[(s=e+124|0)>>2]=a,d[(l=e+104|0)>>2]=n,r=n,n){if((0|d[r+12>>2])==(0|d[r+16>>2])){if(t=-1==(0|ts[127&d[36+(0|d[n>>2])>>2]](r)),r=0|d[s>>2],t)break;n=0|d[i>>2]}else r=a,n=a;if((o=r-n|0)>>>0<=64){if(a=e+92|0,(0|r)==(0|n))r=n;else{r=n,n=0;do{f[(0|d[a>>2])+n|0]=0|f[r+n|0],n=n+1|0,r=0|d[i>>2]}while(n>>>0>>0);n=0|d[s>>2]}u=(t=a=0|d[a>>2])-r|0,d[i>>2]=a,r=n+u|0,d[s>>2]=r,d[(a=e+120|0)>>2]=(0|d[a>>2])+u,l=0|d[l>>2],r=0|rs[63&d[32+(0|d[l>>2])>>2]](l,r,(0|d[c>>2])-(t+o)|0),r=(0|d[s>>2])+r|0,d[s>>2]=r}}else r=a;else d[e+104>>2]=0,r=0|d[t+4>>2],d[(i=e+116|0)>>2]=r,r=r+(0|d[t+8>>2])|0,d[e+124>>2]=r}while(0);if((i=0|d[i>>2])>>>0>=r>>>0)return c=i,d[(u=e+120|0)>>2]=c,void mt(e);for(;;){if(-1==(0|f[i|0])){r=20;break}if((i=i+1|0)>>>0>=r>>>0){r=20;break}}return 20==(0|r)?(d[(u=e+120|0)>>2]=i,void mt(e)):void 0}function ot(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0;if(((o=0|d[(i=(e|=0)+8|0)>>2])-(a=n=0|d[(r=e+4|0)>>2])|0)>>>0>=t>>>0)do{f[n|0]=0,n=1+(0|d[r>>2])|0,d[r>>2]=n,t=t+-1|0}while(0|t);else{(0|(s=a-(n=0|d[e>>2])+t|0))<0&&(Na(e),o=0|d[i>>2],n=0|d[e>>2]),(a=o-n|0)>>>0<1073741823?(a=(a<<=1)>>>0>>0?s:a,n=(0|d[r>>2])-n|0,a?c=8:(o=0,l=0,s=n)):(a=2147483647,n=(0|d[r>>2])-n|0,c=8),8==(0|c)&&(o=a,l=0|Oa(a),s=n),o=l+o|0,a=n=l+s|0;do{f[a|0]=0,n=a=n+1|0,t=t+-1|0}while(0|t);t=0|d[e>>2],Wn(0|(c=l+(s-(a=(0|d[r>>2])-t|0))|0),0|t,0|a),d[e>>2]=c,d[r>>2]=n,d[i>>2]=o,t&&Ba(t)}}function st(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+180|0)>>2])|0,T=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(T<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;do{if(s){if((0|s)<0&&(y=0,P(178,0|a),C=y,y=0,1&C)||(m=6),6==(0|m)&&(y=0,c=0|N(67,0|(l=s<<1)),C=y,y=0,!(1&C))){d[a>>2]=c,C=c+(s<<1)|0,d[a+8>>2]=C,zn(0|c,0,0|l),d[o>>2]=C;break}c=0|ae(),(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),de(0|c)}}while(0);d[r>>2]=0,d[(C=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(T){if(T>>>0>1073741823&&(y=0,P(178,0|r),w=y,y=0,1&w)||(m=16),16==(0|m)&&(y=0,f=0|N(67,0|(u=T<<2)),w=y,y=0,!(1&w))){d[r>>2]=f,m=f+(T<<2)|0,d[r+8>>2]=m,zn(0|f,0,0|u),d[C>>2]=m,m=18;break}c=0|ae(),l=s=0|d[r>>2],s&&((0|(u=0|d[C>>2]))!=(0|s)&&(d[C>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}else m=18}while(0);if(18==(0|m)){f=e+12|0;e:do{if((0|d[f>>2])>0){m=e+4604|0,g=1+(0|E(T,i))|0,p=e+4608|0,A=e+92|0,S=(0|T)>0,v=e+4600|0,w=0;t:for(;;){if(s=(l=0|d[a>>2])+2|0,d[m>>2]=s,l=l+(g<<1)|0,d[p>>2]=l,1&w?(d[m>>2]=l,d[p>>2]=s):s=l,u=0|d[A>>2],y=0,j(0|d[12+(0|d[u>>2])>>2],0|u,0|s,0|d[t>>2],0|i),u=y,y=0,1&u){m=28;break}if(S){s=0|d[m>>2],l=0|d[p>>2],c=0|d[r>>2],u=0;do{if(d[v>>2]=d[c+(u<<2)>>2],c=0|d[t>>2],h[s+(c<<1)>>1]=0|h[s+(c+-1<<1)>>1],h[l+-2>>1]=0|h[s>>1],y=0,L(68,0|e,0),c=y,y=0,1&c){m=27;break t}c=0|d[r>>2],d[c+(u<<2)>>2]=d[v>>2],s=(0|d[m>>2])+(i<<1)|0,d[m>>2]=s,l=(0|d[p>>2])+(i<<1)|0,d[p>>2]=l,u=u+1|0}while((0|u)<(0|T))}if((0|(w=w+1|0))>=(0|d[f>>2])){m=40;break e}}if(27==(0|m)){c=0|ae();break}if(28==(0|m)){c=0|ae();break}}else m=40}while(0);do{if(40==(0|m)){if(y=0,P(182,0|e),e=y,y=0,1&e){c=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[C>>2]))!=(0|s)&&(d[C>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),void(b=n)):void(b=n)}}while(0);l=s=0|d[r>>2],s&&((0|(u=0|d[C>>2]))!=(0|s)&&(d[C>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),de(0|c)}function lt(e){var t,i,r,n=0,a=0;if((n=0|d[(e|=0)+132>>2])||(n=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|n,4,35648),e=y,y=0,1&e||De(0|n,824,96),e=0|ae(),re(0|n),de(0|e)),t=e+108|0,a=0|d[(i=e+120|0)>>2],r=(0|d[t>>2])-a|0,(0|rs[63&d[48+(0|d[n>>2])>>2]](n,a,r))==(0|r))return a=0|d[i>>2],d[t>>2]=a,void(d[e+104>>2]=(0|d[e+124>>2])-a);n=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|n,4,35648),a=y,y=0,1&a||De(0|n,824,96),a=0|ae(),re(0|n),de(0|a)}function ct(e,t,i){t|=0,i|=0;var r,n,a,o,s,l=0,c=0,u=0,h=0;if(i=(0|d[(s=(e|=0)+100|0)>>2])-i|0,d[s>>2]=i,(0|i)>-1)d[(u=e+96|0)>>2]=d[u>>2]|t<>2]=d[u>>2]|t>>0-i,(0|d[(o=e+104|0)>>2])>>>0<4&&(lt(e),i=0|d[s>>2]),r=e+112|0,n=e+108|0,a=e+116|0,l=0;!((0|i)>31);)if(i=0|d[u>>2],0|f[r|0]?(f[d[n>>2]|0]=i>>>25,d[u>>2]=d[u>>2]<<7,i=7+(0|d[s>>2])|0):(f[d[n>>2]|0]=i>>>24,d[u>>2]=d[u>>2]<<8,i=8+(0|d[s>>2])|0),d[s>>2]=i,h=0|d[n>>2],f[r|0]=-1==(0|f[h|0])&1,d[n>>2]=h+1,d[o>>2]=(0|d[o>>2])-1,d[a>>2]=1+(0|d[a>>2]),(0|(l=l+1|0))>=4){c=11;break}e:do{if(11==(0|c)&&(0|i)<0){d[u>>2]=d[u>>2]|t>>0-i,(0|d[o>>2])>>>0<4&&(lt(e),i=0|d[s>>2]),l=0;do{if((0|i)>31)break e;i=0|d[u>>2],0|f[r|0]?(f[d[n>>2]|0]=i>>>25,d[u>>2]=d[u>>2]<<7,i=7+(0|d[s>>2])|0):(f[d[n>>2]|0]=i>>>24,d[u>>2]=d[u>>2]<<8,i=8+(0|d[s>>2])|0),d[s>>2]=i,h=0|d[n>>2],f[r|0]=-1==(0|f[h|0])&1,d[n>>2]=h+1,d[o>>2]=(0|d[o>>2])-1,d[a>>2]=1+(0|d[a>>2]),l=l+1|0}while((0|l)<4)}}while(0);d[u>>2]=d[u>>2]|t<>31)^t)-A|0)|0)+10|0)>>1]))<(0|(n=0|d[(c=e+196+(12*f|0)|0)>>2])))if(a<<1<(0|n))if(a<<2<(0|n))if(a<<3<(0|n))if(a<<4<(0|n))for(t=5;a<>1]^A)-A+r|0)&(r=0|d[(u=e+136|0)>>2]))==(0|n)?n:r&~(n>>31))^A)-A|0,r=0|d[(o=e+144|0)>>2],n=(0|n)>0?(n+r|0)/(1|r<<1)|0:(n-r|0)/(1|r<<1)|0,m=0|d[(l=e+140|0)>>2],m=(i=((0|n)<0?m:0)+n|0)-((0|i)<((m+1|0)/2|0)?0:m)|0,f=e+196+(12*f|0)+4|0,dt(e,t,(r=(n=r|t?0:(d[f>>2]<<1)-1+a>>31)^m)>>30^r<<1,0|d[e+156>>2]),r=0|d[e+160>>2],t=(0|d[c>>2])+((0|m)>-1?m:0-m|0)|0,n=(0|d[f>>2])+(0|E(d[o>>2]<<1|1,m))|0,(0|(i=0|h[p>>1]))==(0|r)&&(t>>=1,n>>=1,i=r>>1),d[c>>2]=t,r=i+1|0,h[p>>1]=r,(0|(t=r+n|0))>=1?(0|n)>0&&(n=n-r|0,p=0|h[s>>1],h[s>>1]=(p<<16>>16<127&1)+(65535&p),n=(0|n)>0?0:n):(n=0|h[s>>1],h[s>>1]=(65535&n)-(n<<16>>16>-128&1),n=(0|t)>(0|~i)?t:0-i|0),d[f>>2]=n,r=0|d[o>>2],(0|(t=(0|E(i=r<<1|1,(m^A)-A|0))+g|0))>=(0-r|0)?((n=0|d[u>>2])+r|0)<(0|t)&&(t=t-(0|E(0|d[l>>2],i))|0):(t=(0|E(0|d[l>>2],i))+t|0,n=0|d[u>>2]),(t&n)==(0|t)?(A=t,0|(A&=65535)):(A=n&~(t>>31),0|(A&=65535))}function ft(e,t,i){t|=0,i|=0;var r,n,a,o=0,s=0,l=0,c=0,u=0;for(u=(0|d[(e|=0)+180>>2])-t|0,n=0|d[e+4608>>2],a=0|d[e+4604>>2],r=65535&(s=0|h[n+(t+-1<<1)>>1]),i=0|d[e+144>>2],l=0;!((0|((0|(c=(0|g[(o=n+(l+t<<1)|0)>>1])-r|0))>-1?c:0-c))>(0|i));)if(h[o>>1]=s,(0|(l=l+1|0))==(0|u)){l=u;break}if(s=(0|l)==(0|u),1<<(o=0|d[36476+(d[(c=e+4600|0)>>2]<<2)>>2])>(0|l))i=l;else{i=l;do{ct(e,1,1),o=0|d[c>>2],i=i-(1<>2])|0,o=(0|o)>30?31:o+1|0,d[c>>2]=o,o=0|d[36476+(o<<2)>>2]}while((0|i)>=1<>2],(0|((0|s)>-1?s:0-s))>(0|n)?(a=r-i>>31|1,t=0|E(a,t-r|0),t=(0|t)>0?(n+t|0)/(1|n<<1)|0:(t-n|0)/(1|n<<1)|0,s=e+140|0,n=0|d[s>>2],i=((0|t)<0?n:0)+t|0,n=i-((0|i)<((n+1|0)/2|0)?0:n)|0,ht(e,e+4576|0,n),n=0|E(n,a),a=0|d[o>>2],o=a<<1|1,n=(0|E(n,o))+r|0,(0|n)>=(0-a|0)?(t=0|d[l>>2],(t+a|0)<(0|n)&&(n=n-(0|E(0|d[s>>2],o))|0)):(n=(0|E(0|d[s>>2],o))+n|0,t=0|d[l>>2]),(n&t)==(0|n)?(l=n,l&=65535,0|l):(l=t&~(n>>31),l&=65535,0|l)):(t=t-i|0,t=(0|t)>0?(n+t|0)/(1|n<<1)|0:(t-n|0)/(1|n<<1)|0,s=e+140|0,n=0|d[s>>2],a=((0|t)<0?n:0)+t|0,n=a-((0|a)<((n+1|0)/2|0)?0:n)|0,ht(e,e+4588|0,n),a=0|d[o>>2],o=a<<1|1,n=(0|E(o,n))+i|0,(0|n)>=(0-a|0)?(t=0|d[l>>2],(t+a|0)<(0|n)&&(n=n-(0|E(0|d[s>>2],o))|0)):(n=(0|E(0|d[s>>2],o))+n|0,t=0|d[l>>2]),(n&t)==(0|n)?(l=n,l&=65535,0|l):(l=t&~(n>>31),l&=65535,0|l))}(e,0|g[(t=n+((u=l+t|0)<<1)|0)>>1],r,0|g[a+(u<<1)>>1]),h[t>>1]=e,e=0|d[c>>2],d[c>>2]=(0|e)<1?0:e+-1|0,0|(e=l+1|0))}function ht(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(dt(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,(0|d[e+156>>2])-1-(0|d[36476+(d[e+4600>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function dt(e,t,i,r){var n,a,o=0;if((0|(o=(i|=0)>>(t|=0)))<((a=(r|=0)-(0|d[(n=(e|=0)+148|0)>>2])|0)+-1|0))return(0|o)>30&&(ct(e,0,r=(0|o)/2|0),o=o-r|0),ct(e,1,o+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-31-(0|d[n>>2])|0)):ct(e,1,a),ct(e,(1<<(t=0|d[n>>2]))-1&i+-1,t)}function mt(e){var t,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0;if((i=0|d[(t=(e|=0)+116|0)>>2])>>>0<((0|d[(l=e+120|0)>>2])-3|0)>>>0)return s=0|d[(l=e+112|0)>>2],d[(e=e+108|0)>>2]=(m[i+1|0]<<16|m[i|0]<<24|m[i+2|0]<<8|m[i+3|0])>>>s|d[e>>2],e=32-s>>3,d[t>>2]=i+e,void(d[l>>2]=(e<<3)+s);r=0|d[(s=e+104|0)>>2];do{if(r){if((0|d[r+12>>2])==(0|d[r+16>>2])){if(-1==(0|ts[127&d[36+(0|d[r>>2])>>2]](r)))break;i=0|d[t>>2]}if((o=(r=0|d[(a=e+124|0)>>2])-i|0)>>>0<=64){if(n=e+92|0,(0|r)==(0|i))r=i;else{r=0;do{f[(0|d[n>>2])+r|0]=0|f[i+r|0],r=r+1|0,i=0|d[t>>2]}while(r>>>0>>0);r=i,i=0|d[a>>2]}c=(n=u=0|d[n>>2])-r|0,d[t>>2]=u,r=i+c|0,d[a>>2]=r,d[l>>2]=(0|d[l>>2])+c,s=0|d[s>>2],s=0|rs[63&d[32+(0|d[s>>2])>>2]](s,r,(0|d[e+96>>2])-(n+o)|0),d[a>>2]=(0|d[a>>2])+s}}}while(0);for(s=e+112|0,o=e+108|0,a=(e=0|d[e+124>>2])+-1|0,i=0|d[t>>2];;){if(i>>>0>=e>>>0){r=14;break}if(r=255&(n=0|f[i|0]),n=n<<24>>24==-1){if((0|i)==(0|a)){r=25;break}if((0|f[(i=i+1|0)|0])<0){r=25;break}}else i=i+1|0;if(u=0|d[s>>2],d[o>>2]=r<<24-u|d[o>>2],d[t>>2]=i,u=u+(n?7:8)|0,d[s>>2]=u,(0|u)>=24){r=33;break}}if(14==(0|r)){if((0|d[s>>2])>=1)return;i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),u=y,y=0,1&u||De(0|i,824,96),u=0|ae(),re(0|i),de(0|u)}else if(25==(0|r)){if((0|d[s>>2])>=1)return;i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),u=y,y=0,1&u||De(0|i,824,96),u=0|ae(),re(0|i),de(0|u)}else if(33==(0|r)){e:do{if(i>>>0>>0)do{if(-1==(0|f[i|0]))break e;i=i+1|0}while(i>>>0>>0)}while(0);return void(d[l>>2]=i)}}function gt(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0;if(((o=0|d[(i=(e|=0)+8|0)>>2])-(a=n=0|d[(r=e+4|0)>>2])|0)>>>0>=t>>>0)do{f[n|0]=0,n=1+(0|d[r>>2])|0,d[r>>2]=n,t=t+-1|0}while(0|t);else{(0|(s=a-(n=0|d[e>>2])+t|0))<0&&(Na(e),o=0|d[i>>2],n=0|d[e>>2]),(a=o-n|0)>>>0<1073741823?(a=(a<<=1)>>>0>>0?s:a,n=(0|d[r>>2])-n|0,a?c=8:(o=0,l=0,s=n)):(a=2147483647,n=(0|d[r>>2])-n|0,c=8),8==(0|c)&&(o=a,l=0|Oa(a),s=n),o=l+o|0,a=n=l+s|0;do{f[a|0]=0,n=a=n+1|0,t=t+-1|0}while(0|t);t=0|d[e>>2],Wn(0|(c=l+(s-(a=(0|d[r>>2])-t|0))|0),0|t,0|a),d[e>>2]=c,d[r>>2]=n,d[i>>2]=o,t&&Ba(t)}}function pt(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+180|0)>>2])|0,w=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(w<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;do{if(s){if(s>>>0>715827882&&(y=0,P(178,0|a),T=y,y=0,1&T)||(m=6),6==(0|m)&&(y=0,l=0|N(67,6*s|0),T=y,y=0,!(1&T))){for(d[o>>2]=l,d[a>>2]=l,c=l+(6*s|0)|0,d[a+8>>2]=c;h[l>>1]=0,h[l+2>>1]=0,h[l+4>>1]=0,s=s+-1|0;)l=l+6|0;d[o>>2]=c;break}c=0|ae(),(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(6*~(((l+-6-s|0)>>>0)/6)|0)),Ba(s),de(0|c)}}while(0);d[r>>2]=0,d[(T=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(w){if(w>>>0>1073741823&&(y=0,P(178,0|r),v=y,y=0,1&v)||(m=18),18==(0|m)&&(y=0,f=0|N(67,0|(u=w<<2)),v=y,y=0,!(1&v))){d[r>>2]=f,m=f+(w<<2)|0,d[r+8>>2]=m,zn(0|f,0,0|u),d[T>>2]=m,m=20;break}c=0|ae(),l=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}else m=20}while(0);if(20==(0|m)){u=e+12|0;e:do{if((0|d[u>>2])>0){f=e+4604|0,m=1+(0|E(w,i))|0,g=e+4608|0,p=e+92|0,A=(0|w)>0,S=e+4600|0,v=0;t:for(;;){if(s=(l=0|d[a>>2])+6|0,d[f>>2]=s,l=l+(6*m|0)|0,d[g>>2]=l,1&v?(d[f>>2]=l,d[g>>2]=s):s=l,c=0|d[p>>2],y=0,j(0|d[12+(0|d[c>>2])>>2],0|c,0|s,0|d[t>>2],0|i),c=y,y=0,1&c){m=30;break}if(A){s=0|d[r>>2],l=0|d[f>>2],c=0;do{if(d[S>>2]=d[s+(c<<2)>>2],s=l+(6*(C=0|d[t>>2])|0)|0,l=l+(6*(C+-1|0)|0)|0,h[s>>1]=0|h[l>>1],h[s+2>>1]=0|h[l+2>>1],h[s+4>>1]=0|h[l+4>>1],l=(0|d[g>>2])-6|0,s=0|d[f>>2],h[l>>1]=0|h[s>>1],h[l+2>>1]=0|h[s+2>>1],h[l+4>>1]=0|h[s+4>>1],y=0,L(69,0|e,0),l=y,y=0,1&l){m=29;break t}s=0|d[r>>2],d[s+(c<<2)>>2]=d[S>>2],l=(0|d[f>>2])+(6*i|0)|0,d[f>>2]=l,d[g>>2]=(0|d[g>>2])+(6*i|0),c=c+1|0}while((0|c)<(0|w))}if((0|(v=v+1|0))>=(0|d[u>>2])){m=42;break e}}if(29==(0|m)){c=0|ae();break}if(30==(0|m)){c=0|ae();break}}else m=42}while(0);do{if(42==(0|m)){if(y=0,P(182,0|e),C=y,y=0,1&C){c=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[T>>2]))!=(0|s)&&(d[T>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(6*~(((l+-6-s|0)>>>0)/6)|0)),Ba(s),void(b=n)):void(b=n)}}while(0);l=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(6*~(((l+-6-s|0)>>>0)/6)|0)),Ba(s),de(0|c)}function At(e,t,i){t|=0,i|=0;var r,n,a,o,s,l,c,u,f,m,p,A,S=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,M=0;for(A=b,b=b+48|0,a=A+30|0,n=A+24|0,r=A+18|0,o=A+12|0,u=A+6|0,f=A,m=(0|d[(e|=0)+180>>2])-t|0,p=0|d[e+4608>>2],s=0|d[e+4604>>2],i=65535&(l=0|h[p+(6*(x=t+-1|0)|0)>>1]),S=e+144|0,v=65535&(c=0|h[p+(6*x|0)+2>>1]),w=65535&(x=0|h[p+(6*x|0)+4>>1]),D=0;T=p+(6*(C=D+t|0)|0)|0,y=p+(6*C|0)+2|0,C=p+(6*C|0)+4|0,!((0|((0|(M=(0|g[T>>1])-i|0))>-1?M:0-M))>(0|(I=0|d[S>>2]))||(M=(0|g[y>>1])-v|0,(0|((0|M)>-1?M:0-M))>(0|I))||(M=(0|g[C>>1])-w|0,(0|((0|M)>-1?M:0-M))>(0|I)));)if(h[T>>1]=l,h[y>>1]=c,h[C>>1]=x,(0|(D=D+1|0))==(0|m)){D=m;break}if(v=(0|D)==(0|m),1<<(S=0|d[36476+(d[(w=e+4600|0)>>2]<<2)>>2])>(0|D))i=D;else{i=D;do{ct(e,1,1),S=0|d[w>>2],i=i-(1<>2])|0,S=(0|S)>30?31:S+1|0,d[w>>2]=S,S=0|d[36476+(S<<2)>>2]}while((0|i)>=1<>1]=0|h[M>>1],h[u+2>>1]=0|h[M+2>>1],h[u+4>>1]=0|h[M+4>>1],h[f>>1]=l,h[f+2>>1]=c,h[f+4>>1]=x,t=s+(6*t|0)|0,h[r>>1]=0|h[u>>1],h[r+2>>1]=0|h[u+2>>1],h[r+4>>1]=0|h[u+4>>1],h[n>>1]=0|h[f>>1],h[n+2>>1]=0|h[f+2>>1],h[n+4>>1]=0|h[f+4>>1],h[a>>1]=0|h[t>>1],h[a+2>>1]=0|h[t+2>>1],h[a+4>>1]=0|h[t+4>>1],function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,f=0,m=0,p=0,A=0,S=0,b=0,v=0,w=0,T=0;if(A=t+136|0,f=0|g[n>>1],m=f-(0|g[r>>1])>>31|1,a=0|E(m,(0|g[i>>1])-f|0),c=t+144|0,o=0|d[c>>2],a=(0|a)>0?(a+o|0)/(1|o<<1)|0:(a-o|0)/(1|o<<1)|0,T=t+140|0,l=0|d[T>>2],s=((0|a)<0?l:0)+a|0,l=s-((0|s)<((l+1|0)/2|0)?0:l)|0,s=t+4576|0,vt(t,s,l),b=0|g[n+2>>1],v=b-(0|g[r+2>>1])>>31|1,a=0|E(v,(0|g[i+2>>1])-b|0),o=0|d[c>>2],a=(0|a)>0?(a+o|0)/(1|o<<1)|0:(a-o|0)/(1|o<<1)|0,p=0|d[T>>2],w=((0|a)<0?p:0)+a|0,p=w-((0|w)<((p+1|0)/2|0)?0:p)|0,vt(t,s,p),w=0|g[n+4>>1],S=w-(0|g[r+4>>1])>>31|1,a=0|E(S,(0|g[i+4>>1])-w|0),o=0|d[c>>2],a=(0|a)>0?(a+o|0)/(1|o<<1)|0:(a-o|0)/(1|o<<1)|0,u=0|d[T>>2],a=((0|a)<0?u:0)+a|0,u=a-((0|a)<((u+1|0)/2|0)?0:u)|0,vt(t,s,u),s=0|d[c>>2],c=s<<1|1,a=(0|E(0|E(c,l),m))+f|0,i=0-s|0,(0|a)>=(0|i)?(o=0|d[A>>2],(o+s|0)<(0|a)&&(a=a-(0|E(0|d[T>>2],c))|0),r=o):(a=(0|E(0|d[T>>2],c))+a|0,r=0|d[A>>2]),(a&r)!=(0|a)&&(a=r&~(a>>31)),n=65535&a,a=(0|E(0|E(c,p),v))+b|0,(0|a)>=(0|i)?(r+s|0)<(0|a)&&(a=a-(0|E(0|d[T>>2],c))|0):a=(0|E(0|d[T>>2],c))+a|0,(a&r)!=(0|a)&&(a=r&~(a>>31)),o=65535&a,a=(0|E(0|E(c,u),S))+w|0,(0|a)>=(0|i)?(r+s|0)<(0|a)&&(a=a-(0|E(0|d[T>>2],c))|0):a=(0|E(0|d[T>>2],c))+a|0,(a&r)==(0|a))return T=a,T&=65535,h[e>>1]=n,h[(w=e+2|0)>>1]=o,void(h[(e=e+4|0)>>1]=T);T=r&~(a>>31),T&=65535,h[e>>1]=n,w=e+2|0,h[w>>1]=o,e=e+4|0,h[e>>1]=T}(o,e,r,n,a),h[M>>1]=0|h[o>>1],h[M+2>>1]=0|h[o+2>>1],h[M+4>>1]=0|h[o+4>>1],M=0|d[w>>2],d[w>>2]=(0|M)<1?0:M+-1|0,b=A,0|(M=D+1|0))}function St(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u,f=0,m=0,g=0,p=0,A=0;if((0|(a=0|h[(p=(e|=0)+196+(12*(f=((A=(t|=0)>>31)^t)-A|0)|0)+10|0)>>1]))<(0|(n=0|d[(c=e+196+(12*f|0)|0)>>2])))if(a<<1<(0|n))if(a<<2<(0|n))if(a<<3<(0|n))if(a<<4<(0|n))for(t=5;a<>1]^A)-A+r|0)&(r=0|d[(u=e+136|0)>>2]))==(0|n)?n:r&~(n>>31))^A)-A|0,r=0|d[(o=e+144|0)>>2],n=(0|n)>0?(n+r|0)/(1|r<<1)|0:(n-r|0)/(1|r<<1)|0,m=0|d[(l=e+140|0)>>2],m=(i=((0|n)<0?m:0)+n|0)-((0|i)<((m+1|0)/2|0)?0:m)|0,f=e+196+(12*f|0)+4|0,bt(e,t,(r=(n=r|t?0:(d[f>>2]<<1)-1+a>>31)^m)>>30^r<<1,0|d[e+156>>2]),r=0|d[e+160>>2],t=(0|d[c>>2])+((0|m)>-1?m:0-m|0)|0,n=(0|d[f>>2])+(0|E(d[o>>2]<<1|1,m))|0,(0|(i=0|h[p>>1]))==(0|r)&&(t>>=1,n>>=1,i=r>>1),d[c>>2]=t,r=i+1|0,h[p>>1]=r,(0|(t=r+n|0))>=1?(0|n)>0&&(n=n-r|0,p=0|h[s>>1],h[s>>1]=(p<<16>>16<127&1)+(65535&p),n=(0|n)>0?0:n):(n=0|h[s>>1],h[s>>1]=(65535&n)-(n<<16>>16>-128&1),n=(0|t)>(0|~i)?t:0-i|0),d[f>>2]=n,r=0|d[o>>2],(0|(t=(0|E(i=r<<1|1,(m^A)-A|0))+g|0))>=(0-r|0)?((n=0|d[u>>2])+r|0)<(0|t)&&(t=t-(0|E(0|d[l>>2],i))|0):(t=(0|E(0|d[l>>2],i))+t|0,n=0|d[u>>2]),(t&n)==(0|t)?(A=t,0|(A&=65535)):(A=n&~(t>>31),0|(A&=65535))}function bt(e,t,i,r){var n,a,o=0;if((0|(o=(i|=0)>>(t|=0)))<((a=(r|=0)-(0|d[(n=(e|=0)+148|0)>>2])|0)+-1|0))return(0|o)>30&&(ct(e,0,r=(0|o)/2|0),o=o-r|0),ct(e,1,o+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-31-(0|d[n>>2])|0)):ct(e,1,a),ct(e,(1<<(t=0|d[n>>2]))-1&i+-1,t)}function vt(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(bt(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,(0|d[e+156>>2])-1-(0|d[36476+(d[e+4600>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function wt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0;if(a=0|d[(s=(e|=0)+4|0)>>2],0|f[a+32|0]){if(Wn(0|d[(o=e+8|0)>>2],0|t,3*r|0),a=0|d[s>>2],t=0|d[a+16>>2],(0|r)>0){for(a=0|d[o>>2],e=0;l=a+2|0,c=0|f[a|0],f[a|0]=0|f[l|0],f[l|0]=c,(0|(e=e+1|0))!=(0|r);)a=a+t|0;a=0|d[s>>2]}s=0|d[o>>2]}else s=t;switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{n=128-(o=0|m[s+(3*a|0)+1|0])+(0|m[s+(3*a|0)+2|0])|0,l=(0|m[s+(3*a|0)|0])-o+128|0,f[(c=i+(3*a|0)|0)|0]=o+192+(((255&n)+(255&l)|0)>>>2),f[c+1|0]=n,f[c+2|0]=l,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{l=128-(r=0|m[s+(3*t|0)+1|0])+(0|m[s+(3*t|0)+2|0])|0,c=(0|m[s+(3*t|0)|0])-r+128|0,f[i+t|0]=r+192+(((255&l)+(255&c)|0)>>>2),f[i+(t+n)|0]=l,f[i+(t+e)|0]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{c=0|f[s+(o<<2)+3|0],r=128-(u=0|m[s+(o<<2)+1|0])+(0|m[s+(o<<2)+2|0])|0,l=(0|m[s+(o<<2)|0])-u+128|0,f[i+o|0]=u+192+(((255&r)+(255&l)|0)>>>2),f[i+(o+n)|0]=r,f[i+(o+e)|0]=l,f[i+(o+t)|0]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function Tt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,h=0,g=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(s=0|m[t+(3*e|0)+1|0],o=0|m[t+(3*e|0)+2|0],l=(0|m[t+(3*e|0)|0])-((o+s|0)>>>2)+64|0,f[(n=i+(3*e|0)|0)|0]=o+128+l,f[n+1|0]=l,f[n+2|0]=s+128+l,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{u=0|m[t+(s+n)|0],h=0|m[t+(s+o)|0],c=(0|m[t+s|0])-((h+u|0)>>>2)+64|0,f[(l=i+(3*s|0)|0)|0]=h+128+c,f[l+1|0]=c,f[l+2|0]=u+128+c,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{c=0|m[t+(s+n)|0],g=0|m[t+(s+e)|0],h=i+(s<<2)|0,u=(u=(0|m[t+s|0])-((g+c|0)>>>2)+64|0)<<8&65280|m[t+(s+o)|0]<<24|g+128+u&255|c+128+u<<16&16711680,f[h|0]=u,f[h+1|0]=u>>8,f[h+2|0]=u>>16,f[h+3|0]=u>>24,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]){if(s=0|d[e+16>>2],!((0|r)>0))return;for(e=i,o=0;g=e+2|0,h=0|f[e|0],f[e|0]=0|f[g|0],f[g|0]=h,(0|(o=o+1|0))!=(0|r);)e=e+s|0}}function yt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0;if(a=0|d[(s=(e|=0)+4|0)>>2],0|f[a+32|0]){if(Wn(0|d[(o=e+8|0)>>2],0|t,3*r|0),a=0|d[s>>2],t=0|d[a+16>>2],(0|r)>0){for(a=0|d[o>>2],e=0;l=a+2|0,c=0|f[a|0],f[a|0]=0|f[l|0],f[l|0]=c,(0|(e=e+1|0))!=(0|r);)a=a+t|0;a=0|d[s>>2]}s=0|d[o>>2]}else s=t;switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{t=0|m[s+(3*a|0)|0],o=255&(n=0|f[s+(3*a|0)+1|0]),l=128+(0|m[s+(3*a|0)+2|0])-((o+t|0)>>>1)&255,f[(c=i+(3*a|0)|0)|0]=t+128-o,f[c+1|0]=n,f[c+2|0]=l,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{l=0|f[s+(3*t|0)+1|0],o=0|m[s+(3*t|0)|0],r=255&l,c=128+(0|m[s+(3*t|0)+2|0])-((r+o|0)>>>1)&255,f[i+t|0]=o+128-r,f[i+(t+n)|0]=l,f[i+(t+e)|0]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{r=0|f[s+(o<<2)+1|0],c=0|f[s+(o<<2)+3|0],h=0|m[s+(o<<2)|0],u=255&r,l=128+(0|m[s+(o<<2)+2|0])-((u+h|0)>>>1)&255,f[i+o|0]=h+128-u,f[i+(o+n)|0]=r,f[i+(o+e)|0]=l,f[i+(o+t)|0]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function Ct(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,h=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(l=255&(s=0|f[t+(3*e|0)+1|0]),o=128+(0|m[t+(3*e|0)|0])+l|0,l=128+(0|m[t+(3*e|0)+2|0])+(((255&o)+l|0)>>>1)&255,f[(n=i+(3*e|0)|0)|0]=o,f[n+1|0]=s,f[n+2|0]=l,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{c=255&(u=0|f[t+(s+n)|0]),h=128+(0|m[t+s|0])+c|0,c=128+(0|m[t+(s+o)|0])+(((255&h)+c|0)>>>1)&255,f[(l=i+(3*s|0)|0)|0]=h,f[l+1|0]=u,f[l+2|0]=c,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{u=0|m[t+(s+n)|0],h=i+(s<<2)|0,u=(c=128+(0|m[t+s|0])+u&255)|u<<8|m[t+(s+o)|0]<<24|128+(0|m[t+(s+e)|0])+((c+u|0)>>>1)<<16&16711680,f[h|0]=u,f[h+1|0]=u>>8,f[h+2|0]=u>>16,f[h+3|0]=u>>24,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]){if(s=0|d[e+16>>2],!((0|r)>0))return;for(e=i,o=0;h=e+2|0,u=0|f[e|0],f[e|0]=0|f[h|0],f[h|0]=u,(0|(o=o+1|0))!=(0|r);)e=e+s|0}}function It(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0;if(a=0|d[(s=(e|=0)+4|0)>>2],0|f[a+32|0]){if(Wn(0|d[(o=e+8|0)>>2],0|t,3*r|0),a=0|d[s>>2],t=0|d[a+16>>2],(0|r)>0){for(a=0|d[o>>2],e=0;l=a+2|0,c=0|f[a|0],f[a|0]=0|f[l|0],f[l|0]=c,(0|(e=e+1|0))!=(0|r);)a=a+t|0;a=0|d[s>>2]}s=0|d[o>>2]}else s=t;switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{l=128-(o=255&(n=0|f[s+(3*a|0)+1|0]))+(0|m[s+(3*a|0)+2|0])&255,f[(c=i+(3*a|0)|0)|0]=128+(0|m[s+(3*a|0)|0])-o,f[c+1|0]=n,f[c+2|0]=l,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{c=128-(r=255&(l=0|f[s+(3*t|0)+1|0]))+(0|m[s+(3*t|0)+2|0])&255,f[i+t|0]=128+(0|m[s+(3*t|0)|0])-r,f[i+(t+n)|0]=l,f[i+(t+e)|0]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{r=0|f[s+(o<<2)+1|0],c=0|f[s+(o<<2)+3|0],l=128-(u=255&r)+(0|m[s+(o<<2)+2|0])&255,f[i+o|0]=128+(0|m[s+(o<<2)|0])-u,f[i+(o+n)|0]=r,f[i+(o+e)|0]=l,f[i+(o+t)|0]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function Dt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0,h=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(l=(o=255&(s=0|f[t+(3*e|0)+1|0]))+128+(0|m[t+(3*e|0)+2|0])&255,f[(n=i+(3*e|0)|0)|0]=128+(0|m[t+(3*e|0)|0])+o,f[n+1|0]=s,f[n+2|0]=l,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{c=(h=255&(u=0|f[t+(s+n)|0]))+128+(0|m[t+(s+o)|0])&255,f[(l=i+(3*s|0)|0)|0]=128+(0|m[t+s|0])+h,f[l+1|0]=u,f[l+2|0]=c,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{u=0|m[t+(s+n)|0],h=i+(s<<2)|0,u=128+(0|m[t+s|0])+u&255|u<<8|m[t+(s+o)|0]<<24|u+128+(0|m[t+(s+e)|0])<<16&16711680,f[h|0]=u,f[h+1|0]=u>>8,f[h+2|0]=u>>16,f[h+3|0]=u>>24,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]){if(s=0|d[e+16>>2],!((0|r)>0))return;for(e=i,o=0;h=e+2|0,u=0|f[e|0],f[e|0]=0|f[h|0],f[h|0]=u,(0|(o=o+1|0))!=(0|r);)e=e+s|0}}function xt(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0;if(a=0|d[(s=(e|=0)+4|0)>>2],0|f[a+32|0]){if(Wn(0|d[(o=e+8|0)>>2],0|t,3*r|0),a=0|d[s>>2],t=0|d[a+16>>2],(0|r)>0){for(a=0|d[o>>2],e=0;l=a+2|0,c=0|f[a|0],f[a|0]=0|f[l|0],f[l|0]=c,(0|(e=e+1|0))!=(0|r);)a=a+t|0;a=0|d[s>>2]}s=0|d[o>>2]}else s=t;switch(0|d[a+16>>2]){case 3:if(2==(0|d[a+24>>2])){if(!((0|r)>0))return;a=0;do{n=0|f[s+(3*a|0)+1|0],l=0|f[s+(3*a|0)+2|0],f[(c=i+(3*a|0)|0)|0]=0|f[s+(3*a|0)|0],f[c+1|0]=n,f[c+2|0]=l,a=a+1|0}while((0|a)!=(0|r));return}if((0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=0;do{l=0|f[s+(3*t|0)+1|0],c=0|f[s+(3*t|0)+2|0],f[i+t|0]=0|f[s+(3*t|0)|0],f[i+(t+n)|0]=l,f[i+(t+e)|0]=c,t=t+1|0}while((0|t)!=(0|a));return;case 4:if(1!=(0|d[a+24>>2])||(0|(a=(0|n)<(0|r)?n:r))<=0)return;e=n<<1,t=3*n|0,o=0;do{r=0|f[s+(o<<2)+1|0],l=0|f[s+(o<<2)+2|0],c=0|f[s+(o<<2)+3|0],f[i+o|0]=0|f[s+(o<<2)|0],f[i+(o+n)|0]=r,f[i+(o+e)|0]=l,f[i+(o+t)|0]=c,o=o+1|0}while((0|o)!=(0|a));return;default:return}}function Et(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0,s=0,l=0,c=0,u=0;e=0|d[(a=(e|=0)+4|0)>>2];e:do{switch(0|d[e+16>>2]){case 3:if(2==(0|d[e+24>>2])){if(!((0|r)>0))break e;for(e=0;;)if(s=0|f[t+(3*e|0)+1|0],l=0|f[t+(3*e|0)+2|0],f[(n=i+(3*e|0)|0)|0]=0|f[t+(3*e|0)|0],f[n+1|0]=s,f[n+2|0]=l,(0|(e=e+1|0))==(0|r))break e}if((0|(e=(0|r)<(0|n)?r:n))>0){o=n<<1,s=0;do{u=0|f[t+(s+n)|0],c=0|f[t+(s+o)|0],f[(l=i+(3*s|0)|0)|0]=0|f[t+s|0],f[l+1|0]=u,f[l+2|0]=c,s=s+1|0}while((0|s)!=(0|e))}break;case 4:if(1==(0|d[e+24>>2])&&(0|(l=(0|r)<(0|n)?r:n))>0){e=n<<1,o=3*n|0,s=0;do{u=i+(s<<2)|0,c=m[t+(s+n)|0]<<8|m[t+s|0]|m[t+(s+e)|0]<<16|m[t+(s+o)|0]<<24,f[u|0]=c,f[u+1|0]=c>>8,f[u+2|0]=c>>16,f[u+3|0]=c>>24,s=s+1|0}while((0|s)!=(0|l))}}}while(0);if(e=0|d[a>>2],0|f[e+32|0]){if(s=0|d[e+16>>2],!((0|r)>0))return;for(e=i,o=0;u=e+2|0,c=0|f[e|0],f[e|0]=0|f[u|0],f[u|0]=c,(0|(o=o+1|0))!=(0|r);)e=e+s|0}}function Mt(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+180|0)>>2])|0,w=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(w<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;e:do{if(s){if(s>>>0>1431655765&&(y=0,P(178,0|a),T=y,y=0,1&T)||(h=6),6==(0|h)&&(y=0,l=0|N(67,3*s|0),T=y,y=0,!(1&T)))for(d[o>>2]=l,d[a>>2]=l,d[a+8>>2]=l+(3*s|0);;)if(f[l|0]=0,f[l+1|0]=0,f[l+2|0]=0,l=3+(0|d[o>>2])|0,d[o>>2]=l,!(s=s+-1|0))break e;c=0|ae(),(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(3*~(((l+-3-s|0)>>>0)/3)|0)),Ba(s),de(0|c)}}while(0);d[r>>2]=0,d[(T=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(w){if(w>>>0>1073741823&&(y=0,P(178,0|r),v=y,y=0,1&v)||(h=17),17==(0|h)&&(y=0,u=0|N(67,0|(c=w<<2)),v=y,y=0,!(1&v))){d[r>>2]=u,h=u+(w<<2)|0,d[r+8>>2]=h,zn(0|u,0,0|c),d[T>>2]=h,h=19;break}c=0|ae(),l=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}else h=19}while(0);if(19==(0|h)){u=e+12|0;e:do{if((0|d[u>>2])>0){h=e+4604|0,m=1+(0|E(w,i))|0,g=e+4608|0,p=e+92|0,A=(0|w)>0,S=e+4600|0,v=0;t:for(;;){if(s=(c=0|d[a>>2])+3|0,d[h>>2]=s,l=c+(3*m|0)|0,d[g>>2]=l,1&v?(d[h>>2]=l,d[g>>2]=s,s=1):s=m,l=0|d[p>>2],y=0,j(0|d[12+(0|d[l>>2])>>2],0|l,c+(3*s|0)|0,0|d[t>>2],0|i),c=y,y=0,1&c){h=29;break}if(A){s=0|d[r>>2],l=0|d[h>>2],c=0;do{if(d[S>>2]=d[s+(c<<2)>>2],s=l+(3*(C=0|d[t>>2])|0)|0,l=l+(3*(C+-1|0)|0)|0,f[s|0]=0|f[l|0],f[s+1|0]=0|f[l+1|0],f[s+2|0]=0|f[l+2|0],s=0|d[h>>2],l=(0|d[g>>2])-3|0,f[l|0]=0|f[s|0],f[l+1|0]=0|f[s+1|0],f[l+2|0]=0|f[s+2|0],y=0,L(70,0|e,0),l=y,y=0,1&l){h=28;break t}s=0|d[r>>2],d[s+(c<<2)>>2]=d[S>>2],l=(0|d[h>>2])+(3*i|0)|0,d[h>>2]=l,d[g>>2]=(0|d[g>>2])+(3*i|0),c=c+1|0}while((0|c)<(0|w))}if((0|(v=v+1|0))>=(0|d[u>>2])){h=41;break e}}if(28==(0|h)){c=0|ae();break}if(29==(0|h)){c=0|ae();break}}else h=41}while(0);do{if(41==(0|h)){if(y=0,P(182,0|e),C=y,y=0,1&C){c=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[T>>2]))!=(0|s)&&(d[T>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(3*~(((l+-3-s|0)>>>0)/3)|0)),Ba(s),void(b=n)):void(b=n)}}while(0);l=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(3*~(((l+-3-s|0)>>>0)/3)|0)),Ba(s),de(0|c)}function kt(e,t,i){t|=0,i|=0;var r,n,a,o,s,l,c,u,h,g,p,A,S=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,M=0;for(A=b,b=b+32|0,p=A+15|0,n=A+12|0,r=A+9|0,a=A+6|0,c=A+3|0,u=A,h=(0|d[(e|=0)+180>>2])-t|0,g=0|d[e+4608>>2],o=0|d[e+4604>>2],i=255&(s=0|f[(x=g+(3*(t+-1|0)|0)|0)|0]),S=e+144|0,v=255&(l=0|f[x+1|0]),w=255&(x=0|f[x+2|0]),D=0;y=(T=g+(3*(D+t|0)|0)|0)+1|0,C=T+2|0,!((0|((0|(M=(0|m[T|0])-i|0))>-1?M:0-M))>(0|(I=0|d[S>>2]))||(M=(0|m[y|0])-v|0,(0|((0|M)>-1?M:0-M))>(0|I))||(M=(0|m[C|0])-w|0,(0|((0|M)>-1?M:0-M))>(0|I)));)if(f[T|0]=s,f[y|0]=l,f[C|0]=x,(0|(D=D+1|0))==(0|h)){D=h;break}if(v=(0|D)==(0|h),1<<(S=0|d[36476+(d[(w=e+4600|0)>>2]<<2)>>2])>(0|D))i=D;else{i=D;do{ct(e,1,1),S=0|d[w>>2],i=i-(1<>2])|0,S=(0|S)>30?31:S+1|0,d[w>>2]=S,S=0|d[36476+(S<<2)>>2]}while((0|i)>=1<>31|1,a=0|E(g,(0|m[i|0])-h|0),c=t+144|0,o=0|d[c>>2],a=(0|a)>0?(a+o|0)/(1|o<<1)|0:(a-o|0)/(1|o<<1)|0,T=t+140|0,l=0|d[T>>2],s=((0|a)<0?l:0)+a|0,l=s-((0|s)<((l+1|0)/2|0)?0:l)|0,s=t+4576|0,Pt(t,s,l),b=0|m[n+1|0],v=b-(0|m[r+1|0])>>31|1,a=0|E(v,(0|m[i+1|0])-b|0),o=0|d[c>>2],a=(0|a)>0?(a+o|0)/(1|o<<1)|0:(a-o|0)/(1|o<<1)|0,p=0|d[T>>2],w=((0|a)<0?p:0)+a|0,p=w-((0|w)<((p+1|0)/2|0)?0:p)|0,Pt(t,s,p),w=0|m[n+2|0],S=w-(0|m[r+2|0])>>31|1,a=0|E(S,(0|m[i+2|0])-w|0),o=0|d[c>>2],a=(0|a)>0?(a+o|0)/(1|o<<1)|0:(a-o|0)/(1|o<<1)|0,u=0|d[T>>2],a=((0|a)<0?u:0)+a|0,u=a-((0|a)<((u+1|0)/2|0)?0:u)|0,Pt(t,s,u),s=0|d[c>>2],c=s<<1|1,a=(0|E(0|E(c,l),g))+h|0,i=0-s|0,(0|a)>=(0|i)?(o=0|d[A>>2],(o+s|0)<(0|a)&&(a=a-(0|E(0|d[T>>2],c))|0),r=o):(a=(0|E(0|d[T>>2],c))+a|0,r=0|d[A>>2]),(a&r)!=(0|a)&&(a=r&~(a>>31)),n=255&a,a=(0|E(0|E(c,p),v))+b|0,(0|a)>=(0|i)?(r+s|0)<(0|a)&&(a=a-(0|E(0|d[T>>2],c))|0):a=(0|E(0|d[T>>2],c))+a|0,(a&r)!=(0|a)&&(a=r&~(a>>31)),o=255&a,a=(0|E(0|E(c,u),S))+w|0,(0|a)>=(0|i)?(r+s|0)<(0|a)&&(a=a-(0|E(0|d[T>>2],c))|0):a=(0|E(0|d[T>>2],c))+a|0,(a&r)==(0|a))return T=a,T&=255,f[e|0]=n,f[(w=e+1|0)|0]=o,void(f[(e=e+2|0)|0]=T);T=r&~(a>>31),T&=255,f[e|0]=n,w=e+1|0,f[w|0]=o,e=e+2|0,f[e|0]=T}(a,e,r,n,p),f[M|0]=0|f[a|0],f[M+1|0]=0|f[a+1|0],f[M+2|0]=0|f[a+2|0],M=0|d[w>>2],d[w>>2]=(0|M)<1?0:M+-1|0,b=A,0|(M=D+1|0))}function Rt(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u,f=0,m=0,g=0,p=0,A=0;if((0|(a=0|h[(p=(e|=0)+196+(12*(f=((A=(t|=0)>>31)^t)-A|0)|0)+10|0)>>1]))<(0|(n=0|d[(c=e+196+(12*f|0)|0)>>2])))if(a<<1<(0|n))if(a<<2<(0|n))if(a<<3<(0|n))if(a<<4<(0|n))for(t=5;a<>1]^A)-A+r|0)&(r=0|d[(u=e+136|0)>>2]))==(0|n)?n:r&~(n>>31))^A)-A|0,r=0|d[(o=e+144|0)>>2],n=(0|n)>0?(n+r|0)/(1|r<<1)|0:(n-r|0)/(1|r<<1)|0,m=0|d[(l=e+140|0)>>2],m=(i=((0|n)<0?m:0)+n|0)-((0|i)<((m+1|0)/2|0)?0:m)|0,f=e+196+(12*f|0)+4|0,Ft(e,t,(r=(n=r|t?0:(d[f>>2]<<1)-1+a>>31)^m)>>30^r<<1,0|d[e+156>>2]),r=0|d[e+160>>2],t=(0|d[c>>2])+((0|m)>-1?m:0-m|0)|0,n=(0|d[f>>2])+(0|E(d[o>>2]<<1|1,m))|0,(0|(i=0|h[p>>1]))==(0|r)&&(t>>=1,n>>=1,i=r>>1),d[c>>2]=t,r=i+1|0,h[p>>1]=r,(0|(t=r+n|0))>=1?(0|n)>0&&(n=n-r|0,p=0|h[s>>1],h[s>>1]=(p<<16>>16<127&1)+(65535&p),n=(0|n)>0?0:n):(n=0|h[s>>1],h[s>>1]=(65535&n)-(n<<16>>16>-128&1),n=(0|t)>(0|~i)?t:0-i|0),d[f>>2]=n,r=0|d[o>>2],(0|(t=(0|E(i=r<<1|1,(m^A)-A|0))+g|0))>=(0-r|0)?((n=0|d[u>>2])+r|0)<(0|t)&&(t=t-(0|E(0|d[l>>2],i))|0):(t=(0|E(0|d[l>>2],i))+t|0,n=0|d[u>>2]),(t&n)==(0|t)?(A=t,0|(A&=255)):(A=n&~(t>>31),0|(A&=255))}function Ft(e,t,i,r){var n,a,o=0;if((0|(o=(i|=0)>>(t|=0)))<((a=(r|=0)-(0|d[(n=(e|=0)+148|0)>>2])|0)+-1|0))return(0|o)>30&&(ct(e,0,r=(0|o)/2|0),o=o-r|0),ct(e,1,o+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-31-(0|d[n>>2])|0)):ct(e,1,a),ct(e,(1<<(t=0|d[n>>2]))-1&i+-1,t)}function Pt(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(Ft(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,(0|d[e+156>>2])-1-(0|d[36476+(d[e+4600>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function Lt(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+156|0)>>2])|0,T=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(T<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;do{if(s){if((0|s)<0&&(y=0,P(178,0|a),C=y,y=0,1&C)||(m=6),6==(0|m)&&(y=0,c=0|N(67,0|(l=s<<1)),C=y,y=0,!(1&C))){d[a>>2]=c,C=c+(s<<1)|0,d[a+8>>2]=C,zn(0|c,0,0|l),d[o>>2]=C;break}c=0|ae(),(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),de(0|c)}}while(0);d[r>>2]=0,d[(C=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(T){if(T>>>0>1073741823&&(y=0,P(178,0|r),w=y,y=0,1&w)||(m=16),16==(0|m)&&(y=0,f=0|N(67,0|(u=T<<2)),w=y,y=0,!(1&w))){d[r>>2]=f,m=f+(T<<2)|0,d[r+8>>2]=m,zn(0|f,0,0|u),d[C>>2]=m,m=18;break}c=0|ae(),l=s=0|d[r>>2],s&&((0|(u=0|d[C>>2]))!=(0|s)&&(d[C>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}else m=18}while(0);if(18==(0|m)){f=e+12|0;e:do{if((0|d[f>>2])>0){m=e+4580|0,g=1+(0|E(T,i))|0,p=e+4584|0,A=e+92|0,S=(0|T)>0,v=e+4576|0,w=0;t:for(;;){if(s=(l=0|d[a>>2])+2|0,d[m>>2]=s,l=l+(g<<1)|0,d[p>>2]=l,1&w?(d[m>>2]=l,d[p>>2]=s):s=l,u=0|d[A>>2],y=0,j(0|d[12+(0|d[u>>2])>>2],0|u,0|s,0|d[t>>2],0|i),u=y,y=0,1&u){m=28;break}if(S){s=0|d[m>>2],l=0|d[p>>2],c=0|d[r>>2],u=0;do{if(d[v>>2]=d[c+(u<<2)>>2],c=0|d[t>>2],h[s+(c<<1)>>1]=0|h[s+(c+-1<<1)>>1],h[l+-2>>1]=0|h[s>>1],y=0,L(71,0|e,0),c=y,y=0,1&c){m=27;break t}c=0|d[r>>2],d[c+(u<<2)>>2]=d[v>>2],s=(0|d[m>>2])+(i<<1)|0,d[m>>2]=s,l=(0|d[p>>2])+(i<<1)|0,d[p>>2]=l,u=u+1|0}while((0|u)<(0|T))}if((0|(w=w+1|0))>=(0|d[f>>2])){m=40;break e}}if(27==(0|m)){c=0|ae();break}if(28==(0|m)){c=0|ae();break}}else m=40}while(0);do{if(40==(0|m)){if(y=0,P(182,0|e),e=y,y=0,1&e){c=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[C>>2]))!=(0|s)&&(d[C>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),void(b=n)):void(b=n)}}while(0);l=s=0|d[r>>2],s&&((0|(u=0|d[C>>2]))!=(0|s)&&(d[C>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),de(0|c)}function _t(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c=0,u=0,f=0,m=0,g=0,p=0;if((0|(u=0|h[(g=(e|=0)+172+(12*(o=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+172+(12*o|0)|0)>>2])))if(u<<1<(0|n))if(u<<2<(0|n))if(u<<3<(0|n))if(u<<4<(0|n))for(c=5;u<>1]^p)-p+r|0))==(0|n)?n:n>>31&65535^65535)^p)-p<<16)>>16,(0|(n=(r=(r=(n=c?0:(d[e+172+(12*o|0)+4>>2]<<1)-1+u>>31)^s)>>30^r<<1)>>c))<47?((0|n)>30&&(ct(e,0,u=(0|n)/2|0),n=n-u|0),ct(e,1,n+1|0),ct(e,r&(1<>1])<<16>>16==64),i=(0|d[r>>2])+s>>c,u=n?32:u<<16>>16,d[m>>2]=(0|d[m>>2])+((0|a)>-65536?s:0-s|0)>>c,c=u+1|0,h[g>>1]=c,(0|(n=c+i|0))<1?(g=0|h[l>>1],h[l>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|n)>(0|~u)?n:0-u|0,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=65535)):(0|i)<=0?(g=i,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=65535)):(g=i-c|0,m=0|h[l>>1],h[l>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=65535))}function Nt(e,t,i){t|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;for(n=(0|d[(e|=0)+156>>2])-t|0,a=0|d[e+4584>>2],c=0|d[e+4580>>2],l=0|h[a+(t+-1<<1)>>1],s=0;;){if((0|h[(i=a+(s+t<<1)|0)>>1])!=l<<16>>16){u=s;break}if(h[i>>1]=l,(0|(s=s+1|0))==(0|n)){u=n;break}}if(r=65535&l,l=(0|u)==(0|n),1<<(s=0|d[36476+(d[(o=e+4576|0)>>2]<<2)>>2])>(0|u))i=u;else{i=u;do{ct(e,1,1),s=0|d[o>>2],i=i-(1<>2])|0,s=(0|s)>30?31:s+1|0,d[o>>2]=s,s=0|d[36476+(s<<2)>>2]}while((0|i)>=1<>1],(0|((0|(c=r-(i=0|g[c+(i<<1)>>1])|0))>-1?c:0-c))<1?(Ut(e,e+4564|0,i=s-r<<16>>16),i=i+r|0):(Ut(e,e+4552|0,t=E(s-i<<16,c=i-r>>31|1)>>16),i=(0|E(t,c))+i|0),h[l>>1]=i,e=0|d[o>>2],d[o>>2]=(0|e)<1?0:e+-1|0,0|(e=u+1|0))}function Ut(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n=0,a=0;if(n=i>>t,a=r+-16|0,(0|n)<(r+-17|0))return(0|n)>30&&(ct(e,0,r=(0|n)/2|0),n=n-r|0),ct(e,1,n+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-47|0)):ct(e,1,a),ct(e,i+65535&65535,16)}(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,63-(0|d[36476+(d[e+4576>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function Ot(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+156|0)>>2])|0,T=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(T<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;do{if(s){if((0|s)<0&&(y=0,P(178,0|a),C=y,y=0,1&C)||(m=6),6==(0|m)&&(y=0,c=0|N(67,0|(l=s<<1)),C=y,y=0,!(1&C))){d[a>>2]=c,C=c+(s<<1)|0,d[a+8>>2]=C,zn(0|c,0,0|l),d[o>>2]=C;break}c=0|ae(),(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),de(0|c)}}while(0);d[r>>2]=0,d[(C=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(T){if(T>>>0>1073741823&&(y=0,P(178,0|r),w=y,y=0,1&w)||(m=16),16==(0|m)&&(y=0,f=0|N(67,0|(u=T<<2)),w=y,y=0,!(1&w))){d[r>>2]=f,m=f+(T<<2)|0,d[r+8>>2]=m,zn(0|f,0,0|u),d[C>>2]=m,m=18;break}c=0|ae(),l=s=0|d[r>>2],s&&((0|(u=0|d[C>>2]))!=(0|s)&&(d[C>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}else m=18}while(0);if(18==(0|m)){f=e+12|0;e:do{if((0|d[f>>2])>0){m=e+4580|0,g=1+(0|E(T,i))|0,p=e+4584|0,A=e+92|0,S=(0|T)>0,v=e+4576|0,w=0;t:for(;;){if(s=(l=0|d[a>>2])+2|0,d[m>>2]=s,l=l+(g<<1)|0,d[p>>2]=l,1&w?(d[m>>2]=l,d[p>>2]=s):s=l,u=0|d[A>>2],y=0,j(0|d[12+(0|d[u>>2])>>2],0|u,0|s,0|d[t>>2],0|i),u=y,y=0,1&u){m=28;break}if(S){s=0|d[m>>2],l=0|d[p>>2],c=0|d[r>>2],u=0;do{if(d[v>>2]=d[c+(u<<2)>>2],c=0|d[t>>2],h[s+(c<<1)>>1]=0|h[s+(c+-1<<1)>>1],h[l+-2>>1]=0|h[s>>1],y=0,L(72,0|e,0),c=y,y=0,1&c){m=27;break t}c=0|d[r>>2],d[c+(u<<2)>>2]=d[v>>2],s=(0|d[m>>2])+(i<<1)|0,d[m>>2]=s,l=(0|d[p>>2])+(i<<1)|0,d[p>>2]=l,u=u+1|0}while((0|u)<(0|T))}if((0|(w=w+1|0))>=(0|d[f>>2])){m=40;break e}}if(27==(0|m)){c=0|ae();break}if(28==(0|m)){c=0|ae();break}}else m=40}while(0);do{if(40==(0|m)){if(y=0,P(182,0|e),e=y,y=0,1&e){c=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[C>>2]))!=(0|s)&&(d[C>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),void(b=n)):void(b=n)}}while(0);l=s=0|d[r>>2],s&&((0|(u=0|d[C>>2]))!=(0|s)&&(d[C>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(~((l+-2-s|0)>>>1)<<1)),Ba(s),de(0|c)}function Bt(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c=0,u=0,f=0,m=0,g=0,p=0;if((0|(u=0|h[(g=(e|=0)+172+(12*(o=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+172+(12*o|0)|0)>>2])))if(u<<1<(0|n))if(u<<2<(0|n))if(u<<3<(0|n))if(u<<4<(0|n))for(c=5;u<>1]^p)-p+r|0))==(0|n)?n:n>>31&4095^4095)^p)-p<<20)>>20,(0|(n=(r=(r=(n=c?0:(d[e+172+(12*o|0)+4>>2]<<1)-1+u>>31)^s)>>30^r<<1)>>c))<35?((0|n)>30&&(ct(e,0,u=(0|n)/2|0),n=n-u|0),ct(e,1,n+1|0),ct(e,r&(1<>1])<<16>>16==64),i=(0|d[r>>2])+s>>c,u=n?32:u<<16>>16,d[m>>2]=(0|d[m>>2])+((0|a)>-1048576?s:0-s|0)>>c,c=u+1|0,h[g>>1]=c,(0|(n=c+i|0))<1?(g=0|h[l>>1],h[l>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|n)>(0|~u)?n:0-u|0,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,t&=4095,0|(t&=65535)):(0|i)<=0?(g=i,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,t&=4095,0|(t&=65535)):(g=i-c|0,m=0|h[l>>1],h[l>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,t&=4095,0|(t&=65535))}function Vt(e,t,i){t|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;for(n=(0|d[(e|=0)+156>>2])-t|0,a=0|d[e+4584>>2],c=0|d[e+4580>>2],l=0|h[a+(t+-1<<1)>>1],s=0;;){if((0|h[(i=a+(s+t<<1)|0)>>1])!=l<<16>>16){u=s;break}if(h[i>>1]=l,(0|(s=s+1|0))==(0|n)){u=n;break}}if(r=65535&l,l=(0|u)==(0|n),1<<(s=0|d[36476+(d[(o=e+4576|0)>>2]<<2)>>2])>(0|u))i=u;else{i=u;do{ct(e,1,1),s=0|d[o>>2],i=i-(1<>2])|0,s=(0|s)>30?31:s+1|0,d[o>>2]=s,s=0|d[36476+(s<<2)>>2]}while((0|i)>=1<>1],(0|((0|(c=r-(i=0|g[c+(i<<1)>>1])|0))>-1?c:0-c))<1?(qt(e,e+4564|0,i=s-r<<20>>20),i=i+r|0):(qt(e,e+4552|0,t=E(s-i<<20,c=i-r>>31|1)>>20),i=(0|E(t,c))+i|0),h[l>>1]=4095&i,e=0|d[o>>2],d[o>>2]=(0|e)<1?0:e+-1|0,0|(e=u+1|0))}function qt(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n=0,a=0;if(n=i>>t,a=r+-12|0,(0|n)<(r+-13|0))return(0|n)>30&&(ct(e,0,r=(0|n)/2|0),n=n-r|0),ct(e,1,n+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-43|0)):ct(e,1,a),ct(e,i+4095&4095,12)}(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,47-(0|d[36476+(d[e+4576>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function Gt(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+156|0)>>2])|0,w=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(w<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;e:do{if(s){if((0|s)<0&&(y=0,P(178,0|a),T=y,y=0,1&T)||(h=6),6==(0|h)&&(y=0,l=0|N(67,0|s),T=y,y=0,!(1&T)))for(d[o>>2]=l,d[a>>2]=l,d[a+8>>2]=l+s;;)if(f[l|0]=0,l=1+(0|d[o>>2])|0,d[o>>2]=l,!(s=s+-1|0))break e;l=0|ae(),(s=0|d[a>>2])||de(0|l),(0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),de(0|l)}}while(0);d[r>>2]=0,d[(T=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(w){if(w>>>0>1073741823&&(y=0,P(178,0|r),v=y,y=0,1&v)||(h=17),17==(0|h)&&(y=0,u=0|N(67,0|(c=w<<2)),v=y,y=0,!(1&v))){d[r>>2]=u,h=u+(w<<2)|0,d[r+8>>2]=h,zn(0|u,0,0|c),d[T>>2]=h,h=19;break}l=0|ae(),c=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-c|0)>>>2)<<2)),Ba(s))}else h=19}while(0);if(19==(0|h)){u=e+12|0;e:do{if((0|d[u>>2])>0){h=e+4580|0,m=1+(0|E(w,i))|0,g=e+4584|0,p=e+92|0,A=(0|w)>0,S=e+4576|0,v=0;t:for(;;){if(s=(l=0|d[a>>2])+1|0,d[h>>2]=s,l=l+m|0,d[g>>2]=l,1&v?(d[h>>2]=l,d[g>>2]=s):s=l,c=0|d[p>>2],y=0,j(0|d[12+(0|d[c>>2])>>2],0|c,0|s,0|d[t>>2],0|i),c=y,y=0,1&c){h=29;break}if(A){s=0|d[h>>2],l=0|d[r>>2],c=0;do{if(d[S>>2]=d[l+(c<<2)>>2],l=0|d[t>>2],f[s+l|0]=0|f[s+(l+-1)|0],f[(0|d[g>>2])-1|0]=0|f[d[h>>2]|0],y=0,L(73,0|e,0),l=y,y=0,1&l){h=28;break t}l=0|d[r>>2],d[l+(c<<2)>>2]=d[S>>2],s=(0|d[h>>2])+i|0,d[h>>2]=s,d[g>>2]=(0|d[g>>2])+i,c=c+1|0}while((0|c)<(0|w))}if((0|(v=v+1|0))>=(0|d[u>>2])){h=41;break e}}if(28==(0|h)){l=0|ae();break}if(29==(0|h)){l=0|ae();break}}else h=41}while(0);do{if(41==(0|h)){if(y=0,P(182,0|e),e=y,y=0,1&e){l=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[T>>2]))!=(0|s)&&(d[T>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),void(b=n)):void(b=n)}}while(0);c=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-c|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|l),(0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),de(0|l)}function Qt(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c=0,u=0,f=0,m=0,g=0,p=0;if((0|(u=0|h[(g=(e|=0)+172+(12*(o=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+172+(12*o|0)|0)>>2])))if(u<<1<(0|n))if(u<<2<(0|n))if(u<<3<(0|n))if(u<<4<(0|n))for(c=5;u<>1]^p)-p+r|0))==(0|n)?n:n>>31&255^255)^p)-p<<24)>>24,n=c?0:(d[e+172+(12*o|0)+4>>2]<<1)-1+u>>31,(0|(r=(n=(n^=s)>>30^n<<1)>>c))<23?(ct(e,1,r+1|0),ct(e,n&(1<>1])<<16>>16==64),i=(0|d[r>>2])+s>>c,u=n?32:u<<16>>16,d[m>>2]=(0|d[m>>2])+((0|a)>-16777216?s:0-s|0)>>c,c=u+1|0,h[g>>1]=c,(0|(n=c+i|0))<1?(g=0|h[l>>1],h[l>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|n)>(0|~u)?n:0-u|0,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=255)):(0|i)<=0?(g=i,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=255)):(g=i-c|0,m=0|h[l>>1],h[l>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=255))}function zt(e,t,i){t|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;for(n=(0|d[(e|=0)+156>>2])-t|0,a=0|d[e+4584>>2],c=0|d[e+4580>>2],l=0|f[a+(t+-1)|0],s=0;;){if((0|f[(i=a+(s+t)|0)|0])!=l<<24>>24){u=s;break}if(f[i|0]=l,(0|(s=s+1|0))==(0|n)){u=n;break}}if(r=255&l,l=(0|u)==(0|n),1<<(s=0|d[36476+(d[(o=e+4576|0)>>2]<<2)>>2])>(0|u))i=u;else{i=u;do{ct(e,1,1),s=0|d[o>>2],i=i-(1<>2])|0,s=(0|s)>30?31:s+1|0,d[o>>2]=s,s=0|d[36476+(s<<2)>>2]}while((0|i)>=1<-1?c:0-c))<1?(Ht(e,e+4564|0,i=s-r<<24>>24),i=i+r|0):(Ht(e,e+4552|0,t=E(s-i<<24,c=i-r>>31|1)>>24),i=(0|E(t,c))+i|0),f[l|0]=i,e=0|d[o>>2],d[o>>2]=(0|e)<1?0:e+-1|0,0|(e=u+1|0))}function Ht(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n=0,a=0;if(n=i>>t,a=r+-8|0,(0|n)<(r+-9|0))return(0|n)>30&&(ct(e,0,r=(0|n)/2|0),n=n-r|0),ct(e,1,n+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-39|0)):ct(e,1,a),ct(e,i+255&255,8)}(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,31-(0|d[36476+(d[e+4576>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function Yt(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+156|0)>>2])|0,w=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(w<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;e:do{if(s){if(s>>>0>1431655765&&(y=0,P(178,0|a),T=y,y=0,1&T)||(h=6),6==(0|h)&&(y=0,l=0|N(67,3*s|0),T=y,y=0,!(1&T)))for(d[o>>2]=l,d[a>>2]=l,d[a+8>>2]=l+(3*s|0);;)if(f[l|0]=0,f[l+1|0]=0,f[l+2|0]=0,l=3+(0|d[o>>2])|0,d[o>>2]=l,!(s=s+-1|0))break e;c=0|ae(),(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(3*~(((l+-3-s|0)>>>0)/3)|0)),Ba(s),de(0|c)}}while(0);d[r>>2]=0,d[(T=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(w){if(w>>>0>1073741823&&(y=0,P(178,0|r),v=y,y=0,1&v)||(h=17),17==(0|h)&&(y=0,u=0|N(67,0|(c=w<<2)),v=y,y=0,!(1&v))){d[r>>2]=u,h=u+(w<<2)|0,d[r+8>>2]=h,zn(0|u,0,0|c),d[T>>2]=h,h=19;break}c=0|ae(),l=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}else h=19}while(0);if(19==(0|h)){u=e+12|0;e:do{if((0|d[u>>2])>0){h=e+4580|0,m=1+(0|E(w,i))|0,g=e+4584|0,p=e+92|0,A=(0|w)>0,S=e+4576|0,v=0;t:for(;;){if(s=(c=0|d[a>>2])+3|0,d[h>>2]=s,l=c+(3*m|0)|0,d[g>>2]=l,1&v?(d[h>>2]=l,d[g>>2]=s,s=1):s=m,l=0|d[p>>2],y=0,j(0|d[12+(0|d[l>>2])>>2],0|l,c+(3*s|0)|0,0|d[t>>2],0|i),c=y,y=0,1&c){h=29;break}if(A){s=0|d[r>>2],l=0|d[h>>2],c=0;do{if(d[S>>2]=d[s+(c<<2)>>2],s=l+(3*(C=0|d[t>>2])|0)|0,l=l+(3*(C+-1|0)|0)|0,f[s|0]=0|f[l|0],f[s+1|0]=0|f[l+1|0],f[s+2|0]=0|f[l+2|0],s=0|d[h>>2],l=(0|d[g>>2])-3|0,f[l|0]=0|f[s|0],f[l+1|0]=0|f[s+1|0],f[l+2|0]=0|f[s+2|0],y=0,L(74,0|e,0),l=y,y=0,1&l){h=28;break t}s=0|d[r>>2],d[s+(c<<2)>>2]=d[S>>2],l=(0|d[h>>2])+(3*i|0)|0,d[h>>2]=l,d[g>>2]=(0|d[g>>2])+(3*i|0),c=c+1|0}while((0|c)<(0|w))}if((0|(v=v+1|0))>=(0|d[u>>2])){h=41;break e}}if(28==(0|h)){c=0|ae();break}if(29==(0|h)){c=0|ae();break}}else h=41}while(0);do{if(41==(0|h)){if(y=0,P(182,0|e),C=y,y=0,1&C){c=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[T>>2]))!=(0|s)&&(d[T>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(3*~(((l+-3-s|0)>>>0)/3)|0)),Ba(s),void(b=n)):void(b=n)}}while(0);l=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-l|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|c),(0|(l=0|d[o>>2]))!=(0|s)&&(d[o>>2]=l+(3*~(((l+-3-s|0)>>>0)/3)|0)),Ba(s),de(0|c)}function Wt(e,t,i){t|=0,i|=0;var r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,b=0;for(c=(0|d[(e|=0)+156>>2])-t|0,u=0|d[e+4584>>2],h=0|d[e+4580>>2],g=0|f[(l=u+(3*(t+-1|0)|0)|0)|0],s=0|f[l+1|0],l=0|f[l+2|0],o=0;n=(i=u+(3*(o+t|0)|0)|0)+1|0,a=i+2|0,((0|f[i|0])==g<<24>>24?(0|f[n|0])==s<<24>>24:0)&(0|f[a|0])==l<<24>>24;)if(f[i|0]=g,f[n|0]=s,f[a|0]=l,(0|(o=o+1|0))==(0|c)){o=c;break}if(a=(0|o)==(0|c),1<<(n=0|d[36476+(d[(r=e+4576|0)>>2]<<2)>>2])>(0|o))i=o;else{i=o;do{ct(e,1,1),n=0|d[r>>2],i=i-(1<>2])|0,n=(0|n)>30?31:n+1|0,d[r>>2]=n,n=0|d[36476+(n<<2)>>2]}while((0|i)>=1<>31|1,Kt(e,S=e+4552|0,A=E((0|m[c|0])-h<<24,p)>>24),Kt(e,S,i=E((255&i)-(g=255&n)<<24,n=g-(255&s)>>31|1)>>24),Kt(e,S,a=E((255&a)-(s=255&b)<<24,l=s-(255&l)>>31|1)>>24),h=(0|E(A,p))+h&255,g=(0|E(i,n))+g&255,e=(0|E(a,l))+s&255,f[c|0]=h,f[u|0]=g,f[t|0]=e,e=0|d[r>>2],d[r>>2]=(0|e)<1?0:e+-1|0,0|(e=o+1|0))}function Xt(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c=0,u=0,f=0,m=0,g=0,p=0;if((0|(u=0|h[(g=(e|=0)+172+(12*(o=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+172+(12*o|0)|0)>>2])))if(u<<1<(0|n))if(u<<2<(0|n))if(u<<3<(0|n))if(u<<4<(0|n))for(c=5;u<>1]^p)-p+r|0))==(0|n)?n:n>>31&255^255)^p)-p<<24)>>24,n=c?0:(d[e+172+(12*o|0)+4>>2]<<1)-1+u>>31,(0|(r=(n=(n^=s)>>30^n<<1)>>c))<23?(ct(e,1,r+1|0),ct(e,n&(1<>1])<<16>>16==64),i=(0|d[r>>2])+s>>c,u=n?32:u<<16>>16,d[m>>2]=(0|d[m>>2])+((0|a)>-16777216?s:0-s|0)>>c,c=u+1|0,h[g>>1]=c,(0|(n=c+i|0))<1?(g=0|h[l>>1],h[l>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|n)>(0|~u)?n:0-u|0,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=255)):(0|i)<=0?(g=i,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=255)):(g=i-c|0,m=0|h[l>>1],h[l>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[r>>2]=g,t=(t=f+(t>>>=31)|0)+(p^=s)|0,0|(t&=255))}function Kt(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n=0,a=0;if(n=i>>t,a=r+-8|0,(0|n)<(r+-9|0))return(0|n)>30&&(ct(e,0,r=(0|n)/2|0),n=n-r|0),ct(e,1,n+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-39|0)):ct(e,1,a),ct(e,i+255&255,8)}(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,31-(0|d[36476+(d[e+4576>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function jt(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0;n=b,b=b+32|0,a=n+12|0,r=n,i=4+(0|d[(t=(e|=0)+180|0)>>2])|0,v=1==(0|d[e+32>>2])?0|d[e+24>>2]:1,s=0|E(v<<1,i),d[a>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0;e:do{if(s){if((0|s)<0&&(y=0,P(178,0|a),T=y,y=0,1&T)||(w=6),6==(0|w)&&(y=0,l=0|N(67,0|s),T=y,y=0,!(1&T)))for(d[o>>2]=l,d[a>>2]=l,d[a+8>>2]=l+s;;)if(f[l|0]=0,l=1+(0|d[o>>2])|0,d[o>>2]=l,!(s=s+-1|0))break e;l=0|ae(),(s=0|d[a>>2])||de(0|l),(0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),de(0|l)}}while(0);d[r>>2]=0,d[(T=r+4|0)>>2]=0,d[r+8>>2]=0;do{if(v){if(v>>>0>1073741823&&(y=0,P(178,0|r),S=y,y=0,1&S)||(w=17),17==(0|w)&&(y=0,u=0|N(67,0|(c=v<<2)),S=y,y=0,!(1&S))){d[r>>2]=u,w=u+(v<<2)|0,d[r+8>>2]=w,zn(0|u,0,0|c),d[T>>2]=w,w=19;break}l=0|ae(),c=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-c|0)>>>2)<<2)),Ba(s))}else w=19}while(0);if(19==(0|w)){m=e+12|0;e:do{if((0|d[m>>2])>0){if(g=e+4604|0,p=1+(0|E(v,i))|0,A=e+4608|0,S=e+92|0,h=e+4600|0,!((0|v)>0)){for(c=0;s=(l=0|d[a>>2])+1|0,d[g>>2]=s,l=l+p|0,d[A>>2]=l,1&c?(d[g>>2]=l,d[A>>2]=s):s=l,v=0|d[S>>2],y=0,j(0|d[12+(0|d[v>>2])>>2],0|v,0|s,0|d[t>>2],0|i),v=y,y=0,!(1&v);)if((0|(c=c+1|0))>=(0|d[m>>2])){w=45;break e}l=0|ae();break}u=0;t:for(;;){if(s=(l=0|d[a>>2])+1|0,d[g>>2]=s,l=l+p|0,d[A>>2]=l,1&u?(d[g>>2]=l,d[A>>2]=s):s=l,w=0|d[S>>2],y=0,j(0|d[12+(0|d[w>>2])>>2],0|w,0|s,0|d[t>>2],0|i),w=y,y=0,1&w){w=28;break}s=0|d[r>>2],l=0|d[g>>2],c=0;do{if(d[h>>2]=d[s+(c<<2)>>2],w=0|d[t>>2],f[l+w|0]=0|f[l+(w+-1)|0],f[(0|d[A>>2])-1|0]=0|f[d[g>>2]|0],y=0,L(75,0|e,0),w=y,y=0,1&w){w=36;break t}s=0|d[r>>2],d[s+(c<<2)>>2]=d[h>>2],l=(0|d[g>>2])+i|0,d[g>>2]=l,d[A>>2]=(0|d[A>>2])+i,c=c+1|0}while((0|c)<(0|v));if((0|(u=u+1|0))>=(0|d[m>>2])){w=45;break e}}if(28==(0|w)){l=0|ae();break}if(36==(0|w)){l=0|ae();break}}else w=45}while(0);do{if(45==(0|w)){if(y=0,P(182,0|e),e=y,y=0,1&e){l=0|ae();break}return l=s=0|d[r>>2],s&&((0|(c=0|d[T>>2]))!=(0|s)&&(d[T>>2]=c+(~((c+-4-l|0)>>>2)<<2)),Ba(s)),(s=0|d[a>>2])?((0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),void(b=n)):void(b=n)}}while(0);c=s=0|d[r>>2],s&&((0|(u=0|d[T>>2]))!=(0|s)&&(d[T>>2]=u+(~((u+-4-c|0)>>>2)<<2)),Ba(s))}(s=0|d[a>>2])||de(0|l),(0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),de(0|l)}function Zt(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u,f=0,m=0,g=0,p=0,A=0;if((0|(a=0|h[(p=(e|=0)+196+(12*(f=((A=(t|=0)>>31)^t)-A|0)|0)+10|0)>>1]))<(0|(n=0|d[(c=e+196+(12*f|0)|0)>>2])))if(a<<1<(0|n))if(a<<2<(0|n))if(a<<3<(0|n))if(a<<4<(0|n))for(t=5;a<>1]^A)-A+r|0)&(r=0|d[(u=e+136|0)>>2]))==(0|n)?n:r&~(n>>31))^A)-A|0,r=0|d[(o=e+144|0)>>2],n=(0|n)>0?(n+r|0)/(1|r<<1)|0:(n-r|0)/(1|r<<1)|0,m=0|d[(l=e+140|0)>>2],m=(i=((0|n)<0?m:0)+n|0)-((0|i)<((m+1|0)/2|0)?0:m)|0,f=e+196+(12*f|0)+4|0,ei(e,t,(r=(n=r|t?0:(d[f>>2]<<1)-1+a>>31)^m)>>30^r<<1,0|d[e+156>>2]),r=0|d[e+160>>2],t=(0|d[c>>2])+((0|m)>-1?m:0-m|0)|0,n=(0|d[f>>2])+(0|E(d[o>>2]<<1|1,m))|0,(0|(i=0|h[p>>1]))==(0|r)&&(t>>=1,n>>=1,i=r>>1),d[c>>2]=t,r=i+1|0,h[p>>1]=r,(0|(t=r+n|0))>=1?(0|n)>0&&(n=n-r|0,p=0|h[s>>1],h[s>>1]=(p<<16>>16<127&1)+(65535&p),n=(0|n)>0?0:n):(n=0|h[s>>1],h[s>>1]=(65535&n)-(n<<16>>16>-128&1),n=(0|t)>(0|~i)?t:0-i|0),d[f>>2]=n,r=0|d[o>>2],(0|(t=(0|E(i=r<<1|1,(m^A)-A|0))+g|0))>=(0-r|0)?((n=0|d[u>>2])+r|0)<(0|t)&&(t=t-(0|E(0|d[l>>2],i))|0):(t=(0|E(0|d[l>>2],i))+t|0,n=0|d[u>>2]),(t&n)==(0|t)?(A=t,0|(A&=255)):(A=n&~(t>>31),0|(A&=255))}function Jt(e,t,i){t|=0,i|=0;var r,n,a,o=0,s=0,l=0,c=0,u=0;for(u=(0|d[(e|=0)+180>>2])-t|0,n=0|d[e+4608>>2],a=0|d[e+4604>>2],r=255&(s=0|f[n+(t+-1)|0]),i=e+144|0,l=0;!((0|((0|(c=(0|m[(o=n+(l+t)|0)|0])-r|0))>-1?c:0-c))>(0|d[i>>2]));)if(f[o|0]=s,(0|(l=l+1|0))==(0|u)){l=u;break}if(s=(0|l)==(0|u),1<<(o=0|d[36476+(d[(c=e+4600|0)>>2]<<2)>>2])>(0|l))i=l;else{i=l;do{ct(e,1,1),o=0|d[c>>2],i=i-(1<>2])|0,o=(0|o)>30?31:o+1|0,d[c>>2]=o,o=0|d[36476+(o<<2)>>2]}while((0|i)>=1<>2],(0|((0|s)>-1?s:0-s))>(0|n)?(a=r-i>>31|1,t=0|E(a,t-r|0),t=(0|t)>0?(n+t|0)/(1|n<<1)|0:(t-n|0)/(1|n<<1)|0,s=e+140|0,n=0|d[s>>2],i=((0|t)<0?n:0)+t|0,n=i-((0|i)<((n+1|0)/2|0)?0:n)|0,$t(e,e+4576|0,n),n=0|E(n,a),a=0|d[o>>2],o=a<<1|1,n=(0|E(n,o))+r|0,(0|n)>=(0-a|0)?(t=0|d[l>>2],(t+a|0)<(0|n)&&(n=n-(0|E(0|d[s>>2],o))|0)):(n=(0|E(0|d[s>>2],o))+n|0,t=0|d[l>>2]),(n&t)==(0|n)?(l=n,l&=255,0|l):(l=t&~(n>>31),l&=255,0|l)):(t=t-i|0,t=(0|t)>0?(n+t|0)/(1|n<<1)|0:(t-n|0)/(1|n<<1)|0,s=e+140|0,n=0|d[s>>2],a=((0|t)<0?n:0)+t|0,n=a-((0|a)<((n+1|0)/2|0)?0:n)|0,$t(e,e+4588|0,n),a=0|d[o>>2],o=a<<1|1,n=(0|E(o,n))+i|0,(0|n)>=(0-a|0)?(t=0|d[l>>2],(t+a|0)<(0|n)&&(n=n-(0|E(0|d[s>>2],o))|0)):(n=(0|E(0|d[s>>2],o))+n|0,t=0|d[l>>2]),(n&t)==(0|n)?(l=n,l&=255,0|l):(l=t&~(n>>31),l&=255,0|l))}(e,0|m[(t=n+(u=l+t|0)|0)|0],r,0|m[a+u|0]),f[t|0]=e,e=0|d[c>>2],d[c>>2]=(0|e)<1?0:e+-1|0,0|(e=l+1|0))}function $t(e,t,i){e|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;if(r=0|m[(o=(t|=0)+9|0)|0],n=0|d[(a=t+4|0)>>2],(0|r)<(0|(l=(0|E(r>>>1,n))+(0|d[t>>2])|0))){c=r,s=0;do{c<<=1,s=s+1|0}while((0|c)<(0|l));l=s}else l=0;(0|i)>0&!(0|l)&&m[t+10|0]<<1>>>0>>0?s=1:u=5;do{if(5==(0|u)){if((s=(0|i)<0)&&m[t+10|0]<<1>>>0>=r>>>0){s=1;break}s&=!!(0|l)}}while(0);if(ei(e,l,s=(((0|i)>-1?i:0-i)<<1)-n+(s<<31>>31)|0,(0|d[e+156>>2])-1-(0|d[36476+(d[e+4600>>2]<<2)>>2])|0),(0|i)<0&&(f[(e=t+10|0)|0]=1+(0|m[e|0])),s=(s+1-(0|d[a>>2])>>1)+(0|d[t>>2])|0,d[t>>2]=s,(l=0|f[o|0])<<24>>24!=(0|f[t+8|0]))return t=l,t=(t&=255)+1|0,t&=255,void(f[o|0]=t);d[t>>2]=s>>1,e=(255&l)>>>1,f[o|0]=e,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=e,t=(t&=255)+1|0,t&=255,f[o|0]=t}function ei(e,t,i,r){var n,a,o=0;if((0|(o=(i|=0)>>(t|=0)))<((a=(r|=0)-(0|d[(n=(e|=0)+148|0)>>2])|0)+-1|0))return(0|o)>30&&(ct(e,0,r=(0|o)/2|0),o=o-r|0),ct(e,1,o+1|0),void ct(e,(1<31?(ct(e,0,31),ct(e,1,r+-31-(0|d[n>>2])|0)):ct(e,1,a),ct(e,(1<<(t=0|d[n>>2]))-1&i+-1,t)}function ti(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u=0,m=0,g=0,p=0,A=0;if((0|(i=0|h[(A=(e|=0)+188+(12*(a=((c=(t|=0)>>31)^t)-c|0)|0)+10|0)>>1]))<(0|(n=0|d[(s=e+188+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(t=5;i<>1]^c)-c+r|0)&(n=0|d[(l=e+128|0)>>2]))==(0|i)?i:n&~(i>>31),(0|d[(i=e+112|0)>>2])<8&&mt(e),r=0|d[(n=e+108|0)>>2],(m=0|d[2832+(t<<11)+((u=r>>>24)<<3)+4>>2])?(d[i>>2]=(0|d[i>>2])-m,d[n>>2]=r<>2]):(g=0|d[e+148>>2],n=0|d[e+140>>2],(0|(i=0|ai(e)))<(g+-1-n|0)?t&&(i=(0|oi(e,t))+(i<>31^i>>1))>-1?i:0-i))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),e=y,y=0,1&e?(e=0|ae(),re(0|i),de(0|e)):De(0|i,824,96))),r=0|d[(g=e+136|0)>>2],t?m=i:m=(n=r?0:(d[e+188+(12*a|0)+4>>2]<<1)-1+(0|h[A>>1])>>31)^i,t=0|d[e+152>>2],n=(0|d[s>>2])+((0|m)>-1?m:0-m|0)|0,i=(0|d[(u=e+188+(12*a|0)+4|0)>>2])+(0|E(r<<1|1,m))|0,(0|(r=0|h[A>>1]))==(0|t)&&(n>>=1,i>>=1,r=t>>1),d[s>>2]=n,t=r+1|0,h[A>>1]=t,(0|(n=t+i|0))>=1?(0|i)>0&&(i=i-t|0,A=0|h[o>>1],h[o>>1]=(A<<16>>16<127&1)+(65535&A),i=(0|i)>0?0:i):(i=0|h[o>>1],h[o>>1]=(65535&i)-(i<<16>>16>-128&1),i=(0|n)>(0|~r)?n:0-r|0),d[u>>2]=i,t=0|d[g>>2],(0|(n=(0|E(r=t<<1|1,(m^c)-c|0))+p|0))>=(0-t|0)?((i=0|d[l>>2])+t|0)<(0|n)&&(n=n-(0|E(0|d[e+132>>2],r))|0):(n=(0|E(0|d[e+132>>2],r))+n|0,i=0|d[l>>2]),(n&i)==(0|n)?(e=n,0|(e&=65535)):(e=i&~(n>>31),0|(e&=65535))}function ii(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0,m=0,g=0;for(a=(e|=0)+108|0,o=e+4592|0,s=0|d[(n=e+112|0)>>2],l=0;;){if((0|s)<1&&(mt(e),s=0|d[n>>2]),c=0|d[a>>2],s=s+-1|0,d[n>>2]=s,d[a>>2]=c<<1,(0|c)>=0){u=8;break}if(c=0|d[o>>2],l=(g=(0|(m=1<>2]))<(0|(g=r-l|0))?m:g)+l|0,(0|g)==(0|m)&&(d[o>>2]=(0|c)>30?31:c+1|0),(0|l)==(0|r)){s=r;break}}if(8==(0|u)&&((0|l)!=(0|r)?(0|(s=(s=((s=0|d[o>>2])+-4|0)>>>0<28?0|oi(e,0|d[36476+(s<<2)>>2]):0)+l|0))>(0|r)&&(s=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|s,5,35648),g=y,y=0,1&g?(g=0|ae(),re(0|s),de(0|g)):De(0|s,824,96)):s=r),!((0|s)>0))return 0|s;l=0;do{h[i+(l<<1)>>1]=t,l=l+1|0}while((0|l)!=(0|s));return 0|s}function ri(e,t,i){var r,n=0,a=0,o=0;return r=(e|=0)+128|0,(0|((0|(o=(t|=0)-(i|=0)|0))>-1?o:0-o))>(0|d[(n=e+136|0)>>2])?(t=0|E(0|ni(e,e+4568|0),i-t>>31|1),a=0|d[n>>2],(0|(t=(0|E(t,o=a<<1|1))+i|0))>=(0-a|0)?((n=0|d[r>>2])+a|0)<(0|t)&&(t=t-(0|E(0|d[e+132>>2],o))|0):(t=(0|E(0|d[e+132>>2],o))+t|0,n=0|d[r>>2]),(t&n)==(0|t)?(e=t,0|(e&=65535)):(e=n&~(t>>31),0|(e&=65535))):(i=0|ni(e,e+4580|0),o=0|d[n>>2],(0|(t=(0|E(a=o<<1|1,i))+t|0))>=(0-o|0)?((n=0|d[r>>2])+o|0)<(0|t)&&(t=t-(0|E(0|d[e+132>>2],a))|0):(t=(0|E(0|d[e+132>>2],a))+t|0,n=0|d[r>>2]),(t&n)==(0|t)?(e=t,0|(e&=65535)):(e=n&~(t>>31),0|(e&=65535)))}function ni(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;s=0|d[e+148>>2],l=0|d[36476+(d[e+4592>>2]<<2)>>2],r=0|d[e+140>>2],a=0|ai(e);do{if((0|a)<(s+-2-l-r|0)){if(n){r=s=1&(a=(l=(0|oi(e,n))+(a<>2])|0),o=1,a=(s+a|0)/2|0;break}e=((r=1&(e=(n=0|d[o>>2])+a|0))+e|0)/2|0,c=8;break}e=((r=1&(e=(a=1+(0|oi(e,r))|0)+(s=0|d[o>>2])|0))+e|0)/2|0,n?(l=a,o=1,a=e,n=s):(n=s,c=8)}while(0);return 8==(0|c)&&(l=a,o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0,a=e),(0|(a=!!(0|r)^o?a:0-a|0))<0&&(f[(c=t+10|0)|0]=1+(0|m[c|0])),r=(l+1-n>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(t=n,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a):(d[t>>2]=r>>1,c=(255&n)>>>1,f[i|0]=c,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=c,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a)}function ai(e){var t,i=0,r=0,n=0,a=0,o=0;if((0|d[(t=(e|=0)+112|0)>>2])<16&&mt(e),(0|(r=0|d[(o=e+108|0)>>2]))>=0){if(1073741824&r)i=1;else if(536870912&r)i=2;else if(268435456&r)i=3;else if(134217728&r)i=4;else if(67108864&r)i=5;else if(33554432&r)i=6;else if(16777216&r)i=7;else if(8388608&r)i=8;else if(4194304&r)i=9;else if(2097152&r)i=10;else if(1048576&r)i=11;else if(524288&r)i=12;else if(262144&r)i=13;else if(131072&r)i=14;else if(i=(a=r>>>12&16)+-1|0,!a){for(i=(0|d[t>>2])-15|0,d[t>>2]=i,n=r<<15,d[o>>2]=n,r=i,i=15;(0|r)<1?(mt(e),a=0|d[o>>2],r=0|d[t>>2]):a=n,r=r+-1|0,d[t>>2]=r,n=a<<1,d[o>>2]=n,!((0|a)<0);)i=i+1|0;return 0|i}}else i=0;return e=i+1|0,d[t>>2]=(0|d[t>>2])-e,d[o>>2]=r<>2]))<(0|t)&&(mt(e),(0|(n=0|d[i>>2]))<(0|t)&&(n=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|n,5,35648),e=y,y=0,1&e?(e=0|ae(),re(0|n),de(0|e)):De(0|n,824,96))),e=0|d[(r=e+108|0)>>2],d[i>>2]=n-t,d[r>>2]=e<>>(32-t|0)|0}function si(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0,m=0,g=0;for(a=(e|=0)+108|0,o=e+4592|0,s=0|d[(n=e+112|0)>>2],l=0;;){if((0|s)<1&&(mt(e),s=0|d[n>>2]),c=0|d[a>>2],s=s+-1|0,d[n>>2]=s,d[a>>2]=c<<1,(0|c)>=0){u=8;break}if(c=0|d[o>>2],l=(g=(0|(m=1<>2]))<(0|(g=r-l|0))?m:g)+l|0,(0|g)==(0|m)&&(d[o>>2]=(0|c)>30?31:c+1|0),(0|l)==(0|r)){s=r;break}}if(8==(0|u)&&((0|l)!=(0|r)?(0|(s=(s=((s=0|d[o>>2])+-4|0)>>>0<28?0|oi(e,0|d[36476+(s<<2)>>2]):0)+l|0))>(0|r)&&(s=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|s,5,35648),g=y,y=0,1&g?(g=0|ae(),re(0|s),de(0|g)):De(0|s,824,96)):s=r),(0|s)<=0)return 0|s;l=0;do{h[(g=i+(6*l|0)|0)>>1]=0|h[t>>1],h[g+2>>1]=0|h[t+2>>1],h[g+4>>1]=0|h[t+4>>1],l=l+1|0}while((0|l)!=(0|s));return 0|s}function li(e,t,i,r){e|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0,f=0;if(f=0|ui(t|=0,u=t+4568|0),c=0|ui(t,u),u=0|ui(t,u),l=t+128|0,s=0|g[r>>1],a=0|d[t+136>>2],(0|(s=(0|E(0|E(o=a<<1|1,f),s-(0|g[i>>1])>>31|1))+s|0))>=(0|(f=0-a|0))?((l=0|d[l>>2])+a|0)<(0|s)&&(s=s-(0|E(0|d[t+132>>2],o))|0):(s=(0|E(0|d[t+132>>2],o))+s|0,l=0|d[l>>2]),(s&l)!=(0|s)&&(s=l&~(s>>31)),n=65535&s,s=0|g[r+2>>1],(0|(s=(0|E(0|E(o,c),s-(0|g[i+2>>1])>>31|1))+s|0))>=(0|f)?(l+a|0)<(0|s)&&(s=s-(0|E(0|d[t+132>>2],o))|0):s=(0|E(0|d[t+132>>2],o))+s|0,(s&l)!=(0|s)&&(s=l&~(s>>31)),c=65535&s,s=0|g[r+4>>1],(0|(s=(0|E(0|E(o,u),s-(0|g[i+4>>1])>>31|1))+s|0))>=(0|f)?(l+a|0)<(0|s)&&(s=s-(0|E(0|d[t+132>>2],o))|0):s=(0|E(0|d[t+132>>2],o))+s|0,(s&l)==(0|s))return t=s,t&=65535,h[e>>1]=n,h[(f=e+2|0)>>1]=c,void(h[(e=e+4|0)>>1]=t);t=l&~(s>>31),t&=65535,h[e>>1]=n,h[(f=e+2|0)>>1]=c,h[(e=e+4|0)>>1]=t}function ci(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u=0,m=0,g=0,p=0,A=0;if((0|(i=0|h[(A=(e|=0)+188+(12*(a=((c=(t|=0)>>31)^t)-c|0)|0)+10|0)>>1]))<(0|(n=0|d[(s=e+188+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(t=5;i<>1]^c)-c+r|0)&(n=0|d[(l=e+128|0)>>2]))==(0|i)?i:n&~(i>>31),(0|d[(i=e+112|0)>>2])<8&&mt(e),r=0|d[(n=e+108|0)>>2],(m=0|d[2832+(t<<11)+((u=r>>>24)<<3)+4>>2])?(d[i>>2]=(0|d[i>>2])-m,d[n>>2]=r<>2]):(g=0|d[e+148>>2],n=0|d[e+140>>2],(0|(i=0|ai(e)))<(g+-1-n|0)?t&&(i=(0|oi(e,t))+(i<>31^i>>1))>-1?i:0-i))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),e=y,y=0,1&e?(e=0|ae(),re(0|i),de(0|e)):De(0|i,824,96))),r=0|d[(g=e+136|0)>>2],t?m=i:m=(n=r?0:(d[e+188+(12*a|0)+4>>2]<<1)-1+(0|h[A>>1])>>31)^i,t=0|d[e+152>>2],n=(0|d[s>>2])+((0|m)>-1?m:0-m|0)|0,i=(0|d[(u=e+188+(12*a|0)+4|0)>>2])+(0|E(r<<1|1,m))|0,(0|(r=0|h[A>>1]))==(0|t)&&(n>>=1,i>>=1,r=t>>1),d[s>>2]=n,t=r+1|0,h[A>>1]=t,(0|(n=t+i|0))>=1?(0|i)>0&&(i=i-t|0,A=0|h[o>>1],h[o>>1]=(A<<16>>16<127&1)+(65535&A),i=(0|i)>0?0:i):(i=0|h[o>>1],h[o>>1]=(65535&i)-(i<<16>>16>-128&1),i=(0|n)>(0|~r)?n:0-r|0),d[u>>2]=i,t=0|d[g>>2],(0|(n=(0|E(r=t<<1|1,(m^c)-c|0))+p|0))>=(0-t|0)?((i=0|d[l>>2])+t|0)<(0|n)&&(n=n-(0|E(0|d[e+132>>2],r))|0):(n=(0|E(0|d[e+132>>2],r))+n|0,i=0|d[l>>2]),(n&i)==(0|n)?(e=n,0|(e&=65535)):(e=i&~(n>>31),0|(e&=65535))}function ui(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;s=0|d[e+148>>2],l=0|d[36476+(d[e+4592>>2]<<2)>>2],r=0|d[e+140>>2],a=0|ai(e);do{if((0|a)<(s+-2-l-r|0)){if(n){r=s=1&(a=(l=(0|oi(e,n))+(a<>2])|0),o=1,a=(s+a|0)/2|0;break}e=((r=1&(e=(n=0|d[o>>2])+a|0))+e|0)/2|0,c=8;break}e=((r=1&(e=(a=1+(0|oi(e,r))|0)+(s=0|d[o>>2])|0))+e|0)/2|0,n?(l=a,o=1,a=e,n=s):(n=s,c=8)}while(0);return 8==(0|c)&&(l=a,o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0,a=e),(0|(a=!!(0|r)^o?a:0-a|0))<0&&(f[(c=t+10|0)|0]=1+(0|m[c|0])),r=(l+1-n>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(t=n,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a):(d[t>>2]=r>>1,c=(255&n)>>>1,f[i|0]=c,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=c,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a)}function fi(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0,h=0,m=0;for(a=(e|=0)+108|0,o=e+4592|0,s=0|d[(n=e+112|0)>>2],l=0;;){if((0|s)<1&&(mt(e),s=0|d[n>>2]),c=0|d[a>>2],s=s+-1|0,d[n>>2]=s,d[a>>2]=c<<1,(0|c)>=0){u=8;break}if(c=0|d[o>>2],l=(m=(0|(h=1<>2]))<(0|(m=r-l|0))?h:m)+l|0,(0|m)==(0|h)&&(d[o>>2]=(0|c)>30?31:c+1|0),(0|l)==(0|r)){s=r;break}}if(8==(0|u)&&((0|l)!=(0|r)?(0|(s=(s=((s=0|d[o>>2])+-4|0)>>>0<28?0|oi(e,0|d[36476+(s<<2)>>2]):0)+l|0))>(0|r)&&(s=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|s,5,35648),m=y,y=0,1&m?(m=0|ae(),re(0|s),de(0|m)):De(0|s,824,96)):s=r),(0|s)<=0)return 0|s;l=0;do{f[(m=i+(3*l|0)|0)|0]=0|f[t|0],f[m+1|0]=0|f[t+1|0],f[m+2|0]=0|f[t+2|0],l=l+1|0}while((0|l)!=(0|s));return 0|s}function hi(e,t,i,r){e|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0,h=0;if(h=0|mi(t|=0,u=t+4568|0),c=0|mi(t,u),u=0|mi(t,u),l=t+128|0,s=0|m[r|0],a=0|d[t+136>>2],(0|(s=(0|E(0|E(o=a<<1|1,h),s-(0|m[i|0])>>31|1))+s|0))>=(0|(h=0-a|0))?((l=0|d[l>>2])+a|0)<(0|s)&&(s=s-(0|E(0|d[t+132>>2],o))|0):(s=(0|E(0|d[t+132>>2],o))+s|0,l=0|d[l>>2]),(s&l)!=(0|s)&&(s=l&~(s>>31)),n=255&s,s=0|m[r+1|0],(0|(s=(0|E(0|E(o,c),s-(0|m[i+1|0])>>31|1))+s|0))>=(0|h)?(l+a|0)<(0|s)&&(s=s-(0|E(0|d[t+132>>2],o))|0):s=(0|E(0|d[t+132>>2],o))+s|0,(s&l)!=(0|s)&&(s=l&~(s>>31)),c=255&s,s=0|m[r+2|0],(0|(s=(0|E(0|E(o,u),s-(0|m[i+2|0])>>31|1))+s|0))>=(0|h)?(l+a|0)<(0|s)&&(s=s-(0|E(0|d[t+132>>2],o))|0):s=(0|E(0|d[t+132>>2],o))+s|0,(s&l)==(0|s))return t=s,t&=255,f[e|0]=n,f[(h=e+1|0)|0]=c,void(f[(e=e+2|0)|0]=t);t=l&~(s>>31),t&=255,f[e|0]=n,f[(h=e+1|0)|0]=c,f[(e=e+2|0)|0]=t}function di(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u=0,m=0,g=0,p=0,A=0;if((0|(i=0|h[(A=(e|=0)+188+(12*(a=((c=(t|=0)>>31)^t)-c|0)|0)+10|0)>>1]))<(0|(n=0|d[(s=e+188+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(t=5;i<>1]^c)-c+r|0)&(n=0|d[(l=e+128|0)>>2]))==(0|i)?i:n&~(i>>31),(0|d[(i=e+112|0)>>2])<8&&mt(e),r=0|d[(n=e+108|0)>>2],(m=0|d[2832+(t<<11)+((u=r>>>24)<<3)+4>>2])?(d[i>>2]=(0|d[i>>2])-m,d[n>>2]=r<>2]):(g=0|d[e+148>>2],n=0|d[e+140>>2],(0|(i=0|ai(e)))<(g+-1-n|0)?t&&(i=(0|oi(e,t))+(i<>31^i>>1))>-1?i:0-i))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),e=y,y=0,1&e?(e=0|ae(),re(0|i),de(0|e)):De(0|i,824,96))),r=0|d[(g=e+136|0)>>2],t?m=i:m=(n=r?0:(d[e+188+(12*a|0)+4>>2]<<1)-1+(0|h[A>>1])>>31)^i,t=0|d[e+152>>2],n=(0|d[s>>2])+((0|m)>-1?m:0-m|0)|0,i=(0|d[(u=e+188+(12*a|0)+4|0)>>2])+(0|E(r<<1|1,m))|0,(0|(r=0|h[A>>1]))==(0|t)&&(n>>=1,i>>=1,r=t>>1),d[s>>2]=n,t=r+1|0,h[A>>1]=t,(0|(n=t+i|0))>=1?(0|i)>0&&(i=i-t|0,A=0|h[o>>1],h[o>>1]=(A<<16>>16<127&1)+(65535&A),i=(0|i)>0?0:i):(i=0|h[o>>1],h[o>>1]=(65535&i)-(i<<16>>16>-128&1),i=(0|n)>(0|~r)?n:0-r|0),d[u>>2]=i,t=0|d[g>>2],(0|(n=(0|E(r=t<<1|1,(m^c)-c|0))+p|0))>=(0-t|0)?((i=0|d[l>>2])+t|0)<(0|n)&&(n=n-(0|E(0|d[e+132>>2],r))|0):(n=(0|E(0|d[e+132>>2],r))+n|0,i=0|d[l>>2]),(n&i)==(0|n)?(e=n,0|(e&=255)):(e=i&~(n>>31),0|(e&=255))}function mi(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;s=0|d[e+148>>2],l=0|d[36476+(d[e+4592>>2]<<2)>>2],r=0|d[e+140>>2],a=0|ai(e);do{if((0|a)<(s+-2-l-r|0)){if(n){r=s=1&(a=(l=(0|oi(e,n))+(a<>2])|0),o=1,a=(s+a|0)/2|0;break}e=((r=1&(e=(n=0|d[o>>2])+a|0))+e|0)/2|0,c=8;break}e=((r=1&(e=(a=1+(0|oi(e,r))|0)+(s=0|d[o>>2])|0))+e|0)/2|0,n?(l=a,o=1,a=e,n=s):(n=s,c=8)}while(0);return 8==(0|c)&&(l=a,o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0,a=e),(0|(a=!!(0|r)^o?a:0-a|0))<0&&(f[(c=t+10|0)|0]=1+(0|m[c|0])),r=(l+1-n>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(t=n,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a):(d[t>>2]=r>>1,c=(255&n)>>>1,f[i|0]=c,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=c,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a)}function gi(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s=0,l=0,c=0,u=0,m=0,g=0,p=0;if((0|(i=0|h[(g=(e|=0)+164+(12*(a=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+164+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(s=5;i<>1]^p)-p+r|0))!=(0|i)&&(i=i>>31&65535^65535),(0|d[(n=e+112|0)>>2])<8&&mt(e),l=0|d[(r=e+108|0)>>2],(u=0|d[2832+(s<<11)+((c=l>>>24)<<3)+4>>2])?(d[n>>2]=(0|d[n>>2])-u,d[r>>2]=l<>2]):((0|(n=0|ai(e)))<47?s&&(n=(0|oi(e,s))+(n<>31^n>>1))>-1?n:0-n))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),t=y,y=0,1&t?(t=0|ae(),re(0|i),de(0|t)):De(0|i,824,96))),r=0|d[(u=e+164+(12*a|0)+4|0)>>2],s?s=0|h[g>>1]:(s=e=0|h[g>>1],n^=(r<<1)-1+(e<<16>>16)>>31),c=r+n>>(e=1&(l=s<<16>>16==64)),l=l?32:s<<16>>16,d[m>>2]=((0|n)>-1?n:0-n|0)+(0|d[m>>2])>>e,r=l+1|0,h[g>>1]=r,(0|(s=r+c|0))<1?(g=0|h[o>>1],h[o>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|s)>(0|~l)?s:0-l|0,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=65535)):(0|c)<=0?(g=c,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=65535)):(g=c-r|0,m=0|h[o>>1],h[o>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=65535))}function pi(e,t,i){t|=0,i|=0;var r,n,a=0,o=0;return a=0|d[(n=(e|=0)+4576|0)>>2],a=0|function(e,t,i,r){t|=0,i|=0,r|=0;var n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,g=0;for(l=108+(e|=0)|0,c=e+4568|0,n=0|d[(s=e+112|0)>>2],a=0;;){if((0|n)<1&&(mt(e),n=0|d[s>>2]),o=0|d[l>>2],n=n+-1|0,d[s>>2]=n,d[l>>2]=o<<1,(0|o)>=0){u=8;break}if(o=0|d[c>>2],a=(g=(0|(m=1<>2]))<(0|(g=r-a|0))?m:g)+a|0,(0|g)==(0|m)&&(d[c>>2]=(0|o)>30?31:o+1|0),(0|a)==(0|r)){n=r;break}}if(8==(0|u)&&((0|a)!=(0|r)?(0|(n=(n=((n=0|d[c>>2])+-4|0)>>>0<28?0|oi(e,0|d[36476+(n<<2)>>2]):0)+a|0))>(0|r)&&(n=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|n,5,35648),g=y,y=0,1&g?(g=0|ae(),re(0|n),de(0|g)):De(0|n,824,96)):n=r),!((0|n)>0))return 0|n;a=0;do{h[i+(a<<1)>>1]=t,a=a+1|0}while((0|a)!=(0|n));return 0|n}(e,i=0|h[a+(t+-1<<1)>>1],a+(t<<1)|0,(0|d[(o=e+148|0)>>2])-t|0),(0|(r=a+t|0))==(0|d[o>>2])?0|(o=a):(i=(0|((0|(o=(i&=65535)-(t=0|g[(0|d[e+4572>>2])+(r<<1)>>1])|0))>-1?o:0-o))<1?(0|Ai(e,e+4556|0))+i|0:(0|E(0|Ai(e,e+4544|0),t-i>>31|1))+t|0,h[(0|d[n>>2])+(r<<1)>>1]=i,e=0|d[(o=e+4568|0)>>2],d[o>>2]=(0|e)<1?0:e+-1|0,0|(o=a+1|0))}function Ai(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;a=0|d[36476+(d[e+4568>>2]<<2)>>2],r=0|ai(e);do{if((0|r)<(46-a|0)){if(n){n=l=1&(a=(r=(0|oi(e,n))+(r<>2])|0),o=1,a=(l+a|0)/2|0;break}a=((n=1&(a=(e=0|d[o>>2])+r|0))+a|0)/2|0,s=8;break}a=((o=1&(a=(r=1+(0|oi(e,16))|0)+(e=0|d[o>>2])|0))+a|0)/2|0,n?(n=o,o=1):(n=o,s=8)}while(0);return 8==(0|s)&&(o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0),(0|(a=!!(0|n)^o?a:0-a|0))<0&&(f[(l=t+10|0)|0]=1+(0|m[l|0])),r=(r+1-e>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(l=n,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a):(d[t>>2]=r>>1,l=(255&n)>>>1,f[i|0]=l,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a)}function Si(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s=0,l=0,c=0,u=0,m=0,g=0,p=0;if((0|(i=0|h[(g=(e|=0)+164+(12*(a=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+164+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(s=5;i<>1]^p)-p+r|0))!=(0|i)&&(i=i>>31&4095^4095),(0|d[(n=e+112|0)>>2])<8&&mt(e),l=0|d[(r=e+108|0)>>2],(u=0|d[2832+(s<<11)+((c=l>>>24)<<3)+4>>2])?(d[n>>2]=(0|d[n>>2])-u,d[r>>2]=l<>2]):((0|(n=0|ai(e)))<35?s&&(n=(0|oi(e,s))+(n<>31^n>>1))>-1?n:0-n))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),t=y,y=0,1&t?(t=0|ae(),re(0|i),de(0|t)):De(0|i,824,96))),r=0|d[(u=e+164+(12*a|0)+4|0)>>2],s?s=0|h[g>>1]:(s=e=0|h[g>>1],n^=(r<<1)-1+(e<<16>>16)>>31),c=r+n>>(e=1&(l=s<<16>>16==64)),l=l?32:s<<16>>16,d[m>>2]=((0|n)>-1?n:0-n|0)+(0|d[m>>2])>>e,r=l+1|0,h[g>>1]=r,(0|(s=r+c|0))<1?(g=0|h[o>>1],h[o>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|s)>(0|~l)?s:0-l|0,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,t&=4095,0|(t&=65535)):(0|c)<=0?(g=c,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,t&=4095,0|(t&=65535)):(g=c-r|0,m=0|h[o>>1],h[o>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,t&=4095,0|(t&=65535))}function bi(e,t,i){t|=0,i|=0;var r,n,a=0,o=0;return a=0|d[(n=(e|=0)+4576|0)>>2],a=0|function(e,t,i,r){t|=0,i|=0,r|=0;var n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,g=0;for(l=108+(e|=0)|0,c=e+4568|0,n=0|d[(s=e+112|0)>>2],a=0;;){if((0|n)<1&&(mt(e),n=0|d[s>>2]),o=0|d[l>>2],n=n+-1|0,d[s>>2]=n,d[l>>2]=o<<1,(0|o)>=0){u=8;break}if(o=0|d[c>>2],a=(g=(0|(m=1<>2]))<(0|(g=r-a|0))?m:g)+a|0,(0|g)==(0|m)&&(d[c>>2]=(0|o)>30?31:o+1|0),(0|a)==(0|r)){n=r;break}}if(8==(0|u)&&((0|a)!=(0|r)?(0|(n=(n=((n=0|d[c>>2])+-4|0)>>>0<28?0|oi(e,0|d[36476+(n<<2)>>2]):0)+a|0))>(0|r)&&(n=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|n,5,35648),g=y,y=0,1&g?(g=0|ae(),re(0|n),de(0|g)):De(0|n,824,96)):n=r),!((0|n)>0))return 0|n;a=0;do{h[i+(a<<1)>>1]=t,a=a+1|0}while((0|a)!=(0|n));return 0|n}(e,i=0|h[a+(t+-1<<1)>>1],a+(t<<1)|0,(0|d[(o=e+148|0)>>2])-t|0),(0|(r=a+t|0))==(0|d[o>>2])?0|(o=a):(i=(0|((0|(o=(i&=65535)-(t=0|g[(0|d[e+4572>>2])+(r<<1)>>1])|0))>-1?o:0-o))<1?(0|vi(e,e+4556|0))+i|0:(0|E(0|vi(e,e+4544|0),t-i>>31|1))+t|0,h[(0|d[n>>2])+(r<<1)>>1]=4095&i,e=0|d[(o=e+4568|0)>>2],d[o>>2]=(0|e)<1?0:e+-1|0,0|(o=a+1|0))}function vi(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;a=0|d[36476+(d[e+4568>>2]<<2)>>2],r=0|ai(e);do{if((0|r)<(34-a|0)){if(n){n=l=1&(a=(r=(0|oi(e,n))+(r<>2])|0),o=1,a=(l+a|0)/2|0;break}a=((n=1&(a=(e=0|d[o>>2])+r|0))+a|0)/2|0,s=8;break}a=((o=1&(a=(r=1+(0|oi(e,12))|0)+(e=0|d[o>>2])|0))+a|0)/2|0,n?(n=o,o=1):(n=o,s=8)}while(0);return 8==(0|s)&&(o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0),(0|(a=!!(0|n)^o?a:0-a|0))<0&&(f[(l=t+10|0)|0]=1+(0|m[l|0])),r=(r+1-e>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(l=n,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a):(d[t>>2]=r>>1,l=(255&n)>>>1,f[i|0]=l,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a)}function wi(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s=0,l=0,c=0,u=0,m=0,g=0,p=0;if((0|(i=0|h[(g=(e|=0)+164+(12*(a=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+164+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(s=5;i<>1]^p)-p+r|0))!=(0|i)&&(i=i>>31&255^255),(0|d[(n=e+112|0)>>2])<8&&mt(e),l=0|d[(r=e+108|0)>>2],(u=0|d[2832+(s<<11)+((c=l>>>24)<<3)+4>>2])?(d[n>>2]=(0|d[n>>2])-u,d[r>>2]=l<>2]):((0|(n=0|ai(e)))<23?s&&(n=(0|oi(e,s))+(n<>31^n>>1))>-1?n:0-n))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),t=y,y=0,1&t?(t=0|ae(),re(0|i),de(0|t)):De(0|i,824,96))),r=0|d[(u=e+164+(12*a|0)+4|0)>>2],s?s=0|h[g>>1]:(s=e=0|h[g>>1],n^=(r<<1)-1+(e<<16>>16)>>31),c=r+n>>(e=1&(l=s<<16>>16==64)),l=l?32:s<<16>>16,d[m>>2]=((0|n)>-1?n:0-n|0)+(0|d[m>>2])>>e,r=l+1|0,h[g>>1]=r,(0|(s=r+c|0))<1?(g=0|h[o>>1],h[o>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|s)>(0|~l)?s:0-l|0,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=255)):(0|c)<=0?(g=c,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=255)):(g=c-r|0,m=0|h[o>>1],h[o>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=255))}function Ti(e,t,i){t|=0,i|=0;var r,n,a=0,o=0;return a=0|d[(n=(e|=0)+4576|0)>>2],a=0|function(e,t,i,r){t|=0,i|=0,r|=0;var n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;for(l=108+(e|=0)|0,c=e+4568|0,n=0|d[(s=e+112|0)>>2],a=0;;){if((0|n)<1&&(mt(e),n=0|d[s>>2]),o=0|d[l>>2],n=n+-1|0,d[s>>2]=n,d[l>>2]=o<<1,(0|o)>=0){u=8;break}if(o=0|d[c>>2],a=(m=(0|(h=1<>2]))<(0|(m=r-a|0))?h:m)+a|0,(0|m)==(0|h)&&(d[c>>2]=(0|o)>30?31:o+1|0),(0|a)==(0|r)){n=r;break}}return 8==(0|u)&&((0|a)!=(0|r)?(n=0|d[c>>2],n=(n+-4|0)>>>0<28?0|oi(e,0|d[36476+(n<<2)>>2]):0,n=n+a|0,(0|n)>(0|r)&&(n=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|n,5,35648),m=y,y=0,1&m?(m=0|ae(),re(0|n),de(0|m)):De(0|n,824,96))):n=r),(0|n)<=0||zn(0|i,0|t,0|n),0|n}(e,i=0|f[a+(t+-1)|0],a+t|0,(0|d[(o=e+148|0)>>2])-t|0),(0|(r=a+t|0))==(0|d[o>>2])?0|(o=a):(i=(0|((0|(o=(i&=255)-(t=0|m[(0|d[e+4572>>2])+r|0])|0))>-1?o:0-o))<1?(0|yi(e,e+4556|0))+i|0:(0|E(0|yi(e,e+4544|0),t-i>>31|1))+t|0,f[(0|d[n>>2])+r|0]=i,e=0|d[(o=e+4568|0)>>2],d[o>>2]=(0|e)<1?0:e+-1|0,0|(o=a+1|0))}function yi(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;a=0|d[36476+(d[e+4568>>2]<<2)>>2],r=0|ai(e);do{if((0|r)<(22-a|0)){if(n){n=l=1&(a=(r=(0|oi(e,n))+(r<>2])|0),o=1,a=(l+a|0)/2|0;break}a=((n=1&(a=(e=0|d[o>>2])+r|0))+a|0)/2|0,s=8;break}a=((o=1&(a=(r=1+(0|oi(e,8))|0)+(e=0|d[o>>2])|0))+a|0)/2|0,n?(n=o,o=1):(n=o,s=8)}while(0);return 8==(0|s)&&(o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0),(0|(a=!!(0|n)^o?a:0-a|0))<0&&(f[(l=t+10|0)|0]=1+(0|m[l|0])),r=(r+1-e>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(l=n,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a):(d[t>>2]=r>>1,l=(255&n)>>>1,f[i|0]=l,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a)}function Ci(e,t,i){t|=0,i|=0;var r,n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;return a=b,b=b+16|0,u=a+3|0,h=a,i=0|d[(l=(e|=0)+4576|0)>>2],r=0|f[(o=i+(3*(t+-1|0)|0)|0)|0],n=0|f[o+1|0],o=0|f[o+2|0],f[h|0]=r,f[h+1|0]=n,f[h+2|0]=o,s=(0|d[(c=e+148|0)>>2])-t|0,f[u|0]=0|f[h|0],f[u+1|0]=0|f[h+1|0],f[u+2|0]=0|f[h+2|0],s=0|function(e,t,i,r){t|=0,i|=0,r|=0;var n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;for(l=108+(e|=0)|0,c=e+4568|0,n=0|d[(s=e+112|0)>>2],a=0;;){if((0|n)<1&&(mt(e),n=0|d[s>>2]),o=0|d[l>>2],n=n+-1|0,d[s>>2]=n,d[l>>2]=o<<1,(0|o)>=0){u=8;break}if(o=0|d[c>>2],a=(m=(0|(h=1<>2]))<(0|(m=r-a|0))?h:m)+a|0,(0|m)==(0|h)&&(d[c>>2]=(0|o)>30?31:o+1|0),(0|a)==(0|r)){n=r;break}}if(8==(0|u)&&((0|a)!=(0|r)?(n=0|d[c>>2],n=(n+-4|0)>>>0<28?0|oi(e,0|d[36476+(n<<2)>>2]):0,n=n+a|0,(0|n)>(0|r)&&(n=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|n,5,35648),m=y,y=0,1&m?(m=0|ae(),re(0|n),de(0|m)):De(0|n,824,96))):n=r),(0|n)<=0)return 0|n;a=0;do{f[(m=i+(3*a|0)|0)|0]=0|f[t|0],f[m+1|0]=0|f[t+1|0],f[m+2|0]=0|f[t+2|0],a=a+1|0}while((0|a)!=(0|n));return 0|n}(e,u,i+(3*t|0)|0,s),(0|(i=s+t|0))==(0|d[c>>2])?(b=a,0|(h=s)):(u=(0|d[e+4572>>2])+(3*i|0)|0,t=0|f[u|0],c=0|f[u+1|0],u=0|f[u+2|0],h=0|d[l>>2],g=0|Di(e,l=e+4544|0),m=0|Di(e,l),t=(0|E((t&=255)-(255&r)>>31|1,g))+t&255,c=(0|E((c&=255)-(255&n)>>31|1,m))+c&255,u=(0|E((u&=255)-(255&o)>>31|1,0|Di(e,l)))+u&255,f[(h=h+(3*i|0)|0)|0]=t,f[h+1|0]=c,f[h+2|0]=u,u=0|d[(h=e+4568|0)>>2],d[h>>2]=(0|u)<1?0:u+-1|0,b=a,0|(h=s+1|0))}function Ii(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s=0,l=0,c=0,u=0,m=0,g=0,p=0;if((0|(i=0|h[(g=(e|=0)+164+(12*(a=((p=(t|=0)>>31)^t)-p|0)|0)+10|0)>>1]))<(0|(n=0|d[(m=e+164+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(s=5;i<>1]^p)-p+r|0))!=(0|i)&&(i=i>>31&255^255),(0|d[(n=e+112|0)>>2])<8&&mt(e),l=0|d[(r=e+108|0)>>2],(u=0|d[2832+(s<<11)+((c=l>>>24)<<3)+4>>2])?(d[n>>2]=(0|d[n>>2])-u,d[r>>2]=l<>2]):((0|(n=0|ai(e)))<23?s&&(n=(0|oi(e,s))+(n<>31^n>>1))>-1?n:0-n))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),t=y,y=0,1&t?(t=0|ae(),re(0|i),de(0|t)):De(0|i,824,96))),r=0|d[(u=e+164+(12*a|0)+4|0)>>2],s?s=0|h[g>>1]:(s=e=0|h[g>>1],n^=(r<<1)-1+(e<<16>>16)>>31),c=r+n>>(e=1&(l=s<<16>>16==64)),l=l?32:s<<16>>16,d[m>>2]=((0|n)>-1?n:0-n|0)+(0|d[m>>2])>>e,r=l+1|0,h[g>>1]=r,(0|(s=r+c|0))<1?(g=0|h[o>>1],h[o>>1]=(65535&g)-(g<<16>>16>-128&1),g=(0|s)>(0|~l)?s:0-l|0,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=255)):(0|c)<=0?(g=c,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=255)):(g=c-r|0,m=0|h[o>>1],h[o>>1]=(m<<16>>16<127&1)+(65535&m),g=(0|g)>0?0:g,d[u>>2]=g,t=(t=i+(t>>>=31)|0)+(p^=n)|0,0|(t&=255))}function Di(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;a=0|d[36476+(d[e+4568>>2]<<2)>>2],r=0|ai(e);do{if((0|r)<(22-a|0)){if(n){n=l=1&(a=(r=(0|oi(e,n))+(r<>2])|0),o=1,a=(l+a|0)/2|0;break}a=((n=1&(a=(e=0|d[o>>2])+r|0))+a|0)/2|0,s=8;break}a=((o=1&(a=(r=1+(0|oi(e,8))|0)+(e=0|d[o>>2])|0))+a|0)/2|0,n?(n=o,o=1):(n=o,s=8)}while(0);return 8==(0|s)&&(o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0),(0|(a=!!(0|n)^o?a:0-a|0))<0&&(f[(l=t+10|0)|0]=1+(0|m[l|0])),r=(r+1-e>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(l=n,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a):(d[t>>2]=r>>1,l=(255&n)>>>1,f[i|0]=l,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,l=(l&=255)+1|0,l&=255,f[i|0]=l,0|a)}function xi(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,n|=0,a|=0,o|=0,s|=0;var l,c,u,g,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0;E=b,b=b+32|0,c=E+16|0,l=E+12|0,I=E+8|0,u=E+4|0,g=E,p=0|rn(r|=0),d[I>>2]=p,y=0,I=0|G(37,0|I,44220),C=y,y=0,1&C&&(E=0|ae(),Nr(p),de(0|E)),Nr(p),d[n>>2]=0,C=I+8|0,p=0|d[t>>2];e:do{if((0|o)!=(0|s)){t:for(;;){A=p,p?(0|d[p+12>>2])==(0|d[p+16>>2])&&-1==(0|ts[127&d[36+(0|d[p>>2])>>2]](p))&&(d[t>>2]=0,p=0,A=0):p=0,w=!(0|p),S=v=0|d[i>>2];do{if(v){if((0|d[v+12>>2])==(0|d[v+16>>2])&&-1==(0|ts[127&d[36+(0|d[v>>2])>>2]](v))){d[i>>2]=0,S=0,x=12;break}if(!w){x=13;break t}}else x=12}while(0);if(12==(0|x)){if(x=0,w){x=13;break}v=0}i:do{if(rs[63&d[36+(0|d[I>>2])>>2]](I,0|f[o|0],0)<<24>>24==37){if((0|(v=o+1|0))==(0|s)){x=17;break t}switch((T=0|rs[63&d[36+(0|d[I>>2])>>2]](I,0|f[v|0],0))<<24>>24){case 48:case 69:if((0|(w=o+2|0))==(0|s)){x=20;break t}o=v,v=0|rs[63&d[36+(0|d[I>>2])>>2]](I,0|f[w|0],0),p=T;break;default:v=T,p=0}T=0|d[36+(0|d[e>>2])>>2],d[u>>2]=A,d[g>>2]=S,d[l>>2]=d[u>>2],d[c>>2]=d[g>>2],T=0|gs[15&T](e,l,c,r,n,a,v,p),d[t>>2]=T,o=o+2|0}else{if((A=0|f[o|0])<<24>>24>-1&&(D=0|d[C>>2],8192&h[D+(A<<24>>24<<1)>>1])){do{if((0|(o=o+1|0))==(0|s)){o=s;break}if((A=0|f[o|0])<<24>>24<=-1)break}while(8192&h[D+(A<<24>>24<<1)>>1]);for(A=v;;){p?(0|d[p+12>>2])==(0|d[p+16>>2])&&-1==(0|ts[127&d[36+(0|d[p>>2])>>2]](p))&&(d[t>>2]=0,p=0):p=0,S=!(0|p);do{if(v){if((0|d[v+12>>2])!=(0|d[v+16>>2])){if(S){T=A;break}break i}if(-1!=(0|ts[127&d[36+(0|d[v>>2])>>2]](v))){if(S^!(0|A)){T=A,v=A;break}break i}d[i>>2]=0,A=0,x=39;break}x=39}while(0);if(39==(0|x)){if(x=0,S)break i;T=A,v=0}if((255&(A=(0|(A=0|d[(S=p+12|0)>>2]))==(0|d[(w=p+16|0)>>2])?0|ts[127&d[36+(0|d[p>>2])>>2]](p):0|m[A|0]))<<24>>24<=-1||!(8192&h[(0|d[C>>2])+(A<<24>>24<<1)>>1]))break i;(0|(A=0|d[S>>2]))!=(0|d[w>>2])?(d[S>>2]=A+1,A=T):(ts[127&d[40+(0|d[p>>2])>>2]](p),A=T)}}if(A=(0|(A=0|d[(S=p+12|0)>>2]))==(0|d[(v=p+16|0)>>2])?0|ts[127&d[36+(0|d[p>>2])>>2]](p):0|m[A|0],(T=0|ls[63&d[12+(0|d[I>>2])>>2]](I,255&A))<<24>>24!=ls[63&d[12+(0|d[I>>2])>>2]](I,0|f[o|0])<<24>>24){x=57;break t}(0|(A=0|d[S>>2]))==(0|d[v>>2])?ts[127&d[40+(0|d[p>>2])>>2]](p):d[S>>2]=A+1,o=o+1|0}}while(0);if(p=0|d[t>>2],!((0|o)!=(0|s)&!(0|d[n>>2])))break e}if(13==(0|x)){d[n>>2]=4;break}if(17==(0|x)){d[n>>2]=4;break}if(20==(0|x)){d[n>>2]=4;break}if(57==(0|x)){d[n>>2]=4,p=0|d[t>>2];break}}}while(0);p?(0|d[p+12>>2])==(0|d[p+16>>2])&&-1==(0|ts[127&d[36+(0|d[p>>2])>>2]](p))&&(d[t>>2]=0,p=0):p=0,o=!(0|p),A=0|d[i>>2];do{if(A){if((0|d[A+12>>2])==(0|d[A+16>>2])&&-1==(0|ts[127&d[36+(0|d[A>>2])>>2]](A))){d[i>>2]=0,x=67;break}o||(x=68)}else x=67}while(0);return 67==(0|x)&&o&&(x=68),68==(0|x)&&(d[n>>2]=2|d[n>>2]),b=E,0|p}function Ei(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l;o=b,b=b+16|0,s=o+4|0,l=o,e=0|ts[127&d[d[(e=(e|=0)+8|0)>>2]>>2]](e),d[l>>2]=d[r>>2],d[s>>2]=d[l>>2],(0|(i=(0|_n(i,s,e,e+168|0,a,n,0))-e|0))<168&&(d[t>>2]=((0|i)/12|0)%7|0),b=o}function Mi(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l;o=b,b=b+16|0,s=o+4|0,l=o,e=0|ts[127&d[4+(0|d[(e=(e|=0)+8|0)>>2])>>2]](e),d[l>>2]=d[r>>2],d[s>>2]=d[l>>2],(0|(i=(0|_n(i,s,e,e+288|0,a,n,0))-e|0))<288&&(d[t>>2]=((0|i)/12|0)%12|0),b=o}function ki(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],e=0|Bn(i,e,n,a,4),4&d[n>>2]||(e=(0|e)<69?e+2e3|0:(e+-69|0)>>>0<31?e+1900|0:e,d[t>>2]=e+-1900),b=o}function Ri(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],((e=0|Bn(i,e,n,a,2))+-1|0)>>>0<31&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Fi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Bn(i,e,n,a,2)))<24&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Pi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],((e=0|Bn(i,e,n,a,2))+-1|0)>>>0<12&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Li(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Bn(i,e,n,a,3)))<366&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function _i(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Bn(i,e,n,a,2)))<13&!(4&(i=0|d[n>>2]))?d[t>>2]=e+-1:d[n>>2]=4|i,b=o}function Ni(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Bn(i,e,n,a,2)))<60&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Ui(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0;var a,o=0,s=0;a=(n|=0)+8|0;e:for(;;){n=0|d[t>>2];do{if(n){if((0|d[n+12>>2])==(0|d[n+16>>2])){if(-1==(0|ts[127&d[36+(0|d[n>>2])>>2]](n))){d[t>>2]=0,n=0;break}n=0|d[t>>2];break}}else n=0}while(0);n=!(0|n),e=0|d[i>>2];do{if(e){if((0|d[e+12>>2])!=(0|d[e+16>>2])){if(n)break;break e}if(-1!=(0|ts[127&d[36+(0|d[e>>2])>>2]](e))){if(n)break;break e}d[i>>2]=0,s=12;break}s=12}while(0);if(12==(0|s)){if(s=0,n){e=0;break}e=0}if(n=0|d[t>>2],(255&(n=(0|(o=0|d[n+12>>2]))==(0|d[n+16>>2])?0|ts[127&d[36+(0|d[n>>2])>>2]](n):0|m[o|0]))<<24>>24<=-1||!(8192&h[(0|d[a>>2])+(n<<24>>24<<1)>>1]))break;(n=0|d[t>>2],(0|(o=0|d[(e=n+12|0)>>2]))!=(0|d[n+16>>2]))?d[e>>2]=o+1:ts[127&d[40+(0|d[n>>2])>>2]](n)}n=0|d[t>>2];do{if(n){if((0|d[n+12>>2])==(0|d[n+16>>2])){if(-1==(0|ts[127&d[36+(0|d[n>>2])>>2]](n))){d[t>>2]=0,n=0;break}n=0|d[t>>2];break}}else n=0}while(0);n=!(0|n);do{if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])&&-1==(0|ts[127&d[36+(0|d[e>>2])>>2]](e))){d[i>>2]=0,s=32;break}n||(s=33)}else s=32}while(0);32==(0|s)&&n&&(s=33),33==(0|s)&&(d[r>>2]=2|d[r>>2])}function Oi(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c=0,u=0;l=b,b=b+16|0,o=l+4|0,s=l,u=0|ts[127&d[8+(0|d[(u=(e|=0)+8|0)>>2])>>2]](u),c=1&(e=0|f[u|0])?0|d[u+4>>2]:(255&e)>>>1,e=1&(e=0|f[u+12|0])?0|d[u+16>>2]:(255&e)>>>1;do{if((0|c)!=(0-e|0)){if(d[s>>2]=d[r>>2],d[o>>2]=d[s>>2],(0|(e=0|_n(i,o,u,u+24|0,a,n,0)))==(0|u)&12==(0|(c=0|d[t>>2]))){d[t>>2]=0;break}(0|c)<12&12==(e-u|0)&&(d[t>>2]=c+12)}else d[n>>2]=4|d[n>>2]}while(0);b=l}function Bi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Bn(i,e,n,a,2)))<61&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Vi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Bn(i,e,n,a,1)))<7&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function qi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],e=0|Bn(i,e,n,a,4),4&d[n>>2]||(d[t>>2]=e+-1900),b=o}function Gi(e,t,i,r,n){e|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0;e=0|d[(t|=0)>>2];do{if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(-1==(0|ts[127&d[36+(0|d[e>>2])>>2]](e))){d[t>>2]=0,e=0;break}e=0|d[t>>2];break}}else e=0}while(0);a=!(0|e),e=0|d[i>>2];do{if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])&&-1==(0|ts[127&d[36+(0|d[e>>2])>>2]](e))){d[i>>2]=0,s=11;break}a?(o=e,s=13):s=12}else s=11}while(0);11==(0|s)&&(a?s=12:(o=0,s=13));e:do{if(12==(0|s))d[r>>2]=6|d[r>>2];else if(13==(0|s)){if(e=0|d[t>>2],e=(0|(a=0|d[e+12>>2]))==(0|d[e+16>>2])?0|ts[127&d[36+(0|d[e>>2])>>2]](e):0|m[a|0],rs[63&d[36+(0|d[n>>2])>>2]](n,255&e,0)<<24>>24!=37){d[r>>2]=4|d[r>>2];break}e=0|d[t>>2],(0|(n=0|d[(a=e+12|0)>>2]))==(0|d[e+16>>2])?(ts[127&d[40+(0|d[e>>2])>>2]](e),(e=0|d[t>>2])?s=21:e=0):(d[a>>2]=n+1,s=21);do{if(21==(0|s)&&(0|d[e+12>>2])==(0|d[e+16>>2])){if(-1==(0|ts[127&d[36+(0|d[e>>2])>>2]](e))){d[t>>2]=0,e=0;break}e=0|d[t>>2];break}}while(0);e=!(0|e);do{if(o){if((0|d[o+12>>2])==(0|d[o+16>>2])&&-1==(0|ts[127&d[36+(0|d[o>>2])>>2]](o))){d[i>>2]=0,s=30;break}if(e)break e}else s=30}while(0);if(30==(0|s)&&!e)break;d[r>>2]=2|d[r>>2]}}while(0)}function Qi(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,n|=0,a|=0,o|=0,s|=0;var l,c,u,f,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0;T=b,b=b+32|0,c=T+16|0,l=T+12|0,v=T+8|0,u=T+4|0,f=T,h=0|rn(r|=0),d[v>>2]=h,y=0,v=0|G(37,0|v,44212),S=y,y=0,1&S&&(T=0|ae(),Nr(h),de(0|T)),Nr(h),d[n>>2]=0,h=0|d[t>>2];e:do{if((0|o)!=(0|s)){t:for(;;){g=h,h?-1==(0|(m=(0|(m=0|d[h+12>>2]))==(0|d[h+16>>2])?0|ts[127&d[36+(0|d[h>>2])>>2]](h):0|d[m>>2]))?(d[t>>2]=0,h=0,A=1,S=0):(A=0,S=g):(h=0,A=1,S=g),m=p=0|d[i>>2];do{if(p){if(-1!=(0|(g=(0|(g=0|d[p+12>>2]))==(0|d[p+16>>2])?0|ts[127&d[36+(0|d[p>>2])>>2]](p):0|d[g>>2]))){if(A)break;w=17;break t}d[i>>2]=0,m=0,w=15;break}w=15}while(0);if(15==(0|w)){if(w=0,A){w=17;break}p=0}i:do{if(rs[63&d[52+(0|d[v>>2])>>2]](v,0|d[o>>2],0)<<24>>24==37){if((0|(g=o+4|0))==(0|s)){w=21;break t}switch((A=0|rs[63&d[52+(0|d[v>>2])>>2]](v,0|d[g>>2],0))<<24>>24){case 48:case 69:if((0|(p=o+8|0))==(0|s)){w=24;break t}o=g,g=0|rs[63&d[52+(0|d[v>>2])>>2]](v,0|d[p>>2],0),h=A;break;default:g=A,h=0}A=0|d[36+(0|d[e>>2])>>2],d[u>>2]=S,d[f>>2]=m,d[l>>2]=d[u>>2],d[c>>2]=d[f>>2],S=0|gs[15&A](e,l,c,r,n,a,g,h),d[t>>2]=S,o=o+8|0}else{if(!(0|rs[63&d[12+(0|d[v>>2])>>2]](v,8192,0|d[o>>2]))){if(m=(0|(m=0|d[(g=h+12|0)>>2]))==(0|d[(p=h+16|0)>>2])?0|ts[127&d[36+(0|d[h>>2])>>2]](h):0|d[m>>2],(0|(S=0|ls[63&d[28+(0|d[v>>2])>>2]](v,m)))!=(0|ls[63&d[28+(0|d[v>>2])>>2]](v,0|d[o>>2]))){w=61;break t}(0|(m=0|d[g>>2]))==(0|d[p>>2])?ts[127&d[40+(0|d[h>>2])>>2]](h):d[g>>2]=m+4,o=o+4|0;break}do{if((0|(o=o+4|0))==(0|s)){o=s;break}}while(0|rs[63&d[12+(0|d[v>>2])>>2]](v,8192,0|d[o>>2]));for(m=p,A=p;;){h?-1==(0|(g=(0|(g=0|d[h+12>>2]))==(0|d[h+16>>2])?0|ts[127&d[36+(0|d[h>>2])>>2]](h):0|d[g>>2]))?(d[t>>2]=0,p=1,h=0):p=0:(p=1,h=0);do{if(A){if(-1!=(0|(g=(0|(g=0|d[A+12>>2]))==(0|d[A+16>>2])?0|ts[127&d[36+(0|d[A>>2])>>2]](A):0|d[g>>2]))){if(p^!(0|m)){S=m,A=m;break}break i}d[i>>2]=0,m=0,w=44;break}w=44}while(0);if(44==(0|w)){if(w=0,p)break i;S=m,A=0}if(m=(0|(m=0|d[(g=h+12|0)>>2]))==(0|d[(p=h+16|0)>>2])?0|ts[127&d[36+(0|d[h>>2])>>2]](h):0|d[m>>2],!(0|rs[63&d[12+(0|d[v>>2])>>2]](v,8192,m)))break i;(0|(m=0|d[g>>2]))!=(0|d[p>>2])?(d[g>>2]=m+4,m=S):(ts[127&d[40+(0|d[h>>2])>>2]](h),m=S)}}}while(0);if(h=0|d[t>>2],!((0|o)!=(0|s)&!(0|d[n>>2])))break e}if(17==(0|w)){d[n>>2]=4;break}if(21==(0|w)){d[n>>2]=4;break}if(24==(0|w)){d[n>>2]=4;break}if(61==(0|w)){d[n>>2]=4,h=0|d[t>>2];break}}}while(0);h?-1==(0|(o=(0|(o=0|d[h+12>>2]))==(0|d[h+16>>2])?0|ts[127&d[36+(0|d[h>>2])>>2]](h):0|d[o>>2]))?(d[t>>2]=0,h=0,g=1):g=0:(h=0,g=1),o=0|d[i>>2];do{if(o){if(-1!=(0|(o=(0|(m=0|d[o+12>>2]))==(0|d[o+16>>2])?0|ts[127&d[36+(0|d[o>>2])>>2]](o):0|d[m>>2]))){if(g)break;w=76;break}d[i>>2]=0,w=74;break}w=74}while(0);return 74==(0|w)&&g&&(w=76),76==(0|w)&&(d[n>>2]=2|d[n>>2]),b=T,0|h}function zi(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l;o=b,b=b+16|0,s=o+4|0,l=o,e=0|ts[127&d[d[(e=(e|=0)+8|0)>>2]>>2]](e),d[l>>2]=d[r>>2],d[s>>2]=d[l>>2],(0|(i=(0|Nn(i,s,e,e+168|0,a,n,0))-e|0))<168&&(d[t>>2]=((0|i)/12|0)%7|0),b=o}function Hi(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l;o=b,b=b+16|0,s=o+4|0,l=o,e=0|ts[127&d[4+(0|d[(e=(e|=0)+8|0)>>2])>>2]](e),d[l>>2]=d[r>>2],d[s>>2]=d[l>>2],(0|(i=(0|Nn(i,s,e,e+288|0,a,n,0))-e|0))<288&&(d[t>>2]=((0|i)/12|0)%12|0),b=o}function Yi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],e=0|Vn(i,e,n,a,4),4&d[n>>2]||(e=(0|e)<69?e+2e3|0:(e+-69|0)>>>0<31?e+1900|0:e,d[t>>2]=e+-1900),b=o}function Wi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],((e=0|Vn(i,e,n,a,2))+-1|0)>>>0<31&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Xi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Vn(i,e,n,a,2)))<24&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Ki(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],((e=0|Vn(i,e,n,a,2))+-1|0)>>>0<12&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function ji(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Vn(i,e,n,a,3)))<366&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function Zi(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Vn(i,e,n,a,2)))<13&!(4&(i=0|d[n>>2]))?d[t>>2]=e+-1:d[n>>2]=4|i,b=o}function Ji(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Vn(i,e,n,a,2)))<60&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function $i(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0;e:for(;;){e=0|d[t>>2];do{if(e){if(-1==(0|(e=(0|(a=0|d[e+12>>2]))==(0|d[e+16>>2])?0|ts[127&d[36+(0|d[e>>2])>>2]](e):0|d[a>>2]))){d[t>>2]=0,o=1;break}o=!(0|d[t>>2]);break}o=1}while(0);a=0|d[i>>2];do{if(a){if(-1!=(0|(e=(0|(e=0|d[a+12>>2]))==(0|d[a+16>>2])?0|ts[127&d[36+(0|d[a>>2])>>2]](a):0|d[e>>2]))){if(o){o=a;break}o=a;break e}d[i>>2]=0,s=15;break}s=15}while(0);if(15==(0|s)){if(s=0,o){o=0;break}o=0}if(e=0|d[t>>2],e=(0|(a=0|d[e+12>>2]))==(0|d[e+16>>2])?0|ts[127&d[36+(0|d[e>>2])>>2]](e):0|d[a>>2],!(0|rs[63&d[12+(0|d[n>>2])>>2]](n,8192,e)))break;(e=0|d[t>>2],(0|(o=0|d[(a=e+12|0)>>2]))!=(0|d[e+16>>2]))?d[a>>2]=o+4:ts[127&d[40+(0|d[e>>2])>>2]](e)}e=0|d[t>>2];do{if(e){if(-1==(0|(e=(0|(a=0|d[e+12>>2]))==(0|d[e+16>>2])?0|ts[127&d[36+(0|d[e>>2])>>2]](e):0|d[a>>2]))){d[t>>2]=0,a=1;break}a=!(0|d[t>>2]);break}a=1}while(0);do{if(o){if(-1!=(0|(e=(0|(e=0|d[o+12>>2]))==(0|d[o+16>>2])?0|ts[127&d[36+(0|d[o>>2])>>2]](o):0|d[e>>2]))){if(a)break;s=39;break}d[i>>2]=0,s=37;break}s=37}while(0);37==(0|s)&&a&&(s=39),39==(0|s)&&(d[r>>2]=2|d[r>>2])}function er(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c=0,u=0;l=b,b=b+16|0,o=l+4|0,s=l,u=0|ts[127&d[8+(0|d[(u=(e|=0)+8|0)>>2])>>2]](u),c=1&(e=0|f[u|0])?0|d[u+4>>2]:(255&e)>>>1,e=1&(e=0|f[u+12|0])?0|d[u+16>>2]:(255&e)>>>1;do{if((0|c)!=(0-e|0)){if(d[s>>2]=d[r>>2],d[o>>2]=d[s>>2],(0|(e=0|Nn(i,o,u,u+24|0,a,n,0)))==(0|u)&12==(0|(c=0|d[t>>2]))){d[t>>2]=0;break}(0|c)<12&12==(e-u|0)&&(d[t>>2]=c+12)}else d[n>>2]=4|d[n>>2]}while(0);b=l}function tr(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Vn(i,e,n,a,2)))<61&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function ir(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],(0|(e=0|Vn(i,e,n,a,1)))<7&!(4&(i=0|d[n>>2]))?d[t>>2]=e:d[n>>2]=4|i,b=o}function rr(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s;o=b,b=b+16|0,e=o+4|0,d[(s=o)>>2]=d[r>>2],d[e>>2]=d[s>>2],e=0|Vn(i,e,n,a,4),4&d[n>>2]||(d[t>>2]=e+-1900),b=o}function nr(e,t,i,r,n){e|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0;e=0|d[(t|=0)>>2];do{if(e){if(-1==(0|(e=(0|(a=0|d[e+12>>2]))==(0|d[e+16>>2])?0|ts[127&d[36+(0|d[e>>2])>>2]](e):0|d[a>>2]))){d[t>>2]=0,o=1;break}o=!(0|d[t>>2]);break}o=1}while(0);a=0|d[i>>2];do{if(a){if(-1!=(0|(e=(0|(e=0|d[a+12>>2]))==(0|d[a+16>>2])?0|ts[127&d[36+(0|d[a>>2])>>2]](a):0|d[e>>2]))){if(o){s=a,l=17;break}l=16;break}d[i>>2]=0,l=14;break}l=14}while(0);14==(0|l)&&(o?l=16:(s=0,l=17));e:do{if(16==(0|l))d[r>>2]=6|d[r>>2];else if(17==(0|l)){if(e=0|d[t>>2],e=(0|(a=0|d[e+12>>2]))==(0|d[e+16>>2])?0|ts[127&d[36+(0|d[e>>2])>>2]](e):0|d[a>>2],rs[63&d[52+(0|d[n>>2])>>2]](n,e,0)<<24>>24!=37){d[r>>2]=4|d[r>>2];break}e=0|d[t>>2],(0|(o=0|d[(a=e+12|0)>>2]))==(0|d[e+16>>2])?(ts[127&d[40+(0|d[e>>2])>>2]](e),(e=0|d[t>>2])?l=25:a=1):(d[a>>2]=o+4,l=25);do{if(25==(0|l)){if(-1==(0|(e=(0|(a=0|d[e+12>>2]))==(0|d[e+16>>2])?0|ts[127&d[36+(0|d[e>>2])>>2]](e):0|d[a>>2]))){d[t>>2]=0,a=1;break}a=!(0|d[t>>2]);break}}while(0);do{if(s){if(-1!=(0|(e=(0|(e=0|d[s+12>>2]))==(0|d[s+16>>2])?0|ts[127&d[36+(0|d[s>>2])>>2]](s):0|d[e>>2]))){if(a)break e;break}d[i>>2]=0,l=37;break}l=37}while(0);if(37==(0|l)&&!a)break;d[r>>2]=2|d[r>>2]}}while(0)}function ar(e){var t,i,r=0;t=0|d[(e|=0)>>2],y=0,i=0|H(3),r=y,y=0;do{if(!(1&r)){if((0|t)!=(0|i)&&(y=0,P(188,0|d[e>>2]),r=y,y=0,1&r))break;return}}while(0);Ue(r=0|ae(0))}function or(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c;c=b,b=b+16|0,f[(l=c)|0]=37,f[(o=l+1|0)|0]=n,f[(s=l+2|0)|0]=a,f[l+3|0]=0,a<<24>>24&&(f[o|0]=a,f[s|0]=n),e=t+(0|se(0|t,(0|d[i>>2])-t|0,0|l,0|r,0|d[e>>2]))|0,d[i>>2]=e,b=c}function sr(e){e|=0;var t;t=0|ne(8),y=0,L(90,0|t,0|e),e=y,y=0,1&e?(e=0|ae(),re(0|t),de(0|e)):De(0|t,616,80)}function lr(e,t,i,r){t|=0,i|=0,r|=0;var n=0,a=0,o=0,s=0;n=0|f[(e|=0)|0],a=0|d[(o=e+4|0)>>2];e:do{if(0|(1&n?a:(255&n)>>>1)){if((0|t)!=(0|i)){if((n=i+-4|0)>>>0>t>>>0){a=t;do{s=0|d[a>>2],d[a>>2]=d[n>>2],d[n>>2]=s,a=a+4|0,n=n+-4|0}while(a>>>0>>0)}n=0|f[e|0],a=0|d[o>>2]}i=i+-4|0,e=(o=(s=!(1&n))?e+1|0:0|d[e+8>>2])+(s?(255&n)>>>1:a)|0,n=(a=0|f[o|0])<<24>>24<1|a<<24>>24==127;t:do{if(i>>>0>t>>>0){for(;n||a<<24>>24==(0|d[t>>2]);)if(t=t+4|0,n=(a=0|f[(o=(e-o|0)>1?o+1|0:o)|0])<<24>>24<1|a<<24>>24==127,t>>>0>=i>>>0)break t;d[r>>2]=4;break e}}while(0);!n&&((0|d[i>>2])-1|0)>>>0>=a<<24>>24>>>0&&(d[r>>2]=4)}}while(0)}function cr(e,t,i){e|=0,i|=0;var r,n=0;_r(t|=0),n=0|d[(r=e+8|0)>>2];do{if((0|d[e+12>>2])-n>>2>>>0<=i>>>0){if(y=0,L(124,0|r,i+1|0),e=y,y=0,!(1&e)){n=0|d[r>>2];break}n=0|ae(),t&&Nr(t),de(0|n)}}while(0);(e=0|d[n+(i<<2)>>2])&&(Nr(e),n=0|d[r>>2]),d[n+(i<<2)>>2]=t}function ur(e){var t,i,r=0,n=0;if(d[(e|=0)>>2]=44196,i=e+12|0,r=0|d[(t=e+8|0)>>2],(0|d[i>>2])!=(0|r)){n=0;do{(r=0|d[r+(n<<2)>>2])&&Nr(r),n=n+1|0,r=0|d[t>>2]}while(n>>>0<(0|d[i>>2])-r>>2>>>0)}qr(e+144|0),qn(t)}function fr(e,t){return 0|function(e,t){e|=0,t|=0;var i=0;return i=0|d[e+8>>2],i=(0|d[e+12>>2])-i>>2>>>0>t>>>0?!!(0|d[i+(t<<2)>>2]):0,0|i}(e|=0,t|=0)?0|d[(0|d[e+8>>2])+(t<<2)>>2]:(function(e){e|=0,d[e>>2]=36888}(e=0|ne(4)),De(0|e,640,82),0)}function hr(e){e|=0;var t,i=0;if(y=0,t=0|H(6),i=y,y=0,!(1&i))return i=0|d[t>>2],d[e>>2]=i,void _r(i);Ue(i=0|ae(0))}function dr(e,t){e|=0,t=0|d[(t|=0)>>2],d[e>>2]=t,_r(t)}function mr(e){Nr(0|d[(e|=0)>>2])}function gr(e){var t,i;return i=b,b=b+16|0,t=i,-1!=(0|d[(e|=0)>>2])&&(d[t>>2]=e,d[t+4>>2]=191,d[t+8>>2]=0,function(e,t,i){e|=0,t|=0,i|=0;var r=0;if(Fe(42676),1==(0|d[e>>2]))do{Z(42704,42676)}while(1==(0|d[e>>2]));do{if(0|d[e>>2])Se(42676);else{if(d[e>>2]=1,y=0,N(72,42676),r=y,y=0,!(1&r||(y=0,P(0|i,0|t),r=y,y=0,1&r)||(y=0,N(73,42676),r=y,y=0,1&r)||(d[e>>2]=-1,y=0,N(72,42676),r=y,y=0,1&r)||(y=0,N(74,42704),r=y,y=0,1&r)))break;r=0|ae(0),ue(0|r),y=0,N(73,42676),r=y,y=0,!(1&r)&&(d[e>>2]=0,y=0,N(72,42676),r=y,y=0,!(1&r))&&(y=0,N(74,42704),r=y,y=0,!(1&r))&&(y=0,X(5),y=0),t=0|ae(),y=0,X(3),r=y,y=0,1&r?Ue(r=0|ae(0)):de(0|t)}}while(0)}(e,t,192)),b=i,(0|d[e+4>>2])-1|0}function pr(e,t){return t|=0,0|fr(e=0|d[(e|=0)>>2],0|gr(t))}function Ar(){var e,t=0;return y=0,e=0|H(7),t=y,y=0,1&t?(Ue(t=0|ae(0)),0):0|d[e>>2]}function Sr(){var e,t=0;return y=0,e=0|H(8),t=y,y=0,1&t?(Ue(t=0|ae(0)),0):0|d[e>>2]}function br(){var e,t=0;return y=0,e=0|H(9),t=y,y=0,1&t?(Ue(t=0|ae(0)),0):0|d[e>>2]}function vr(e){var t;d[(e|=0)>>2]=44236,0|(t=0|d[e+8>>2])&&0|f[e+12|0]&&function(e){e|=0,Ba(e)}(t)}function wr(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u,g,p,S,w,T,y,C,I,x,M,k,R,F,P,L,_=0,N=0,U=0,O=0,B=0,V=0,q=0,G=0,Q=0,z=0,H=0,Y=0,W=0,X=0,K=0,j=0,Z=0,J=0,$=0,ee=0,te=0,ie=0,re=0,ne=0,ae=0,oe=0,se=0;L=b,b=b+624|0,R=L+16|0,x=L,F=L+528|0,a=!!(0|(e|=0)),S=o=(oe=L+536|0)+40|0,oe=oe+39|0,w=(P=L+8|0)+4|0,T=(se=L+576|0)+12|0,se=se+11|0,I=(C=T)-(y=k=L+588|0)|0,s=-2-y|0,l=C+2|0,c=(M=L+24|0)+288|0,g=u=k+9|0,p=k+8|0,_=0,H=t|=0,N=0,t=0;e:for(;;){do{if((0|_)>-1){if((0|N)>(2147483647-_|0)){_=0|$a(),d[_>>2]=75,_=-1;break}_=N+_|0;break}}while(0);if(!((N=0|f[H|0])<<24>>24)){ae=245;break}U=H;t:for(;;){switch(N<<24>>24){case 37:N=U,ae=9;break t;case 0:N=U;break t}N=0|f[(ne=U+1|0)|0],U=ne}t:do{if(9==(0|ae))for(;;){if(ae=0,37!=(0|f[N+1|0]))break t;if(U=U+1|0,37!=(0|f[(N=N+2|0)|0]))break;ae=9}}while(0);if(W=U-H|0,a&&!(32&d[e>>2])&&Mo(H,W,e),(0|U)==(0|H)){(O=((U=0|f[(V=N+1|0)|0])<<24>>24)-48|0)>>>0<10?(ne=36==(0|f[N+2|0]),U=0|f[(V=ne?N+3|0:V)|0],Q=ne?O:-1,t=ne?1:t):Q=-1,N=U<<24>>24;t:do{if(32==(-32&N))for(O=0;;){if(!(1<>24)-32,32!=(-32&(N=(U=0|f[(V=V+1|0)|0])<<24>>24))){q=O,N=V;break}}else q=0,N=V}while(0);do{if(U<<24>>24==42){if((U=(0|f[(O=N+1|0)|0])-48|0)>>>0<10&&36==(0|f[N+2|0]))d[n+(U<<2)>>2]=10,t=1,N=N+3|0,U=0|d[r+((0|f[O|0])-48<<3)>>2];else{if(t){_=-1;break e}if(!a){Y=q,N=O,t=0,ne=0;break}t=3+(0|d[i>>2])&-4,U=0|d[t>>2],d[i>>2]=t+4,t=0,N=O}(0|U)<0?(Y=8192|q,ne=0-U|0):(Y=q,ne=U)}else if((O=(U<<24>>24)-48|0)>>>0<10){U=0;do{U=(10*U|0)+O|0,O=(0|f[(N=N+1|0)|0])-48|0}while(O>>>0<10);if((0|U)<0){_=-1;break e}Y=q,ne=U}else Y=q,ne=0}while(0);t:do{if(46==(0|f[N|0])){if((U=0|f[(O=N+1|0)|0])<<24>>24!=42){if(!((V=(U<<24>>24)-48|0)>>>0<10)){N=O,V=0;break}for(N=O,U=0;;)if(U=(10*U|0)+V|0,(V=(0|f[(N=N+1|0)|0])-48|0)>>>0>=10){V=U;break t}}if((U=(0|f[(O=N+2|0)|0])-48|0)>>>0<10&&36==(0|f[N+3|0])){d[n+(U<<2)>>2]=10,N=N+4|0,V=0|d[r+((0|f[O|0])-48<<3)>>2];break}if(t){_=-1;break e}a?(N=3+(0|d[i>>2])&-4,V=0|d[N>>2],d[i>>2]=N+4,N=O):(N=O,V=0)}else V=-1}while(0);for(G=0;;){if((U=(0|f[N|0])-65|0)>>>0>57){_=-1;break e}if(O=N+1|0,!(((q=255&(U=0|f[56223+(58*G|0)+U|0]))+-1|0)>>>0<8)){re=O;break}N=O,G=q}if(!(U<<24>>24)){_=-1;break}O=(0|Q)>-1;do{if(U<<24>>24==19){if(O){_=-1;break e}ae=52}else{if(O){d[n+(Q<<2)>>2]=q,ie=0|d[(te=r+(Q<<3)|0)+4>>2],d[(ae=x)>>2]=d[te>>2],d[ae+4>>2]=ie,ae=52;break}if(!a){_=0;break e}yr(x,q,i)}}while(0);if(52!=(0|ae)||(ae=0,a)){Q=!!(0|G)&3==(15&(Q=0|f[N|0]))?-33&Q:Q,O=-65537&Y,ie=8192&Y?O:Y;t:do{switch(0|Q){case 110:switch(0|G){case 0:case 1:case 6:d[d[x>>2]>>2]=_,H=re,N=W;continue e;case 2:case 7:H=0|d[x>>2],d[H>>2]=_,d[H+4>>2]=((0|_)<0)<<31>>31,H=re,N=W;continue e;case 3:h[d[x>>2]>>1]=_,H=re,N=W;continue e;case 4:f[d[x>>2]|0]=_,H=re,N=W;continue e;default:H=re,N=W;continue e}case 112:G=8|ie,V=V>>>0>8?V:8,Q=120,ae=64;break;case 88:case 120:G=ie,ae=64;break;case 111:if(!(0|(U=0|d[(O=x)>>2]))&!(0|(O=0|d[O+4>>2])))N=o;else{N=o;do{f[(N=N+-1|0)|0]=7&U|48,U=0|Yn(0|U,0|O,3),O=D}while(!(!(0|U)&!(0|O)))}8&ie?(U=ie,V=(0|V)<(0|(G=S-N+1|0))?G:V,G=0,q=56703,ae=77):(U=ie,G=0,q=56703,ae=77);break;case 105:case 100:if(N=0|d[(U=x)>>2],(0|(U=0|d[U+4>>2]))<0){N=0|Qn(0,0,0|N,0|U),U=D,d[(O=x)>>2]=N,d[O+4>>2]=U,O=1,q=56703,ae=76;break t}2048&ie?(O=1,q=56704,ae=76):(O=q=1&ie,q=0|q?56705:56703,ae=76);break;case 117:N=0|d[(U=x)>>2],U=0|d[U+4>>2],O=0,q=56703,ae=76;break;case 99:f[oe|0]=d[x>>2],H=oe,U=1,G=0,Q=56703,N=o;break;case 109:N=0|$a(),N=0|eo(0|d[N>>2]),ae=82;break;case 115:N=0|(N=0|d[x>>2])?N:56713,ae=82;break;case 67:d[P>>2]=d[x>>2],d[w>>2]=0,d[x>>2]=P,V=-1,ae=86;break;case 83:V?ae=86:(Ir(e,32,ne,0,ie),N=0,ae=98);break;case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:B=+A[x>>3],d[R>>2]=0,A[v>>3]=B,(0|d[v+4>>2])>=0?2048&ie?(ee=1,te=56723):(ee=te=1&ie,te=0|te?56726:56721):(B=-B,ee=1,te=56720),A[v>>3]=B,$=2146435072&d[v+4>>2];do{if($>>>0<2146435072|2146435072==(0|$)&!1){if((U=0!=(z=2*+fo(B,R)))&&(d[R>>2]=(0|d[R>>2])-1),97==(0|(Z=32|Q))){W=0|(H=32&Q)?te+9|0:te,Y=2|ee,N=12-V|0;do{if(!(V>>>0>11|!(0|N))){B=8;do{N=N+-1|0,B*=16}while(0|N);if(45==(0|f[W|0])){B=-(B+(-z-B));break}B=z+B-B;break}B=z}while(0);for((0|(N=0|Cr(N=(0|(U=0|d[R>>2]))<0?0-U|0:U,((0|N)<0)<<31>>31,T)))==(0|T)&&(f[se|0]=48,N=se),f[N+-1|0]=43+(U>>31&2),f[(G=N+-2|0)|0]=Q+15,q=(0|V)<1,O=!(8&ie),U=k;;){te=~~B,N=U+1|0,f[U|0]=m[56687+te|0]|H,B=16*(B-+(0|te));do{if(1==(N-y|0)){if(O&q&0==B)break;f[N|0]=46,N=U+2|0}}while(0);if(0==B)break;U=N}Ir(e,32,ne,O=(V=!!(0|V)&(s+N|0)<(0|V)?l+V-G|0:I-G+N|0)+Y|0,ie),32&d[e>>2]||Mo(W,Y,e),Ir(e,48,ne,O,65536^ie),N=N-y|0,32&d[e>>2]||Mo(k,N,e),Ir(e,48,V-(N+(U=C-G|0))|0,0,0),32&d[e>>2]||Mo(G,U,e),Ir(e,32,ne,O,8192^ie),N=(0|O)<(0|ne)?ne:O;break}N=(0|V)<0?6:V,U?(U=(0|d[R>>2])-28|0,d[R>>2]=U,B=268435456*z):(B=z,U=0|d[R>>2]),J=$=(0|U)<0?M:c,U=$;do{j=~~B>>>0,d[U>>2]=j,U=U+4|0,B=1e9*(B-+(j>>>0))}while(0!=B);if(O=U,(0|(U=0|d[R>>2]))>0)for(q=$;;){G=(0|U)>29?29:U,V=O+-4|0;do{if(V>>>0>>0)V=q;else{U=0;do{K=0|$n(0|(j=0|Hn(0|(j=0|Xn(0|d[V>>2],0,0|G)),0|D,0|U,0)),0|(U=D),1e9,0),d[V>>2]=K,U=0|Jn(0|j,0|U,1e9,0),V=V+-4|0}while(V>>>0>=q>>>0);if(!U){V=q;break}d[(V=q+-4|0)>>2]=U}}while(0);for(;!(O>>>0<=V>>>0)&&!(0|d[(U=O+-4|0)>>2]);)O=U;if(U=(0|d[R>>2])-G|0,d[R>>2]=U,!((0|U)>0))break;q=V}else V=$;if((0|U)<0)for(W=1+((N+25|0)/9|0)|0,X=102==(0|Z),H=V;;){Y=(0|(Y=0-U|0))>9?9:Y;do{if(H>>>0>>0){U=(1<>>Y,V=0,G=H;do{j=0|d[G>>2],d[G>>2]=(j>>>Y)+V,V=0|E(j&U,q),G=G+4|0}while(G>>>0>>0);if(U=0|d[H>>2]?H:H+4|0,!V){V=U;break}d[O>>2]=V,V=U,O=O+4|0}else V=0|d[H>>2]?H:H+4|0}while(0);if(O=O-(U=X?$:V)>>2>(0|W)?U+(W<<2)|0:O,U=(0|d[R>>2])+Y|0,d[R>>2]=U,(0|U)>=0){H=V;break}H=V}else H=V;do{if(H>>>0>>0){if(U=9*(J-H>>2)|0,(q=0|d[H>>2])>>>0<10)break;V=10;do{V=10*V|0,U=U+1|0}while(q>>>0>=V>>>0)}else U=0}while(0);if((0|(V=N-(102!=(0|Z)?U:0)+(((j=!!(0|N))&(K=103==(0|Z)))<<31>>31)|0))<((9*(O-J>>2)|0)-9|0)){if(V=$+((X=(0|(G=V+9216|0))/9|0)+-1023<<2)|0,(0|(G=1+((0|G)%9|0)|0))<9){q=10;do{q=10*q|0,G=G+1|0}while(9!=(0|G))}else q=10;0|(W=((Y=0|d[V>>2])>>>0)%(q>>>0)|0)||($+(X+-1022<<2)|0)!=(0|O)?ae=163:q=H;do{if(163==(0|ae)){ae=0,z=(Y>>>0)/(q>>>0)&1?9007199254740994:9007199254740992,G=(0|q)/2|0;do{if(W>>>0>>0)B=.5;else{if((0|W)==(0|G)&&($+(X+-1022<<2)|0)==(0|O)){B=1;break}B=1.5}}while(0);do{if(ee){if(45!=(0|f[te|0]))break;z=-z,B=-B}}while(0);if(G=Y-W|0,d[V>>2]=G,z+B==z){q=H;break}if(Z=G+q|0,d[V>>2]=Z,Z>>>0>999999999)for(U=H;;){if(q=V+-4|0,d[V>>2]=0,q>>>0>>0&&(d[(U=U+-4|0)>>2]=0),Z=1+(0|d[q>>2])|0,d[q>>2]=Z,!(Z>>>0>999999999)){H=U,V=q;break}V=q}if(U=9*(J-H>>2)|0,(G=0|d[H>>2])>>>0<10){q=H;break}q=10;do{q=10*q|0,U=U+1|0}while(G>>>0>=q>>>0);q=H}}while(0);H=q,O=O>>>0>(Z=V+4|0)>>>0?Z:O}for(W=0-U|0;;){if(O>>>0<=H>>>0){X=0,Z=O;break}if(0|d[(V=O+-4|0)>>2]){X=1,Z=O;break}O=V}do{if(K){if((0|(N=(1&j^1)+N|0))>(0|U)&(0|U)>-5?(Q=Q+-1|0,N=N+-1-U|0):(Q=Q+-2|0,N=N+-1|0),O=8&ie)break;do{if(X){if(!(O=0|d[Z+-4>>2])){V=9;break}if((O>>>0)%10|0){V=0;break}q=10,V=0;do{q=10*q|0,V=V+1|0}while(!((O>>>0)%(q>>>0)|0))}else V=9}while(0);if(O=(9*(Z-J>>2)|0)-9|0,102==(32|Q)){N=(0|N)<(0|(O=(0|(O=O-V|0))<0?0:O))?N:O,O=0;break}N=(0|N)<(0|(O=(0|(O=O+U-V|0))<0?0:O))?N:O,O=0;break}O=8&ie}while(0);if(q=1&!!(0|(Y=N|O)),G=102==(32|Q))U=(0|U)>0?U:0,Q=0;else{if((C-(V=0|Cr(V=(0|U)<0?W:U,((0|V)<0)<<31>>31,T))|0)<2)do{f[(V=V+-1|0)|0]=48}while((C-V|0)<2);f[V+-1|0]=43+(U>>31&2),f[(J=V+-2|0)|0]=Q,U=C-J|0,Q=J}Ir(e,32,ne,W=ee+1+N+q+U|0,ie),32&d[e>>2]||Mo(te,ee,e),Ir(e,48,ne,W,65536^ie);do{if(G){U=V=H>>>0>$>>>0?$:H;do{O=0|Cr(0|d[U>>2],0,u);do{if((0|U)==(0|V)){if((0|O)!=(0|u))break;f[p|0]=48,O=p}else{if(O>>>0<=k>>>0)break;do{f[(O=O+-1|0)|0]=48}while(O>>>0>k>>>0)}}while(0);32&d[e>>2]||Mo(O,g-O|0,e),U=U+4|0}while(U>>>0<=$>>>0);do{if(Y){if(32&d[e>>2])break;Mo(56755,1,e)}}while(0);if((0|N)>0&U>>>0>>0)for(O=U;;){if((U=0|Cr(0|d[O>>2],0,u))>>>0>k>>>0)do{f[(U=U+-1|0)|0]=48}while(U>>>0>k>>>0);if(32&d[e>>2]||Mo(U,(0|N)>9?9:N,e),U=N+-9|0,!((0|N)>9&(O=O+4|0)>>>0>>0)){N=U;break}N=U}Ir(e,48,N+9|0,9,0)}else{if(G=X?Z:H+4|0,(0|N)>-1){q=!(0|O),V=H;do{(0|(U=0|Cr(0|d[V>>2],0,u)))==(0|u)&&(f[p|0]=48,U=p);do{if((0|V)==(0|H)){if(O=U+1|0,32&d[e>>2]||Mo(U,1,e),q&(0|N)<1){U=O;break}if(32&d[e>>2]){U=O;break}Mo(56755,1,e),U=O}else{if(U>>>0<=k>>>0)break;do{f[(U=U+-1|0)|0]=48}while(U>>>0>k>>>0)}}while(0);O=g-U|0,32&d[e>>2]||Mo(U,(0|N)>(0|O)?O:N,e),N=N-O|0,V=V+4|0}while(V>>>0>>0&(0|N)>-1)}if(Ir(e,48,N+18|0,18,0),32&d[e>>2])break;Mo(Q,C-Q|0,e)}}while(0);Ir(e,32,ne,W,8192^ie),N=(0|W)<(0|ne)?ne:W}else G=!!(32&Q),Ir(e,32,ne,V=(U=(q=B!=B|!1)?0:ee)+3|0,O),32&(N=0|d[e>>2])||(Mo(te,U,e),N=0|d[e>>2]),32&N||Mo(q?G?56747:56751:G?56739:56743,3,e),Ir(e,32,ne,V,8192^ie),N=(0|V)<(0|ne)?ne:V}while(0);H=re;continue e;default:O=ie,U=V,G=0,Q=56703,N=o}}while(0);t:do{if(64==(0|ae))if(O=x,U=0|d[O>>2],O=0|d[O+4>>2],q=32&Q,!(0|U)&!(0|O))N=o,U=G,G=0,q=56703,ae=77;else{N=o;do{f[(N=N+-1|0)|0]=m[56687+(15&U)|0]|q,U=0|Yn(0|U,0|O,4),O=D}while(!(!(0|U)&!(0|O)));!(8&G)|!(0|d[(ae=x)>>2])&!(0|d[ae+4>>2])?(U=G,G=0,q=56703,ae=77):(U=G,G=2,q=56703+(Q>>4)|0,ae=77)}else if(76==(0|ae))N=0|Cr(N,U,o),U=ie,G=O,ae=77;else if(82==(0|ae))ae=0,ie=0|Bo(N,0,V),te=!(0|ie),H=N,U=te?V:ie-N|0,G=0,Q=56703,N=te?N+V|0:ie;else if(86==(0|ae)){for(ae=0,U=0,N=0,q=0|d[x>>2];(O=0|d[q>>2])&&!((0|(N=0|vo(F,O)))<0|N>>>0>(V-U|0)>>>0)&&V>>>0>(U=N+U|0)>>>0;)q=q+4|0;if((0|N)<0){_=-1;break e}if(Ir(e,32,ne,U,ie),U)for(O=0,V=0|d[x>>2];;){if(!(N=0|d[V>>2])){N=U,ae=98;break t}if((0|(O=(N=0|vo(F,N))+O|0))>(0|U)){N=U,ae=98;break t}if(32&d[e>>2]||Mo(F,N,e),O>>>0>=U>>>0){N=U,ae=98;break}V=V+4|0}else N=0,ae=98}}while(0);98!=(0|ae)?(77==(0|ae)&&(ae=0,O=(0|V)>-1?-65537&U:U,!!(0|V)|(U=!!(0|d[(U=x)>>2])|!!(0|d[U+4>>2]))?(H=N,U=(0|V)>(0|(U=S-N+(1&U^1)|0))?V:U,Q=q,N=o):(H=o,U=0,Q=q,N=o)),Ir(e,32,N=(0|ne)<(0|(V=G+(U=(0|U)<(0|(q=N-H|0))?q:U)|0))?V:ne,V,O),32&d[e>>2]||Mo(Q,G,e),Ir(e,48,N,V,65536^O),Ir(e,48,U,q,0),32&d[e>>2]||Mo(H,q,e),Ir(e,32,N,V,8192^O),H=re):(ae=0,Ir(e,32,ne,N,8192^ie),H=re,N=(0|ne)>(0|N)?ne:N)}else H=re,N=W}else H=N,N=W}e:do{if(245==(0|ae)&&!e)if(t){for(_=1;t=0|d[n+(_<<2)>>2];)if(yr(r+(_<<3)|0,t,i),(0|(_=_+1|0))>=10){_=1;break e}if((0|_)<10)for(;;){if(0|d[n+(_<<2)>>2]){_=-1;break e}if((0|(_=_+1|0))>=10){_=1;break}}else _=1}else _=0}while(0);return b=L,0|_}function Tr(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s,l;return l=b,b=b+112|0,d[(s=l)>>2]=0,d[(a=s+4|0)>>2]=e,d[s+44>>2]=e,d[(o=s+8|0)>>2]=(0|e)<0?-1:e+2147483647|0,d[s+76>>2]=-1,ro(s,0),r=0|io(s,i,1,r,n),t&&(d[t>>2]=e+((0|d[a>>2])+(0|d[s+108>>2])-(0|d[o>>2]))),b=l,0|r}function yr(e,t,i){e|=0,t|=0,i|=0;var r=0,n=0,a=0;e:do{if(t>>>0<=20){switch(0|t){case 9:r=3+(0|d[i>>2])&-4,t=0|d[r>>2],d[i>>2]=r+4,d[e>>2]=t;break e;case 10:r=3+(0|d[i>>2])&-4,t=0|d[r>>2],d[i>>2]=r+4,d[(r=e)>>2]=t,d[r+4>>2]=((0|t)<0)<<31>>31;break e;case 11:r=3+(0|d[i>>2])&-4,t=0|d[r>>2],d[i>>2]=r+4,d[(r=e)>>2]=t,d[r+4>>2]=0;break e;case 12:r=7+(0|d[i>>2])&-8,n=0|d[(t=r)>>2],t=0|d[t+4>>2],d[i>>2]=r+8,d[(r=e)>>2]=n,d[r+4>>2]=t;break e;case 13:n=3+(0|d[i>>2])&-4,r=0|d[n>>2],d[i>>2]=n+4,r=(65535&r)<<16>>16,d[(n=e)>>2]=r,d[n+4>>2]=((0|r)<0)<<31>>31;break e;case 14:n=3+(0|d[i>>2])&-4,r=0|d[n>>2],d[i>>2]=n+4,d[(n=e)>>2]=65535&r,d[n+4>>2]=0;break e;case 15:n=3+(0|d[i>>2])&-4,r=0|d[n>>2],d[i>>2]=n+4,r=(255&r)<<24>>24,d[(n=e)>>2]=r,d[n+4>>2]=((0|r)<0)<<31>>31;break e;case 16:n=3+(0|d[i>>2])&-4,r=0|d[n>>2],d[i>>2]=n+4,d[(n=e)>>2]=255&r,d[n+4>>2]=0;break e;case 17:case 18:n=7+(0|d[i>>2])&-8,a=+A[n>>3],d[i>>2]=n+8,A[e>>3]=a;break e;default:break e}}}while(0)}function Cr(e,t,i){i|=0;var r=0;if((t|=0)>>>0>0|!(0|t)&(e|=0)>>>0>4294967295)for(;;){if(r=0|$n(0|e,0|t,10,0),f[(i=i+-1|0)|0]=48|r,r=0|Jn(0|e,0|t,10,0),!(t>>>0>9|9==(0|t)&e>>>0>4294967295)){e=r;break}e=r,t=D}if(e)for(;f[(i=i+-1|0)|0]=(e>>>0)%10|48,!(e>>>0<10);)e=(e>>>0)/10|0;return 0|i}function Ir(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s=0;o=b,b=b+256|0,a=o;do{if((0|i)>(0|r)&!(73728&n)){if(zn(0|a,0|t,0|((n=i-r|0)>>>0>256?256:n)),s=!(32&(t=0|d[e>>2])),n>>>0>255){r=i-r|0;do{s&&(Mo(a,256,e),t=0|d[e>>2]),n=n+-256|0,s=!(32&t)}while(n>>>0>255);if(!s)break;n=255&r}else if(!s)break;Mo(a,n,e)}}while(0);b=o}function Dr(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0,m=0,g=0,p=0,A=0,S=0,b=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0,_=0,N=0,U=0,O=0;do{if(e>>>0<245){if(e=(m=e>>>0<11?16:e+11&-8)>>>3,3&(i=(s=0|d[10218])>>>e)){i=40912+((r=(e=(1&i^1)+e|0)<<1)<<2)|0,n=0|d[(r=40912+(r+2<<2)|0)>>2],o=0|d[(a=n+8|0)>>2];do{if((0|i)!=(0|o)){if(o>>>0<(0|d[10222])>>>0&&ee(),(0|d[(t=o+12|0)>>2])==(0|n)){d[t>>2]=i,d[r>>2]=o;break}ee()}else d[10218]=s&~(1<>2]=3|O,d[(O=n+(4|O)|0)>>2]=1|d[O>>2],0|(O=a)}if(m>>>0>(o=0|d[10220])>>>0){if(i){r=((r=i<>>=l=r>>>12&16)>>>5&8)|l|(a=(r>>>=n)>>>2&4)|(i=(r>>>=a)>>>1&2)|(e=(r>>>=i)>>>1&1))+(r>>>e)|0)<<1)<<2)|0,a=0|d[(r=40912+(r+2<<2)|0)>>2],n=0|d[(l=a+8|0)>>2];do{if((0|i)!=(0|n)){if(n>>>0<(0|d[10222])>>>0&&ee(),(0|d[(t=n+12|0)>>2])==(0|a)){d[t>>2]=i,d[r>>2]=n,c=0|d[10220];break}ee()}else d[10218]=s&~(1<>2]=3|m,s=a+m|0,d[a+(4|m)>>2]=1|o,d[a+O>>2]=o,c&&(n=0|d[10223],r=40912+((t=(i=c>>>3)<<1)<<2)|0,(e=0|d[10218])&(i=1<>2])>>>0<(0|d[10222])>>>0?ee():(u=e,f=t):(d[10218]=e|i,u=40912+(t+2<<2)|0,f=r),d[u>>2]=n,d[f+12>>2]=n,d[n+8>>2]=f,d[n+12>>2]=r),d[10220]=o,d[10223]=s,0|(O=l)}if(e=0|d[10219]){for(i=(e&0-e)-1|0,r=0|d[41176+(((N=(i>>>=U=i>>>12&16)>>>5&8)|U|(O=(i>>>=N)>>>2&4)|(e=(i>>>=O)>>>1&2)|(r=(i>>>=e)>>>1&1))+(i>>>r)<<2)>>2],i=(-8&d[r+4>>2])-m|0,e=r;;){if(!(t=0|d[e+16>>2])&&!(t=0|d[e+20>>2])){l=i;break}i=(O=(e=(-8&d[t+4>>2])-m|0)>>>0>>0)?e:i,e=t,r=O?t:r}r>>>0<(a=0|d[10222])>>>0&&ee(),r>>>0>=(s=r+m|0)>>>0&&ee(),o=0|d[r+24>>2],i=0|d[r+12>>2];do{if((0|i)==(0|r)){if(!(t=0|d[(e=r+20|0)>>2])&&!(t=0|d[(e=r+16|0)>>2])){h=0;break}for(;;)if(n=0|d[(i=t+20|0)>>2])t=n,e=i;else{if(!(n=0|d[(i=t+16|0)>>2]))break;t=n,e=i}if(!(e>>>0>>0)){d[e>>2]=0,h=t;break}ee()}else{if((n=0|d[r+8>>2])>>>0>>0&&ee(),(0|d[(t=n+12|0)>>2])!=(0|r)&&ee(),(0|d[(e=i+8|0)>>2])==(0|r)){d[t>>2]=i,d[e>>2]=n,h=i;break}ee()}}while(0);do{if(o){if(t=0|d[r+28>>2],(0|r)==(0|d[(e=41176+(t<<2)|0)>>2])){if(d[e>>2]=h,!h){d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(t=o+16|0)>>2])==(0|r)?d[t>>2]=h:d[o+20>>2]=h,!h)break;h>>>0<(e=0|d[10222])>>>0&&ee(),d[h+24>>2]=o,t=0|d[r+16>>2];do{if(t){if(!(t>>>0>>0)){d[h+16>>2]=t,d[t+24>>2]=h;break}ee()}}while(0);if(t=0|d[r+20>>2]){if(!(t>>>0<(0|d[10222])>>>0)){d[h+20>>2]=t,d[t+24>>2]=h;break}ee()}}}while(0);return l>>>0<16?(O=l+m|0,d[r+4>>2]=3|O,d[(O=r+(O+4)|0)>>2]=1|d[O>>2]):(d[r+4>>2]=3|m,d[r+(4|m)>>2]=1|l,d[r+(l+m)>>2]=l,(t=0|d[10220])&&(a=0|d[10223],n=40912+((t=(i=t>>>3)<<1)<<2)|0,(e=0|d[10218])&(i=1<>2])>>>0<(0|d[10222])>>>0?ee():(g=t,p=e):(d[10218]=e|i,g=40912+(t+2<<2)|0,p=n),d[g>>2]=a,d[p+12>>2]=a,d[a+8>>2]=p,d[a+12>>2]=n),d[10220]=l,d[10223]=s),0|(O=r+8|0)}p=m}else p=m}else if(e>>>0<=4294967231)if(f=-8&(e=e+11|0),u=0|d[10219]){i=0-f|0,(e>>>=8)?f>>>0>16777215?c=31:c=f>>>((c=14-((g=((w=e<<(p=(e+1048320|0)>>>16&8))+520192|0)>>>16&4)|p|(c=((w<<=g)+245760|0)>>>16&2))+(w<>>15)|0)+7|0)&1|c<<1:c=0,e=0|d[41176+(c<<2)>>2];e:do{if(e)for(o=i,n=0,s=f<<(31==(0|c)?0:25-(c>>>1)),l=e,e=0;;){if((i=(a=-8&d[l+4>>2])-f|0)>>>0>>0){if((0|a)==(0|f)){a=l,e=l,w=90;break e}e=l}else i=o;if(n=!(0|(w=0|d[l+20>>2]))|(0|w)==(0|(l=0|d[l+16+(s>>>31<<2)>>2]))?n:w,!l){w=86;break}o=i,s<<=1}else n=0,e=0,w=86}while(0);if(86==(0|w)){if(!(0|n)&!(0|e)){if(!(e=u&((e=2<>>=h=e>>>12&16)>>>5&8)|h|(g=(e>>>=u)>>>2&4)|(p=(e>>>=g)>>>1&2)|(n=(e>>>=p)>>>1&1))+(e>>>n)<<2)>>2],e=0}n?(a=n,w=90):(s=i,l=e)}if(90==(0|w))for(;;)if(w=0,i=(n=(p=(-8&d[a+4>>2])-f|0)>>>0>>0)?p:i,e=n?a:e,n=0|d[a+16>>2])a=n,w=90;else{if(!(a=0|d[a+20>>2])){s=i,l=e;break}w=90}if(0|l&&s>>>0<((0|d[10220])-f|0)>>>0){l>>>0<(n=0|d[10222])>>>0&&ee(),l>>>0>=(o=l+f|0)>>>0&&ee(),a=0|d[l+24>>2],i=0|d[l+12>>2];do{if((0|i)==(0|l)){if(!(t=0|d[(e=l+20|0)>>2])&&!(t=0|d[(e=l+16|0)>>2])){m=0;break}for(;;)if(r=0|d[(i=t+20|0)>>2])t=r,e=i;else{if(!(r=0|d[(i=t+16|0)>>2]))break;t=r,e=i}if(!(e>>>0>>0)){d[e>>2]=0,m=t;break}ee()}else{if((r=0|d[l+8>>2])>>>0>>0&&ee(),(0|d[(t=r+12|0)>>2])!=(0|l)&&ee(),(0|d[(e=i+8|0)>>2])==(0|l)){d[t>>2]=i,d[e>>2]=r,m=i;break}ee()}}while(0);do{if(a){if(t=0|d[l+28>>2],(0|l)==(0|d[(e=41176+(t<<2)|0)>>2])){if(d[e>>2]=m,!m){d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(t=a+16|0)>>2])==(0|l)?d[t>>2]=m:d[a+20>>2]=m,!m)break;m>>>0<(e=0|d[10222])>>>0&&ee(),d[m+24>>2]=a,t=0|d[l+16>>2];do{if(t){if(!(t>>>0>>0)){d[m+16>>2]=t,d[t+24>>2]=m;break}ee()}}while(0);if(t=0|d[l+20>>2]){if(!(t>>>0<(0|d[10222])>>>0)){d[m+20>>2]=t,d[t+24>>2]=m;break}ee()}}}while(0);e:do{if(s>>>0>=16){if(d[l+4>>2]=3|f,d[l+(4|f)>>2]=1|s,d[l+(s+f)>>2]=s,t=s>>>3,s>>>0<256){r=40912+((e=t<<1)<<2)|0,(i=0|d[10218])&(t=1<>2])>>>0<(0|d[10222])>>>0?ee():(S=t,b=e):(d[10218]=i|t,S=40912+(e+2<<2)|0,b=r),d[S>>2]=o,d[b+12>>2]=o,d[l+(f+8)>>2]=b,d[l+(f+12)>>2]=r;break}if((t=s>>>8)?s>>>0>16777215?r=31:r=s>>>((r=14-((N=((O=t<<(U=(t+1048320|0)>>>16&8))+520192|0)>>>16&4)|U|(r=((O<<=N)+245760|0)>>>16&2))+(O<>>15)|0)+7|0)&1|r<<1:r=0,t=41176+(r<<2)|0,d[l+(f+28)>>2]=r,d[l+(f+20)>>2]=0,d[l+(f+16)>>2]=0,!((e=0|d[10219])&(i=1<>2]=o,d[l+(f+24)>>2]=t,d[l+(f+12)>>2]=o,d[l+(f+8)>>2]=o;break}t=0|d[t>>2];t:do{if((-8&d[t+4>>2])!=(0|s)){for(r=s<<(31==(0|r)?0:25-(r>>>1));i=0|d[(e=t+16+(r>>>31<<2)|0)>>2];){if((-8&d[i+4>>2])==(0|s)){C=i;break t}r<<=1,t=i}if(!(e>>>0<(0|d[10222])>>>0)){d[e>>2]=o,d[l+(f+24)>>2]=t,d[l+(f+12)>>2]=o,d[l+(f+8)>>2]=o;break e}ee()}else C=t}while(0);if((e=0|d[(t=C+8|0)>>2])>>>0>=(O=0|d[10222])>>>0&C>>>0>=O>>>0){d[e+12>>2]=o,d[t>>2]=o,d[l+(f+8)>>2]=e,d[l+(f+12)>>2]=C,d[l+(f+24)>>2]=0;break}ee()}else O=s+f|0,d[l+4>>2]=3|O,O=l+(O+4)|0,d[O>>2]=1|d[O>>2]}while(0);return 0|(O=l+8|0)}p=f}else p=f;else p=-1}while(0);if((i=0|d[10220])>>>0>=p>>>0)return t=i-p|0,e=0|d[10223],t>>>0>15?(d[10223]=e+p,d[10220]=t,d[e+(p+4)>>2]=1|t,d[e+i>>2]=t,d[e+4>>2]=3|p):(d[10220]=0,d[10223]=0,d[e+4>>2]=3|i,d[(O=e+(i+4)|0)>>2]=1|d[O>>2]),0|(O=e+8|0);if((e=0|d[10221])>>>0>p>>>0)return U=e-p|0,d[10221]=U,O=0|d[10224],d[10224]=O+p,d[O+(p+4)>>2]=1|U,d[O+4>>2]=3|p,0|(O=O+8|0);do{if(!(0|d[10336])){if(!((e=0|ge(30))+-1&e)){d[10338]=e,d[10337]=e,d[10339]=-1,d[10340]=-1,d[10341]=0,d[10329]=0,C=-16&Re(0)^1431655768,d[10336]=C;break}ee()}}while(0);if(l=p+48|0,(u=(o=(s=0|d[10338])+(c=p+47|0)|0)&(s=0-s|0))>>>0<=p>>>0||0|(e=0|d[10328])&&(C=(b=0|d[10326])+u|0)>>>0<=b>>>0|C>>>0>e>>>0)return 0|(O=0);e:do{if(4&d[10329])e=0,w=191;else{e=0|d[10224];t:do{if(e){for(n=41320;;){if((i=0|d[n>>2])>>>0<=e>>>0&&(i+(0|d[(A=n+4|0)>>2])|0)>>>0>e>>>0){a=n,e=A;break}if(!(n=0|d[n+8>>2])){w=174;break t}}if((i=o-(0|d[10221])&s)>>>0<2147483647)if(e=(C=(0|(n=0|ce(0|i)))==((0|d[a>>2])+(0|d[e>>2])|0))?i:0,C){if(-1!=(0|n)){T=n,g=e,w=194;break e}}else w=184;else e=0}else w=174}while(0);do{if(174==(0|w))if(-1!=(0|(a=0|ce(0))))if(e=a,i=(n=(i=0|d[10337])+-1|0)&e?u-e+(n+e&0-i)|0:u,n=(e=0|d[10326])+i|0,i>>>0>p>>>0&i>>>0<2147483647){if(0|(C=0|d[10328])&&n>>>0<=e>>>0|n>>>0>C>>>0){e=0;break}if(e=(C=(0|(n=0|ce(0|i)))==(0|a))?i:0,C){T=a,g=e,w=194;break e}w=184}else e=0;else e=0}while(0);t:do{if(184==(0|w)){a=0-i|0;do{if(l>>>0>i>>>0&i>>>0<2147483647&-1!=(0|n)&&(v=c-i+(v=0|d[10338])&0-v)>>>0<2147483647){if(-1==(0|ce(0|v))){ce(0|a);break t}i=v+i|0;break}}while(0);if(-1!=(0|n)){T=n,g=i,w=194;break e}}}while(0);d[10329]=4|d[10329],w=191}}while(0);if(191==(0|w)&&u>>>0<2147483647&&(T=0|ce(0|u))>>>0<(y=0|ce(0))>>>0&-1!=(0|T)&-1!=(0|y)&&(D=(I=y-T|0)>>>0>(p+40|0)>>>0)&&(g=D?I:e,w=194),194==(0|w)){e=(0|d[10326])+g|0,d[10326]=e,e>>>0>(0|d[10327])>>>0&&(d[10327]=e),o=0|d[10224];e:do{if(o){a=41320;do{if((0|T)==((e=0|d[a>>2])+(n=0|d[(i=a+4|0)>>2])|0)){x=e,E=i,M=n,k=a,w=204;break}a=0|d[a+8>>2]}while(0|a);if(204==(0|w)&&!(8&d[k+12>>2])&&o>>>0>>0&o>>>0>=x>>>0){d[E>>2]=M+g,N=(O=(0|d[10221])+g|0)-(U=7&(U=o+8|0)?0-U&7:0)|0,d[10224]=o+U,d[10221]=N,d[o+(U+4)>>2]=1|N,d[o+(O+4)>>2]=40,d[10225]=d[10340];break}for(T>>>0<(e=0|d[10222])>>>0&&(d[10222]=T,e=T),i=T+g|0,a=41320;;){if((0|d[a>>2])==(0|i)){n=a,i=a,w=212;break}if(!(a=0|d[a+8>>2])){i=41320;break}}if(212==(0|w)){if(!(8&d[i+12>>2])){d[n>>2]=T,d[(h=i+4|0)>>2]=(0|d[h>>2])+g,m=T+(f=(h=7&(h=T+8|0)?0-h&7:0)+p|0)|0,u=(t=T+((c=7&(c=T+(g+8)|0)?0-c&7:0)+g)|0)-(T+h)-p|0,d[T+(h+4)>>2]=3|p;t:do{if((0|t)!=(0|o)){if((0|t)==(0|d[10223])){O=(0|d[10220])+u|0,d[10220]=O,d[10223]=m,d[T+(f+4)>>2]=1|O,d[T+(O+f)>>2]=O;break}if(1==(3&(i=0|d[T+((s=g+4|0)+c)>>2]))){l=-8&i,a=i>>>3;i:do{if(i>>>0>=256){o=0|d[T+((24|c)+g)>>2],r=0|d[T+(g+12+c)>>2];do{if((0|r)==(0|t)){if(!(i=0|d[(r=T+(s+(n=16|c))|0)>>2])&&!(i=0|d[(r=T+(n+g)|0)>>2])){_=0;break}for(;;)if(a=0|d[(n=i+20|0)>>2])i=a,r=n;else{if(!(a=0|d[(n=i+16|0)>>2]))break;i=a,r=n}if(!(r>>>0>>0)){d[r>>2]=0,_=i;break}ee()}else{if((n=0|d[T+((8|c)+g)>>2])>>>0>>0&&ee(),(0|d[(e=n+12|0)>>2])!=(0|t)&&ee(),(0|d[(i=r+8|0)>>2])==(0|t)){d[e>>2]=r,d[i>>2]=n,_=r;break}ee()}}while(0);if(!o)break;i=41176+((e=0|d[T+(g+28+c)>>2])<<2)|0;do{if((0|t)==(0|d[i>>2])){if(d[i>>2]=_,_)break;d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(e=o+16|0)>>2])==(0|t)?d[e>>2]=_:d[o+20>>2]=_,!_)break i}while(0);_>>>0<(i=0|d[10222])>>>0&&ee(),d[_+24>>2]=o,e=0|d[T+((t=16|c)+g)>>2];do{if(e){if(!(e>>>0>>0)){d[_+16>>2]=e,d[e+24>>2]=_;break}ee()}}while(0);if(!(t=0|d[T+(s+t)>>2]))break;if(!(t>>>0<(0|d[10222])>>>0)){d[_+20>>2]=t,d[t+24>>2]=_;break}ee()}else{r=0|d[T+((8|c)+g)>>2],n=0|d[T+(g+12+c)>>2],i=40912+(a<<1<<2)|0;do{if((0|r)!=(0|i)){if(r>>>0>>0&&ee(),(0|d[r+12>>2])==(0|t))break;ee()}}while(0);if((0|n)==(0|r)){d[10218]=d[10218]&~(1<>>0>>0&&ee(),(0|d[(e=n+8|0)>>2])==(0|t)){R=e;break}ee()}}while(0);d[r+12>>2]=n,d[R>>2]=r}}while(0);t=T+((l|c)+g)|0,n=l+u|0}else n=u;if(d[(t=t+4|0)>>2]=-2&d[t>>2],d[T+(f+4)>>2]=1|n,d[T+(n+f)>>2]=n,t=n>>>3,n>>>0<256){r=40912+((e=t<<1)<<2)|0,i=0|d[10218],t=1<>2])>>>0>=(0|d[10222])>>>0){N=t,U=e;break}ee()}else d[10218]=i|t,N=40912+(e+2<<2)|0,U=r}while(0);d[N>>2]=m,d[U+12>>2]=m,d[T+(f+8)>>2]=U,d[T+(f+12)>>2]=r;break}t=n>>>8;do{if(t){if(n>>>0>16777215){r=31;break}r=n>>>((r=14-((_=((U=t<<(N=(t+1048320|0)>>>16&8))+520192|0)>>>16&4)|N|(r=((U<<=_)+245760|0)>>>16&2))+(U<>>15)|0)+7|0)&1|r<<1}else r=0}while(0);if(t=41176+(r<<2)|0,d[T+(f+28)>>2]=r,d[T+(f+20)>>2]=0,d[T+(f+16)>>2]=0,!((e=0|d[10219])&(i=1<>2]=m,d[T+(f+24)>>2]=t,d[T+(f+12)>>2]=m,d[T+(f+8)>>2]=m;break}t=0|d[t>>2];i:do{if((-8&d[t+4>>2])!=(0|n)){for(r=n<<(31==(0|r)?0:25-(r>>>1));i=0|d[(e=t+16+(r>>>31<<2)|0)>>2];){if((-8&d[i+4>>2])==(0|n)){O=i;break i}r<<=1,t=i}if(!(e>>>0<(0|d[10222])>>>0)){d[e>>2]=m,d[T+(f+24)>>2]=t,d[T+(f+12)>>2]=m,d[T+(f+8)>>2]=m;break t}ee()}else O=t}while(0);if((e=0|d[(t=O+8|0)>>2])>>>0>=(U=0|d[10222])>>>0&O>>>0>=U>>>0){d[e+12>>2]=m,d[t>>2]=m,d[T+(f+8)>>2]=e,d[T+(f+12)>>2]=O,d[T+(f+24)>>2]=0;break}ee()}else O=(0|d[10221])+u|0,d[10221]=O,d[10224]=m,d[T+(f+4)>>2]=1|O}while(0);return 0|(O=T+(8|h)|0)}i=41320}for(;!((e=0|d[i>>2])>>>0<=o>>>0&&(t=0|d[i+4>>2],r=e+t|0,r>>>0>o>>>0));)i=0|d[i+8>>2];if(t=(e=(e=e+(t+-47+(7&(n=e+(t+-39)|0)?0-n&7:0))|0)>>>0<(n=o+16|0)>>>0?o:e)+8|0,O=g+-40-(i=7&(i=T+8|0)?0-i&7:0)|0,d[10224]=T+i,d[10221]=O,d[T+(i+4)>>2]=1|O,d[T+(g+-36)>>2]=40,d[10225]=d[10340],d[(i=e+4|0)>>2]=27,d[t>>2]=d[10330],d[t+4>>2]=d[10331],d[t+8>>2]=d[10332],d[t+12>>2]=d[10333],d[10330]=T,d[10331]=g,d[10333]=0,d[10332]=t,d[(t=e+28|0)>>2]=7,(e+32|0)>>>0>>0)do{O=t,d[(t=t+4|0)>>2]=7}while((O+8|0)>>>0>>0);if((0|e)!=(0|o)){if(a=e-o|0,d[i>>2]=-2&d[i>>2],d[o+4>>2]=1|a,d[e>>2]=a,t=a>>>3,a>>>0<256){r=40912+((e=t<<1)<<2)|0,(i=0|d[10218])&(t=1<>2])>>>0<(0|d[10222])>>>0?ee():(F=t,P=e):(d[10218]=i|t,F=40912+(e+2<<2)|0,P=r),d[F>>2]=o,d[P+12>>2]=o,d[o+8>>2]=P,d[o+12>>2]=r;break}if((t=a>>>8)?a>>>0>16777215?r=31:r=a>>>((r=14-((N=((O=t<<(U=(t+1048320|0)>>>16&8))+520192|0)>>>16&4)|U|(r=((O<<=N)+245760|0)>>>16&2))+(O<>>15)|0)+7|0)&1|r<<1:r=0,i=41176+(r<<2)|0,d[o+28>>2]=r,d[o+20>>2]=0,d[n>>2]=0,!((t=0|d[10219])&(e=1<>2]=o,d[o+24>>2]=i,d[o+12>>2]=o,d[o+8>>2]=o;break}t=0|d[i>>2];t:do{if((-8&d[t+4>>2])!=(0|a)){for(r=a<<(31==(0|r)?0:25-(r>>>1));i=0|d[(e=t+16+(r>>>31<<2)|0)>>2];){if((-8&d[i+4>>2])==(0|a)){L=i;break t}r<<=1,t=i}if(!(e>>>0<(0|d[10222])>>>0)){d[e>>2]=o,d[o+24>>2]=t,d[o+12>>2]=o,d[o+8>>2]=o;break e}ee()}else L=t}while(0);if((e=0|d[(t=L+8|0)>>2])>>>0>=(O=0|d[10222])>>>0&L>>>0>=O>>>0){d[e+12>>2]=o,d[t>>2]=o,d[o+8>>2]=e,d[o+12>>2]=L,d[o+24>>2]=0;break}ee()}}else{!(0|(O=0|d[10222]))|T>>>0>>0&&(d[10222]=T),d[10330]=T,d[10331]=g,d[10333]=0,d[10227]=d[10336],d[10226]=-1,t=0;do{U=40912+((O=t<<1)<<2)|0,d[40912+(O+3<<2)>>2]=U,d[40912+(O+2<<2)>>2]=U,t=t+1|0}while(32!=(0|t));U=g+-40-(O=7&(O=T+8|0)?0-O&7:0)|0,d[10224]=T+O,d[10221]=U,d[T+(O+4)>>2]=1|U,d[T+(g+-36)>>2]=40,d[10225]=d[10340]}}while(0);if((t=0|d[10221])>>>0>p>>>0)return U=t-p|0,d[10221]=U,O=0|d[10224],d[10224]=O+p,d[O+(p+4)>>2]=1|U,d[O+4>>2]=3|p,0|(O=O+8|0)}return O=0|$a(),d[O>>2]=12,0|(O=0)}function xr(e){var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0,m=0,g=0,p=0,A=0,S=0,b=0,v=0;if(e|=0){(t=e+-8|0)>>>0<(s=0|d[10222])>>>0&&ee(),1==(0|(r=3&(i=0|d[e+-4>>2])))&&ee(),p=e+((m=-8&i)+-8)|0;do{if(1&i)v=t,a=m;else{if(t=0|d[t>>2],!r)return;if(f=t+m|0,(u=e+(l=-8-t|0)|0)>>>0>>0&&ee(),(0|u)==(0|d[10223])){if(3&~(i=0|d[(t=e+(m+-4)|0)>>2])){v=u,a=f;break}return d[10220]=f,d[t>>2]=-2&i,d[e+(l+4)>>2]=1|f,void(d[p>>2]=f)}if(n=t>>>3,t>>>0<256){if(r=0|d[e+(l+8)>>2],i=0|d[e+(l+12)>>2],(0|r)!=(0|(t=40912+(n<<1<<2)|0))&&(r>>>0>>0&&ee(),(0|d[r+12>>2])!=(0|u)&&ee()),(0|i)==(0|r)){d[10218]=d[10218]&~(1<>>0>>0&&ee(),(0|d[(t=i+8|0)>>2])==(0|u)?o=t:ee()):o=i+8|0,d[r+12>>2]=i,d[o>>2]=r,v=u,a=f;break}o=0|d[e+(l+24)>>2],r=0|d[e+(l+12)>>2];do{if((0|r)==(0|u)){if(!(t=0|d[(i=e+(l+20)|0)>>2])&&!(t=0|d[(i=e+(l+16)|0)>>2])){c=0;break}for(;;)if(n=0|d[(r=t+20|0)>>2])t=n,i=r;else{if(!(n=0|d[(r=t+16|0)>>2]))break;t=n,i=r}if(!(i>>>0>>0)){d[i>>2]=0,c=t;break}ee()}else{if((n=0|d[e+(l+8)>>2])>>>0>>0&&ee(),(0|d[(t=n+12|0)>>2])!=(0|u)&&ee(),(0|d[(i=r+8|0)>>2])==(0|u)){d[t>>2]=r,d[i>>2]=n,c=r;break}ee()}}while(0);if(o){if(t=0|d[e+(l+28)>>2],(0|u)==(0|d[(i=41176+(t<<2)|0)>>2])){if(d[i>>2]=c,!c){d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(t=o+16|0)>>2])==(0|u)?d[t>>2]=c:d[o+20>>2]=c,!c){v=u,a=f;break}c>>>0<(i=0|d[10222])>>>0&&ee(),d[c+24>>2]=o,t=0|d[e+(l+16)>>2];do{if(t){if(!(t>>>0>>0)){d[c+16>>2]=t,d[t+24>>2]=c;break}ee()}}while(0);if(t=0|d[e+(l+20)>>2]){if(!(t>>>0<(0|d[10222])>>>0)){d[c+20>>2]=t,d[t+24>>2]=c,v=u,a=f;break}ee()}else v=u,a=f}else v=u,a=f}}while(0);if(v>>>0>=p>>>0&&ee(),1&(i=0|d[(t=e+(m+-4)|0)>>2])||ee(),2&i)d[t>>2]=-2&i,d[v+4>>2]=1|a,d[v+a>>2]=a;else{if((0|p)==(0|d[10224])){if(b=(0|d[10221])+a|0,d[10221]=b,d[10224]=v,d[v+4>>2]=1|b,(0|v)!=(0|d[10223]))return;return d[10223]=0,void(d[10220]=0)}if((0|p)==(0|d[10223]))return b=(0|d[10220])+a|0,d[10220]=b,d[10223]=v,d[v+4>>2]=1|b,void(d[v+b>>2]=b);a=(-8&i)+a|0,n=i>>>3;do{if(i>>>0>=256){o=0|d[e+(m+16)>>2],t=0|d[e+(4|m)>>2];do{if((0|t)==(0|p)){if(!(t=0|d[(i=e+(m+12)|0)>>2])&&!(t=0|d[(i=e+(m+8)|0)>>2])){g=0;break}for(;;)if(n=0|d[(r=t+20|0)>>2])t=n,i=r;else{if(!(n=0|d[(r=t+16|0)>>2]))break;t=n,i=r}if(!(i>>>0<(0|d[10222])>>>0)){d[i>>2]=0,g=t;break}ee()}else{if((i=0|d[e+m>>2])>>>0<(0|d[10222])>>>0&&ee(),(0|d[(r=i+12|0)>>2])!=(0|p)&&ee(),(0|d[(n=t+8|0)>>2])==(0|p)){d[r>>2]=t,d[n>>2]=i,g=t;break}ee()}}while(0);if(o){if(t=0|d[e+(m+20)>>2],(0|p)==(0|d[(i=41176+(t<<2)|0)>>2])){if(d[i>>2]=g,!g){d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(t=o+16|0)>>2])==(0|p)?d[t>>2]=g:d[o+20>>2]=g,!g)break;g>>>0<(i=0|d[10222])>>>0&&ee(),d[g+24>>2]=o,t=0|d[e+(m+8)>>2];do{if(t){if(!(t>>>0>>0)){d[g+16>>2]=t,d[t+24>>2]=g;break}ee()}}while(0);if(t=0|d[e+(m+12)>>2]){if(!(t>>>0<(0|d[10222])>>>0)){d[g+20>>2]=t,d[t+24>>2]=g;break}ee()}}}else{if(r=0|d[e+m>>2],i=0|d[e+(4|m)>>2],(0|r)!=(0|(t=40912+(n<<1<<2)|0))&&(r>>>0<(0|d[10222])>>>0&&ee(),(0|d[r+12>>2])!=(0|p)&&ee()),(0|i)==(0|r)){d[10218]=d[10218]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(t=i+8|0)>>2])==(0|p)?h=t:ee()):h=i+8|0,d[r+12>>2]=i,d[h>>2]=r}}while(0);if(d[v+4>>2]=1|a,d[v+a>>2]=a,(0|v)==(0|d[10223]))return void(d[10220]=a)}if(t=a>>>3,a>>>0<256)return n=40912+((i=t<<1)<<2)|0,(r=0|d[10218])&(t=1<>2])>>>0<(0|d[10222])>>>0?ee():(A=t,S=i):(d[10218]=r|t,A=40912+(i+2<<2)|0,S=n),d[A>>2]=v,d[S+12>>2]=v,d[v+8>>2]=S,void(d[v+12>>2]=n);(t=a>>>8)?a>>>0>16777215?n=31:n=a>>>((n=14-((p=((S=t<<(A=(t+1048320|0)>>>16&8))+520192|0)>>>16&4)|A|(n=((S<<=p)+245760|0)>>>16&2))+(S<>>15)|0)+7|0)&1|n<<1:n=0,t=41176+(n<<2)|0,d[v+28>>2]=n,d[v+20>>2]=0,d[v+16>>2]=0,i=0|d[10219],r=1<>2];t:do{if((-8&d[t+4>>2])!=(0|a)){for(n=a<<(31==(0|n)?0:25-(n>>>1));r=0|d[(i=t+16+(n>>>31<<2)|0)>>2];){if((-8&d[r+4>>2])==(0|a)){b=r;break t}n<<=1,t=r}if(!(i>>>0<(0|d[10222])>>>0)){d[i>>2]=v,d[v+24>>2]=t,d[v+12>>2]=v,d[v+8>>2]=v;break e}ee()}else b=t}while(0);if((i=0|d[(t=b+8|0)>>2])>>>0>=(S=0|d[10222])>>>0&b>>>0>=S>>>0){d[i+12>>2]=v,d[t>>2]=v,d[v+8>>2]=i,d[v+12>>2]=b,d[v+24>>2]=0;break}ee()}else d[10219]=i|r,d[t>>2]=v,d[v+24>>2]=t,d[v+12>>2]=v,d[v+8>>2]=v}while(0);if(v=(0|d[10226])-1|0,d[10226]=v,v)return;for(t=41328;t=0|d[t>>2];)t=t+8|0;d[10226]=-1}}function Er(e,t){t|=0;var i=0,r=0;return(e|=0)?t>>>0>4294967231?(e=0|$a(),d[e>>2]=12,0|(e=0)):(i=0|function(e,t){e|=0,t|=0;var i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0,m=0,g=0;if(m=e+4|0,g=0|d[m>>2],u=e+(l=-8&g)|0,s=0|d[10222],i=3&g,1!=(0|i)&e>>>0>=s>>>0&e>>>0>>0||ee(),r=e+(4|l)|0,n=0|d[r>>2],1&n||ee(),!i)return t>>>0<256?(e=0,0|e):(l>>>0>=(t+4|0)>>>0&&(l-t|0)>>>0<=d[10338]<<1>>>0||(e=0),0|e);if(l>>>0>=t>>>0)return i=l-t|0,i>>>0<=15||(d[m>>2]=1&g|t|2,d[e+(t+4)>>2]=3|i,d[r>>2]=1|d[r>>2],Mr(e+t|0,i)),0|e;if((0|u)==(0|d[10224]))return i=(0|d[10221])+l|0,i>>>0<=t>>>0?(e=0,0|e):(h=i-t|0,d[m>>2]=1&g|t|2,d[e+(t+4)>>2]=1|h,d[10224]=e+t,d[10221]=h,0|e);if((0|u)==(0|d[10223]))return r=(0|d[10220])+l|0,r>>>0>>0?(e=0,0|e):(i=r-t|0,i>>>0>15?(d[m>>2]=1&g|t|2,d[e+(t+4)>>2]=1|i,d[e+r>>2]=i,r=e+(r+4)|0,d[r>>2]=-2&d[r>>2],r=e+t|0):(d[m>>2]=1&g|r|2,r=e+(r+4)|0,d[r>>2]=1|d[r>>2],r=0,i=0),d[10220]=i,d[10223]=r,0|e);if(2&n||(f=(-8&n)+l|0)>>>0>>0)return e=0,0|e;h=f-t|0,a=n>>>3;do{if(n>>>0>=256){o=0|d[e+(l+24)>>2],a=0|d[e+(l+12)>>2];do{if((0|a)==(0|u)){if(!(i=0|d[(r=e+(l+20)|0)>>2])&&!(i=0|d[(r=e+(l+16)|0)>>2])){c=0;break}for(;;)if(a=0|d[(n=i+20|0)>>2])i=a,r=n;else{if(!(a=0|d[(n=i+16|0)>>2]))break;i=a,r=n}if(!(r>>>0>>0)){d[r>>2]=0,c=i;break}ee()}else{if((n=0|d[e+(l+8)>>2])>>>0>>0&&ee(),(0|d[(i=n+12|0)>>2])!=(0|u)&&ee(),(0|d[(r=a+8|0)>>2])==(0|u)){d[i>>2]=a,d[r>>2]=n,c=a;break}ee()}}while(0);if(o){if(i=0|d[e+(l+28)>>2],(0|u)==(0|d[(r=41176+(i<<2)|0)>>2])){if(d[r>>2]=c,!c){d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(i=o+16|0)>>2])==(0|u)?d[i>>2]=c:d[o+20>>2]=c,!c)break;c>>>0<(r=0|d[10222])>>>0&&ee(),d[c+24>>2]=o,i=0|d[e+(l+16)>>2];do{if(i){if(!(i>>>0>>0)){d[c+16>>2]=i,d[i+24>>2]=c;break}ee()}}while(0);if(i=0|d[e+(l+20)>>2]){if(!(i>>>0<(0|d[10222])>>>0)){d[c+20>>2]=i,d[i+24>>2]=c;break}ee()}}}else{if(n=0|d[e+(l+8)>>2],r=0|d[e+(l+12)>>2],(0|n)!=(0|(i=40912+(a<<1<<2)|0))&&(n>>>0>>0&&ee(),(0|d[n+12>>2])!=(0|u)&&ee()),(0|r)==(0|n)){d[10218]=d[10218]&~(1<>>0>>0&&ee(),(0|d[(i=r+8|0)>>2])==(0|u)?o=i:ee()):o=r+8|0,d[n+12>>2]=r,d[o>>2]=n}}while(0);return h>>>0<16?(d[m>>2]=f|1&g|2,t=e+(4|f)|0,d[t>>2]=1|d[t>>2],0|e):(d[m>>2]=1&g|t|2,d[e+(t+4)>>2]=3|h,g=e+(4|f)|0,d[g>>2]=1|d[g>>2],Mr(e+t|0,h),0|e)}(e+-8|0,t>>>0<11?16:t+11&-8),i?0|(e=i+8|0):(i=0|Dr(t))?(Wn(0|i,0|e,0|((r=(-8&(r=0|d[e+-4>>2]))-(3&r?4:8)|0)>>>0>>0?r:t)),xr(e),0|(e=i)):0|(e=0)):0|(e=0|Dr(t))}function Mr(e,t){var i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0,m=0,g=0,p=0,A=0,S=0,b=0;p=(e|=0)+(t|=0)|0,i=0|d[e+4>>2];do{if(1&i)b=e,o=t;else{if(c=0|d[e>>2],!(3&i))return;if(f=c+t|0,(h=e+(0-c)|0)>>>0<(l=0|d[10222])>>>0&&ee(),(0|h)==(0|d[10223])){if(3&~(i=0|d[(r=e+(t+4)|0)>>2])){b=h,o=f;break}return d[10220]=f,d[r>>2]=-2&i,d[e+(4-c)>>2]=1|f,void(d[p>>2]=f)}if(a=c>>>3,c>>>0<256){if(n=0|d[e+(8-c)>>2],r=0|d[e+(12-c)>>2],(0|n)!=(0|(i=40912+(a<<1<<2)|0))&&(n>>>0>>0&&ee(),(0|d[n+12>>2])!=(0|h)&&ee()),(0|r)==(0|n)){d[10218]=d[10218]&~(1<>>0>>0&&ee(),(0|d[(i=r+8|0)>>2])==(0|h)?s=i:ee()):s=r+8|0,d[n+12>>2]=r,d[s>>2]=n,b=h,o=f;break}s=0|d[e+(24-c)>>2],n=0|d[e+(12-c)>>2];do{if((0|n)==(0|h)){if(!(i=0|d[(r=e+((n=16-c|0)+4)|0)>>2])&&!(i=0|d[(r=e+n|0)>>2])){u=0;break}for(;;)if(a=0|d[(n=i+20|0)>>2])i=a,r=n;else{if(!(a=0|d[(n=i+16|0)>>2]))break;i=a,r=n}if(!(r>>>0>>0)){d[r>>2]=0,u=i;break}ee()}else{if((a=0|d[e+(8-c)>>2])>>>0>>0&&ee(),(0|d[(i=a+12|0)>>2])!=(0|h)&&ee(),(0|d[(r=n+8|0)>>2])==(0|h)){d[i>>2]=n,d[r>>2]=a,u=n;break}ee()}}while(0);if(s){if(i=0|d[e+(28-c)>>2],(0|h)==(0|d[(r=41176+(i<<2)|0)>>2])){if(d[r>>2]=u,!u){d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(i=s+16|0)>>2])==(0|h)?d[i>>2]=u:d[s+20>>2]=u,!u){b=h,o=f;break}u>>>0<(n=0|d[10222])>>>0&&ee(),d[u+24>>2]=s,r=0|d[e+(i=16-c|0)>>2];do{if(r){if(!(r>>>0>>0)){d[u+16>>2]=r,d[r+24>>2]=u;break}ee()}}while(0);if(i=0|d[e+(i+4)>>2]){if(!(i>>>0<(0|d[10222])>>>0)){d[u+20>>2]=i,d[i+24>>2]=u,b=h,o=f;break}ee()}else b=h,o=f}else b=h,o=f}}while(0);if(p>>>0<(l=0|d[10222])>>>0&&ee(),2&(r=0|d[(i=e+(t+4)|0)>>2]))d[i>>2]=-2&r,d[b+4>>2]=1|o,d[b+o>>2]=o;else{if((0|p)==(0|d[10224])){if(S=(0|d[10221])+o|0,d[10221]=S,d[10224]=b,d[b+4>>2]=1|S,(0|b)!=(0|d[10223]))return;return d[10223]=0,void(d[10220]=0)}if((0|p)==(0|d[10223]))return S=(0|d[10220])+o|0,d[10220]=S,d[10223]=b,d[b+4>>2]=1|S,void(d[b+S>>2]=S);o=(-8&r)+o|0,a=r>>>3;do{if(r>>>0>=256){s=0|d[e+(t+24)>>2],n=0|d[e+(t+12)>>2];do{if((0|n)==(0|p)){if(!(i=0|d[(r=e+(t+20)|0)>>2])&&!(i=0|d[(r=e+(t+16)|0)>>2])){g=0;break}for(;;)if(a=0|d[(n=i+20|0)>>2])i=a,r=n;else{if(!(a=0|d[(n=i+16|0)>>2]))break;i=a,r=n}if(!(r>>>0>>0)){d[r>>2]=0,g=i;break}ee()}else{if((a=0|d[e+(t+8)>>2])>>>0>>0&&ee(),(0|d[(i=a+12|0)>>2])!=(0|p)&&ee(),(0|d[(r=n+8|0)>>2])==(0|p)){d[i>>2]=n,d[r>>2]=a,g=n;break}ee()}}while(0);if(s){if(i=0|d[e+(t+28)>>2],(0|p)==(0|d[(r=41176+(i<<2)|0)>>2])){if(d[r>>2]=g,!g){d[10219]=d[10219]&~(1<>>0<(0|d[10222])>>>0&&ee(),(0|d[(i=s+16|0)>>2])==(0|p)?d[i>>2]=g:d[s+20>>2]=g,!g)break;g>>>0<(r=0|d[10222])>>>0&&ee(),d[g+24>>2]=s,i=0|d[e+(t+16)>>2];do{if(i){if(!(i>>>0>>0)){d[g+16>>2]=i,d[i+24>>2]=g;break}ee()}}while(0);if(i=0|d[e+(t+20)>>2]){if(!(i>>>0<(0|d[10222])>>>0)){d[g+20>>2]=i,d[i+24>>2]=g;break}ee()}}}else{if(n=0|d[e+(t+8)>>2],r=0|d[e+(t+12)>>2],(0|n)!=(0|(i=40912+(a<<1<<2)|0))&&(n>>>0>>0&&ee(),(0|d[n+12>>2])!=(0|p)&&ee()),(0|r)==(0|n)){d[10218]=d[10218]&~(1<>>0>>0&&ee(),(0|d[(i=r+8|0)>>2])==(0|p)?m=i:ee()):m=r+8|0,d[n+12>>2]=r,d[m>>2]=n}}while(0);if(d[b+4>>2]=1|o,d[b+o>>2]=o,(0|b)==(0|d[10223]))return void(d[10220]=o)}if(i=o>>>3,o>>>0<256)return a=40912+((r=i<<1)<<2)|0,(n=0|d[10218])&(i=1<>2])>>>0<(0|d[10222])>>>0?ee():(A=i,S=r):(d[10218]=n|i,A=40912+(r+2<<2)|0,S=a),d[A>>2]=b,d[S+12>>2]=b,d[b+8>>2]=S,void(d[b+12>>2]=a);if((i=o>>>8)?o>>>0>16777215?a=31:a=o>>>((a=14-((p=((S=i<<(A=(i+1048320|0)>>>16&8))+520192|0)>>>16&4)|A|(a=((S<<=p)+245760|0)>>>16&2))+(S<>>15)|0)+7|0)&1|a<<1:a=0,i=41176+(a<<2)|0,d[b+28>>2]=a,d[b+20>>2]=0,d[b+16>>2]=0,!((r=0|d[10219])&(n=1<>2]=b,d[b+24>>2]=i,d[b+12>>2]=b,void(d[b+8>>2]=b);i=0|d[i>>2];e:do{if((-8&d[i+4>>2])!=(0|o)){for(a=o<<(31==(0|a)?0:25-(a>>>1));n=0|d[(r=i+16+(a>>>31<<2)|0)>>2];){if((-8&d[n+4>>2])==(0|o)){i=n;break e}a<<=1,i=n}return r>>>0<(0|d[10222])>>>0&&ee(),d[r>>2]=b,d[b+24>>2]=i,d[b+12>>2]=b,void(d[b+8>>2]=b)}}while(0);(n=0|d[(r=i+8|0)>>2])>>>0>=(S=0|d[10222])>>>0&i>>>0>=S>>>0||ee(),d[n+12>>2]=b,d[r>>2]=b,d[b+8>>2]=n,d[b+12>>2]=i,d[b+24>>2]=0}function kr(e){e|=0;var t,i,r=0,n=0,a=0,o=0;if(function(e,t,i){e|=0,t|=0,i|=0;var r=0,n=0,a=0;if(n=b,b=b+16|0,a=n+4|0,r=n,on(e),d[e>>2]=42600,d[e+32>>2]=t,d[e+40>>2]=i,d[e+48>>2]=-1,f[e+52|0]=0,dr(a,e+4|0),d[r>>2]=d[a>>2],y=0,L(23,0|e,0|r),i=y,y=0,!(1&i))return mr(r),void(b=n);a=0|ae(),mr(r),an(e),de(0|a)}(42048,t=0|d[9321],42104),d[10342]=42892,d[10344]=42912,d[10343]=0,e=0|d[10720],y=0,L(62,41368+e|0,42048),a=y,y=0,1&a&&(a=0|ae(),tn(41376),de(0|a)),d[41368+(e+72)>>2]=0,d[41368+(e+76)>>2]=-1,Rr(42152,i=0|d[9322],42112),d[10364]=42972,d[10365]=42992,n=0|d[10740],y=0,L(62,41456+n|0,42152),a=y,y=0,1&a&&(a=0|ae(),tn(41460),de(0|a)),d[41456+(e=n+72|0)>>2]=0,d[41456+(r=n+76|0)>>2]=-1,Rr(42200,a=0|d[9320],42120),d[10385]=42972,d[10386]=42992,y=0,L(62,41540+n|0,42200),o=y,y=0,1&o&&(o=0|ae(),tn(41544),de(0|o)),d[41540+e>>2]=0,d[41540+r>>2]=-1,o=0|d[24+(0|d[(0|d[10385])-12>>2])+41540>>2],d[10406]=42972,d[10407]=42992,y=0,L(62,41624+n|0,0|o),o=y,y=0,1&o&&(o=0|ae(),tn(41628),de(0|o)),d[41624+e>>2]=0,d[41624+r>>2]=-1,d[72+(0|d[(0|d[10342])-12>>2])+41368>>2]=41456,e=4+(0|d[(0|d[10385])-12>>2])+41540|0,d[e>>2]=8192|d[e>>2],d[72+(0|d[(0|d[10385])-12>>2])+41540>>2]=41456,function(e,t,i){e|=0,t|=0,i|=0;var r=0,n=0,a=0;if(n=b,b=b+16|0,a=n+4|0,r=n,ln(e),d[e>>2]=42472,d[e+32>>2]=t,d[e+40>>2]=i,d[e+48>>2]=-1,f[e+52|0]=0,dr(a,e+4|0),d[r>>2]=d[a>>2],y=0,L(21,0|e,0|r),i=y,y=0,!(1&i))return mr(r),void(b=n);a=0|ae(),mr(r),sn(e),de(0|a)}(42248,t,42128),d[10427]=42932,d[10429]=42952,d[10428]=0,e=0|d[10730],y=0,L(62,41708+e|0,42248),o=y,y=0,1&o&&(o=0|ae(),nn(41716),de(0|o)),d[41708+(e+72)>>2]=0,d[41708+(e+76)>>2]=-1,Fr(42304,i,42136),d[10449]=43012,d[10450]=43032,n=0|d[10750],y=0,L(62,41796+n|0,42304),o=y,y=0,1&o&&(o=0|ae(),nn(41800),de(0|o)),d[41796+(e=n+72|0)>>2]=0,d[41796+(r=n+76|0)>>2]=-1,Fr(42352,a,42144),d[10470]=43012,d[10471]=43032,y=0,L(62,41880+n|0,42352),o=y,y=0,1&o&&(o=0|ae(),nn(41884),de(0|o)),d[41880+e>>2]=0,d[41880+r>>2]=-1,o=0|d[24+(0|d[(0|d[10470])-12>>2])+41880>>2],d[10491]=43012,d[10492]=43032,y=0,L(62,41964+n|0,0|o),o=y,y=0,!(1&o))return d[41964+e>>2]=0,d[41964+r>>2]=-1,d[72+(0|d[(0|d[10427])-12>>2])+41708>>2]=41796,o=4+(0|d[(0|d[10470])-12>>2])+41880|0,d[o>>2]=8192|d[o>>2],void(d[72+(0|d[(0|d[10470])-12>>2])+41880>>2]=41796);o=0|ae(),nn(41968),de(0|o)}function Rr(e,t,i){t|=0,i|=0;var r,n,a=0;if(n=b,b=b+16|0,a=n+4|0,r=n,on(e|=0),d[e>>2]=42536,d[e+32>>2]=t,dr(a,e+4|0),d[r>>2]=d[a>>2],y=0,t=0|G(37,0|r,44280),a=y,y=0,!(1&a))return mr(r),d[e+36>>2]=t,d[e+40>>2]=i,a=1&ts[127&d[28+(0|d[t>>2])>>2]](t),f[e+44|0]=a,void(b=n);a=0|ae(),mr(r),an(e),de(0|a)}function Fr(e,t,i){t|=0,i|=0;var r,n,a=0;if(n=b,b=b+16|0,a=n+4|0,r=n,ln(e|=0),d[e>>2]=42408,d[e+32>>2]=t,dr(a,e+4|0),d[r>>2]=d[a>>2],y=0,t=0|G(37,0|r,44288),a=y,y=0,!(1&a))return mr(r),d[e+36>>2]=t,d[e+40>>2]=i,a=1&ts[127&d[28+(0|d[t>>2])>>2]](t),f[e+44|0]=a,void(b=n);a=0|ae(),mr(r),sn(e),de(0|a)}function Pr(e,t){t|=0;var i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0;o=b,b=b+32|0,a=o+16|0,n=o+8|0,i=o+4|0,r=o,c=(e|=0)+52|0;e:do{if(0|f[c|0])l=e+48|0,s=0|d[l>>2],t&&(d[l>>2]=-1,f[c|0]=0);else{if(p=e+32|0,(0|(s=(0|(s=0|d[e+44>>2]))>1?s:1))>0){c=0;do{if(-1==(0|(l=0|Ro(0|d[p>>2])))){s=-1;break e}f[a+c|0]=l,c=c+1|0}while((0|c)<(0|s))}t:do{if(0|f[e+53|0])d[n>>2]=f[a|0];else{h=e+40|0,m=e+36|0,g=n+4|0;i:for(;;){switch(A=0|d[h>>2],l=0|d[(c=A)>>2],c=0|d[c+4>>2],S=0|d[m>>2],u=a+s|0,0|gs[15&d[16+(0|d[S>>2])>>2]](S,A,a,u,i,n,g,r)){case 2:s=-1;break e;case 3:break i;case 1:break;default:break t}if(S=0|d[h>>2],d[S>>2]=l,d[S+4>>2]=c,8==(0|s)){s=-1;break e}if(-1==(0|(l=0|Ro(0|d[p>>2])))){s=-1;break e}f[u|0]=l,s=s+1|0}d[n>>2]=f[a|0]}}while(0);if(t){s=0|d[n>>2],d[e+48>>2]=s;break}for(;!((0|s)<=0);)if(-1==(0|Lo(0|f[a+(s=s+-1|0)|0],0|d[p>>2]))){s=-1;break e}s=0|d[n>>2]}}while(0);return b=o,0|s}function Lr(e,t){t|=0;var i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0;o=b,b=b+32|0,a=o+16|0,n=o+8|0,i=o+4|0,r=o,c=(e|=0)+52|0;e:do{if(0|f[c|0])l=e+48|0,s=0|d[l>>2],t&&(d[l>>2]=-1,f[c|0]=0);else{if(A=e+32|0,(0|(s=(0|(s=0|d[e+44>>2]))>1?s:1))>0){c=0;do{if(-1==(0|(l=0|Ro(0|d[A>>2])))){s=-1;break e}f[a+c|0]=l,c=c+1|0}while((0|c)<(0|s))}t:do{if(0|f[e+53|0])f[n|0]=0|f[a|0];else{h=e+40|0,g=e+36|0,p=n+1|0;i:for(;;){switch(S=0|d[h>>2],l=0|d[(c=S)>>2],c=0|d[c+4>>2],v=0|d[g>>2],u=a+s|0,0|gs[15&d[16+(0|d[v>>2])>>2]](v,S,a,u,i,n,p,r)){case 2:s=-1;break e;case 3:break i;case 1:break;default:break t}if(v=0|d[h>>2],d[v>>2]=l,d[v+4>>2]=c,8==(0|s)){s=-1;break e}if(-1==(0|(l=0|Ro(0|d[A>>2])))){s=-1;break e}f[u|0]=l,s=s+1|0}f[n|0]=0|f[a|0]}}while(0);if(t)s=0|f[n|0],d[e+48>>2]=255&s;else{for(;!((0|s)<=0);)if(-1==(0|Lo(0|m[a+(s=s+-1|0)|0],0|d[A>>2]))){s=-1;break e}s=0|f[n|0]}s&=255}}while(0);return b=o,0|s}function _r(e){d[(e=(e|=0)+4|0)>>2]=1+(0|d[e>>2])}function Nr(e){var t,i;return t=0|d[(i=(e|=0)+4|0)>>2],d[i>>2]=t+-1,t?e=0:(Jo[255&d[8+(0|d[e>>2])>>2]](e),e=1),0|e}function Ur(e){Ga(e|=0)}function Or(e,t){e|=0,1&f[(t|=0)|0]?Br(e,0|d[t+8>>2],0|d[t+4>>2]):(d[e>>2]=d[t>>2],d[e+4>>2]=d[t+4>>2],d[e+8>>2]=d[t+8>>2])}function Br(e,t,i){e|=0,t|=0;var r=0,n=0;(i|=0)>>>0>4294967279&&_a(e),i>>>0<11?(f[e|0]=i<<1,e=e+1|0):(r=0|Oa(n=i+16&-16),d[e+8>>2]=r,d[e>>2]=1|n,d[e+4>>2]=i,e=r),Wn(0|e,0|t,0|i),f[e+i|0]=0}function Vr(e,t,i){e|=0,i|=0;var r=0,n=0;(t|=0)>>>0>4294967279&&_a(e),t>>>0<11?(f[e|0]=t<<1,e=e+1|0):(r=0|Oa(n=t+16&-16),d[e+8>>2]=r,d[e>>2]=1|n,d[e+4>>2]=t,e=r),zn(0|e,0|i,0|t),f[e+t|0]=0}function qr(e){1&f[(e|=0)|0]&&Ba(0|d[e+8>>2])}function Gr(e,t,i){t|=0,i|=0;var r,n=0,a=0;1&(n=0|f[(e|=0)|0])?(a=(-2&(n=0|d[e>>2]))-1|0,n&=255):a=10,r=!(1&n);do{if(a>>>0>=i>>>0){if(Kn(0|(n=r?e+1|0:0|d[e+8>>2]),0|t,0|i),f[n+i|0]=0,1&f[e|0]){d[e+4>>2]=i;break}f[e|0]=i<<1;break}Wr(e,a,i-a|0,n=r?(255&n)>>>1:0|d[e+4>>2],0,n,i,t)}while(0);return 0|e}function Qr(e,t,i){t|=0,i|=0;var r,n=0;n=(r=!(1&(n=0|f[(e|=0)|0])))?(255&n)>>>1:0|d[e+4>>2];do{if(n>>>0>=t>>>0){if(r){f[e+1+t|0]=0,f[e|0]=t<<1;break}f[(0|d[e+8>>2])+t|0]=0,d[e+4>>2]=t;break}zr(e,t-n|0,i)}while(0)}function zr(e,t,i){e|=0,i|=0;var r=0,n=0,a=0;return(t|=0)&&(1&(r=0|f[e|0])?(n=(-2&(r=0|d[e>>2]))-1|0,r&=255):n=10,(n-(a=1&r?0|d[e+4>>2]:(255&r)>>>1)|0)>>>0>>0&&(Xr(e,n,t-n+a|0,a,a,0,0),r=0|f[e|0]),zn((n=1&r?0|d[e+8>>2]:e+1|0)+a|0,0|i,0|t),r=a+t|0,1&f[e|0]?d[e+4>>2]=r:f[e|0]=r<<1,f[n+r|0]=0),0|e}function Hr(e,t){return 0|Yr(e|=0,t|=0,0|Go(t))}function Yr(e,t,i){t|=0,i|=0;var r=0,n=0,a=0;return 1&(r=0|f[(e|=0)|0])?(n=(-2&(r=0|d[e>>2]))-1|0,r&=255):n=10,(n-(a=1&r?0|d[e+4>>2]:(255&r)>>>1)|0)>>>0>=i>>>0?i&&(Wn((n=1&r?0|d[e+8>>2]:e+1|0)+a|0,0|t,0|i),r=a+i|0,1&f[e|0]?d[e+4>>2]=r:f[e|0]=r<<1,f[n+r|0]=0):Wr(e,n,i-n+a|0,a,a,0,i,t),0|e}function Wr(e,t,i,r,n,a,o,s){e|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l=0,c=0,u=0;(-18-(t|=0)|0)>>>0<(i|=0)>>>0&&_a(e),u=1&f[e|0]?0|d[e+8>>2]:e+1|0,t>>>0<2147483623?l=(l=(l=i+t|0)>>>0<(c=t<<1)>>>0?c:l)>>>0<11?11:l+16&-16:l=-17,c=0|Oa(l),n&&Wn(0|c,0|u,0|n),o&&Wn(c+n|0,0|s,0|o),(0|(i=r-a|0))!=(0|n)&&Wn(c+(o+n)|0,u+(a+n)|0,i-n|0),10!=(0|t)&&Ba(u),d[e+8>>2]=c,d[e>>2]=1|l,t=i+o|0,d[e+4>>2]=t,f[c+t|0]=0}function Xr(e,t,i,r,n,a,o){e|=0,r|=0,n|=0,a|=0,o|=0;var s=0,l=0,c=0;(-17-(t|=0)|0)>>>0<(i|=0)>>>0&&_a(e),c=1&f[e|0]?0|d[e+8>>2]:e+1|0,t>>>0<2147483623?s=(s=(s=i+t|0)>>>0<(l=t<<1)>>>0?l:s)>>>0<11?11:s+16&-16:s=-17,l=0|Oa(s),n&&Wn(0|l,0|c,0|n),(0|(i=r-a|0))!=(0|n)&&Wn(l+(o+n)|0,c+(a+n)|0,i-n|0),10!=(0|t)&&Ba(c),d[e+8>>2]=l,d[e>>2]=1|s}function Kr(e,t,i){e|=0,t|=0;var r=0,n=0;(i|=0)>>>0>1073741807&&_a(e),i>>>0<2?(f[e|0]=i<<1,e=e+4|0):(r=0|Oa((n=i+4&-4)<<2),d[e+8>>2]=r,d[e>>2]=1|n,d[e+4>>2]=i,e=r),Ho(e,t,i),d[e+(i<<2)>>2]=0}function jr(e,t,i){e|=0,i|=0;var r=0,n=0;(t|=0)>>>0>1073741807&&_a(e),t>>>0<2?(f[e|0]=t<<1,e=e+4|0):(r=0|Oa((n=t+4&-4)<<2),d[e+8>>2]=r,d[e>>2]=1|n,d[e+4>>2]=t,e=r),function(e,t,i){e|=0,t|=0,i|=0;var r=0;if(i)for(r=e;i=i+-1|0,d[r>>2]=t,i;)r=r+4|0}(e,i,t),d[e+(t<<2)>>2]=0}function Zr(e){1&f[(e|=0)|0]&&Ba(0|d[e+8>>2])}function Jr(e,t,i,r,n,a,o,s){e|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l=0,c=0,u=0;(1073741806-(t|=0)|0)>>>0<(i|=0)>>>0&&_a(e),u=1&f[e|0]?0|d[e+8>>2]:e+4|0,t>>>0<536870887?l=(l=(l=i+t|0)>>>0<(c=t<<1)>>>0?c:l)>>>0<2?2:l+4&-4:l=1073741807,c=0|Oa(l<<2),n&&Ho(c,u,n),o&&Ho(c+(n<<2)|0,s,o),(0|(i=r-a|0))!=(0|n)&&Ho(c+(o+n<<2)|0,u+(a+n<<2)|0,i-n|0),1!=(0|t)&&Ba(u),d[e+8>>2]=c,d[e>>2]=1|l,t=i+o|0,d[e+4>>2]=t,d[c+(t<<2)>>2]=0}function $r(e,t,i,r,n,a,o){e|=0,r|=0,n|=0,a|=0,o|=0;var s=0,l=0,c=0;(1073741807-(t|=0)|0)>>>0<(i|=0)>>>0&&_a(e),c=1&f[e|0]?0|d[e+8>>2]:e+4|0,t>>>0<536870887?s=(s=(s=i+t|0)>>>0<(l=t<<1)>>>0?l:s)>>>0<2?2:s+4&-4:s=1073741807,l=0|Oa(s<<2),n&&Ho(l,c,n),(0|(i=r-a|0))!=(0|n)&&Ho(l+(o+n<<2)|0,c+(a+n<<2)|0,i-n|0),1!=(0|t)&&Ba(c),d[e+8>>2]=l,d[e>>2]=1|s}function en(e){var t=0;if(d[(e|=0)>>2]=43068,y=0,L(88,0|e,0),t=y,y=0,!(1&t))return mr(e+28|0),xr(0|d[e+32>>2]),xr(0|d[e+36>>2]),xr(0|d[e+48>>2]),void xr(0|d[e+60>>2]);Ue(t=0|ae(0))}function tn(e){en(e|=0)}function rn(e){var t,i;return i=b,b=b+16|0,dr(t=i,(e|=0)+28|0),b=i,0|d[t>>2]}function nn(e){en(e|=0)}function an(e){d[(e|=0)>>2]=42760,mr(e+4|0)}function on(e){d[(e|=0)>>2]=42760,hr(e+4|0),d[(e=e+8|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[e+16>>2]=0,d[e+20>>2]=0}function sn(e){d[(e|=0)>>2]=42824,mr(e+4|0)}function ln(e){d[(e|=0)>>2]=42824,hr(e+4|0),d[(e=e+8|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[e+16>>2]=0,d[e+20>>2]=0}function cn(e){en((e|=0)+8|0),Ba(e)}function un(e){e|=0;var t,i,r=0,n=0;i=b,b=b+16|0,t=i;e:do{if(0|d[e+(24+(0|d[(0|d[e>>2])-12>>2]))>>2]){y=0,L(65,0|t,0|e),r=y,y=0;t:do{if(!(1&r)){do{if(0|f[t|0]){if(r=0|d[e+(24+(0|d[(0|d[e>>2])-12>>2]))>>2],y=0,r=0|N(0|d[24+(0|d[r>>2])>>2],0|r),n=y,y=0,!(1&n||-1==(0|r)&&(n=0|d[(0|d[e>>2])-12>>2],y=0,L(66,e+n|0,1|d[e+(n+16)>>2]),n=y,y=0,1&n)))break;r=0|ae(0),mn(t);break t}}while(0);mn(t);break e}r=0|ae(0)}while(0);if(ue(0|r),y=0,P(181,e+(0|d[(0|d[e>>2])-12>>2])|0),n=y,y=0,!(1&n)){he();break}r=0|ae(),y=0,X(3),n=y,y=0,1&n?Ue(n=0|ae(0)):de(0|r)}}while(0);return b=i,0|e}function fn(e){en((e|=0)+8|0),Ba(e)}function hn(e){e|=0;var t,i,r=0,n=0;i=b,b=b+16|0,t=i;e:do{if(0|d[e+(24+(0|d[(0|d[e>>2])-12>>2]))>>2]){y=0,L(89,0|t,0|e),r=y,y=0;t:do{if(!(1&r)){do{if(0|f[t|0]){if(r=0|d[e+(24+(0|d[(0|d[e>>2])-12>>2]))>>2],y=0,r=0|N(0|d[24+(0|d[r>>2])>>2],0|r),n=y,y=0,!(1&n||-1==(0|r)&&(n=0|d[(0|d[e>>2])-12>>2],y=0,L(66,e+n|0,1|d[e+(n+16)>>2]),n=y,y=0,1&n)))break;r=0|ae(0),pn(t);break t}}while(0);pn(t);break e}r=0|ae(0)}while(0);if(ue(0|r),y=0,P(181,e+(0|d[(0|d[e>>2])-12>>2])|0),n=y,y=0,!(1&n)){he();break}r=0|ae(),y=0,X(3),n=y,y=0,1&n?Ue(n=0|ae(0)):de(0|r)}}while(0);return b=i,0|e}function dn(e){en((e|=0)+4|0),Ba(e)}function mn(e){var t=0,i=0;i=0|d[(e=(e|=0)+4|0)>>2],t=0|d[(0|d[i>>2])-12>>2];do{if(0|d[i+(t+24)>>2]&&!(0|d[i+(t+16)>>2])&&8192&d[i+(t+4)>>2]&&!(0|me())){if(t=0|d[e>>2],t=0|d[t+(24+(0|d[(0|d[t>>2])-12>>2]))>>2],y=0,t=0|N(0|d[24+(0|d[t>>2])>>2],0|t),i=y,y=0,!(1&i||-1==(0|t)&&(t=0|d[e>>2],i=0|d[(0|d[t>>2])-12>>2],y=0,L(66,t+i|0,1|d[t+(i+16)>>2]),i=y,y=0,1&i)))break;i=0|ae(0),ue(0|i),y=0,X(3),i=y,y=0,1&i&&Ue(i=0|ae(0))}}while(0)}function gn(e){en((e|=0)+4|0),Ba(e)}function pn(e){var t=0,i=0;i=0|d[(e=(e|=0)+4|0)>>2],t=0|d[(0|d[i>>2])-12>>2];do{if(0|d[i+(t+24)>>2]&&!(0|d[i+(t+16)>>2])&&8192&d[i+(t+4)>>2]&&!(0|me())){if(t=0|d[e>>2],t=0|d[t+(24+(0|d[(0|d[t>>2])-12>>2]))>>2],y=0,t=0|N(0|d[24+(0|d[t>>2])>>2],0|t),i=y,y=0,!(1&i||-1==(0|t)&&(t=0|d[e>>2],i=0|d[(0|d[t>>2])-12>>2],y=0,L(66,t+i|0,1|d[t+(i+16)>>2]),i=y,y=0,1&i)))break;i=0|ae(0),ue(0|i),y=0,X(3),i=y,y=0,1&i&&Ue(i=0|ae(0))}}while(0)}function An(e,t,i,r,n,a,o,s,l,c){e|=0,t|=0,i|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0;var u,h,m=0,g=0;h=(0|(u=0|d[(r|=0)>>2]))==(0|i);do{if(h){if(!(m=(0|f[c+24|0])==e<<24>>24)&&(0|f[c+25|0])!=e<<24>>24){g=5;break}d[r>>2]=i+1,f[i|0]=m?43:45,d[n>>2]=0,m=0}else g=5}while(0);e:do{if(5==(0|g)){if(g=0|f[o|0],e<<24>>24==a<<24>>24&&0|(1&g?d[o+4>>2]:(255&g)>>>1)){if(((m=0|d[l>>2])-s|0)>=160){m=0;break}t=0|d[n>>2],d[l>>2]=m+4,d[m>>2]=t,d[n>>2]=0,m=0;break}for(o=c+26|0,m=c;(0|f[m|0])!=e<<24>>24;)if((0|(m=m+1|0))==(0|o)){m=o;break}if((0|(m=m-c|0))>23)m=-1;else{switch(0|t){case 10:case 8:if((0|m)>=(0|t)){m=-1;break e}break;case 16:if((0|m)>=22){if(h){m=-1;break e}if((u-i|0)>=3){m=-1;break e}if(48!=(0|f[u+-1|0])){m=-1;break e}d[n>>2]=0,m=0|f[57498+m|0],d[r>>2]=u+1,f[u|0]=m,m=0;break e}}m=0|f[57498+m|0],d[r>>2]=u+1,f[u|0]=m,d[n>>2]=1+(0|d[n>>2]),m=0}}}while(0);return 0|m}function Sn(){var e=0,t=0;do{if(!(0|f[1968])&&0|te(1968)){if(y=0,e=0|O(31,2147483647,58885,0),t=y,y=0,!(1&t)){d[11196]=e,oe(1968);break}t=0|ae(),Pe(1968),de(0|t)}}while(0);return 0|d[11196]}function bn(e,t,i,r,n,a,o,s,l,c){e|=0,t|=0,i|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0;var u,h,m=0,g=0;h=(0|(u=0|d[(r|=0)>>2]))==(0|i);do{if(h){if(!(m=(0|d[c+96>>2])==(0|e))&&(0|d[c+100>>2])!=(0|e)){g=5;break}d[r>>2]=i+1,f[i|0]=m?43:45,d[n>>2]=0,m=0}else g=5}while(0);e:do{if(5==(0|g)){if(g=0|f[o|0],(0|e)==(0|a)&&0|(1&g?d[o+4>>2]:(255&g)>>>1)){if(((m=0|d[l>>2])-s|0)>=160){m=0;break}t=0|d[n>>2],d[l>>2]=m+4,d[m>>2]=t,d[n>>2]=0,m=0;break}for(o=c+104|0,m=c;(0|d[m>>2])!=(0|e);)if((0|(m=m+4|0))==(0|o)){m=o;break}if(o=(m=m-c|0)>>2,(0|m)>92)m=-1;else{switch(0|t){case 10:case 8:if((0|o)>=(0|t)){m=-1;break e}break;case 16:if((0|m)>=88){if(h){m=-1;break e}if((u-i|0)>=3){m=-1;break e}if(48!=(0|f[u+-1|0])){m=-1;break e}d[n>>2]=0,m=0|f[57498+o|0],d[r>>2]=u+1,f[u|0]=m,m=0;break e}}m=0|f[57498+o|0],d[r>>2]=u+1,f[u|0]=m,d[n>>2]=1+(0|d[n>>2]),m=0}}}while(0);return 0|m}function vn(e,t,i,r){e|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0;if(o=b,b=b+16|0,a=o,t=0|rn(t|=0),d[a>>2]=t,y=0,n=0|G(37,0|a,44220),c=y,y=0,!(1&c||(y=0,Y(0|d[32+(0|d[n>>2])>>2],0|n,57498,57524,0|i),c=y,y=0,1&c)||(y=0,l=0|G(37,0|a,44360),c=y,y=0,1&c)||(y=0,s=0|N(0|d[16+(0|d[l>>2])>>2],0|l),c=y,y=0,1&c)||(f[r|0]=s,y=0,L(0|d[20+(0|d[l>>2])>>2],0|e,0|l),c=y,y=0,1&c)))return Nr(t),void(b=o);c=0|ae(),Nr(t),de(0|c)}function wn(e,t,i,r,n){e|=0,i|=0,r|=0,n|=0;var a,o,s,l=0,c=0,u=0,h=0;if(s=b,b=b+16|0,o=s,t=0|rn(t|=0),d[o>>2]=t,y=0,a=0|G(37,0|o,44220),h=y,y=0,!(1&h||(y=0,Y(0|d[32+(0|d[a>>2])>>2],0|a,57498,57530,0|i),h=y,y=0,1&h)||(y=0,u=0|G(37,0|o,44360),h=y,y=0,1&h)||(y=0,l=0|N(0|d[12+(0|d[u>>2])>>2],0|u),h=y,y=0,1&h)||(f[r|0]=l,y=0,c=0|N(0|d[16+(0|d[u>>2])>>2],0|u),h=y,y=0,1&h)||(f[n|0]=c,y=0,L(0|d[20+(0|d[u>>2])>>2],0|e,0|u),h=y,y=0,1&h)))return Nr(t),void(b=s);h=0|ae(),Nr(t),de(0|h)}function Tn(e,t,i,r,n,a,o,s,l,c,u,h){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0,h|=0;var g=0,p=0;e:do{if(e<<24>>24==a<<24>>24)0|f[t|0]?(f[t|0]=0,i=0|d[n>>2],d[n>>2]=i+1,f[i|0]=46,i=0|f[s|0],0|(1&i?d[s+4>>2]:(255&i)>>>1)&&(g=0|d[c>>2],(g-l|0)<160)&&(l=0|d[u>>2],d[c>>2]=g+4,d[g>>2]=l),g=0):g=-1;else{if(e<<24>>24==o<<24>>24&&0|(1&(o=0|f[s|0])?d[s+4>>2]:(255&o)>>>1)){if(!(0|f[t|0])){g=-1;break}if(((g=0|d[c>>2])-l|0)>=160){g=0;break}l=0|d[u>>2],d[c>>2]=g+4,d[g>>2]=l,d[u>>2]=0,g=0;break}for(a=h+32|0,g=h;(0|f[g|0])!=e<<24>>24;)if((0|(g=g+1|0))==(0|a)){g=a;break}if((0|(a=g-h|0))>31)g=-1;else switch(o=0|f[57498+a|0],0|a){case 24:case 25:if((0|(g=0|d[n>>2]))!=(0|r)&&(95&m[g+-1|0])!=(127&m[i|0])){g=-1;break e}d[n>>2]=g+1,f[g|0]=o,g=0;break e;case 23:case 22:f[i|0]=80,g=0|d[n>>2],d[n>>2]=g+1,f[g|0]=o,g=0;break e;default:if((0|(g=95&o))==(0|f[i|0])&&(f[i|0]=128|g,!!(0|f[t|0]))&&(f[t|0]=0,!!(0|(1&(i=0|f[s|0])?d[s+4>>2]:(255&i)>>>1)))&&((p=0|d[c>>2])-l|0)<160&&(l=0|d[u>>2],d[c>>2]=p+4,d[p>>2]=l),c=0|d[n>>2],d[n>>2]=c+1,f[c|0]=o,(0|a)>21){g=0;break e}d[u>>2]=1+(0|d[u>>2]),g=0;break e}}}while(0);return 0|g}function yn(e,t,i,r){e|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0;if(o=b,b=b+16|0,a=o,t=0|rn(t|=0),d[a>>2]=t,y=0,n=0|G(37,0|a,44212),c=y,y=0,!(1&c||(y=0,Y(0|d[48+(0|d[n>>2])>>2],0|n,57498,57524,0|i),c=y,y=0,1&c)||(y=0,l=0|G(37,0|a,44368),c=y,y=0,1&c)||(y=0,s=0|N(0|d[16+(0|d[l>>2])>>2],0|l),c=y,y=0,1&c)||(d[r>>2]=s,y=0,L(0|d[20+(0|d[l>>2])>>2],0|e,0|l),c=y,y=0,1&c)))return Nr(t),void(b=o);c=0|ae(),Nr(t),de(0|c)}function Cn(e,t,i,r,n){e|=0,i|=0,r|=0,n|=0;var a,o,s,l=0,c=0,u=0,f=0;if(s=b,b=b+16|0,o=s,t=0|rn(t|=0),d[o>>2]=t,y=0,a=0|G(37,0|o,44212),f=y,y=0,!(1&f||(y=0,Y(0|d[48+(0|d[a>>2])>>2],0|a,57498,57530,0|i),f=y,y=0,1&f)||(y=0,u=0|G(37,0|o,44368),f=y,y=0,1&f)||(y=0,l=0|N(0|d[12+(0|d[u>>2])>>2],0|u),f=y,y=0,1&f)||(d[r>>2]=l,y=0,c=0|N(0|d[16+(0|d[u>>2])>>2],0|u),f=y,y=0,1&f)||(d[n>>2]=c,y=0,L(0|d[20+(0|d[u>>2])>>2],0|e,0|u),f=y,y=0,1&f)))return Nr(t),void(b=s);f=0|ae(),Nr(t),de(0|f)}function In(e,t,i,r,n,a,o,s,l,c,u,h){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0,h|=0;var g=0,p=0;e:do{if((0|e)==(0|a))0|f[t|0]?(f[t|0]=0,i=0|d[n>>2],d[n>>2]=i+1,f[i|0]=46,i=0|f[s|0],0|(1&i?d[s+4>>2]:(255&i)>>>1)&&(g=0|d[c>>2],(g-l|0)<160)&&(l=0|d[u>>2],d[c>>2]=g+4,d[g>>2]=l),g=0):g=-1;else{if((0|e)==(0|o)&&0|(1&(o=0|f[s|0])?d[s+4>>2]:(255&o)>>>1)){if(!(0|f[t|0])){g=-1;break}if(((g=0|d[c>>2])-l|0)>=160){g=0;break}l=0|d[u>>2],d[c>>2]=g+4,d[g>>2]=l,d[u>>2]=0,g=0;break}for(a=h+128|0,g=h;(0|d[g>>2])!=(0|e);)if((0|(g=g+4|0))==(0|a)){g=a;break}if(g=(a=g-h|0)>>2,(0|a)<=124){switch(o=0|f[57498+g|0],0|g){case 24:case 25:if((0|(g=0|d[n>>2]))!=(0|r)&&(95&m[g+-1|0])!=(127&m[i|0])){g=-1;break e}d[n>>2]=g+1,f[g|0]=o,g=0;break e;case 23:case 22:f[i|0]=80;break;default:(0|(g=95&o))==(0|f[i|0])&&(f[i|0]=128|g,0|f[t|0])&&(f[t|0]=0,0|(1&(i=0|f[s|0])?d[s+4>>2]:(255&i)>>>1))&&((p=0|d[c>>2])-l|0)<160&&(l=0|d[u>>2],d[c>>2]=p+4,d[p>>2]=l)}c=0|d[n>>2],d[n>>2]=c+1,f[c|0]=o,(0|a)>84||(d[u>>2]=1+(0|d[u>>2])),g=0}else g=-1}}while(0);return 0|g}function Dn(e,t,i,r){e|=0,t|=0,i|=0;var n=0,a=0;if(2048&(r|=0)&&(f[e|0]=43,e=e+1|0),512&r&&(f[e|0]=35,e=e+1|0),(n=0|f[t|0])<<24>>24)for(a=t;;){if(a=a+1|0,t=e+1|0,f[e|0]=n,!((n=0|f[a|0])<<24>>24)){e=t;break}e=t}e:do{switch(74&r){case 64:f[e|0]=111;break;case 8:if(16384&r){f[e|0]=88;break e}f[e|0]=120;break e;default:if(i){f[e|0]=100;break e}f[e|0]=117;break e}}while(0)}function xn(e,t,i){e|=0,t|=0,i|=0;e:do{switch(176&d[i+4>>2]){case 16:switch((i=0|f[e|0])<<24>>24){case 43:case 45:e=e+1|0;break e}if((t-e|0)>1&i<<24>>24==48){switch(0|f[e+1|0]){case 88:case 120:break;default:0;break e}e=e+2|0}else 0;break;case 32:e=t;break;default:0}}while(0);return 0|e}function En(e,t,i){e|=0,t|=0;var r,n,a,o=0,s=0;if(2048&(i|=0)&&(f[e|0]=43,e=e+1|0),1024&i&&(f[e|0]=35,e=e+1|0),r=i>>>14,(a=260==(0|(n=260&i)))?s=0:(f[e|0]=46,f[e+1|0]=42,e=e+2|0,s=1),(i=0|f[t|0])<<24>>24)for(o=e;t=t+1|0,e=o+1|0,f[o|0]=i,(i=0|f[t|0])<<24>>24;)o=e;e:do{switch(0|n){case 4:if(1&r){f[e|0]=70;break e}f[e|0]=102;break e;case 256:if(1&r){f[e|0]=69;break e}f[e|0]=101;break e;default:if(i=!!(1&r),a){if(i){f[e|0]=65;break e}f[e|0]=97;break e}if(i){f[e|0]=71;break e}f[e|0]=103;break e}}while(0);return 0|s}function Mn(e,t){t|=0,d[(e|=0)+4>>2]=t+-1,d[e>>2]=44384,f[e+8|0]=46,f[e+9|0]=44,d[(e=e+12|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0}function kn(e,t){t|=0,d[(e|=0)+4>>2]=t+-1,d[e>>2]=44424,d[e+8>>2]=46,d[e+12>>2]=44,d[(e=e+16|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0}function Rn(e){d[(e|=0)>>2]=44384,qr(e+12|0)}function Fn(e){d[(e|=0)>>2]=44424,qr(e+16|0)}function Pn(e){switch(74&d[(e|=0)+4>>2]){case 64:e=8;break;case 8:e=16;break;case 0:e=0;break;default:e=10}return 0|e}function Ln(e){var t,i,r=0;d[(e|=0)>>2]=44304,t=0|d[(e=e+8|0)>>2],y=0,i=0|H(3),r=y,y=0;do{if(!(1&r)){if((0|t)!=(0|i)&&(y=0,P(188,0|d[e>>2]),r=y,y=0,1&r))break;return}}while(0);Ue(r=0|ae(0))}function _n(e,t,i,r,n,a,o){e|=0,t|=0,n|=0,a|=0,o|=0;var s,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;s=b,b=b+112|0,c=s,h=((r|=0)-(i|=0)|0)/12|0;do{if(h>>>0>100){if(!(0|(c=0|Dr(h)))&&(y=0,X(6),I=y,y=0,1&I)){l=0,A=6;break}l=c,A=11}else l=0,A=11}while(0);e:do{if(11==(0|A)){if((0|i)==(0|r))u=0;else for(A=i,g=0,p=c;(u=1&(u=0|f[A|0])?0|d[A+4>>2]:(255&u)>>>1)?(f[p|0]=1,u=g):(f[p|0]=2,u=g+1|0,h=h+-1|0),(0|(A=A+12|0))!=(0|r);)g=u,p=p+1|0;C=(0|i)==(0|r),I=(0|i)==(0|r),T=0,S=u;t:for(;;){u=0|d[e>>2];do{if(u){if((0|d[u+12>>2])==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),w=y,y=0,1&w){A=5;break t}if(-1==(0|u)){d[e>>2]=0,u=0;break}u=0|d[e>>2];break}}else u=0}while(0);if(A=!(0|u),g=0|d[t>>2]){if((0|d[g+12>>2])==(0|d[g+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[g>>2])>>2],0|g),w=y,y=0,1&w){A=5;break}-1==(0|u)&&(d[t>>2]=0,g=0)}}else g=0;if(p=!(0|g),u=0|d[e>>2],!(!!(0|h)&(A^p))){A=64;break}if((0|(g=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),w=y,y=0,1&w){A=5;break}}else u=0|m[g|0];if(u&=255,!o&&(y=0,u=0|G(0|d[12+(0|d[n>>2])>>2],0|n,0|u),w=y,y=0,1&w)){A=5;break}if(w=T+1|0,C)u=0,A=S;else for(p=0,v=i,A=S,S=c;;){do{if(1==(0|f[S|0])){if(g=1&f[v|0]?0|d[v+8>>2]:v+1|0,g=0|f[g+T|0],!o&&(y=0,g=0|G(0|d[12+(0|d[n>>2])>>2],0|n,0|g),D=y,y=0,1&D)){A=4;break t}if(u<<24>>24!=g<<24>>24){f[S|0]=0,g=p,h=h+-1|0;break}(0|(g=1&(g=0|f[v|0])?0|d[v+4>>2]:(255&g)>>>1))==(0|w)?(f[S|0]=2,g=1,A=A+1|0,h=h+-1|0):g=1}else g=p}while(0);if((0|(v=v+12|0))==(0|r)){u=g;break}p=g,S=S+1|0}if(u){if(u=0|d[e>>2],(0|(p=0|d[(g=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),D=y,y=0,1&D){A=5;break}}else d[g>>2]=p+1;if((A+h|0)>>>0<2|I)T=w,S=A;else for(u=i,p=A,A=c;;){if(2==(0|f[A|0])&&((0|(g=1&(g=0|f[u|0])?0|d[u+4>>2]:(255&g)>>>1))!=(0|w)&&(f[A|0]=0,p=p+-1|0)),(0|(u=u+12|0))==(0|r)){T=w,S=p;continue t}A=A+1|0}}else T=w,S=A}if(4==(0|A)){i=0|ae();break}if(5==(0|A)){i=0|ae();break}if(64==(0|A)){do{if(u){if((0|d[u+12>>2])==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),D=y,y=0,1&D){A=6;break e}if(-1==(0|u)){d[e>>2]=0,u=0;break}u=0|d[e>>2];break}}else u=0}while(0);h=!(0|u);do{if(p)A=76;else{if((0|d[g+12>>2])==(0|d[g+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[g>>2])>>2],0|g),D=y,y=0,1&D){A=6;break e}if(-1==(0|u)){d[t>>2]=0,A=76;break}}h||(A=77)}}while(0);76==(0|A)&&h&&(A=77),77==(0|A)&&(d[a>>2]=2|d[a>>2]);t:do{if((0|i)==(0|r))A=81;else for(;;){if(2==(0|f[c|0]))break t;if((0|(i=i+12|0))==(0|r)){A=81;break}c=c+1|0}}while(0);return 81==(0|A)&&(d[a>>2]=4|d[a>>2],i=r),l&&xr(l),b=s,0|i}}}while(0);return 6==(0|A)&&(i=0|ae()),l&&xr(l),de(0|i),0}function Nn(e,t,i,r,n,a,o){e|=0,t|=0,n|=0,a|=0,o|=0;var s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0;s=b,b=b+112|0,c=s,h=((r|=0)-(i|=0)|0)/12|0;do{if(h>>>0>100){if(!(0|(c=0|Dr(h)))&&(y=0,X(6),C=y,y=0,1&C)){l=0,g=6;break}l=c,g=11}else l=0,g=11}while(0);e:do{if(11==(0|g)){if((0|i)==(0|r))u=0;else for(p=i,m=0,g=c;(u=1&(u=0|f[p|0])?0|d[p+4>>2]:(255&u)>>>1)?(f[g|0]=1,u=m):(f[g|0]=2,u=m+1|0,h=h+-1|0),(0|(p=p+12|0))!=(0|r);)m=u,g=g+1|0;T=(0|i)==(0|r),C=(0|i)==(0|r),w=0,A=h;t:for(;;){h=0|d[e>>2];do{if(h){if((0|(m=0|d[h+12>>2]))==(0|d[h+16>>2])){if(y=0,h=0|N(0|d[36+(0|d[h>>2])>>2],0|h),v=y,y=0,1&v){g=5;break t}}else h=0|d[m>>2];if(-1==(0|h)){d[e>>2]=0,p=1;break}p=!(0|d[e>>2]);break}p=1}while(0);if(m=0|d[t>>2]){if((0|(h=0|d[m+12>>2]))==(0|d[m+16>>2])){if(y=0,h=0|N(0|d[36+(0|d[m>>2])>>2],0|m),v=y,y=0,1&v){g=5;break}}else h=0|d[h>>2];-1==(0|h)?(d[t>>2]=0,m=0,g=1):g=0}else m=0,g=1;if(h=0|d[e>>2],!(!!(0|A)&(p^g))){g=66;break}if((0|(m=0|d[h+12>>2]))==(0|d[h+16>>2])){if(y=0,h=0|N(0|d[36+(0|d[h>>2])>>2],0|h),v=y,y=0,1&v){g=5;break}}else h=0|d[m>>2];if(!o&&(y=0,h=0|G(0|d[28+(0|d[n>>2])>>2],0|n,0|h),v=y,y=0,1&v)){g=5;break}if(v=w+1|0,T)h=0,p=A;else for(p=0,S=i,g=A,A=c;;){do{if(1==(0|f[A|0])){if(m=1&f[S|0]?0|d[S+8>>2]:S+4|0,m=0|d[m+(w<<2)>>2],!o&&(y=0,m=0|G(0|d[28+(0|d[n>>2])>>2],0|n,0|m),I=y,y=0,1&I)){g=4;break t}if((0|h)!=(0|m)){f[A|0]=0,m=p,g=g+-1|0;break}(0|(m=1&(m=0|f[S|0])?0|d[S+4>>2]:(255&m)>>>1))==(0|v)?(f[A|0]=2,m=1,u=u+1|0,g=g+-1|0):m=1}else m=p}while(0);if((0|(S=S+12|0))==(0|r)){h=m,p=g;break}p=m,A=A+1|0}if(h){if(h=0|d[e>>2],(0|(g=0|d[(m=h+12|0)>>2]))==(0|d[h+16>>2])){if(y=0,N(0|d[40+(0|d[h>>2])>>2],0|h),I=y,y=0,1&I){g=5;break}}else d[m>>2]=g+4;if((u+p|0)>>>0<2|C)w=v,A=p;else for(h=i,g=c;;){if(2==(0|f[g|0])&&((0|(m=1&(m=0|f[h|0])?0|d[h+4>>2]:(255&m)>>>1))!=(0|v)&&(f[g|0]=0,u=u+-1|0)),(0|(h=h+12|0))==(0|r)){w=v,A=p;continue t}g=g+1|0}}else w=v,A=p}if(4==(0|g)){i=0|ae();break}if(5==(0|g)){i=0|ae();break}if(66==(0|g)){do{if(h){if((0|(u=0|d[h+12>>2]))==(0|d[h+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[h>>2])>>2],0|h),I=y,y=0,1&I){g=6;break e}}else u=0|d[u>>2];if(-1==(0|u)){d[e>>2]=0,h=1;break}h=!(0|d[e>>2]);break}h=1}while(0);do{if(m){if((0|(u=0|d[m+12>>2]))==(0|d[m+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[m>>2])>>2],0|m),I=y,y=0,1&I){g=6;break e}}else u=0|d[u>>2];if(-1!=(0|u)){if(h)break;g=81;break}d[t>>2]=0,g=79;break}g=79}while(0);79==(0|g)&&h&&(g=81),81==(0|g)&&(d[a>>2]=2|d[a>>2]);t:do{if((0|i)==(0|r))g=85;else for(;;){if(2==(0|f[c|0]))break t;if((0|(i=i+12|0))==(0|r)){g=85;break}c=c+1|0}}while(0);return 85==(0|g)&&(d[a>>2]=4|d[a>>2],i=r),l&&xr(l),b=s,0|i}}}while(0);return 6==(0|g)&&(i=0|ae()),l&&xr(l),de(0|i),0}function Un(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o=0;return a=b,b=b+16|0,d[(o=a)>>2]=n,n=0|so(i),i=0|No(e,t,r,o),0|n&&(y=0,N(75,0|n),o=y,y=0,1&o)&&Ue(o=0|ae(0)),b=a,0|i}function On(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l=0,c=0,u=0,h=0,m=0;s=b,b=b+16|0,o=s,l=0|d[(e|=0)>>2];e:do{if(l){if(u=r-(m=t)>>2,u=(0|(c=0|d[(h=n+12|0)>>2]))>(0|u)?c-u|0:0,n=(m=(c=i)-m|0)>>2,(0|m)>0&&(0|rs[63&d[48+(0|d[l>>2])>>2]](l,t,n))!=(0|n)){d[e>>2]=0,l=0;break}do{if((0|u)>0){if(jr(o,u,a),y=0,n=0|O(0|d[48+(0|d[l>>2])>>2],0|l,0|(1&f[o|0]?d[o+8>>2]:o+4),0|u),m=y,y=0,1&m&&(m=0|ae(),Zr(o),de(0|m)),(0|n)==(0|u)){Zr(o);break}d[e>>2]=0,Zr(o),l=0;break e}}while(0);if(r=(m=r-c|0)>>2,(0|m)>0&&(0|rs[63&d[48+(0|d[l>>2])>>2]](l,i,r))!=(0|r)){d[e>>2]=0,l=0;break}d[h>>2]=0}else l=0}while(0);return b=s,0|l}function Bn(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,f=0,g=0,p=0,A=0;a=0|d[(e|=0)>>2];do{if(a){if((0|d[a+12>>2])==(0|d[a+16>>2])){if(-1==(0|ts[127&d[36+(0|d[a>>2])>>2]](a))){d[e>>2]=0,a=0;break}a=0|d[e>>2];break}}else a=0}while(0);o=!(0|a),a=0|d[t>>2];do{if(a){if((0|d[a+12>>2])==(0|d[a+16>>2])&&-1==(0|ts[127&d[36+(0|d[a>>2])>>2]](a))){d[t>>2]=0,A=11;break}A=o?13:12}else A=11}while(0);11==(0|A)&&(o?A=12:(a=0,A=13));e:do{if(12==(0|A))d[i>>2]=6|d[i>>2],a=0;else if(13==(0|A)){if(o=0|d[e>>2],(s=255&(o=(0|(s=0|d[o+12>>2]))==(0|d[o+16>>2])?0|ts[127&d[36+(0|d[o>>2])>>2]](o):0|m[s|0]))<<24>>24>-1&&2048&h[(0|d[(p=r+8|0)>>2])+(o<<24>>24<<1)>>1]){for(c=rs[63&d[36+(0|d[r>>2])>>2]](r,s,0)<<24>>24,o=0|d[e>>2],(0|(l=0|d[(s=o+12|0)>>2]))==(0|d[o+16>>2])?(ts[127&d[40+(0|d[o>>2])>>2]](o),f=n,u=a,n=a,a=c):(d[s>>2]=l+1,f=n,u=a,n=a,a=c);;){a=a+-48|0,g=f+-1|0,o=0|d[e>>2];do{if(o){if((0|d[o+12>>2])==(0|d[o+16>>2])){if(-1==(0|ts[127&d[36+(0|d[o>>2])>>2]](o))){d[e>>2]=0,o=0;break}o=0|d[e>>2];break}}else o=0}while(0);if(l=!(0|o),n?(0|d[n+12>>2])==(0|d[n+16>>2])?-1==(0|ts[127&d[36+(0|d[n>>2])>>2]](n))?(d[t>>2]=0,s=0,n=0):(s=u,n=u):s=u:(s=u,n=0),o=0|d[e>>2],!((0|f)>1&(l^!(0|n))))break;if((l=255&(o=(0|(l=0|d[o+12>>2]))==(0|d[o+16>>2])?0|ts[127&d[36+(0|d[o>>2])>>2]](o):0|m[l|0]))<<24>>24<=-1||!(2048&h[(0|d[p>>2])+(o<<24>>24<<1)>>1]))break e;(a=(rs[63&d[36+(0|d[r>>2])>>2]](r,l,0)<<24>>24)+(10*a|0)|0,o=0|d[e>>2],(0|(c=0|d[(l=o+12|0)>>2]))!=(0|d[o+16>>2]))?(d[l>>2]=c+1,f=g,u=s):(ts[127&d[40+(0|d[o>>2])>>2]](o),f=g,u=s)}do{if(o){if((0|d[o+12>>2])==(0|d[o+16>>2])){if(-1==(0|ts[127&d[36+(0|d[o>>2])>>2]](o))){d[e>>2]=0,o=0;break}o=0|d[e>>2];break}}else o=0}while(0);o=!(0|o);do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])&&-1==(0|ts[127&d[36+(0|d[s>>2])>>2]](s))){d[t>>2]=0,A=50;break}if(o)break e}else A=50}while(0);if(50==(0|A)&&!o)break;d[i>>2]=2|d[i>>2];break}d[i>>2]=4|d[i>>2],a=0}}while(0);return 0|a}function Vn(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0,m=0;a=0|d[(e|=0)>>2];do{if(a){if(-1==(0|(a=(0|(o=0|d[a+12>>2]))==(0|d[a+16>>2])?0|ts[127&d[36+(0|d[a>>2])>>2]](a):0|d[o>>2]))){d[e>>2]=0,s=1;break}s=!(0|d[e>>2]);break}s=1}while(0);o=0|d[t>>2];do{if(o){if(-1!=(0|(a=(0|(a=0|d[o+12>>2]))==(0|d[o+16>>2])?0|ts[127&d[36+(0|d[o>>2])>>2]](o):0|d[a>>2]))){if(s){m=17;break}m=16;break}d[t>>2]=0,m=14;break}m=14}while(0);14==(0|m)&&(s?m=16:(o=0,m=17));e:do{if(16==(0|m))d[i>>2]=6|d[i>>2],a=0;else if(17==(0|m)){if(a=0|d[e>>2],a=(0|(s=0|d[a+12>>2]))==(0|d[a+16>>2])?0|ts[127&d[36+(0|d[a>>2])>>2]](a):0|d[s>>2],!(0|rs[63&d[12+(0|d[r>>2])>>2]](r,2048,a))){d[i>>2]=4|d[i>>2],a=0;break}for(a=rs[63&d[52+(0|d[r>>2])>>2]](r,a,0)<<24>>24,s=0|d[e>>2],(0|(c=0|d[(l=s+12|0)>>2]))==(0|d[s+16>>2])?(ts[127&d[40+(0|d[s>>2])>>2]](s),f=n,u=o,l=o):(d[l>>2]=c+4,f=n,u=o,l=o);;){a=a+-48|0,h=f+-1|0,o=0|d[e>>2];do{if(o){if(-1==(0|(o=(0|(s=0|d[o+12>>2]))==(0|d[o+16>>2])?0|ts[127&d[36+(0|d[o>>2])>>2]](o):0|d[s>>2]))){d[e>>2]=0,c=1;break}c=!(0|d[e>>2]);break}c=1}while(0);do{if(l){if(-1==(0|(o=(0|(o=0|d[l+12>>2]))==(0|d[l+16>>2])?0|ts[127&d[36+(0|d[l>>2])>>2]](l):0|d[o>>2]))){d[t>>2]=0,l=0,n=0,o=1;break}l=u,n=u,o=!(0|u);break}l=u,n=0,o=1}while(0);if(s=0|d[e>>2],!((0|f)>1&(c^o)))break;if(o=(0|(o=0|d[s+12>>2]))==(0|d[s+16>>2])?0|ts[127&d[36+(0|d[s>>2])>>2]](s):0|d[o>>2],!(0|rs[63&d[12+(0|d[r>>2])>>2]](r,2048,o)))break e;(a=(rs[63&d[52+(0|d[r>>2])>>2]](r,o,0)<<24>>24)+(10*a|0)|0,o=0|d[e>>2],(0|(c=0|d[(s=o+12|0)>>2]))!=(0|d[o+16>>2]))?(d[s>>2]=c+4,f=h,u=l,l=n):(ts[127&d[40+(0|d[o>>2])>>2]](o),f=h,u=l,l=n)}do{if(s){if(-1==(0|(o=(0|(o=0|d[s+12>>2]))==(0|d[s+16>>2])?0|ts[127&d[36+(0|d[s>>2])>>2]](s):0|d[o>>2]))){d[e>>2]=0,s=1;break}s=!(0|d[e>>2]);break}s=1}while(0);do{if(l){if(-1!=(0|(o=(0|(o=0|d[l+12>>2]))==(0|d[l+16>>2])?0|ts[127&d[36+(0|d[l>>2])>>2]](l):0|d[o>>2]))){if(s)break e;break}d[t>>2]=0,m=60;break}m=60}while(0);if(60==(0|m)&&!s)break;d[i>>2]=2|d[i>>2]}}while(0);return 0|a}function qn(e){var t,i=0,r=0;t=0|d[(e|=0)>>2];do{if(t){if((0|(i=0|d[(r=e+4|0)>>2]))!=(0|t)){do{i=i+-4|0}while((0|i)!=(0|t));d[r>>2]=i}if((e+16|0)==(0|t)){f[e+128|0]=0;break}Ba(t);break}}while(0)}function Gn(e,t){var i;i=(e|=0)+4|0,e=t|=0,t=0|d[i>>2];do{d[t>>2]=0,t=4+(0|d[i>>2])|0,d[i>>2]=t,e=e+-1|0}while(0|e)}function Qn(e,t,i,r){return D=r=(t|=0)-(r|=0)-((i|=0)>>>0>(e|=0)>>>0|0)>>>0,e-i>>>0|0}function zn(e,t,i){t|=0;var r,n=0,a=0,o=0;if(r=(e|=0)+(i|=0)|0,(0|i)>=20){if(o=(t&=255)|t<<8|t<<16|t<<24,n=-4&r,a=3&e)for(a=e+4-a|0;(0|e)<(0|a);)f[e|0]=t,e=e+1|0;for(;(0|e)<(0|n);)d[e>>2]=o,e=e+4|0}for(;(0|e)<(0|r);)f[e|0]=t,e=e+1|0;return e-i|0}function Hn(e,t,i,r){return D=(t|=0)+(r|=0)+((i=(e|=0)+(i|=0)>>>0)>>>0>>0|0)>>>0,0|i}function Yn(e,t,i){return e|=0,t|=0,(0|(i|=0))<32?(D=t>>>i,e>>>i|(t&(1<>>i-32|0)}function Wn(e,t,i){e|=0,t|=0;var r;if((0|(i|=0))>=4096)return 0|fe(0|e,0|t,0|i);if(r=0|e,(3&e)==(3&t)){for(;3&e;){if(!i)return 0|r;f[e|0]=0|f[t|0],e=e+1|0,t=t+1|0,i=i-1|0}for(;(0|i)>=4;)d[e>>2]=d[t>>2],e=e+4|0,t=t+4|0,i=i-4|0}for(;(0|i)>0;)f[e|0]=0|f[t|0],e=e+1|0,t=t+1|0,i=i-1|0;return 0|r}function Xn(e,t,i){return e|=0,t|=0,(0|(i|=0))<32?(D=t<>>32-i,e<0;)t=t-1|0,i=i-1|0,f[(e=e-1|0)|0]=0|f[t|0];e=r}else Wn(e,t,i);return 0|e}function jn(e){var t=0;return(0|(t=0|f[w+(255&(e|=0))|0]))<8?0|t:(0|(t=0|f[w+(e>>8&255)|0]))<8?t+8|0:(0|(t=0|f[w+(e>>16&255)|0]))<8?t+16|0:24+(0|f[w+(e>>>24)|0])|0}function Zn(e,t,i,r){t|=0,r|=0;var n,a;return i=0|function(e,t){var i,r,n,a=0;return e=((i=0|E(a=65535&(t|=0),n=65535&(e|=0)))>>>16)+(0|E(a,r=e>>>16))|0,t=0|E(a=t>>>16,n),D=(e>>>16)+(0|E(a,r))+(((65535&e)+t|0)>>>16)|0,e+t<<16|65535&i}(n=e|=0,a=i|=0),e=D,D=(0|E(t,a))+(0|E(r,n))+e|0,0|i}function Jn(e,t,i,r){return 0|ea(e|=0,t|=0,i|=0,r|=0,0)}function $n(e,t,i,r){var n,a;return a=b,b=b+16|0,ea(e|=0,t|=0,i|=0,r|=0,n=0|a),b=a,D=0|d[n+4>>2],0|d[n>>2]}function ea(e,t,i,r,n){n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0,m=0,g=0;if(u=e|=0,o=i|=0,s=h=r|=0,!(c=l=t|=0))return a=!!(0|n),s?a?(d[n>>2]=0|e,d[n+4>>2]=0,D=h=0,0|(n=0)):(D=h=0,0|(n=0)):(a&&(d[n>>2]=(u>>>0)%(o>>>0),d[n+4>>2]=0),D=h=0,0|(n=(u>>>0)/(o>>>0)>>>0));a=!(0|s);do{if(o){if(!a){if((a=(0|M(0|s))-(0|M(0|c))|0)>>>0<=31){o=f=a+1|0,e=u>>>(f>>>0)&(t=a-31>>31)|c<<(s=31-a|0),t&=c>>>(f>>>0),a=0,s=u<>2]=0|e,d[n+4>>2]=0|l,D=h=0,0|(n=0)):(D=h=0,0|(n=0))}if((a=o-1|0)&o){o=s=33+(0|M(0|o))-(0|M(0|c))|0,e=(f=32-s|0)-1>>31&c>>>((m=s-32|0)>>>0)|(c<>>(s>>>0))&(t=m>>31),t&=c>>>(s>>>0),a=u<<(g=64-s|0)&(l=f>>31),s=(c<>>(m>>>0))&l|u<>31;break}return n&&(d[n>>2]=a&u,d[n+4>>2]=0),1==(0|o)?(D=m=0|l,0|(g=0|e)):(g=0|jn(0|o),D=m=c>>>(g>>>0)|0,0|(g=c<<32-g|u>>>(g>>>0)))}if(a)return n&&(d[n>>2]=(c>>>0)%(o>>>0),d[n+4>>2]=0),D=m=0,0|(g=(c>>>0)/(o>>>0)>>>0);if(!u)return n&&(d[n>>2]=0,d[n+4>>2]=(c>>>0)%(s>>>0)),D=m=0,0|(g=(c>>>0)/(s>>>0)>>>0);if(!((a=s-1|0)&s))return n&&(d[n>>2]=0|e,d[n+4>>2]=a&c),m=0,g=c>>>((0|jn(0|s))>>>0),D=m,0|g;if((a=(0|M(0|s))-(0|M(0|c))|0)>>>0<=30){o=t=a+1|0,e=c<<(s=31-a|0)|u>>>(t>>>0),t=c>>>(t>>>0),a=0,s=u<>2]=0|e,d[n+4>>2]=0|l,D=m=0,0|(g=0)):(D=m=0,0|(g=0))}while(0);if(o){c=0|Hn(0|(f=0|i),0|(u=0|h),-1,-1),i=D,l=s,s=0;do{r=l,l=a>>>31|l<<1,a=s|a<<1,Qn(c,i,r=e<<1|r>>>31,h=e>>>31|t<<1),s=1&(m=(g=D)>>31|((0|g)<0?-1:0)<<1),e=0|Qn(r,h,m&f,(((0|g)<0?-1:0)>>31|((0|g)<0?-1:0)<<1)&u),t=D,o=o-1|0}while(0|o);c=l,l=0}else c=s,l=0,s=0;return o=0,n&&(d[n>>2]=e,d[n+4>>2]=t),D=m=(0|a)>>>31|(c|o)<<1|l,0|(g=a<<1&-2|s)}function ta(e,t,i,r,n,a,o){return k(0),0}function ia(e,t,i,r,n){k(1)}function ra(e,t,i,r,n,a){return a=+a,k(2),0}function na(e){k(3)}function aa(e,t){k(4)}function oa(e,t,i,r,n,a){return k(5),0}function sa(e){return k(6),0}function la(e,t,i,r,n,a,o,s,l,c,u){return k(7),0}function ca(e,t,i){return k(8),0}function ua(e,t,i,r,n,a,o,s,l,c,u,f,h,d,m){k(9)}function fa(e,t,i,r,n,a){k(10)}function ha(e,t,i,r,n,a,o){k(11)}function da(e,t,i,r,n,a,o,s,l,c){k(12)}function ma(e,t){return k(13),0}function ga(e,t,i,r,n){return k(14),0}function pa(){return k(16),0}function Aa(e,t,i,r){return k(17),0}function Sa(){k(19)}function ba(e,t,i,r,n,a,o,s){return k(20),0}function va(e,t,i,r,n){return n=+n,k(21),0}function wa(e,t,i,r){k(22)}function Ta(e,t,i,r,n){i|=0,r|=0,n|=0;var a,o,s,l,c,u=0,m=0,g=0,p=0,A=0;if((0|(i=0|h[(A=(e|=0)+188+(12*(a=((c=(t|=0)>>31)^t)-c|0)|0)+10|0)>>1]))<(0|(n=0|d[(s=e+188+(12*a|0)|0)>>2])))if(i<<1<(0|n))if(i<<2<(0|n))if(i<<3<(0|n))if(i<<4<(0|n))for(t=5;i<>1]^c)-c+r|0)&(n=0|d[(l=e+128|0)>>2]))==(0|i)?i:n&~(i>>31),(0|d[(i=e+112|0)>>2])<8&&mt(e),r=0|d[(n=e+108|0)>>2],(m=0|d[2832+(t<<11)+((u=r>>>24)<<3)+4>>2])?(d[i>>2]=(0|d[i>>2])-m,d[n>>2]=r<>2]):(g=0|d[e+148>>2],n=0|d[e+140>>2],(0|(i=0|ai(e)))<(g+-1-n|0)?t&&(i=(0|oi(e,t))+(i<>31^i>>1))>-1?i:0-i))>65535&&(i=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|i,5,35648),e=y,y=0,1&e?(e=0|ae(),re(0|i),de(0|e)):De(0|i,824,96))),r=0|d[(g=e+136|0)>>2],t?m=i:m=(n=r?0:(d[e+188+(12*a|0)+4>>2]<<1)-1+(0|h[A>>1])>>31)^i,t=0|d[e+152>>2],n=(0|d[s>>2])+((0|m)>-1?m:0-m|0)|0,i=(0|d[(u=e+188+(12*a|0)+4|0)>>2])+(0|E(r<<1|1,m))|0,(0|(r=0|h[A>>1]))==(0|t)&&(n>>=1,i>>=1,r=t>>1),d[s>>2]=n,t=r+1|0,h[A>>1]=t,(0|(n=t+i|0))>=1?(0|i)>0&&(i=i-t|0,A=0|h[o>>1],h[o>>1]=(A<<16>>16<127&1)+(65535&A),i=(0|i)>0?0:i):(i=0|h[o>>1],h[o>>1]=(65535&i)-(i<<16>>16>-128&1),i=(0|n)>(0|~r)?n:0-r|0),d[u>>2]=i,t=0|d[g>>2],(0|(n=(0|E(r=t<<1|1,(m^c)-c|0))+p|0))>=(0-t|0)?((i=0|d[l>>2])+t|0)<(0|n)&&(n=n-(0|E(0|d[e+132>>2],r))|0):(n=(0|E(0|d[e+132>>2],r))+n|0,i=0|d[l>>2]),(n&i)==(0|n)?(e=n,0|(e&=255)):(e=i&~(n>>31),0|(e&=255))}function ya(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0,h=0,m=0;for(a=(e|=0)+108|0,o=e+4592|0,s=0|d[(n=e+112|0)>>2],l=0;;){if((0|s)<1&&(mt(e),s=0|d[n>>2]),c=0|d[a>>2],s=s+-1|0,d[n>>2]=s,d[a>>2]=c<<1,(0|c)>=0){u=8;break}if(c=0|d[o>>2],l=(m=(0|(h=1<>2]))<(0|(m=r-l|0))?h:m)+l|0,(0|m)==(0|h)&&(d[o>>2]=(0|c)>30?31:c+1|0),(0|l)==(0|r)){s=r;break}}return 8==(0|u)&&((0|l)!=(0|r)?(0|(s=(s=((s=0|d[o>>2])+-4|0)>>>0<28?0|oi(e,0|d[36476+(s<<2)>>2]):0)+l|0))>(0|r)&&(s=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|s,5,35648),m=y,y=0,1&m?(m=0|ae(),re(0|s),de(0|m)):De(0|s,824,96)):s=r),(0|s)<=0||zn(0|i,0|t,0|s),0|s}function Ca(e,t,i){var r,n=0,a=0,o=0;return r=(e|=0)+128|0,(0|((0|(o=(t|=0)-(i|=0)|0))>-1?o:0-o))>(0|d[(n=e+136|0)>>2])?(t=0|E(0|Ia(e,e+4568|0),i-t>>31|1),a=0|d[n>>2],(0|(t=(0|E(t,o=a<<1|1))+i|0))>=(0-a|0)?((n=0|d[r>>2])+a|0)<(0|t)&&(t=t-(0|E(0|d[e+132>>2],o))|0):(t=(0|E(0|d[e+132>>2],o))+t|0,n=0|d[r>>2]),(t&n)==(0|t)?(e=t,0|(e&=255)):(e=n&~(t>>31),0|(e&=255))):(i=0|Ia(e,e+4580|0),o=0|d[n>>2],(0|(t=(0|E(a=o<<1|1,i))+t|0))>=(0-o|0)?((n=0|d[r>>2])+o|0)<(0|t)&&(t=t-(0|E(0|d[e+132>>2],a))|0):(t=(0|E(0|d[e+132>>2],a))+t|0,n=0|d[r>>2]),(t&n)==(0|t)?(e=t,0|(e&=255)):(e=n&~(t>>31),0|(e&=255)))}function Ia(e,t){e|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if((0|(r=0|m[(i=(t|=0)+9|0)|0]))<(0|(a=(0|E(r>>>1,0|d[(o=t+4|0)>>2]))+(0|d[t>>2])|0))){n=0;do{r<<=1,n=n+1|0}while((0|r)<(0|a))}else n=0;s=0|d[e+148>>2],l=0|d[36476+(d[e+4592>>2]<<2)>>2],r=0|d[e+140>>2],a=0|ai(e);do{if((0|a)<(s+-2-l-r|0)){if(n){r=s=1&(a=(l=(0|oi(e,n))+(a<>2])|0),o=1,a=(s+a|0)/2|0;break}e=((r=1&(e=(n=0|d[o>>2])+a|0))+e|0)/2|0,c=8;break}e=((r=1&(e=(a=1+(0|oi(e,r))|0)+(s=0|d[o>>2])|0))+e|0)/2|0,n?(l=a,o=1,a=e,n=s):(n=s,c=8)}while(0);return 8==(0|c)&&(l=a,o=m[t+10|0]<<1>>>0>=(0|m[i|0])>>>0,a=e),(0|(a=!!(0|r)^o?a:0-a|0))<0&&(f[(c=t+10|0)|0]=1+(0|m[c|0])),r=(l+1-n>>1)+(0|d[t>>2])|0,d[t>>2]=r,(n=0|f[i|0])<<24>>24!=(0|f[t+8|0])?(t=n,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a):(d[t>>2]=r>>1,c=(255&n)>>>1,f[i|0]=c,f[(t=t+10|0)|0]=(0|m[t|0])>>>1,t=c,t=(t&=255)+1|0,t&=255,f[i|0]=t,0|a)}function Da(e){e|=0;var t,i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0;t=b,b=b+16|0,d[(i=t)>>2]=0,d[(r=i+4|0)>>2]=0,d[i+8>>2]=0,y=0,n=0|N(67,1),c=y,y=0;e:do{if(!(1&c||(c=n+1|0,f[n|0]=1,d[i>>2]=n,d[r>>2]=c,d[i+8>>2]=c,y=0,L(84,0|i,65535&d[e>>2]),c=y,y=0,1&c)||(y=0,L(84,0|i,65535&d[e+4>>2]),c=y,y=0,1&c)||(y=0,L(84,0|i,65535&d[e+8>>2]),c=y,y=0,1&c)||(y=0,L(84,0|i,65535&d[e+12>>2]),c=y,y=0,1&c)||(y=0,L(84,0|i,65535&d[e+16>>2]),c=y,y=0,1&c)||(y=0,u=0|N(67,20),c=y,y=0,1&c))){d[u>>2]=36800,f[u+4|0]=-8,d[(s=u+8|0)>>2]=0,d[(c=u+12|0)>>2]=0,d[(e=u+16|0)>>2]=0,o=(n=0|d[r>>2])-(h=0|d[i>>2])|0;do{if((0|n)!=(0|h)){if((0|o)<0&&(y=0,P(178,0|s),h=y,y=0,1&h)||(l=11),11==(0|l)&&(y=0,a=0|N(67,0|o),h=y,y=0,!(1&h))){if(d[c>>2]=a,d[s>>2]=a,d[e>>2]=a+o,(0|(n=0|d[i>>2]))==(0|(e=0|d[r>>2])))break;do{f[a|0]=0|f[n|0],a=1+(0|d[c>>2])|0,d[c>>2]=a,n=n+1|0}while((0|n)!=(0|e));n=0|d[i>>2];break}a=0|ae(),(n=0|d[s>>2])&&((0|d[c>>2])!=(0|n)&&(d[c>>2]=n),Ba(n)),Ba(u);break e}}while(0);return n?((0|d[r>>2])!=(0|n)&&(d[r>>2]=n),Ba(n),b=t,0|u):(b=t,0|u)}l=25}while(0);return 25==(0|l)&&(a=0|ae()),(n=0|d[i>>2])||de(0|a),(0|d[r>>2])!=(0|n)&&(d[r>>2]=n),Ba(n),de(0|a),0}function xa(e,t){t|=0;var i,r=0,n=0;return(i=0|d[(e|=0)+4>>2])?(0|(n=0|d[(r=i+24|0)>>2]))==(0|d[i+28>>2])?void ls[63&d[52+(0|d[i>>2])>>2]](i,255&t):(d[r>>2]=n+1,void(f[n|0]=t)):(n=0|d[(r=e+16|0)>>2])>>>0<(0|d[e+12>>2])>>>0?(d[r>>2]=n+1,void(f[(0|d[e+8>>2])+n|0]=t)):(r=0|ne(16),y=0,n=0|H(1),t=y,y=0,1&t&&(t=0|ae(),re(0|r),de(0|t)),y=0,W(7,0|r,4,0|n),t=y,y=0,void(1&t?(t=0|ae(),re(0|r),de(0|t)):De(0|r,824,96)))}function Ea(e,t,i){t|=0,i|=0;var r,n=0,a=0;d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,a=(0|(a=2+(3*i|0)+(r=(0|t)<4095?(t+128|0)/256|0:16)|0))<(0|(n=i+1|0))|(0|a)>(0|t)?n:a,d[e+4>>2]=a,n=(0|(n=(r<<2|3)+(5*i|0)|0))>(0|t)|(0|n)<(0|a)?a:n,d[e+8>>2]=n,i=4+(7*i|0)+(17*r|0)|0,d[e+12>>2]=(0|i)>(0|t)|(0|i)<(0|n)?n:i,d[e>>2]=t,d[e+16>>2]=64}function Ma(e){var t=0,i=0,r=0,n=0;if(Fa(e|=0)<<24>>24!=-40&&(t=0|ne(16),y=0,i=0|H(1),n=y,y=0,!(1&n)&&(y=0,W(7,0|t,5,0|i),n=y,y=0,!(1&n))&&De(0|t,824,96),n=0|ae(),re(0|t),de(0|n)),(t=0|Fa(e))<<24>>24!=-38){for(;r=(255&Ra(e))<<8,r|=255&Ra(e),!((0|(i=-2-(t=0|Pa(e,t))+r|0))<0);){if((0|i)>0){t=r+-2-t|0,i=0;do{Ra(e),i=i+1|0}while((0|i)!=(0|t))}if((t=0|Fa(e))<<24>>24==-38){n=8;break}}8!=(0|n)&&(t=0|ne(16),y=0,i=0|H(1),n=y,y=0,!(1&n)&&(y=0,W(7,0|t,5,0|i),n=y,y=0,!(1&n))&&De(0|t,824,96),n=0|ae(),re(0|t),de(0|n))}}function ka(e,t){e|=0;var i=0,r=0,n=0;(t|=0)||(Ra(e)<<24>>24!=-1&&(t=0|ne(16),y=0,i=0|H(1),e=y,y=0,!(1&e)&&(y=0,W(7,0|t,12,0|i),e=y,y=0,!(1&e))&&De(0|t,824,96),e=0|ae(),re(0|t),de(0|e)),Ra(e)<<24>>24!=-38&&(t=0|ne(16),y=0,i=0|H(1),e=y,y=0,!(1&e)&&(y=0,W(7,0|t,5,0|i),e=y,y=0,!(1&e))&&De(0|t,824,96),e=0|ae(),re(0|t),de(0|e))),Ra(e),Ra(e),r=255&(i=0|Ra(e));do{if(i<<24>>24==1)Ra(e),i=0,n=20;else{if((0|r)==(0|d[e+32>>2])){if(t=0|Ra(e),i<<24>>24){i=0,n=20;break}break}t=0|ne(16),y=0,i=0|H(1),e=y,y=0,!(1&e)&&(y=0,W(7,0|t,2,0|i),e=y,y=0,!(1&e))&&De(0|t,824,96),e=0|ae(),re(0|t),de(0|e)}}while(0);if(20==(0|n))for(;Ra(e),i=i+1|0,t=0|Ra(e),(0|i)!=(0|r);)n=20;d[e+36>>2]=255&t,n=0|Ra(e),d[(i=e+40|0)>>2]=255&n,(255&n)>=3&&(t=0|ne(16),y=0,i=0|H(1),e=y,y=0,!(1&e)&&(y=0,W(7,0|t,5,0|i),e=y,y=0,!(1&e))&&De(0|t,824,96),e=0|ae(),re(0|t),de(0|e)),Ra(e)<<24>>24&&(t=0|ne(16),y=0,i=0|H(1),e=y,y=0,!(1&e)&&(y=0,W(7,0|t,5,0|i),e=y,y=0,!(1&e))&&De(0|t,824,96),e=0|ae(),re(0|t),de(0|e)),!(0|d[(r=e+28|0)>>2])&&((t=0|d[e+108>>2])||(t=0|d[e+16>>2]),i=0|d[i>>2]?0|d[e+32>>2]:1,n=0|E(i,t),e=0|E(n,(7+(0|d[e+24>>2])|0)/8|0),d[r>>2]=e)}function Ra(e){var t=0,i=0,r=0,n=0;return(i=0|d[(e|=0)>>2])?((0|(t=0|d[(e=i+12|0)>>2]))==(0|d[i+16>>2])?e=0|ts[127&d[40+(0|d[i>>2])>>2]](i):(d[e>>2]=t+1,e=0|m[t|0]),0|(n=255&e)):(n=0|d[(r=e+8|0)>>2])?(t=0|d[(e=e+4|0)>>2],i=0|f[t|0],t?(d[e>>2]=t+1,d[r>>2]=n+-1,0|(n=i)):0|(n=i)):(e=0|ne(16),y=0,t=0|H(1),n=y,y=0,1&n&&(n=0|ae(),re(0|e),de(0|n)),y=0,W(7,0|e,4,0|t),n=y,y=0,1&n?(n=0|ae(),re(0|e),de(0|n)):De(0|e,824,96),0)}function Fa(e){var t,i=0,r=0,n=0,a=0,o=0,s=0,l=0;if(r=b,b=b+176|0,i=r+152|0,l=r+16|0,o=r,n=255&(s=0|Ra(e|=0)),s<<24>>24==-1){do{i=0|Ra(e)}while(i<<24>>24==-1);return b=r,0|i}s=l+56|0,t=l+4|0,d[l>>2]=36160,d[s>>2]=36180,y=0,L(62,l+56|0,0|t),a=y,y=0,1&a&&(l=0|ae(),tn(s),de(0|l)),d[l+128>>2]=0,d[l+132>>2]=-1,d[l>>2]=36200,d[l+56>>2]=36220,y=0,P(180,0|t),a=y,y=0;do{if(1&a)i=0|ae();else{if(d[t>>2]=36236,d[(a=l+36|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[l+52>>2]=16,d[i>>2]=0,d[i+4>>2]=0,d[i+8>>2]=0,y=0,L(63,0|t,0|i),r=y,y=0,1&r){l=0|ae(),qr(i),qr(a),an(t),i=l;break}qr(i),d[l+(76+(0|d[(0|d[l>>2])-12>>2]))>>2]=48,y=0,i=0|O(28,0|l,50907,62),r=y,y=0,!(1&r)&&(r=i+(4+(0|d[(0|d[i>>2])-12>>2]))|0,d[r>>2]=-75&d[r>>2]|8,r=i+(4+(0|d[(0|d[i>>2])-12>>2]))|0,d[r>>2]=16384|d[r>>2],d[i+(12+(0|d[(0|d[i>>2])-12>>2]))>>2]=2,y=0,G(38,0|i,0|n),n=y,y=0,!(1&n))&&(r=0|ne(16),y=0,L(64,0|o,0|t),n=y,y=0,1&n?i=0|ae():(y=0,i=0|H(1),n=y,y=0,1&n||(y=0,j(36,0|r,12,0|i,0|o),n=y,y=0,1&n)?e=1:(y=0,W(6,0|r,824,96),y=0,e=0),i=0|ae(),qr(o),e||(o=i,d[l>>2]=36200,d[s>>2]=36220,d[t>>2]=36236,qr(a),an(t),tn(s),de(0|o))),re(0|r),o=i,d[l>>2]=36200,d[s>>2]=36220,d[t>>2]=36236,qr(a),an(t),tn(s),de(0|o)),o=0|ae(),d[l>>2]=36200,d[s>>2]=36220,d[t>>2]=36236,qr(a),an(t),tn(s),de(0|o)}}while(0);return l=i,tn(s),de(0|l),0}function Pa(e,t){e|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0;switch(n=b,b=b+320|0,i=n+300|0,u=n+152|0,c=n+288|0,f=n+16|0,r=n,(t|=0)<<24>>24){case-9:return h=255&Ra(e),d[e+24>>2]=h,h=(255&Ra(e))<<8|255&Ra(e),f=(255&Ra(e))<<8|255&Ra(e),d[e+16>>2]=f,d[e+20>>2]=h,h=255&Ra(e),d[e+32>>2]=h,b=n,0|(h=6);case-8:return h=0|function(e){e|=0;var t=0;return Ra(e)<<24>>24!=1?(e=1,0|e):(t=(255&Ra(e))<<8,t|=255&Ra(e),d[e+52>>2]=t,t=(255&Ra(e))<<8,t|=255&Ra(e),d[e+56>>2]=t,t=(255&Ra(e))<<8,t|=255&Ra(e),d[e+60>>2]=t,t=(255&Ra(e))<<8,t|=255&Ra(e),d[e+64>>2]=t,t=(255&Ra(e))<<8,t|=255&Ra(e),d[e+68>>2]=t,e=11,0|e)}(e),b=n,0|h;case-24:return h=0|function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0;i=b,b=b+16|0,n=i,d[n>>2]=0,a=n+4|0,d[a>>2]=0,d[n+8>>2]=0,y=0,W(9,0|e,0|n,4),t=y,y=0;e:do{if(!(1&t)){t=0|d[n>>2];t:do{if(0|Qo(t,51051,4))e=4;else{if(y=0,t=0|N(69,0|e),o=y,y=0,1&o){r=3;break e}switch(0|(t&=255)){case 3:case 2:case 1:case 0:d[e+44>>2]=t,e=5,t=0|d[n>>2];break t;case 5:case 4:if(t=0|ne(16),y=0,e=0|H(1),o=y,y=0,!(1&o||(y=0,W(7,0|t,7,0|e),o=y,y=0,1&o))){y=0,W(6,0|t,824,96),y=0,r=3;break e}e=0|ae(),re(0|t);break e;default:if(t=0|ne(16),y=0,e=0|H(1),o=y,y=0,!(1&o||(y=0,W(7,0|t,5,0|e),o=y,y=0,1&o))){y=0,W(6,0|t,824,96),y=0,r=3;break e}e=0|ae(),re(0|t);break e}}}while(0);return t?((0|d[a>>2])!=(0|t)&&(d[a>>2]=t),Ba(t),b=i,0|e):(b=i,0|e)}r=3}while(0);return 3==(0|r)&&(e=0|ae()),t=0|d[n>>2],t||de(0|e),(0|d[a>>2])!=(0|t)&&(d[a>>2]=t),Ba(t),de(0|e),0}(e),b=n,0|h;case-53:case-54:case-55:case-57:case-58:case-59:case-61:case-62:case-63:case-64:l=u+56|0,o=u+4|0,d[u>>2]=36160,d[l>>2]=36180,y=0,L(62,u+56|0,0|o),f=y,y=0,1&f&&(h=0|ae(),tn(l),de(0|h)),d[u+128>>2]=0,d[u+132>>2]=-1,d[u>>2]=36200,d[u+56>>2]=36220,y=0,P(180,0|o),f=y,y=0;do{if(1&f)e=0|ae();else{if(d[o>>2]=36236,d[(s=u+36|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[u+52>>2]=16,d[i>>2]=0,d[i+4>>2]=0,d[i+8>>2]=0,y=0,L(63,0|o,0|i),f=y,y=0,1&f){e=0|ae(),qr(i),qr(s),an(o);break}qr(i),y=0,e=0|O(28,0|u,50970,26),f=y,y=0;do{if(1&f||(y=0,a=0|G(38,0|e,255&t),f=y,y=0,1&f)||(y=0,O(28,0|a,50997,18),f=y,y=0,1&f))h=20;else{if(a=0|ne(16),y=0,L(64,0|c,0|o),f=y,y=0,1&f)e=0|ae();else if(y=0,e=0|H(1),f=y,y=0,1&f||(y=0,j(36,0|a,10,0|e,0|c),f=y,y=0,1&f)?n=1:(y=0,W(6,0|a,824,96),y=0,n=0),e=0|ae(),qr(c),!n)break;re(0|a)}}while(0);20==(0|h)&&(e=0|ae()),d[u>>2]=36200,d[l>>2]=36220,d[o>>2]=36236,qr(s),an(o),tn(l),de(0|(h=e))}}while(0);h=e,tn(l),de(0|h);case-25:case-32:case-2:return b=n,0|(h=0);default:c=f+56|0,s=f+4|0,d[f>>2]=36160,d[c>>2]=36180,y=0,L(62,f+56|0,0|s),u=y,y=0,1&u&&(h=0|ae(),tn(c),de(0|h)),d[f+128>>2]=0,d[f+132>>2]=-1,d[f>>2]=36200,d[f+56>>2]=36220,y=0,P(180,0|s),u=y,y=0;do{if(1&u)e=0|ae();else{if(d[s>>2]=36236,d[(l=f+36|0)>>2]=0,d[l+4>>2]=0,d[l+8>>2]=0,d[l+12>>2]=0,d[f+52>>2]=16,d[i>>2]=0,d[i+4>>2]=0,d[i+8>>2]=0,y=0,L(63,0|s,0|i),u=y,y=0,1&u){e=0|ae(),qr(i),qr(l),an(s);break}qr(i),y=0,e=0|O(28,0|f,51016,20),u=y,y=0;do{if(1&u||(y=0,o=0|G(38,0|e,255&t),u=y,y=0,1&u)||(y=0,O(28,0|o,51037,13),u=y,y=0,1&u))h=40;else{if(a=0|ne(16),y=0,L(64,0|r,0|s),u=y,y=0,1&u)e=0|ae();else if(y=0,e=0|H(1),u=y,y=0,1&u||(y=0,j(36,0|a,11,0|e,0|r),u=y,y=0,1&u)?n=1:(y=0,W(6,0|a,824,96),y=0,n=0),e=0|ae(),qr(r),!n)break;re(0|a)}}while(0);40==(0|h)&&(e=0|ae()),d[f>>2]=36200,d[c>>2]=36220,d[s>>2]=36236,qr(l),an(s),tn(c),de(0|(h=e))}}while(0);h=e,tn(c),de(0|h)}return 0}function La(e,t){e|=0,t|=0;var i;i=b,b=b+16|0,d[i>>2]=t,_o(t=0|d[9320],e,i),function(e,t){e|=0,t|=0;var i=0,r=0,n=0,a=0,o=0;(0|d[t+76>>2])>=0&&0|wo(t)?((0|f[t+75|0])!=(0|e)&&(r=t+20|0,(n=0|d[r>>2])>>>0<(0|d[t+16>>2])>>>0)?(d[r>>2]=n+1,f[n|0]=e,i=255&e):i=0|yo(t,e),To(t)):o=3;do{if(3==(0|o)){if((0|f[t+75|0])!=(0|e)&&(i=0|d[(a=t+20|0)>>2])>>>0<(0|d[t+16>>2])>>>0){d[a>>2]=i+1,f[i|0]=e,i=255&e;break}i=0|yo(t,e)}}while(0)}(10,t),ee()}function _a(e){ie(51337,51366,1164,51442)}function Na(e){ie(51463,51486,303,51442)}function Ua(){var e,t=0;return e=b,b=b+16|0,0|be(37024,4)?(La(51562,e),0):(t=0|pe(0|d[9255]),b=e,0|t)}function Oa(e){var t=0;e=0|Dr(t=0|(e|=0)?e:1);e:do{if(!e){for(;e=0|qa();)if(ms[7&e](),e=0|Dr(t))break e;t=0|ne(4),d[t>>2]=36844,De(0|t,592,78)}}while(0);return 0|e}function Ba(e){xr(e|=0)}function Va(e){var t=0;t=b,b=b+16|0,y=0,X(0|(e|=0)),e=y,y=0,1&e||(y=0,L(85,51626,0|t),y=0),e=0|ae(0),ue(0|e),y=0,L(85,51666,t+8|0),y=0,e=0|ae(0),y=0,X(3),t=y,y=0,1&t?Ue(t=0|ae(0)):Ue(e)}function qa(){var e;return e=0|d[9214],d[9214]=e+0,0|e}function Ga(e){d[(e|=0)>>2]=36868,function(e){e|=0;var t=0,i=0;i=(0|d[e>>2])-4|0,t=0|d[i>>2],d[i>>2]=t+-1,(t+-1|0)<0&&Ba((0|d[e>>2])-12|0)}(e+4|0)}function Qa(e,t,i,r){e|=0,i|=0,r|=0;var n;n=0|d[(e=(t|=0)+16|0)>>2];do{if(n){if((0|n)!=(0|i)){d[(r=t+36|0)>>2]=1+(0|d[r>>2]),d[t+24>>2]=2,f[t+54|0]=1;break}2==(0|d[(e=t+24|0)>>2])&&(d[e>>2]=r)}else d[e>>2]=i,d[t+24>>2]=r,d[t+36>>2]=1}while(0)}function za(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0;a=(n=0|d[(e|=0)+4>>2])>>8,1&n&&(a=0|d[(0|d[i>>2])+a>>2]),e=0|d[e>>2],As[63&d[28+(0|d[e>>2])>>2]](e,t,i+a|0,2&n?r:2)}function Ha(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s,l,c,u,m,g=0,p=0;m=b,b=b+64|0,u=m,p=0|d[(e|=0)>>2],c=e+(0|d[p+-8>>2])|0,p=0|d[p+-4>>2],d[u>>2]=i,d[u+4>>2]=e,d[u+8>>2]=t,d[u+12>>2]=r,e=u+20|0,t=u+24|0,n=u+28|0,a=u+32|0,o=u+40|0,s=(0|p)==(0|i),l=(g=r=u+16|0)+36|0;do{d[g>>2]=0,g=g+4|0}while((0|g)<(0|l));h[r+36>>1]=0,f[r+38|0]=0;e:do{if(s)d[u+48>>2]=1,as[15&d[20+(0|d[i>>2])>>2]](i,u,c,c,1,0),r=1==(0|d[t>>2])?c:0;else{switch(jo[15&d[24+(0|d[p>>2])>>2]](p,u,c,1,0),0|d[u+36>>2]){case 0:r=1==(0|d[o>>2])&1==(0|d[n>>2])&1==(0|d[a>>2])?0|d[e>>2]:0;break e;case 1:break;default:r=0;break e}if(1!=(0|d[t>>2])&&!(!(0|d[o>>2])&1==(0|d[n>>2])&1==(0|d[a>>2]))){r=0;break}r=0|d[r>>2]}}while(0);return b=m,0|r}function Ya(e,t,i,r,n){e|=0,i|=0,r|=0,n|=0,f[(t|=0)+53|0]=1;do{if((0|d[t+4>>2])==(0|r)){if(f[t+52|0]=1,!(e=0|d[(r=t+16|0)>>2])){if(d[r>>2]=i,d[t+24>>2]=n,d[t+36>>2]=1,1!=(0|n)||1!=(0|d[t+48>>2]))break;f[t+54|0]=1;break}if((0|e)!=(0|i)){d[(n=t+36|0)>>2]=1+(0|d[n>>2]),f[t+54|0]=1;break}2==(0|(r=0|d[(e=t+24|0)>>2]))&&(d[e>>2]=n,r=n),1==(0|r)&&1==(0|d[t+48>>2])&&(f[t+54|0]=1)}}while(0)}function Wa(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s=0;s=(o=0|d[(e|=0)+4>>2])>>8,1&o&&(s=0|d[(0|d[r>>2])+s>>2]),e=0|d[e>>2],as[15&d[20+(0|d[e>>2])>>2]](e,t,i,r+s|0,2&o?n:2,a)}function Xa(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0;var a,o=0;o=(a=0|d[(e|=0)+4>>2])>>8,1&a&&(o=0|d[(0|d[i>>2])+o>>2]),e=0|d[e>>2],jo[15&d[24+(0|d[e>>2])>>2]](e,t,i+o|0,2&a?r:2,n)}function Ka(){var e;(function(e){d[(e|=0)>>2]=36844})(e=0|ne(4)),De(0|e,592,78)}function ja(e,t,i,r){return 0|(e=0|function(e,t,i){return e|=0,t|=0,i|=0,e=0|Tr(e,t,i,-1,-1),0|e}(e|=0,t|=0,i|=0))}function Za(e,t,i,r){return 0|(e=0|function(e,t,i){return e|=0,t|=0,i|=0,e=0|Tr(e,t,i,0,-2147483648),0|e}(e|=0,t|=0,i|=0))}function Ja(e){return 1&(32==(0|(e|=0))|(e+-9|0)>>>0<5)}function $a(){var e=0;return 0|d[9258]?(e=60+(0|Ae())|0,e=0|d[e>>2]):e=37308,0|e}function eo(e){e|=0;var t=0,i=0;for(t=0;;){if((0|m[51978+t|0])==(0|e)){i=2;break}if(87==(0|(t=t+1|0))){t=87,e=52066,i=5;break}}if(2==(0|i)&&(t?(e=52066,i=5):e=52066),5==(0|i))for(;;){for(i=e;e=i+1|0,0|f[i|0];)i=e;if(!(t=t+-1|0))break;i=5}return 0|e}function to(e,t,i){e|=0,i|=0;var r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,y=0,M=0,k=0,R=0,F=0,P=0,L=0,_=0,N=0,U=0,O=0,B=0,V=0;switch(r=b,b=b+512|0,N=r,0|(t|=0)){case 0:B=24,O=-149,k=4;break;case 1:case 2:B=53,O=-1074,k=4;break;default:n=0}e:do{if(4==(0|k)){P=e+4|0,F=e+100|0;do{(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e)}while(0|Ja(t));t:do{switch(0|t){case 43:case 45:if(a=1-((45==(0|t)&1)<<1)|0,(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0){d[P>>2]=t+1,t=0|m[t|0],U=a;break t}t=0|no(e),U=a;break t;default:U=1}}while(0);a=t,t=0;do{if((32|a)!=(0|f[53870+t|0]))break;do{if(t>>>0<7){if((a=0|d[P>>2])>>>0<(0|d[F>>2])>>>0){d[P>>2]=a+1,a=0|m[a|0];break}a=0|no(e);break}}while(0);t=t+1|0}while(t>>>0<8);t:do{switch(0|t){case 8:break;case 3:k=23;break;default:if((s=!!(0|i))&t>>>0>3){if(8==(0|t))break t;k=23;break t}i:do{if(!t){t=0;do{if((32|a)!=(0|f[56747+t|0]))break i;do{if(t>>>0<2){if((a=0|d[P>>2])>>>0<(0|d[F>>2])>>>0){d[P>>2]=a+1,a=0|m[a|0];break}a=0|no(e);break}}while(0);t=t+1|0}while(t>>>0<3)}}while(0);switch(0|t){case 3:if((t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e),40!=(0|t)){if(!(0|d[F>>2])){n=C;break e}d[P>>2]=(0|d[P>>2])-1,n=C;break e}for(t=1;(a=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=a+1,a=0|m[a|0]):a=0|no(e),(a+-48|0)>>>0<10|(a+-65|0)>>>0<26||95==(0|a)|(a+-97|0)>>>0<26;)t=t+1|0;if(41==(0|a)){n=C;break e}if((a=!(0|d[F>>2]))||(d[P>>2]=(0|d[P>>2])-1),!s){B=0|$a(),d[B>>2]=22,ro(e,0),n=0;break e}if(!t){n=C;break e}for(;;)if(t=t+-1|0,a||(d[P>>2]=(0|d[P>>2])-1),!t){n=C;break e}case 0:do{if(48==(0|a)){if((t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e),120!=(32|t)){if(!(0|d[F>>2])){t=48;break}d[P>>2]=(0|d[P>>2])-1,t=48;break}(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0],s=0):(t=0|no(e),s=0);i:for(;;){switch(0|t){case 46:k=74;break i;case 48:break;default:y=0,l=0,T=0,a=0,u=s,h=0,w=0,c=1,s=0,n=0;break i}(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0],s=1):(t=0|no(e),s=1)}if(74==(0|k))if((t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e),48==(0|t)){s=0,a=0;do{(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e),s=0|Hn(0|s,0|a,-1,-1),a=D}while(48==(0|t));y=0,l=0,T=s,u=1,h=1,w=0,c=1,s=0,n=0}else y=0,l=0,T=0,a=0,u=s,h=1,w=0,c=1,s=0,n=0;for(;;){if(g=32|t,(S=t+-48|0)>>>0>=10){if(!((v=46==(0|t))|(g+-97|0)>>>0<6)){g=T,S=y;break}if(v){if(h){g=T,S=y,t=46;break}v=l,a=y,S=y,h=1,g=w,o=c}else k=86}else k=86;if(86==(0|k)){k=0,t=(0|t)>57?g+-87|0:S;do{if((0|y)<0|!(0|y)&l>>>0<8)g=w,o=c,s=t+(s<<4)|0;else{if((0|y)<0|!(0|y)&l>>>0<14){g=w,o=A=.0625*c,n+=A*+(0|t);break}!!(0|w)|!(0|t)?(g=w,o=c):(g=1,o=c,n+=.5*c)}}while(0);l=0|Hn(0|l,0|y,1,0),v=T,S=D,u=1}(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,y=S,T=v,t=0|m[t|0],w=g,c=o):(y=S,T=v,t=0|no(e),w=g,c=o)}if(!u){(t=!(0|d[F>>2]))||(d[P>>2]=(0|d[P>>2])-1),i?!t&&(M=0|d[P>>2],d[P>>2]=M+-1,!!(0|h))&&(d[P>>2]=M+-2):ro(e,0),n=0*+(0|U);break e}if(h=(u=!(0|h))?l:g,u=u?S:a,(0|S)<0|!(0|S)&l>>>0<8){a=S;do{s<<=4,l=0|Hn(0|l,0|a,1,0),a=D}while((0|a)<0|!(0|a)&l>>>0<8)}if(112==(32|t)){if(!(0|(a=0|Wo(e,i)))&-2147483648==(0|(t=D))){if(!i){ro(e,0),n=0;break e}0|d[F>>2]?(d[P>>2]=(0|d[P>>2])-1,a=0,t=0):(a=0,t=0)}}else 0|d[F>>2]?(d[P>>2]=(0|d[P>>2])-1,a=0,t=0):(a=0,t=0);if(N=0|Hn(0|(N=0|Xn(0|h,0|u,2)),0|D,-32,-1),t=0|Hn(0|N,0|D,0|a,0|t),a=D,!s){n=0*+(0|U);break e}if((0|a)>0|!(0|a)&t>>>0>(0-O|0)>>>0){B=0|$a(),d[B>>2]=34,n=17976931348623157e292*+(0|U)*17976931348623157e292;break e}if((0|a)<(0|(_=((0|(N=O+-106|0))<0)<<31>>31))|(0|a)==(0|_)&t>>>0>>0){B=0|$a(),d[B>>2]=34,n=22250738585072014e-324*+(0|U)*22250738585072014e-324;break e}if((0|s)>-1){do{s=1^(N=1&(_=!(n>=.5))|s<<1),n+=_?n:n+-1,t=0|Hn(0|t,0|a,-1,-1),a=D}while((0|N)>-1);l=t,c=n}else l=t,c=n;t=0|Hn(0|l,0|a,0|(t=0|Qn(32,0,0|O,((0|O)<0)<<31>>31)),0|D),0>(0|(O=D))|!(0|O)&B>>>0>t>>>0?(0|t)<0?(t=0,k=127):k=125:(t=B,k=125),125==(0|k)&&((0|t)<53?k=127:(a=t,o=+(0|U),n=0)),127==(0|k)&&(a=t,o=n=+(0|U),n=+lo(+ho(1,84-t|0),n)),0==(n=o*((B=!(1&s)&0!=c&(0|a)<32)?0:c)+(n+o*+(((1&B)+s|0)>>>0))-n)&&(B=0|$a(),d[B>>2]=34),n=+mo(n,l);break e}t=a}while(0);_=0-(L=O+B|0)|0,s=0;i:for(;;){switch(0|t){case 46:k=138;break i;case 48:break;default:a=0,g=0,h=0;break i}(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0],s=1):(t=0|no(e),s=1)}if(138==(0|k))if((t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e),48==(0|t))for(a=0,t=0;;){if(a=0|Hn(0|a,0|t,-1,-1),s=D,(t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e),48!=(0|t)){g=s,s=1,h=1;break}t=s}else a=0,g=0,h=1;d[N>>2]=0,u=t+-48|0,l=46==(0|t);i:do{if(l|u>>>0<10){R=N+496|0,y=0,v=0,w=l,k=g,S=s,M=h,s=0,l=0,h=0;r:for(;;){do{if(w){if(M){g=k,t=y,u=v;break r}a=y,g=v,M=1}else{if(w=0|Hn(0|y,0|v,1,0),v=D,T=48!=(0|t),(0|l)>=125){if(!T){g=k,y=w;break}d[R>>2]=1|d[R>>2],g=k,y=w;break}g=N+(l<<2)|0,s&&(u=t+-48+(10*(0|d[g>>2])|0)|0),d[g>>2]=u,g=k,y=w,S=1,s=(u=9==(0|(s=s+1|0)))?0:s,l=(1&u)+l|0,h=T?w:h}}while(0);if((t=0|d[P>>2])>>>0<(0|d[F>>2])>>>0?(d[P>>2]=t+1,t=0|m[t|0]):t=0|no(e),!((w=46==(0|t))|(u=t+-48|0)>>>0<10)){u=M,k=161;break i}k=g}S=!!(0|S),k=169}else y=0,v=0,S=s,u=h,s=0,l=0,h=0,k=161}while(0);do{if(161==(0|k)){if(a=(R=!(0|u))?y:a,g=R?v:g,!(101==(32|t)&(S=!!(0|S)))){if((0|t)>-1){t=y,u=v,k=169;break}t=y,u=v,k=171;break}if(!(0|(u=0|Wo(e,i)))&-2147483648==(0|(t=D))){if(!i){ro(e,0),n=0;break}0|d[F>>2]?(d[P>>2]=(0|d[P>>2])-1,u=0,t=0):(u=0,t=0)}a=0|Hn(0|u,0|t,0|a,0|g),S=y,g=D,u=v,k=173}}while(0);169==(0|k)&&(0|d[F>>2]?(d[P>>2]=(0|d[P>>2])-1,S?(S=t,k=173):k=172):k=171),171==(0|k)&&(S?(S=t,k=173):k=172);do{if(172==(0|k))B=0|$a(),d[B>>2]=22,ro(e,0),n=0;else if(173==(0|k)){if(!(t=0|d[N>>2])){n=0*+(0|U);break}if((0|a)==(0|S)&(0|g)==(0|u)&((0|u)<0|!(0|u)&S>>>0<10)&&B>>>0>30|!(t>>>B|0)){n=+(0|U)*+(t>>>0);break}if((0|g)>(0|(P=((0|(e=(0|O)/-2|0))<0)<<31>>31))|(0|g)==(0|P)&a>>>0>e>>>0){B=0|$a(),d[B>>2]=34,n=17976931348623157e292*+(0|U)*17976931348623157e292;break}if((0|g)<(0|(P=((0|(e=O+-106|0))<0)<<31>>31))|(0|g)==(0|P)&a>>>0>>0){B=0|$a(),d[B>>2]=34,n=22250738585072014e-324*+(0|U)*22250738585072014e-324;break}if(s){if((0|s)<9){t=0|d[(u=N+(l<<2)|0)>>2];do{t=10*t|0,s=s+1|0}while(9!=(0|s));d[u>>2]=t}l=l+1|0}if((0|h)<9&&(0|h)<=(0|a)&(0|a)<18){if(9==(0|a)){n=+(0|U)*+((0|d[N>>2])>>>0);break}if((0|a)<9){n=+(0|U)*+((0|d[N>>2])>>>0)/+(0|d[37312+(8-a<<2)>>2]);break}if((0|(e=B+27+(0|E(a,-3))|0))>30|!((t=0|d[N>>2])>>>e|0)){n=+(0|U)*+(t>>>0)*+(0|d[37312+(a+-10<<2)>>2]);break}}if(t=(0|a)%9|0){if(u=0|d[37312+(8-(S=(0|a)>-1?t:t+9|0)<<2)>>2],l){h=1e9/(0|u)|0,s=0,t=0,g=0;do{e=(((P=0|d[(F=N+(g<<2)|0)>>2])>>>0)/(u>>>0)|0)+t|0,d[F>>2]=e,t=0|E((P>>>0)%(u>>>0)|0,h),e=(0|g)==(0|s)&!(0|e),g=g+1|0,a=e?a+-9|0:a,s=e?127&g:s}while((0|g)!=(0|l));t&&(d[N+(l<<2)>>2]=t,l=l+1|0)}else s=0,l=0;t=0,a=9-S+a|0}else s=0,t=0;i:for(;;){v=(0|a)<18,w=18==(0|a),T=N+(s<<2)|0;do{if(!v){if(!w)break i;if((0|d[T>>2])>>>0>=9007199){a=18;break i}}for(u=0,h=l+127|0;h=0|Hn(0|(h=0|Xn(0|d[(g=N+((S=127&h)<<2)|0)>>2],0,29)),0|D,0|u,0),(u=D)>>>0>0|!(0|u)&h>>>0>1e9?(e=0|Jn(0|h,0|u,1e9,0),h=0|$n(0|h,0|u,1e9,0),u=e):u=0,d[g>>2]=h,l=(0|S)!=(l+127&127)|(e=(0|S)==(0|s))||0|h?l:S,!e;)h=S+-1|0;t=t+-29|0}while(!(0|u));(0|(s=s+127&127))==(0|l)&&(e=l+127&127,d[(l=N+((l+126&127)<<2)|0)>>2]=d[l>>2]|d[N+(e<<2)>>2],l=e),d[N+(s<<2)>>2]=u,a=a+9|0}i:for(;;){for(y=l+1&127,T=N+((l+127&127)<<2)|0;;){for(w=(0|a)>27?9:1,S=1^(v=18==(0|a));;){g=(0|(h=127&s))==(0|l);do{if(g)k=219;else{if((u=0|d[N+(h<<2)>>2])>>>0<9007199){k=219;break}if(u>>>0>9007199)break;if((0|(u=s+1&127))==(0|l)){k=219;break}if((u=0|d[N+(u<<2)>>2])>>>0<254740991){k=219;break}if(!(u>>>0>254740991|S)){a=h;break i}}}while(0);if(219==(0|k)&&(k=0,v)){k=220;break i}if(t=t+w|0,(0|s)!=(0|l))break;s=l}for(S=(1<>>w,h=s,u=0,g=s;s=((e=0|d[(P=N+(g<<2)|0)>>2])>>>w)+u|0,d[P>>2]=s,u=0|E(e&S,v),s=(0|g)==(0|h)&!(0|s),g=g+1&127,a=s?a+-9|0:a,s=s?g:h,(0|g)!=(0|l);)h=s;if(u){if((0|y)!=(0|s))break;d[T>>2]=1|d[T>>2]}}d[N+(l<<2)>>2]=u,l=y}220==(0|k)&&(g?(d[N+(y+-1<<2)>>2]=0,a=l,l=y):a=h),n=+((0|d[N+(a<<2)>>2])>>>0),(0|(a=s+1&127))==(0|l)&&(d[N+((l=s+2&127)+-1<<2)>>2]=0),o=(A=+(0|U))*(1e9*n+ +((0|d[N+(a<<2)>>2])>>>0)),a=1&(S=(0|(g=(v=t+53|0)-O|0))<(0|B)),(0|(h=S?(0|g)<0?0:g:B))<53?(p=V=+lo(+ho(1,105-h|0),o),n=c=+co(o,+ho(1,53-h|0)),c=V+(o-c)):(p=0,n=0,c=o),u=s+2&127;do{if((0|u)==(0|l))o=n;else{u=0|d[N+(u<<2)>>2];do{if(u>>>0>=5e8){if(u>>>0>5e8){n=.75*A+n;break}if((s+3&127)==(0|l)){n=.5*A+n;break}n=.75*A+n;break}if(!(0|u)&&(s+3&127)==(0|l))break;n=.25*A+n}while(0);if((53-h|0)<=1){o=n;break}if(0!=+co(n,1)){o=n;break}o=n+1}}while(0);n=c+o-p;do{if((2147483647&v)>(-2-L|0)){if(+x(+n)>=9007199254740992&&(a=S&(0|h)==(0|g)?0:a,t=t+1|0,n*=.5),(t+50|0)<=(0|_)&&!(0!=o&!!(0|a)))break;B=0|$a(),d[B>>2]=34}}while(0);n=+mo(n,t)}}while(0);break e;default:0|d[F>>2]&&(d[P>>2]=(0|d[P>>2])-1),B=0|$a(),d[B>>2]=22,ro(e,0),n=0;break e}}}while(0);if(23==(0|k)&&((a=!(0|d[F>>2]))||(d[P>>2]=(0|d[P>>2])-1),!!(0|i)&t>>>0>3))do{a||(d[P>>2]=(0|d[P>>2])-1),t=t+-1|0}while(t>>>0>3);n=+(0|U)*I}}while(0);return b=r,+n}function io(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0;e:do{if(t>>>0>36)n=0|$a(),d[n>>2]=22,n=0,r=0;else{A=e+4|0,p=e+100|0;do{(a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e)}while(0|Ja(a));t:do{switch(0|a){case 43:case 45:if(o=(45==(0|a))<<31>>31,(a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0){d[A>>2]=a+1,a=0|m[a|0],g=o;break t}a=0|no(e),g=o;break t;default:g=0}}while(0);o=!(0|t);do{if(!(-17&t)&48==(0|a)){if((a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e),120!=(32|a)){if(o){t=8,u=46;break}u=32;break}if((t=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=t+1,a=0|m[t|0]):a=0|no(e),(0|m[53879+(a+1)|0])>15){if((r=!(0|d[p>>2]))||(d[A>>2]=(0|d[A>>2])-1),!i){ro(e,0),n=0,r=0;break e}if(r){n=0,r=0;break e}d[A>>2]=(0|d[A>>2])-1,n=0,r=0;break e}t=16,u=46}else{if(t=o?10:t,!((0|m[53879+(a+1)|0])>>>0>>0)){0|d[p>>2]&&(d[A>>2]=(0|d[A>>2])-1),ro(e,0),n=0|$a(),d[n>>2]=22,n=0,r=0;break e}u=32}}while(0);if(32==(0|u))if(10==(0|t)){if((t=a+-48|0)>>>0<10){for(a=0;;){if(o=(10*a|0)+t|0,(t=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=t+1,a=0|m[t|0]):a=0|no(e),!((t=a+-48|0)>>>0<10&o>>>0<429496729)){t=o;break}a=o}o=0}else t=0,o=0;if((i=a+-48|0)>>>0<10){for(;;){if(s=0|Zn(0|t,0|o,10,0),(l=D)>>>0>(h=~(c=((0|i)<0)<<31>>31))>>>0|(0|l)==(0|h)&s>>>0>~i>>>0){s=t;break}if(t=0|Hn(0|s,0|l,0|i,0|c),o=D,(a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e),!((i=a+-48|0)>>>0<10&(o>>>0<429496729|429496729==(0|o)&t>>>0<2576980378))){s=t;break}}i>>>0>9?(a=s,t=g):(t=10,u=72)}else a=t,t=g}else u=46;t:do{if(46==(0|u)){if(!(t+-1&t)){if(u=0|f[54136+((23*t|0)>>>5&7)|0],(i=255&(o=0|f[53879+(a+1)|0]))>>>0>>0){for(a=0;s=i|a<>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e),s>>>0<134217728&(i=255&(o=0|f[53879+(a+1)|0]))>>>0>>0;)a=s;i=0}else i=0,s=0;if(l=0|Yn(-1,-1,0|u),(255&o)>>>0>=t>>>0|i>>>0>(c=D)>>>0|(0|i)==(0|c)&s>>>0>l>>>0){o=i,u=72;break}for(a=i;;){if(s=0|Xn(0|s,0|a,0|u),i=D,s|=255&o,(a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e),(255&(o=0|f[53879+(a+1)|0]))>>>0>=t>>>0|i>>>0>c>>>0|(0|i)==(0|c)&s>>>0>l>>>0){o=i,u=72;break t}a=i}}if((i=255&(o=0|f[53879+(a+1)|0]))>>>0>>0){for(a=0;s=i+(0|E(a,t))|0,(a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e),s>>>0<119304647&(i=255&(o=0|f[53879+(a+1)|0]))>>>0>>0;)a=s;i=0}else s=0,i=0;if((255&o)>>>0>>0)for(u=0|Jn(-1,-1,0|t,0),h=D,c=i;;){if(c>>>0>h>>>0|(0|c)==(0|h)&s>>>0>u>>>0){o=c,u=72;break t}if(i=0|Zn(0|s,0|c,0|t,0),(l=D)>>>0>4294967295|-1==(0|l)&i>>>0>~(o&=255)>>>0){o=c,u=72;break t}if(s=0|Hn(0|o,0,0|i,0|l),i=D,(a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e),(255&(o=0|f[53879+(a+1)|0]))>>>0>=t>>>0){o=i,u=72;break}c=i}else o=i,u=72}}while(0);if(72==(0|u))if((0|m[53879+(a+1)|0])>>>0>>0){do{(a=0|d[A>>2])>>>0<(0|d[p>>2])>>>0?(d[A>>2]=a+1,a=0|m[a|0]):a=0|no(e)}while((0|m[53879+(a+1)|0])>>>0>>0);o=0|$a(),d[o>>2]=34,o=n,a=r,t=!0&!(1&r)?g:0}else a=s,t=g;if(0|d[p>>2]&&(d[A>>2]=(0|d[A>>2])-1),!(o>>>0>>0|(0|o)==(0|n)&a>>>0>>0)){if(!(!1|!!(1&r)|!!(0|t))){A=0|$a(),d[A>>2]=34,r=0|Hn(0|r,0|n,-1,-1),n=D;break}if(o>>>0>n>>>0|(0|o)==(0|n)&a>>>0>r>>>0){A=0|$a(),d[A>>2]=34;break}}r=0|Qn(a^t,o^(r=((0|t)<0)<<31>>31),0|t,0|r),n=D}}while(0);return D=n,0|r}function ro(e,t){t|=0;var i,r,n;d[(e|=0)+104>>2]=t,i=0|d[e+4>>2],n=(r=0|d[e+8>>2])-i|0,d[e+108>>2]=n,d[e+100>>2]=!!(0|t)&(0|n)>(0|t)?i+t:r}function no(e){var t=0,i=0,r=0,n=0,a=0,o=0;return 0|(a=0|d[(i=(e|=0)+104|0)>>2])&&(0|d[e+108>>2])>=(0|a)?o=4:(0|(t=0|xo(e)))>=0?(n=0|d[i>>2],i=e+8|0,n?((i=r=0|d[i>>2])-(a=0|d[e+4>>2])|0)>(0|(n=n-(0|d[e+108>>2])-1|0))?d[e+100>>2]=a+n:o=9:(i=r=0|d[i>>2],o=9),9==(0|o)&&(d[e+100>>2]=i),i=0|d[e+4>>2],r&&(d[(e=e+108|0)>>2]=r+1-i+(0|d[e>>2])),(0|m[(i=i+-1|0)|0])!=(0|t)&&(f[i|0]=t)):o=4,4==(0|o)&&(d[e+100>>2]=0,t=-1),0|t}function ao(e){var t=0;return(e|=0)>>>0>4294963200&&(t=0|$a(),d[t>>2]=0-e,e=-1),0|e}function oo(e,t){return-1}function so(e){e|=0;var t,i;return t=176+(0|Ae())|0,i=0|d[t>>2],e&&(d[t>>2]=e),0|i}function lo(e,t){return+ +function(e,t){e=+e,t=+t;var i,r=0;return A[v>>3]=e,i=0|d[v>>2],r=0|d[v+4>>2],A[v>>3]=t,r=-2147483648&d[v+4>>2]|2147483647&r,d[v>>2]=i,d[v+4>>2]=r,+ +A[v>>3]}(e=+e,t=+t)}function co(e,t){return+ +function(e,t){e=+e,t=+t;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,h=0,m=0;A[v>>3]=e,r=0|d[v>>2],u=0|d[v+4>>2],A[v>>3]=t,f=0|d[v>>2],h=0|d[v+4>>2],n=0|Yn(0|r,0|u,52),n&=2047,l=0|Yn(0|f,0|h,52),l&=2047,i=-2147483648&u,s=0|Xn(0|f,0|h,1),c=D;e:do{if(!(0|s)&!(0|c)||(o=2147483647&h,o>>>0>2146435072|2146435072==(0|o)&f>>>0>0|2047==(0|n)))m=3;else{if(a=0|Xn(0|r,0|u,1),!((o=D)>>>0>c>>>0|(0|o)==(0|c)&a>>>0>s>>>0))return+((0|a)==(0|s)&(0|o)==(0|c)?0*e:e);if(n)a=1048575&u|1048576;else{if(n=0|Xn(0|r,0|u,12),(0|(a=D))>-1|-1==(0|a)&n>>>0>4294967295){o=n,n=0;do{n=n+-1|0,o=0|Xn(0|o,0|a,1),a=D}while((0|a)>-1|-1==(0|a)&o>>>0>4294967295)}else n=0;r=0|Xn(0|r,0|u,1-n|0),a=D}if(l)u=1048575&h|1048576;else{if(o=0|Xn(0|f,0|h,12),(0|(s=D))>-1|-1==(0|s)&o>>>0>4294967295){l=0;do{l=l+-1|0,o=0|Xn(0|o,0|s,1),s=D}while((0|s)>-1|-1==(0|s)&o>>>0>4294967295)}else l=0;f=0|Xn(0|f,0|h,1-l|0),u=D}c=0|Qn(0|r,0|a,0|f,0|u),o=(0|(s=D))>-1|-1==(0|s)&c>>>0>4294967295;t:do{if((0|n)>(0|l)){for(;;){if(o){if((0|r)==(0|f)&(0|a)==(0|u))break;r=c,a=s}if(n=n+-1|0,c=0|Qn(0|(r=0|Xn(0|r,0|a,1)),0|(a=D),0|f,0|u),o=(0|(s=D))>-1|-1==(0|s)&c>>>0>4294967295,(0|n)<=(0|l))break t}t=0*e;break e}}while(0);if(o){if((0|r)==(0|f)&(0|a)==(0|u)){t=0*e;break}a=s,r=c}if(a>>>0<1048576|1048576==(0|a)&r>>>0<0)do{r=0|Xn(0|r,0|a,1),a=D,n=n+-1|0}while(a>>>0<1048576|1048576==(0|a)&r>>>0<0);(0|n)>0?(h=0|Hn(0|r,0|a,0,-1048576),r=D,n=0|Xn(0|n,0,52),r|=D,n|=h):(n=0|Yn(0|r,0|a,1-n|0),r=D),d[v>>2]=n,d[v+4>>2]=r|i,t=+A[v>>3]}}while(0);return 3==(0|m)&&(t*=e,t/=t),+t}(e=+e,t=+t)}function uo(e,t){e=+e,t|=0;var i,r=0,n=0;switch(A[v>>3]=e,n=0|Yn(0|(r=0|d[v>>2]),0|(i=0|d[v+4>>2]),52),0|(n&=2047)){case 0:0!=e?(e=+uo(0x10000000000000000*e,t),r=(0|d[t>>2])-64|0):r=0,d[t>>2]=r;break;case 2047:break;default:d[t>>2]=n+-1022,d[v>>2]=r,d[v+4>>2]=-2146435073&i|1071644672,e=+A[v>>3]}return+e}function fo(e,t){return+ +uo(e=+e,t|=0)}function ho(e,t){e=+e;var i=0;return(0|(t|=0))>1023?(e*=898846567431158e293,(0|(i=t+-1023|0))>1023&&(i=(0|(i=t+-2046|0))>1023?1023:i,e*=898846567431158e293)):(0|t)<-1022?(e*=22250738585072014e-324,(0|(i=t+1022|0))<-1022&&(i=(0|(i=t+2044|0))<-1022?-1022:i,e*=22250738585072014e-324)):i=t,i=0|Xn(i+1023|0,0,52),t=D,d[v>>2]=i,d[v+4>>2]=t,+e*+A[v>>3]}function mo(e,t){return+ +ho(e=+e,t|=0)}function go(e,t,i,r){e|=0,t|=0,i|=0;var n,a,o=0,s=0,l=0,c=0;a=b,b=b+16|0,o=a,r=0|d[(n=0|(r|=0)?r:37348)>>2];e:do{if(t)if(s=0|e?e:o,i){if(r)o=i,l=9;else{if(o=255&(r=0|f[t|0]),r<<24>>24>-1){d[s>>2]=o,r=1&!!(r<<24>>24);break}if((r=o+-194|0)>>>0>50){l=15;break}r=0|d[37076+(r<<2)>>2],(o=i+-1|0)&&(t=t+1|0,l=9)}t:do{if(9==(0|l)){if(((c=(255&(e=0|f[t|0]))>>>3)+-16|c+(r>>26))>>>0>7){l=15;break e}for(;t=t+1|0,o=o+-1|0,!((0|(r=(255&e)-128|r<<6))>=0);){if(!o)break t;if((-64&(e=0|f[t|0]))<<24>>24!=-128){l=15;break e}}d[n>>2]=0,d[s>>2]=r,r=i-o|0;break e}}while(0);d[n>>2]=r,r=-2}else r=-2;else r?l=15:r=0}while(0);return 15==(0|l)&&(d[n>>2]=0,r=0|$a(),d[r>>2]=84,r=-1),b=a,0|r}function po(e){return 1&(e=(e|=0)?!(0|d[e>>2]):1)}function Ao(e,t,i,r){e|=0,i|=0,r|=0;var n=0,a=0,o=0,s=0,l=0,c=0;n=0|d[(t|=0)>>2],0|r&&0|(a=0|d[r>>2])?e?(d[r>>2]=0,l=e,r=i,s=a,c=37):(r=i,o=n,c=16):e?(a=e,r=i,c=6):(r=i,c=7);e:for(;;){if(6==(0|c)){if(!r){c=26;break}for(e=a;;){a=0|f[n|0];do{if(((255&a)-1|0)>>>0<127&&r>>>0>4&!(3&n)){for(o=n;;){if(-2139062144&((n=0|d[o>>2])+-16843009|n)){a=n,n=o,c=32;break}if(d[e>>2]=255&n,d[e+4>>2]=m[o+1|0],d[e+8>>2]=m[o+2|0],n=o+4|0,a=e+16|0,d[e+12>>2]=m[o+3|0],!((r=r+-4|0)>>>0>4)){c=31;break}e=a,o=n}if(31==(0|c)){e=a,a=0|f[n|0];break}if(32==(0|c)){a&=255;break}}}while(0);if(((a&=255)+-1|0)>>>0>=127)break;if(n=n+1|0,d[e>>2]=a,!(r=r+-1|0)){c=26;break e}e=e+4|0}if((a=a+-194|0)>>>0>50){c=48;break}l=e,s=0|d[37076+(a<<2)>>2],n=n+1|0,c=37;continue}if(7==(0|c)){if(((255&(a=0|f[n|0]))-1|0)>>>0<127&&!(3&n)){if(!(-2139062144&((a=0|d[n>>2])+-16843009|a)))do{r=r+-4|0,a=0|d[(n=n+4|0)>>2]}while(!(-2139062144&(a+-16843009|a)));a&=255}if(((a&=255)+-1|0)>>>0<127){r=r+-1|0,n=n+1|0,c=7;continue}if((a=a+-194|0)>>>0>50){c=48;break}a=0|d[37076+(a<<2)>>2],o=n+1|0,c=16;continue}if(16==(0|c)){if(((c=(0|m[o|0])>>>3)+-16|c+(a>>26))>>>0>7){c=17;break}if(n=o+1|0,33554432&a){if((-64&f[n|0])<<24>>24!=-128){c=20;break}if(n=o+2|0,524288&a){if((-64&f[n|0])<<24>>24!=-128){c=23;break}n=o+3|0}}r=r+-1|0,c=7;continue}if(37==(0|c)){if(((c=(a=0|m[n|0])>>>3)+-16|c+(s>>26))>>>0>7){c=38;break}if(o=n+1|0,(0|(e=a+-128|s<<6))<0){if(128!=(192&(a=0|m[o|0]))){c=41;break}if(o=n+2|0,(0|(e=a+-128|e<<6))<0){if(128!=(192&(a=0|m[o|0]))){c=44;break}e=a+-128|e<<6,n=n+3|0}else n=o}else n=o;d[l>>2]=e,a=l+4|0,r=r+-1|0,c=6;continue}}return 17==(0|c)||20==(0|c)||23==(0|c)?(n=o+-1|0,c=47):26==(0|c)?d[t>>2]=n:38==(0|c)?(e=l,a=s,n=n+-1|0,c=47):(41==(0|c)||44==(0|c))&&(r=l,i=n+-1|0,c=52),47==(0|c)&&(a?(r=e,i=n,c=52):c=48),48==(0|c)&&(0|f[n|0]?(r=e,i=n,c=52):(e&&(d[e>>2]=0,d[t>>2]=0),i=i-r|0)),52==(0|c)&&(c=0|$a(),d[c>>2]=84,r&&(d[t>>2]=i),i=-1),0|i}function So(e,t,i){e|=0,t|=0;do{if(e){if(t>>>0<128){f[e|0]=t,e=1;break}if(t>>>0<2048){f[e|0]=t>>>6|192,f[e+1|0]=63&t|128,e=2;break}if(t>>>0<55296|57344==(-8192&t)){f[e|0]=t>>>12|224,f[e+1|0]=t>>>6&63|128,f[e+2|0]=63&t|128,e=3;break}if((t+-65536|0)>>>0<1048576){f[e|0]=t>>>18|240,f[e+1|0]=t>>>12&63|128,f[e+2|0]=t>>>6&63|128,f[e+3|0]=63&t|128,e=4;break}e=0|$a(),d[e>>2]=84,e=-1;break}e=1}while(0);return 0|e}function bo(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o=0,s=0;a=b,b=b+16|0,n=a;e:do{if(e){t:do{if(i>>>0>3){for(r=i,o=0|d[t>>2];;){if(((s=0|d[o>>2])+-1|0)>>>0>126){if(!s)break;if(-1==(0|(s=0|So(e,s)))){i=-1;break e}e=e+s|0,r=r-s|0}else f[e|0]=s,e=e+1|0,r=r+-1|0,o=0|d[t>>2];if(o=o+4|0,d[t>>2]=o,r>>>0<=3)break t}f[e|0]=0,d[t>>2]=0,i=i-r|0;break e}r=i}while(0);if(r){for(o=0|d[t>>2];;){if(((s=0|d[o>>2])+-1|0)>>>0>126){if(!s){o=19;break}if(-1==(0|(s=0|So(n,s)))){i=-1;break e}if(r>>>0>>0){o=22;break}So(e,0|d[o>>2]),e=e+s|0,r=r-s|0}else f[e|0]=s,e=e+1|0,r=r+-1|0,o=0|d[t>>2];if(o=o+4|0,d[t>>2]=o,!r)break e}if(19==(0|o)){f[e|0]=0,d[t>>2]=0,i=i-r|0;break}if(22==(0|o)){i=i-r|0;break}}}else if(e=0|d[t>>2],r=0|d[e>>2],r){i=0;do{if(r>>>0>127){if(-1==(0|(r=0|So(n,r)))){i=-1;break e}}else r=1;i=r+i|0,r=0|d[(e=e+4|0)>>2]}while(0|r)}else i=0}while(0);return b=a,0|i}function vo(e,t){return t|=0,0|(e=(e|=0)?0|So(e,t):0)}function wo(e){return 0}function To(e){0}function yo(e,t){e|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+16|0,i=255&(t|=0),f[(r=n)|0]=i,(s=0|d[(o=e+16|0)>>2])?l=4:0|Do(e)?a=-1:(s=0|d[o>>2],l=4);do{if(4==(0|l)){if((l=0|d[(o=e+20|0)>>2])>>>0>>0&&(0|(a=255&t))!=(0|f[e+75|0])){d[o>>2]=l+1,f[l|0]=i;break}a=1==(0|rs[63&d[e+36>>2]](e,r,1))?0|m[r|0]:-1}}while(0);return b=n,0|a}function Co(e,t,i){t|=0,i|=0;var r,n,a,o,s,l,c=0,u=0,f=0,h=0,m=0,g=0;for(l=b,b=b+48|0,g=l+16|0,a=l,c=l+32|0,u=0|d[(o=(e|=0)+28|0)>>2],d[c>>2]=u,u=(0|d[(s=e+20|0)>>2])-u|0,d[c+4>>2]=u,d[c+8>>2]=t,d[c+12>>2]=i,r=e+60|0,n=e+44|0,t=2,u=u+i|0;;){if(0|d[9258]?(Me(186,0|e),d[a>>2]=d[r>>2],d[a+4>>2]=c,d[a+8>>2]=t,h=0|ao(0|Ne(146,0|a)),Te(0)):(d[g>>2]=d[r>>2],d[g+4>>2]=c,d[g+8>>2]=t,h=0|ao(0|Ne(146,0|g))),(0|u)==(0|h)){u=6;break}if((0|h)<0){u=8;break}u=u-h|0,h>>>0<=(f=0|d[c+4>>2])>>>0?2==(0|t)?(d[o>>2]=(0|d[o>>2])+h,m=f,t=2):m=f:(m=0|d[n>>2],d[o>>2]=m,d[s>>2]=m,m=0|d[c+12>>2],h=h-f|0,c=c+8|0,t=t+-1|0),d[c>>2]=(0|d[c>>2])+h,d[c+4>>2]=m-h}return 6==(0|u)?(g=0|d[n>>2],d[e+16>>2]=g+(0|d[e+48>>2]),e=g,d[o>>2]=e,d[s>>2]=e):8==(0|u)&&(d[e+16>>2]=0,d[o>>2]=0,d[s>>2]=0,d[e>>2]=32|d[e>>2],i=2==(0|t)?0:i-(0|d[c+4>>2])|0),b=l,0|i}function Io(e){var t=0,i=0;return i=0|f[(t=(e|=0)+74|0)|0],f[t|0]=i+255|i,i=e+44|0,(0|d[(t=e+20|0)>>2])>>>0>(0|d[i>>2])>>>0&&rs[63&d[e+36>>2]](e,0,0),d[e+16>>2]=0,d[e+28>>2]=0,d[t>>2]=0,20&(t=0|d[e>>2])?(4&t&&(d[e>>2]=32|t),t=-1):(t=0|d[i>>2],d[e+8>>2]=t,d[e+4>>2]=t,t=0),0|t}function Do(e){var t,i=0;return t=0|f[(i=(e|=0)+74|0)|0],f[i|0]=t+255|t,8&(i=0|d[e>>2])?(d[e>>2]=32|i,i=-1):(d[e+8>>2]=0,d[e+4>>2]=0,i=0|d[e+44>>2],d[e+28>>2]=i,d[e+20>>2]=i,d[e+16>>2]=i+(0|d[e+48>>2]),i=0),0|i}function xo(e){var t,i=0;return t=b,b=b+16|0,i=t,i=!(0|d[(e|=0)+8>>2])&&0|Io(e)?-1:1==(0|rs[63&d[e+32>>2]](e,i,1))?0|m[i|0]:-1,b=t,0|i}function Eo(e){e|=0;var t=0,i=0;do{if(e){if((0|d[e+76>>2])<=-1){t=0|Xo(e);break}i=!0,t=0|Xo(e),i||To()}else{if(t=0|d[9323]?0|Eo(0|d[9323]):0,J(37060),e=0|d[9264])do{i=(d[e+76>>2],0),(0|d[e+20>>2])>>>0>(0|d[e+28>>2])>>>0&&(t=Xo(e)|t),i&&To(),e=0|d[e+56>>2]}while(0|e);we(37060)}}while(0);return 0|t}function Mo(e,t,i){e|=0,t|=0;var r=0,n=0,a=0,o=0;(n=0|d[(r=(i|=0)+16|0)>>2])?a=4:0|Do(i)?r=0:(n=0|d[r>>2],a=4);e:do{if(4==(0|a)){if((n-(a=0|d[(o=i+20|0)>>2])|0)>>>0>>0){r=0|rs[63&d[i+36>>2]](i,e,t);break}t:do{if((0|f[i+75|0])>-1){for(r=t;;){if(!r){n=a,r=0;break t}if(10==(0|f[e+(n=r+-1|0)|0]))break;r=n}if((0|rs[63&d[i+36>>2]](i,e,r))>>>0>>0)break e;t=t-r|0,e=e+r|0,n=0|d[o>>2]}else n=a,r=0}while(0);Wn(0|n,0|e,0|t),d[o>>2]=(0|d[o>>2])+t,r=r+t|0}}while(0);return 0|r}function ko(e,t,i,r){e|=0,r|=0;var n,a=0;return n=0|E(i|=0,t|=0),(0|d[r+76>>2])>-1?(a=!0,e=0|Mo(e,n,r),a||To()):e=0|Mo(e,n,r),(0|e)!=(0|n)&&(i=(e>>>0)/(t>>>0)|0),0|i}function Ro(e){var t=0,i=0,r=0;d[(e|=0)+76>>2],r=3;do{if(3==(0|r)){if((i=0|d[(t=e+4|0)>>2])>>>0<(0|d[e+8>>2])>>>0){d[t>>2]=i+1,t=0|m[i|0];break}t=0|xo(e);break}}while(0);return 0|t}function Fo(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a;return n=b,b=b+16|0,d[(a=n)>>2]=r,r=0|No(e,t,i,a),b=n,0|r}function Po(e,t,i){e|=0,t|=0,i|=0;var r,n;return r=b,b=b+16|0,d[(n=r)>>2]=i,i=0|Uo(e,t,n),b=r,0|i}function Lo(e,t){e|=0,t|=0;var i=0,r=0,n=0,a=0;do{if(-1!=(0|e)){if(n=(d[t+76>>2],0),!(0|d[t+8>>2])&&0|Io(t)||(a=6),6==(0|a)&&(r=0|d[(i=t+4|0)>>2])>>>0>((0|d[t+44>>2])-8|0)>>>0){if(a=r+-1|0,d[i>>2]=a,f[a|0]=e,d[t>>2]=-17&d[t>>2],!n)break;To();break}n&&To(),e=-1}else e=-1}while(0);return 0|e}function _o(e,t,i){e|=0,t|=0,i|=0;var r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0;s=b,b=b+224|0,r=s+80|0,a=s,n=s+136|0,c=(l=o=s+96|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|c));return d[r>>2]=d[i>>2],(0|wr(0,t,r,a,o))<0?i=-1:(p=(d[e+76>>2],0),A=32&(i=0|d[e>>2]),(0|f[e+74|0])<1&&(d[e>>2]=-33&i),0|d[(i=e+48|0)>>2]?l=0|wr(e,t,r,a,o):(u=0|d[(c=e+44|0)>>2],d[c>>2]=n,d[(h=e+28|0)>>2]=n,d[(m=e+20|0)>>2]=n,d[i>>2]=80,d[(g=e+16|0)>>2]=n+80,l=0|wr(e,t,r,a,o),u&&(rs[63&d[e+36>>2]](e,0,0),l=0|d[m>>2]?l:-1,d[c>>2]=u,d[i>>2]=0,d[g>>2]=0,d[h>>2]=0,d[m>>2]=0)),i=0|d[e>>2],d[e>>2]=i|A,p&&To(),i=32&i?-1:l),b=s,0|i}function No(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0;o=b,b=b+128|0,s=o+112|0,c=37352,n=(l=a=o)+112|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|n));return(t+-1|0)>>>0>2147483646?t?(t=0|$a(),d[t>>2]=75,t=-1):(t=1,u=4):(s=e,u=4),4==(0|u)&&(u=t>>>0>(u=-2-s|0)>>>0?u:t,d[a+48>>2]=u,d[(e=a+20|0)>>2]=s,d[a+44>>2]=s,t=s+u|0,d[(s=a+16|0)>>2]=t,d[a+28>>2]=t,t=0|_o(a,i,r),u&&(i=0|d[e>>2],f[i+(((0|i)==(0|d[s>>2]))<<31>>31)|0]=0)),b=o,0|t}function Uo(e,t,i){e|=0,t|=0,i|=0;var r,n,a=0,o=0;n=b,b=b+112|0,o=(a=r=n)+112|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|o));return d[r+32>>2]=29,d[r+44>>2]=e,d[r+76>>2]=-1,d[r+84>>2]=e,o=0|function(e,t,i){t|=0,i|=0;var r,n,a,o,s,l,c=0,u=0,g=0,S=0,v=0,w=0,T=0,y=0,C=0,I=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0,_=0,N=0,U=0,O=0,B=0,V=0,q=0,G=0;l=b,b=b+304|0,n=l+16|0,o=l+8|0,a=l+33|0,s=l,r=l+32|0,d[76+(e|=0)>>2],q=0,c=0|f[0|t];e:do{if(c<<24>>24){O=e+4|0,B=e+100|0,U=e+108|0,R=e+8|0,F=a+10|0,P=a+33|0,L=o+4|0,_=a+46|0,N=a+94|0,g=c,c=0,S=t,C=0,u=0,t=0;t:for(;;){i:do{if(0|Ja(255&g)){for(;0|Ja(0|m[0|(g=S+1|0)]);)S=g;ro(e,0);do{(g=0|d[O>>2])>>>0<(0|d[B>>2])>>>0?(d[O>>2]=g+1,g=0|m[0|g]):g=0|no(e)}while(0|Ja(g));g=0|d[O>>2],0|d[B>>2]&&(g=g+-1|0,d[O>>2]=g),v=(0|d[U>>2])+C+g-(0|d[R>>2])|0}else{g=37==(0|f[0|S]);r:do{if(g){v=0|f[0|(T=S+1|0)];n:do{switch(v<<24>>24){case 37:break r;case 42:k=0,v=S+2|0;break;default:if((v=(255&v)-48|0)>>>0<10&&36==(0|f[S+2|0])){for(d[n>>2]=d[i>>2];k=3+(0|d[n>>2])&-4,g=0|d[k>>2],d[n>>2]=k+4,v>>>0>1;)v=v+-1|0;k=g,v=S+3|0;break n}v=3+(0|d[i>>2])&-4,k=0|d[v>>2],d[i>>2]=v+4,v=T}}while(0);if(((S=255&(g=0|f[0|v]))-48|0)>>>0<10)for(g=0;T=(10*g|0)-48+S|0,!(((S=255&(g=0|f[0|(v=v+1|0)]))-48|0)>>>0>=10);)g=T;else T=0;switch(g<<24>>24==109?(y=0|f[0|(v=v+1|0)],g=1&!!(0|k),u=0,t=0):(y=g,g=0),S=v+1|0,255&y){case 104:S=(M=104==(0|f[0|S]))?v+2|0:S,v=M?-2:-1;break;case 108:S=(M=108==(0|f[0|S]))?v+2|0:S,v=M?3:1;break;case 106:v=3;break;case 116:case 122:v=1;break;case 76:v=2;break;case 110:case 112:case 67:case 83:case 91:case 99:case 115:case 88:case 71:case 70:case 69:case 65:case 103:case 102:case 101:case 97:case 120:case 117:case 111:case 105:case 100:S=v,v=0;break;default:V=152;break t}switch(y=(I=3==(47&(y=0|m[0|S])))?32|y:y,I=I?1:v,0|y){case 99:M=C,E=(0|T)<1?1:T;break;case 91:M=C,E=T;break;case 110:if(!k){v=C;break i}switch(0|I){case-2:f[0|k]=C,v=C;break i;case-1:h[k>>1]=C,v=C;break i;case 0:case 1:d[k>>2]=C,v=C;break i;case 3:d[(v=k)>>2]=C,d[v+4>>2]=((0|C)<0)<<31>>31,v=C;break i;default:v=C;break i}default:ro(e,0);do{(v=0|d[O>>2])>>>0<(0|d[B>>2])>>>0?(d[O>>2]=v+1,v=0|m[0|v]):v=0|no(e)}while(0|Ja(v));v=0|d[O>>2],0|d[B>>2]&&(v=v+-1|0,d[O>>2]=v),M=(0|d[U>>2])+C+v-(0|d[R>>2])|0,E=T}if(ro(e,E),(v=0|d[O>>2])>>>0<(T=0|d[B>>2])>>>0)d[O>>2]=v+1;else{if((0|no(e))<0){V=152;break t}T=0|d[B>>2]}T&&(d[O>>2]=(0|d[O>>2])-1);n:do{switch(0|y){case 91:case 99:case 115:x=99==(0|y);a:do{if(99==(239&y))zn(0|a,-1,257),f[0|a]=0,115==(0|y)&&(f[0|P]=0,f[0|F]=0,f[F+1|0]=0,f[F+2|0]=0,f[F+3|0]=0,f[F+4|0]=0);else{switch(v=1&(C=94==(0|f[0|(G=S+1|0)])),y=C?G:S,S=C?S+2|0:G,zn(0|a,1&C,257),f[0|a]=0,0|f[0|S]){case 45:C=255&(1^v),f[0|_]=C,S=y+2|0;break;case 93:C=255&(1^v),f[0|N]=C,S=y+2|0;break;default:C=255&(1^v)}for(;;){v=0|f[0|S];o:do{switch(v<<24>>24){case 0:V=152;break t;case 93:break a;case 45:switch((v=0|f[0|(y=S+1|0)])<<24>>24){case 93:case 0:v=45;break o}if((255&(S=0|f[S+-1|0]))<(255&v)){S&=255;do{f[a+(S=S+1|0)|0]=C,v=0|f[0|y]}while((0|S)<(255&v));S=y}else S=y}}while(0);f[a+(1+(255&v))|0]=C,S=S+1|0}}}while(0);y=x?E+1|0:31,C=1==(0|I),I=!!(0|g);a:do{if(C){if(I){if(!(t=0|Dr(y<<2))){u=0,V=152;break t}}else t=k;d[o>>2]=0,d[L>>2]=0,u=0;o:for(;;){T=!(0|t);do{s:for(;;){if((v=0|d[O>>2])>>>0<(0|d[B>>2])>>>0?(d[O>>2]=v+1,v=0|m[0|v]):v=0|no(e),!(0|f[a+(v+1)|0]))break o;switch(f[0|r]=v,0|go(s,r,1,o)){case-1:u=0,V=152;break t;case-2:break;default:break s}}T||(d[t+(u<<2)>>2]=d[s>>2],u=u+1|0)}while(!(I&(0|u)==(0|y)));if(!(v=0|Er(t,(u=y<<1|1)<<2))){u=0,V=152;break t}G=y,y=u,t=v,u=G}if(!(0|po(o))){u=0,V=152;break t}T=u,u=0}else{if(I){if(!(u=0|Dr(y))){u=0,t=0,V=152;break t}for(v=0;;){do{if((t=0|d[O>>2])>>>0<(0|d[B>>2])>>>0?(d[O>>2]=t+1,t=0|m[0|t]):t=0|no(e),!(0|f[a+(t+1)|0])){T=v,t=0;break a}f[u+v|0]=t,v=v+1|0}while((0|v)!=(0|y));if(!(v=0|Er(u,t=y<<1|1))){t=0,V=152;break t}G=y,y=t,u=v,v=G}}if(k)for(u=0;;){if((t=0|d[O>>2])>>>0>>0?(d[O>>2]=t+1,t=0|m[0|t]):t=0|no(e),!(0|f[a+(t+1)|0])){T=u,u=k,t=0;break a}f[k+u|0]=t,T=0|d[B>>2],u=u+1|0}else for(u=T;;){if((t=0|d[O>>2])>>>0>>0?(d[O>>2]=t+1,t=0|m[0|t]):t=0|no(e),!(0|f[a+(t+1)|0])){T=0,u=0,t=0;break a}u=0|d[B>>2]}}}while(0);if(v=0|d[O>>2],0|d[B>>2]&&(v=v+-1|0,d[O>>2]=v),!((v=v-(0|d[R>>2])+(0|d[U>>2])|0)&&(0|v)==(0|E)|1^x))break t;do{if(I){if(C){d[k>>2]=t;break}d[k>>2]=u;break}}while(0);if(!x){if(t&&(d[t+(T<<2)>>2]=0),!u){u=0;break n}f[u+T|0]=0}break;case 120:case 88:case 112:v=16,V=134;break;case 111:v=8,V=134;break;case 117:case 100:v=10,V=134;break;case 105:v=0,V=134;break;case 71:case 103:case 70:case 102:case 69:case 101:case 65:case 97:if(w=+to(e,I,0),(0|d[U>>2])==((0|d[R>>2])-(0|d[O>>2])|0))break t;if(k)switch(0|I){case 0:p[k>>2]=w;break n;case 1:case 2:A[k>>3]=w;break n;default:break n}}}while(0);n:do{if(134==(0|V)){if(V=0,v=0|io(e,v,0,-1,-1),(0|d[U>>2])==((0|d[R>>2])-(0|d[O>>2])|0))break t;if(!!(0|k)&112==(0|y)){d[k>>2]=v;break}if(k)switch(0|I){case-2:f[0|k]=v;break n;case-1:h[k>>1]=v;break n;case 0:case 1:d[k>>2]=v;break n;case 3:d[(G=k)>>2]=v,d[G+4>>2]=D;break n;default:break n}}}while(0);c=(1&!!(0|k))+c|0,v=(0|d[U>>2])+M+(0|d[O>>2])-(0|d[R>>2])|0;break i}}while(0);if(S=S+(1&g)|0,ro(e,0),(g=0|d[O>>2])>>>0<(0|d[B>>2])>>>0?(d[O>>2]=g+1,g=0|m[0|g]):g=0|no(e),(0|g)!=(0|m[0|S])){V=21;break t}v=C+1|0}}while(0);if(!((g=0|f[0|(S=S+1|0)])<<24>>24))break e;C=v}if(21==(0|V)){if(0|d[B>>2]&&(d[O>>2]=(0|d[O>>2])-1),!!(0|c)|(0|g)>-1)break;c=0,V=153}else 152==(0|V)&&(c||(c=g,V=153));153==(0|V)&&(g=c,c=-1),g&&(xr(u),xr(t))}else c=0}while(0);return q&&To(),b=l,0|c}(r,t,i),b=n,0|o}function Oo(e,t,i){return+ +function(e,t,i){e|=0,t|=0,i|=0;var r,n,a,o=0,s=0;a=b,b=b+112|0,s=(o=n=a)+112|0;do{d[o>>2]=0,o=o+4|0}while((0|o)<(0|s));return d[(o=n+4|0)>>2]=e,d[(s=n+8|0)>>2]=-1,d[n+44>>2]=e,d[n+76>>2]=-1,ro(n,0),r=+to(n,i,1),i=(0|d[o>>2])-(0|d[s>>2])+(0|d[n+108>>2])|0,t&&(d[t>>2]=0|i?e+i|0:e),b=a,+r}(e|=0,t|=0,2)}function Bo(e,t,i){e|=0;var r=0,n=0,a=0,o=0;a=255&(t|=0),r=!!(0|(i|=0));e:do{if(r&!!(3&e))for(n=255&t;;){if((0|f[e|0])==n<<24>>24){o=6;break e}if(!((r=!!(0|(i=i+-1|0)))&!!(3&(e=e+1|0)))){o=5;break}}else o=5}while(0);5==(0|o)&&(r?o=6:i=0);e:do{if(6==(0|o)&&(n=255&t,(0|f[e|0])!=n<<24>>24)){r=0|E(a,16843009);t:do{if(i>>>0>3){for(;!((-2139062144&(a=d[e>>2]^r)^-2139062144)&a+-16843009);)if(e=e+4|0,(i=i+-4|0)>>>0<=3){o=11;break t}}else o=11}while(0);if(11==(0|o)&&!i){i=0;break}for(;;){if((0|f[e|0])==n<<24>>24)break e;if(e=e+1|0,!(i=i+-1|0)){i=0;break}}}}while(0);return 0|(0|i?e:0)}function Vo(e,t){t|=0;var i=0,r=0;if(r=0|f[(e|=0)|0],i=0|f[t|0],r<<24>>24&&r<<24>>24==i<<24>>24){do{t=t+1|0,r=0|f[(e=e+1|0)|0],i=0|f[t|0]}while(r<<24>>24&&r<<24>>24==i<<24>>24);t=r}else t=r;return(255&t)-(255&i)|0}function qo(e,t){return function(e,t){e|=0;var i=0,r=0;i=t|=0;e:do{if(3&(i^e))r=8;else{if(3&i)do{if(i=0|f[0|t],f[0|e]=i,!(i<<24>>24))break e;t=t+1|0,e=e+1|0}while(3&t);if(!((-2139062144&(i=0|d[t>>2])^-2139062144)&i+-16843009))for(r=e;t=t+4|0,e=r+4|0,d[r>>2]=i,!((-2139062144&(i=0|d[t>>2])^-2139062144)&i+-16843009);)r=e;r=8}}while(0);if(8==(0|r)&&(r=0|f[0|t],f[0|e]=r,r<<24>>24))do{e=e+1|0,r=0|f[0|(t=t+1|0)],f[0|e]=r}while(r<<24>>24)}(e|=0,t|=0),0|e}function Go(e){var t,i=0,r=0;t=e|=0;e:do{if(3&t)for(i=e,e=t;;){if(!(0|f[i|0]))break e;if(!(3&(e=i=i+1|0))){e=i,r=4;break}}else r=4}while(0);if(4==(0|r)){for(;!((-2139062144&(i=0|d[e>>2])^-2139062144)&i+-16843009);)e=e+4|0;if((255&i)<<24>>24)do{e=e+1|0}while(0|f[e|0])}return e-t|0}function Qo(e,t,i){e|=0,t|=0;var r=0,n=0;if(i|=0){r=0|f[e|0];e:do{if(r<<24>>24)for(;;){if(i=i+-1|0,!(r<<24>>24==(n=0|f[t|0])<<24>>24&!!(0|i)&!!(n<<24>>24)))break e;if(t=t+1|0,!((r=0|f[(e=e+1|0)|0])<<24>>24)){r=0;break}}else r=0}while(0);t=(255&r)-(0|m[t|0])|0}else t=0;return 0|t}function zo(e){var t=0;for(t=e|=0;0|d[t>>2];)t=t+4|0;return t-e>>2}function Ho(e,t,i){e|=0,t|=0;var r=0;if(i|=0)for(r=e;i=i+-1|0,d[r>>2]=d[t>>2],i;)t=t+4|0,r=r+4|0;return 0|e}function Yo(e,t,i){var r=0;if(r=!(0|(i|=0)),(e|=0)-(t|=0)>>2>>>0>>0){if(!r)do{d[e+((i=i+-1|0)<<2)>>2]=d[t+(i<<2)>>2]}while(0|i)}else if(!r)for(r=t,t=e;i=i+-1|0,d[t>>2]=d[r>>2],i;)r=r+4|0,t=t+4|0;return 0|e}function Wo(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0;switch((n=0|d[(i=(e|=0)+4|0)>>2])>>>0<(0|d[(r=e+100|0)>>2])>>>0?(d[i>>2]=n+1,n=0|m[n|0]):n=0|no(e),0|n){case 43:case 45:a=45==(0|n)&1,(n=0|d[i>>2])>>>0<(0|d[r>>2])>>>0?(d[i>>2]=n+1,n=0|m[n|0]):n=0|no(e),!!(0|t)&(n+-48|0)>>>0>9&&0|d[r>>2]&&(d[i>>2]=(0|d[i>>2])-1),s=a;break;default:s=0}if((n+-48|0)>>>0>9)0|d[r>>2]?(d[i>>2]=(0|d[i>>2])-1,a=-2147483648,n=0):(a=-2147483648,n=0);else{a=0;do{a=n+-48+(10*a|0)|0,(n=0|d[i>>2])>>>0<(0|d[r>>2])>>>0?(d[i>>2]=n+1,n=0|m[n|0]):n=0|no(e)}while((n+-48|0)>>>0<10&(0|a)<214748364);if(t=((0|a)<0)<<31>>31,(n+-48|0)>>>0<10){do{t=0|Zn(0|a,0|t,10,0),a=D,n=0|Hn(0|n,((0|n)<0)<<31>>31,-48,-1),a=0|Hn(0|n,0|D,0|t,0|a),t=D,(n=0|d[i>>2])>>>0<(0|d[r>>2])>>>0?(d[i>>2]=n+1,n=0|m[n|0]):n=0|no(e)}while((n+-48|0)>>>0<10&((0|t)<21474836|21474836==(0|t)&a>>>0<2061584302));o=a}else o=a;if((n+-48|0)>>>0<10)do{(n=0|d[i>>2])>>>0<(0|d[r>>2])>>>0?(d[i>>2]=n+1,n=0|m[n|0]):n=0|no(e)}while((n+-48|0)>>>0<10);0|d[r>>2]&&(d[i>>2]=(0|d[i>>2])-1),e=!!(0|s),n=0|Qn(0,0,0|o,0|t),a=e?D:t,n=e?n:o}return D=a,0|n}function Xo(e){var t,i=0,r=0,n=0,a=0,o=0;return t=(e|=0)+28|0,(0|d[(i=e+20|0)>>2])>>>0>(0|d[t>>2])>>>0&&(rs[63&d[e+36>>2]](e,0,0),!(0|d[i>>2]))?i=-1:((r=0|d[(o=e+4|0)>>2])>>>0<(a=0|d[(n=e+8|0)>>2])>>>0&&rs[63&d[e+40>>2]](e,r-a|0,1),d[e+16>>2]=0,d[t>>2]=0,d[i>>2]=0,d[n>>2]=0,d[o>>2]=0,i=0),0|i}var Ko=[ta,function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0;var s,l=0;if(s=b,b=b+112|0,l=s+4|0,d[(i=s)>>2]=l+100,or(e+8|0,l,i,n,a,o),n=0|d[i>>2],i=0|d[t>>2],(0|l)!=(0|n))do{o=0|f[l|0];do{if(i){if((0|(a=0|d[(r=i+24|0)>>2]))==(0|d[i+28>>2])){i=(t=-1==(0|ls[63&d[52+(0|d[i>>2])>>2]](i,255&o)))?0:i;break}d[r>>2]=a+1,f[a|0]=o;break}i=0}while(0);l=l+1|0}while((0|l)!=(0|n));return b=s,0|i},function(e,t,i,r,n,a,o){var s;if(e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s=b,b=b+416|0,r=s+8|0,d[(i=s)>>2]=r+400,function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0;if(o=b,b=b+128|0,c=o+16|0,s=o,l=o+8|0,d[(u=o+12|0)>>2]=c+100,or(e,c,u,r,n,a),d[(n=s)>>2]=0,d[n+4>>2]=0,d[l>>2]=c,n=(0|d[i>>2])-t>>2,a=0|so(0|d[e>>2]),y=0,n=0|Y(18,0|t,0|l,0|n,0|s),e=y,y=0,1&e&&(n=0|ae(),0|a&&(y=0,N(75,0|a),u=y,y=0,1&u)&&Ue(u=0|ae(0)),de(0|n)),0|a&&(y=0,N(75,0|a),u=y,y=0,1&u)&&Ue(u=0|ae(0)),-1!=(0|n))return d[i>>2]=t+(n<<2),void(b=o);sr(58955)}(e+8|0,r,i,n,a,o),e=0|d[i>>2],i=0|d[t>>2],(0|r)!=(0|e)){n=r;do{r=0|d[n>>2],i?((0|(o=0|d[(a=i+24|0)>>2]))==(0|d[i+28>>2])?r=0|ls[63&d[52+(0|d[i>>2])>>2]](i,r):(d[a>>2]=o+4,d[o>>2]=r),i=-1==(0|r)?0:i):i=0,n=n+4|0}while((0|n)!=(0|e))}return b=s,0|i},function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0;var s,l,c,u,h,m,g,p,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0;if(h=b,b=b+240|0,c=h+24|0,u=h,e=h+136|0,l=h+12|0,m=h+8|0,T=h+134|0,S=h+4|0,s=h+124|0,d[(g=h+16|0)>>2]=e,d[(p=g+4|0)>>2]=189,v=e+100|0,y=0,A=0|N(68,0|n),k=y,y=0,1&k)S=0|ae(),d[g>>2]=0,A=189,F=45;else{d[m>>2]=A,y=0,e=0|G(37,0|m,44220),k=y,y=0;e:do{if(!(1&k||(f[T|0]=0,d[S>>2]=d[i>>2],w=0|d[n+4>>2],y=0,d[c>>2]=d[S>>2],w=0|U(1,0|t,0|c,0|r,0|m,0|w,0|a,0|T,0|e,0|g,0|l,0|v),k=y,y=0,1&k))){t:do{if(w){if(y=0,Y(0|d[32+(0|d[e>>2])>>2],0|e,58976,58986,0|s),k=y,y=0,1&k){F=10;break e}(0|(e=(S=0|d[l>>2])-(v=0|d[g>>2])|0))>98?(A=e=0|Dr(e+2|0),e?F=13:(y=0,X(6),k=y,y=0,1&k||(e=0,F=13))):(A=0,e=c,F=13);do{if(13==(0|F)){if(0|f[T|0]&&(f[e|0]=45,e=e+1|0),M=s+10|0,k=s,v>>>0>>0){E=(x=(D=(I=(C=(T=(n=(r=(w=s+1|0)+1|0)+1|0)+1|0)+1|0)+1|0)+1|0)+1|0)+1|0;do{S=0|f[v|0];do{if((0|f[s|0])!=S<<24>>24)if((0|f[w|0])!=S<<24>>24)if((0|f[r|0])!=S<<24>>24)if((0|f[n|0])!=S<<24>>24)if((0|f[T|0])==S<<24>>24)S=T;else{if((0|f[C|0])==S<<24>>24){S=C;break}if((0|f[I|0])==S<<24>>24){S=I;break}if((0|f[D|0])==S<<24>>24){S=D;break}if((0|f[x|0])==S<<24>>24){S=x;break}S=(0|f[E|0])==S<<24>>24?E:M}else S=n;else S=r;else S=w;else S=s}while(0);f[e|0]=0|f[S-k+58976|0],v=v+1|0,e=e+1|0}while(v>>>0<(0|d[l>>2])>>>0)}if(f[e|0]=0,d[u>>2]=o,1!=(0|Po(c,58987,u))&&(y=0,P(190,58991),o=y,y=0,1&o))break;A&&xr(A);break t}}while(0);if(e=0|ae(),!A){S=e,A=g;break e}xr(A),S=e,A=g;break e}}while(0);e=0|d[t>>2];do{if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[e>>2])>>2],0|e),o=y,y=0,1&o){F=10;break e}if(-1==(0|e)){d[t>>2]=0,e=0;break}e=0|d[t>>2];break}}else e=0}while(0);A=!(0|e),e=0|d[i>>2];do{if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[e>>2])>>2],0|e),o=y,y=0,1&o){F=10;break e}if(-1==(0|e)){d[i>>2]=0,F=37;break}}A||(F=38)}else F=37}while(0);return 37==(0|F)&&A&&(F=38),38==(0|F)&&(d[a>>2]=2|d[a>>2]),A=0|d[t>>2],Nr(0|d[m>>2]),e=0|d[g>>2],d[g>>2]=0,0|e&&(y=0,P(0|d[p>>2],0|e),F=y,y=0,1&F)&&Ue(F=0|ae(0)),b=h,0|A}F=10}while(0);10==(0|F)&&(S=0|ae(),A=g),Nr(0|d[m>>2]),e=0|d[A>>2],d[A>>2]=0,e?(A=0|d[p>>2],F=45):R=S}return 45==(0|F)&&(y=0,P(0|A,0|e),F=y,y=0,1&F?Ue(F=0|ae(0)):R=S),de(0|R),0},function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0;var s,l,c,u,h,m,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;if(h=b,b=b+144|0,g=h+24|0,e=h+32|0,c=h+8|0,s=h+4|0,l=h+28|0,p=h,d[(m=h+16|0)>>2]=e,d[(D=m+4|0)>>2]=189,A=e+100|0,y=0,u=0|N(68,0|n),S=y,y=0,1&S)g=0|ae(),d[m>>2]=0,I=36;else{d[s>>2]=u,y=0,S=0|G(37,0|s,44220),e=y,y=0;e:do{if(!(1&e||(f[l|0]=0,w=0|d[i>>2],d[p>>2]=w,v=0|d[n+4>>2],T=w,y=0,d[g>>2]=d[p>>2],v=0|U(1,0|t,0|g,0|r,0|s,0|v,0|a,0|l,0|S,0|m,0|c,0|A),n=y,y=0,1&n))){if(v){if(1&f[o|0]?(f[d[o+8>>2]|0]=0,d[o+4>>2]=0):(f[o+1|0]=0,f[o|0]=0),0|f[l|0]&&(y=0,e=0|G(0|d[28+(0|d[S>>2])>>2],0|S,45),n=y,y=0,1&n||(y=0,L(67,0|o,0|e),n=y,y=0,1&n))||(y=0,p=0|G(0|d[28+(0|d[S>>2])>>2],0|S,48),n=y,y=0,1&n))break;e=0|d[m>>2],g=(A=0|d[c>>2])+-1|0;t:do{if(e>>>0>>0)do{if((0|f[e|0])!=p<<24>>24)break t;e=e+1|0}while(e>>>0>>0)}while(0);if(y=0,O(32,0|o,0|e,0|A),o=y,y=0,1&o)break}e=0|d[t>>2];do{if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[e>>2])>>2],0|e),o=y,y=0,1&o)break e;if(-1==(0|e)){d[t>>2]=0,e=0;break}e=0|d[t>>2];break}}else e=0}while(0);g=!(0|e);do{if(w){if((0|d[T+12>>2])==(0|d[T+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[w>>2])>>2],0|T),T=y,y=0,1&T)break e;if(-1==(0|e)){d[i>>2]=0,I=29;break}}g||(I=30)}else I=29}while(0);return 29==(0|I)&&g&&(I=30),30==(0|I)&&(d[a>>2]=2|d[a>>2]),g=0|d[t>>2],Nr(u),e=0|d[m>>2],d[m>>2]=0,0|e&&(y=0,P(0|d[D>>2],0|e),D=y,y=0,1&D)&&Ue(D=0|ae(0)),b=h,0|g}}while(0);g=0|ae(),Nr(u),e=0|d[m>>2],d[m>>2]=0,e?I=36:C=g}return 36==(0|I)&&(y=0,P(0|d[D>>2],0|e),D=y,y=0,1&D?Ue(D=0|ae(0)):C=g),de(0|C),0},function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0;var s,l,c,u,h,m,g,p,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0;if(h=b,b=b+576|0,s=h+424|0,u=h,e=h+24|0,l=h+12|0,m=h+8|0,T=h+464|0,S=h+4|0,c=h+468|0,d[(g=h+16|0)>>2]=e,d[(p=g+4|0)>>2]=189,v=e+400|0,y=0,A=0|N(68,0|n),k=y,y=0,1&k)S=0|ae(),d[g>>2]=0,A=189,F=47;else{d[m>>2]=A,y=0,e=0|G(37,0|m,44212),k=y,y=0;e:do{if(!(1&k||(f[T|0]=0,d[S>>2]=d[i>>2],w=0|d[n+4>>2],y=0,d[s>>2]=d[S>>2],w=0|U(2,0|t,0|s,0|r,0|m,0|w,0|a,0|T,0|e,0|g,0|l,0|v),k=y,y=0,1&k))){t:do{if(w){if(y=0,Y(0|d[48+(0|d[e>>2])>>2],0|e,59007,59017,0|s),k=y,y=0,1&k){F=10;break e}(0|(e=(S=0|d[l>>2])-(v=0|d[g>>2])|0))>392?(A=e=0|Dr(2+(e>>2)|0),e?F=13:(y=0,X(6),k=y,y=0,1&k||(e=0,F=13))):(A=0,e=c,F=13);do{if(13==(0|F)){if(0|f[T|0]&&(f[e|0]=45,e=e+1|0),M=s+40|0,k=s,v>>>0>>0){E=(x=(D=(I=(C=(T=(n=(r=(w=s+4|0)+4|0)+4|0)+4|0)+4|0)+4|0)+4|0)+4|0)+4|0;do{S=0|d[v>>2];do{if((0|d[s>>2])!=(0|S))if((0|d[w>>2])!=(0|S))if((0|d[r>>2])!=(0|S))if((0|d[n>>2])!=(0|S))if((0|d[T>>2])==(0|S))S=T;else{if((0|d[C>>2])==(0|S)){S=C;break}if((0|d[I>>2])==(0|S)){S=I;break}if((0|d[D>>2])==(0|S)){S=D;break}if((0|d[x>>2])==(0|S)){S=x;break}S=(0|d[E>>2])==(0|S)?E:M}else S=n;else S=r;else S=w;else S=s}while(0);f[e|0]=0|f[59007+(S-k>>2)|0],v=v+4|0,e=e+1|0}while(v>>>0<(0|d[l>>2])>>>0)}if(f[e|0]=0,d[u>>2]=o,1!=(0|Po(c,58987,u))&&(y=0,P(190,58991),o=y,y=0,1&o))break;A&&xr(A);break t}}while(0);if(e=0|ae(),!A){S=e,A=g;break e}xr(A),S=e,A=g;break e}}while(0);e=0|d[t>>2];do{if(e){if((0|(A=0|d[e+12>>2]))==(0|d[e+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[e>>2])>>2],0|e),o=y,y=0,1&o){F=10;break e}}else e=0|d[A>>2];if(-1==(0|e)){d[t>>2]=0,S=1;break}S=!(0|d[t>>2]);break}S=1}while(0);e=0|d[i>>2];do{if(e){if((0|(A=0|d[e+12>>2]))==(0|d[e+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[e>>2])>>2],0|e),o=y,y=0,1&o){F=10;break e}}else e=0|d[A>>2];if(-1!=(0|e)){if(S)break;F=40;break}d[i>>2]=0,F=38;break}F=38}while(0);return 38==(0|F)&&S&&(F=40),40==(0|F)&&(d[a>>2]=2|d[a>>2]),A=0|d[t>>2],Nr(0|d[m>>2]),e=0|d[g>>2],d[g>>2]=0,0|e&&(y=0,P(0|d[p>>2],0|e),F=y,y=0,1&F)&&Ue(F=0|ae(0)),b=h,0|A}F=10}while(0);10==(0|F)&&(S=0|ae(),A=g),Nr(0|d[m>>2]),e=0|d[A>>2],d[A>>2]=0,e?(A=0|d[p>>2],F=47):R=S}return 47==(0|F)&&(y=0,P(0|A,0|e),F=y,y=0,1&F?Ue(F=0|ae(0)):R=S),de(0|R),0},function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0;var s,l,c,u,h,m,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;if(h=b,b=b+432|0,g=h+424|0,e=h+24|0,c=h+8|0,s=h+4|0,l=h+428|0,p=h,d[(m=h+16|0)>>2]=e,d[(D=m+4|0)>>2]=189,A=e+400|0,y=0,u=0|N(68,0|n),S=y,y=0,1&S)g=0|ae(),d[m>>2]=0,I=38;else{d[s>>2]=u,y=0,S=0|G(37,0|s,44212),e=y,y=0;e:do{if(!(1&e||(f[l|0]=0,w=0|d[i>>2],d[p>>2]=w,v=0|d[n+4>>2],T=w,y=0,d[g>>2]=d[p>>2],v=0|U(2,0|t,0|g,0|r,0|s,0|v,0|a,0|l,0|S,0|m,0|c,0|A),n=y,y=0,1&n))){if(v){if(1&f[o|0]?d[d[o+8>>2]>>2]=0:f[o|0]=0,d[o+4>>2]=0,0|f[l|0]&&(y=0,e=0|G(0|d[44+(0|d[S>>2])>>2],0|S,45),n=y,y=0,1&n||(y=0,L(92,0|o,0|e),n=y,y=0,1&n))||(y=0,p=0|G(0|d[44+(0|d[S>>2])>>2],0|S,48),n=y,y=0,1&n))break;e=0|d[m>>2],g=(A=0|d[c>>2])+-4|0;t:do{if(e>>>0>>0)do{if((0|d[e>>2])!=(0|p))break t;e=e+4|0}while(e>>>0>>0)}while(0);if(y=0,O(33,0|o,0|e,0|A),o=y,y=0,1&o)break}e=0|d[t>>2];do{if(e){if((0|(g=0|d[e+12>>2]))==(0|d[e+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[e>>2])>>2],0|e),o=y,y=0,1&o)break e}else e=0|d[g>>2];if(-1==(0|e)){d[t>>2]=0,g=1;break}g=!(0|d[t>>2]);break}g=1}while(0);do{if(w){if((0|(e=0|d[T+12>>2]))==(0|d[T+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[w>>2])>>2],0|T),T=y,y=0,1&T)break e}else e=0|d[e>>2];if(-1!=(0|e)){if(g)break;I=32;break}d[i>>2]=0,I=30;break}I=30}while(0);return 30==(0|I)&&g&&(I=32),32==(0|I)&&(d[a>>2]=2|d[a>>2]),g=0|d[t>>2],Nr(u),e=0|d[m>>2],d[m>>2]=0,0|e&&(y=0,P(0|d[D>>2],0|e),D=y,y=0,1&D)&&Ue(D=0|ae(0)),b=h,0|g}}while(0);g=0|ae(),Nr(u),e=0|d[m>>2],d[m>>2]=0,e?I=38:C=g}return 38==(0|I)&&(y=0,P(0|d[D>>2],0|e),D=y,y=0,1&D?Ue(D=0|ae(0)):C=g),de(0|C),0},_n,Nn,ta,ta,ta,ta,ta,ta,ta],jo=[ia,function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4620|0]=1&n,d[(t=e+156|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,s=e+172|0,C=4+(0|d[s>>2])|0,l=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(l<<1,C),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;e:do{if(t){if((0|t)<0&&(y=0,P(178,0|M),x=y,y=0,1&x)||(T=6),6==(0|T)&&(y=0,i=0|N(67,0|t),x=y,y=0,!(1&x)))for(d[k>>2]=i,d[M>>2]=i,d[M+8>>2]=i+t;;)if(f[i|0]=0,i=1+(0|d[k>>2])|0,d[k>>2]=i,!(t=t+-1|0))break e;i=0|ae(),(t=0|d[M>>2])||de(0|i),(0|d[k>>2])!=(0|t)&&(d[k>>2]=t),Ba(t),de(0|i)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(l){if(l>>>0>1073741823&&(y=0,P(178,0|I),w=y,y=0,1&w)||(T=17),17==(0|T)&&(y=0,n=0|N(67,0|(r=l<<2)),w=y,y=0,!(1&w))){d[I>>2]=n,T=n+(l<<2)|0,d[I+8>>2]=T,zn(0|n,0,0|r),d[x>>2]=T,T=19;break}i=0|ae(),r=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-r|0)>>>2)<<2)),Ba(t))}else T=19}while(0);if(19==(0|T)){t=0|d[(c=e+8|0)>>2];e:do{if((0|t)>0){if(u=e+4596|0,m=(h=0|E(l,C))+1|0,g=e+4600|0,p=e+160|0,A=e+168|0,S=e+164|0,v=e+156|0,w=e+88|0,o=e+4592|0,!((0|l)>0)){for(a=0;;){if(i=(n=0|d[M>>2])+1|0,d[u>>2]=i,r=n+m|0,d[g>>2]=r,1&a?(d[u>>2]=r,d[g>>2]=i,i=1):i=m,(0|(l=0|d[p>>2]))<=(0|a)&&(0|a)<((0|d[A>>2])+l|0)){if(l=0|d[w>>2],y=0,j(0|d[8+(0|d[l>>2])>>2],0|l,n+(i+((0|d[v>>2])-h))|0,0|d[S>>2],0|C),l=y,y=0,1&l)break;t=0|d[c>>2]}if((0|(a=a+1|0))>=(0|t)){T=50;break e}}i=0|ae();break}a=0;t:for(;;){t=(i=0|d[M>>2])+1|0,d[u>>2]=t,i=i+m|0,d[g>>2]=i,1&a&&(d[u>>2]=i,d[g>>2]=t,t=i),n=0|d[I>>2],i=t,r=0;do{if(d[o>>2]=d[n+(r<<2)>>2],T=0|d[s>>2],f[i+T|0]=0|f[i+(T+-1)|0],f[(0|d[g>>2])-1|0]=0|f[d[u>>2]|0],y=0,L(83,0|e,0),T=y,y=0,1&T){T=38;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[o>>2],i=(0|d[u>>2])+C|0,d[u>>2]=i,t=0|d[g>>2],d[g>>2]=t+C,r=r+1|0}while((0|r)<(0|l));if((0|(T=0|d[p>>2]))<=(0|a)&&(0|a)<((0|d[A>>2])+T|0)&&(T=0|d[w>>2],y=0,j(0|d[8+(0|d[T>>2])>>2],0|T,t+(C+((0|d[v>>2])-h))|0,0|d[S>>2],0|C),T=y,y=0,1&T)){T=30;break}if((0|(a=a+1|0))>=(0|d[c>>2])){T=50;break e}}if(30==(0|T)){i=0|ae();break}if(38==(0|T)){i=0|ae();break}}else T=50}while(0);do{if(50==(0|T)){if(y=0,P(183,0|e),e=y,y=0,1&e){i=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|d[k>>2])!=(0|t)&&(d[k>>2]=t),Ba(t),void(b=D)):void(b=D)}}while(0);r=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-r|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|i),(0|d[k>>2])!=(0|t)&&(d[k>>2]=t),Ba(t),de(0|i)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4596|0]=1&n,d[(t=e+132|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,w=e+148|0,T=4+(0|d[w>>2])|0,C=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(C<<1,T),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;e:do{if(t){if(t>>>0>1431655765&&(y=0,P(178,0|M),x=y,y=0,1&x)||(a=6),6==(0|a)&&(y=0,i=0|N(67,3*t|0),x=y,y=0,!(1&x)))for(d[k>>2]=i,d[M>>2]=i,d[M+8>>2]=i+(3*t|0);;)if(f[i|0]=0,f[i+1|0]=0,f[i+2|0]=0,i=3+(0|d[k>>2])|0,d[k>>2]=i,!(t=t+-1|0))break e;r=0|ae(),(t=0|d[M>>2])||de(0|r),(0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(3*~(((i+-3-t|0)>>>0)/3)|0)),Ba(t),de(0|r)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(C){if(C>>>0>1073741823&&(y=0,P(178,0|I),v=y,y=0,1&v)||(a=17),17==(0|a)&&(y=0,n=0|N(67,0|(r=C<<2)),v=y,y=0,!(1&v))){d[I>>2]=n,a=n+(C<<2)|0,d[I+8>>2]=a,zn(0|n,0,0|r),d[x>>2]=a,a=19;break}r=0|ae(),i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}else a=19}while(0);if(19==(0|a)){a=e+8|0;e:do{if((0|d[a>>2])>0){o=e+4572|0,l=(s=0|E(C,T))+1|0,c=e+4576|0,u=(0|C)>0,h=e+136|0,m=e+144|0,g=e+140|0,p=e+132|0,A=e+88|0,S=e+4568|0,v=0;t:for(;;){if(i=(r=0|d[M>>2])+3|0,d[o>>2]=i,r=r+(3*l|0)|0,d[c>>2]=r,1&v?(d[o>>2]=r,d[c>>2]=i,t=i,i=r):t=r,u){n=0|d[I>>2],r=0;do{if(d[S>>2]=d[n+(r<<2)>>2],n=i+(3*(t=0|d[w>>2])|0)|0,i=i+(3*(t+-1|0)|0)|0,f[n|0]=0|f[i|0],f[n+1|0]=0|f[i+1|0],f[n+2|0]=0|f[i+2|0],i=0|d[o>>2],n=(0|d[c>>2])-3|0,f[n|0]=0|f[i|0],f[n+1|0]=0|f[i+1|0],f[n+2|0]=0|f[i+2|0],y=0,L(82,0|e,0),n=y,y=0,1&n){a=30;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[S>>2],i=(0|d[o>>2])+(3*T|0)|0,d[o>>2]=i,t=(0|d[c>>2])+(3*T|0)|0,d[c>>2]=t,r=r+1|0}while((0|r)<(0|C))}if((0|(n=0|d[h>>2]))<=(0|v)&&(0|v)<((0|d[m>>2])+n|0)&&(n=0|d[A>>2],y=0,j(0|d[8+(0|d[n>>2])>>2],0|n,t+(3*((0|d[p>>2])-s|0)|0)|0,0|d[g>>2],0|T),n=y,y=0,1&n)){a=31;break}if((0|(v=v+1|0))>=(0|d[a>>2])){a=43;break e}}if(30==(0|a)){r=0|ae();break}if(31==(0|a)){r=0|ae();break}}else a=43}while(0);do{if(43==(0|a)){if(y=0,P(183,0|e),e=y,y=0,1&e){r=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(3*~(((i+-3-t|0)>>>0)/3)|0)),Ba(t),void(b=D)):void(b=D)}}while(0);i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|r),i=0|d[k>>2],(0|i)!=(0|t)&&(d[k>>2]=i+(3*~(((i+-3-t|0)>>>0)/3)|0)),Ba(t),de(0|r)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4596|0]=1&n,d[(t=e+132|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,w=e+148|0,T=4+(0|d[w>>2])|0,C=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(C<<1,T),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;e:do{if(t){if((0|t)<0&&(y=0,P(178,0|M),x=y,y=0,1&x)||(a=6),6==(0|a)&&(y=0,i=0|N(67,0|t),x=y,y=0,!(1&x)))for(d[k>>2]=i,d[M>>2]=i,d[M+8>>2]=i+t;;)if(f[i|0]=0,i=1+(0|d[k>>2])|0,d[k>>2]=i,!(t=t+-1|0))break e;i=0|ae(),(t=0|d[M>>2])||de(0|i),(0|d[k>>2])!=(0|t)&&(d[k>>2]=t),Ba(t),de(0|i)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(C){if(C>>>0>1073741823&&(y=0,P(178,0|I),v=y,y=0,1&v)||(a=17),17==(0|a)&&(y=0,n=0|N(67,0|(r=C<<2)),v=y,y=0,!(1&v))){d[I>>2]=n,a=n+(C<<2)|0,d[I+8>>2]=a,zn(0|n,0,0|r),d[x>>2]=a,a=19;break}i=0|ae(),r=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-r|0)>>>2)<<2)),Ba(t))}else a=19}while(0);if(19==(0|a)){a=e+8|0;e:do{if((0|d[a>>2])>0){o=e+4572|0,l=(s=0|E(C,T))+1|0,c=e+4576|0,u=(0|C)>0,h=e+136|0,m=e+144|0,g=e+140|0,p=e+132|0,A=e+88|0,S=e+4568|0,v=0;t:for(;;){if(i=(r=0|d[M>>2])+1|0,d[o>>2]=i,r=r+l|0,d[c>>2]=r,1&v?(d[o>>2]=r,d[c>>2]=i,t=i,i=r):t=r,u){n=0|d[I>>2],r=0;do{if(d[S>>2]=d[n+(r<<2)>>2],n=0|d[w>>2],f[i+n|0]=0|f[i+(n+-1)|0],f[(0|d[c>>2])-1|0]=0|f[d[o>>2]|0],y=0,L(81,0|e,0),n=y,y=0,1&n){a=30;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[S>>2],i=(0|d[o>>2])+T|0,d[o>>2]=i,t=(0|d[c>>2])+T|0,d[c>>2]=t,r=r+1|0}while((0|r)<(0|C))}if((0|(n=0|d[h>>2]))<=(0|v)&&(0|v)<((0|d[m>>2])+n|0)&&(n=0|d[A>>2],y=0,j(0|d[8+(0|d[n>>2])>>2],0|n,t+((0|d[p>>2])-s)|0,0|d[g>>2],0|T),n=y,y=0,1&n)){a=31;break}if((0|(v=v+1|0))>=(0|d[a>>2])){a=43;break e}}if(30==(0|a)){i=0|ae();break}if(31==(0|a)){i=0|ae();break}}else a=43}while(0);do{if(43==(0|a)){if(y=0,P(183,0|e),e=y,y=0,1&e){i=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|d[k>>2])!=(0|t)&&(d[k>>2]=t),Ba(t),void(b=D)):void(b=D)}}while(0);r=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-r|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|i),(0|d[k>>2])!=(0|t)&&(d[k>>2]=t),Ba(t),de(0|i)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4596|0]=1&n,d[(t=e+132|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,w=e+148|0,T=4+(0|d[w>>2])|0,C=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(C<<1,T),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;do{if(t){if((0|t)<0&&(y=0,P(178,0|M),x=y,y=0,1&x)||(o=6),6==(0|o)&&(y=0,r=0|N(67,0|(i=t<<1)),x=y,y=0,!(1&x))){d[M>>2]=r,x=r+(t<<1)|0,d[M+8>>2]=x,zn(0|r,0,0|i),d[k>>2]=x;break}r=0|ae(),(t=0|d[M>>2])||de(0|r),(0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),de(0|r)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(C){if(C>>>0>1073741823&&(y=0,P(178,0|I),v=y,y=0,1&v)||(o=16),16==(0|o)&&(y=0,a=0|N(67,0|(n=C<<2)),v=y,y=0,!(1&v))){d[I>>2]=a,o=a+(C<<2)|0,d[I+8>>2]=o,zn(0|a,0,0|n),d[x>>2]=o,o=18;break}r=0|ae(),i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}else o=18}while(0);if(18==(0|o)){a=e+8|0;e:do{if((0|d[a>>2])>0){o=e+4572|0,l=(s=0|E(C,T))+1|0,c=e+4576|0,u=(0|C)>0,f=e+136|0,m=e+144|0,g=e+140|0,p=e+132|0,A=e+88|0,S=e+4568|0,v=0;t:for(;;){if(i=(r=0|d[M>>2])+2|0,d[o>>2]=i,r=r+(l<<1)|0,d[c>>2]=r,1&v?(d[o>>2]=r,d[c>>2]=i,t=i,i=r):t=r,u){n=0|d[I>>2],r=0;do{if(d[S>>2]=d[n+(r<<2)>>2],n=0|d[w>>2],h[i+(n<<1)>>1]=0|h[i+(n+-1<<1)>>1],h[t+-2>>1]=0|h[i>>1],y=0,L(80,0|e,0),n=y,y=0,1&n){o=29;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[S>>2],i=(0|d[o>>2])+(T<<1)|0,d[o>>2]=i,t=(0|d[c>>2])+(T<<1)|0,d[c>>2]=t,r=r+1|0}while((0|r)<(0|C))}if((0|(n=0|d[f>>2]))<=(0|v)&&(0|v)<((0|d[m>>2])+n|0)&&(n=0|d[A>>2],y=0,j(0|d[8+(0|d[n>>2])>>2],0|n,t+((0|d[p>>2])-s<<1)|0,0|d[g>>2],0|T),n=y,y=0,1&n)){o=30;break}if((0|(v=v+1|0))>=(0|d[a>>2])){o=42;break e}}if(29==(0|o)){r=0|ae();break}if(30==(0|o)){r=0|ae();break}}else o=42}while(0);do{if(42==(0|o)){if(y=0,P(183,0|e),e=y,y=0,1&e){r=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),void(b=D)):void(b=D)}}while(0);i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|r),i=0|d[k>>2],(0|i)!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),de(0|r)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4596|0]=1&n,d[(t=e+132|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,w=e+148|0,T=4+(0|d[w>>2])|0,C=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(C<<1,T),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;do{if(t){if((0|t)<0&&(y=0,P(178,0|M),x=y,y=0,1&x)||(o=6),6==(0|o)&&(y=0,r=0|N(67,0|(i=t<<1)),x=y,y=0,!(1&x))){d[M>>2]=r,x=r+(t<<1)|0,d[M+8>>2]=x,zn(0|r,0,0|i),d[k>>2]=x;break}r=0|ae(),(t=0|d[M>>2])||de(0|r),(0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),de(0|r)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(C){if(C>>>0>1073741823&&(y=0,P(178,0|I),v=y,y=0,1&v)||(o=16),16==(0|o)&&(y=0,a=0|N(67,0|(n=C<<2)),v=y,y=0,!(1&v))){d[I>>2]=a,o=a+(C<<2)|0,d[I+8>>2]=o,zn(0|a,0,0|n),d[x>>2]=o,o=18;break}r=0|ae(),i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}else o=18}while(0);if(18==(0|o)){a=e+8|0;e:do{if((0|d[a>>2])>0){o=e+4572|0,l=(s=0|E(C,T))+1|0,c=e+4576|0,u=(0|C)>0,f=e+136|0,m=e+144|0,g=e+140|0,p=e+132|0,A=e+88|0,S=e+4568|0,v=0;t:for(;;){if(i=(r=0|d[M>>2])+2|0,d[o>>2]=i,r=r+(l<<1)|0,d[c>>2]=r,1&v?(d[o>>2]=r,d[c>>2]=i,t=i,i=r):t=r,u){n=0|d[I>>2],r=0;do{if(d[S>>2]=d[n+(r<<2)>>2],n=0|d[w>>2],h[i+(n<<1)>>1]=0|h[i+(n+-1<<1)>>1],h[t+-2>>1]=0|h[i>>1],y=0,L(79,0|e,0),n=y,y=0,1&n){o=29;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[S>>2],i=(0|d[o>>2])+(T<<1)|0,d[o>>2]=i,t=(0|d[c>>2])+(T<<1)|0,d[c>>2]=t,r=r+1|0}while((0|r)<(0|C))}if((0|(n=0|d[f>>2]))<=(0|v)&&(0|v)<((0|d[m>>2])+n|0)&&(n=0|d[A>>2],y=0,j(0|d[8+(0|d[n>>2])>>2],0|n,t+((0|d[p>>2])-s<<1)|0,0|d[g>>2],0|T),n=y,y=0,1&n)){o=30;break}if((0|(v=v+1|0))>=(0|d[a>>2])){o=42;break e}}if(29==(0|o)){r=0|ae();break}if(30==(0|o)){r=0|ae();break}}else o=42}while(0);do{if(42==(0|o)){if(y=0,P(183,0|e),e=y,y=0,1&e){r=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),void(b=D)):void(b=D)}}while(0);i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|r),i=0|d[k>>2],(0|i)!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),de(0|r)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4620|0]=1&n,d[(t=e+156|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,w=e+172|0,T=4+(0|d[w>>2])|0,C=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(C<<1,T),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;e:do{if(t){if(t>>>0>1431655765&&(y=0,P(178,0|M),x=y,y=0,1&x)||(a=6),6==(0|a)&&(y=0,i=0|N(67,3*t|0),x=y,y=0,!(1&x)))for(d[k>>2]=i,d[M>>2]=i,d[M+8>>2]=i+(3*t|0);;)if(f[i|0]=0,f[i+1|0]=0,f[i+2|0]=0,i=3+(0|d[k>>2])|0,d[k>>2]=i,!(t=t+-1|0))break e;r=0|ae(),(t=0|d[M>>2])||de(0|r),(0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(3*~(((i+-3-t|0)>>>0)/3)|0)),Ba(t),de(0|r)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(C){if(C>>>0>1073741823&&(y=0,P(178,0|I),v=y,y=0,1&v)||(a=17),17==(0|a)&&(y=0,n=0|N(67,0|(r=C<<2)),v=y,y=0,!(1&v))){d[I>>2]=n,a=n+(C<<2)|0,d[I+8>>2]=a,zn(0|n,0,0|r),d[x>>2]=a,a=19;break}r=0|ae(),i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}else a=19}while(0);if(19==(0|a)){a=e+8|0;e:do{if((0|d[a>>2])>0){o=e+4596|0,l=(s=0|E(C,T))+1|0,c=e+4600|0,u=(0|C)>0,h=e+160|0,m=e+168|0,g=e+164|0,p=e+156|0,A=e+88|0,S=e+4592|0,v=0;t:for(;;){if(i=(r=0|d[M>>2])+3|0,d[o>>2]=i,r=r+(3*l|0)|0,d[c>>2]=r,1&v?(d[o>>2]=r,d[c>>2]=i,t=i,i=r):t=r,u){n=0|d[I>>2],r=0;do{if(d[S>>2]=d[n+(r<<2)>>2],n=i+(3*(t=0|d[w>>2])|0)|0,i=i+(3*(t+-1|0)|0)|0,f[n|0]=0|f[i|0],f[n+1|0]=0|f[i+1|0],f[n+2|0]=0|f[i+2|0],i=0|d[o>>2],n=(0|d[c>>2])-3|0,f[n|0]=0|f[i|0],f[n+1|0]=0|f[i+1|0],f[n+2|0]=0|f[i+2|0],y=0,L(78,0|e,0),n=y,y=0,1&n){a=30;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[S>>2],i=(0|d[o>>2])+(3*T|0)|0,d[o>>2]=i,t=(0|d[c>>2])+(3*T|0)|0,d[c>>2]=t,r=r+1|0}while((0|r)<(0|C))}if((0|(n=0|d[h>>2]))<=(0|v)&&(0|v)<((0|d[m>>2])+n|0)&&(n=0|d[A>>2],y=0,j(0|d[8+(0|d[n>>2])>>2],0|n,t+(3*((0|d[p>>2])-s|0)|0)|0,0|d[g>>2],0|T),n=y,y=0,1&n)){a=31;break}if((0|(v=v+1|0))>=(0|d[a>>2])){a=43;break e}}if(30==(0|a)){r=0|ae();break}if(31==(0|a)){r=0|ae();break}}else a=43}while(0);do{if(43==(0|a)){if(y=0,P(183,0|e),e=y,y=0,1&e){r=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(3*~(((i+-3-t|0)>>>0)/3)|0)),Ba(t),void(b=D)):void(b=D)}}while(0);i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|r),i=0|d[k>>2],(0|i)!=(0|t)&&(d[k>>2]=i+(3*~(((i+-3-t|0)>>>0)/3)|0)),Ba(t),de(0|r)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4620|0]=1&n,d[(t=e+156|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,w=e+172|0,T=4+(0|d[w>>2])|0,C=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(C<<1,T),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;do{if(t){if(t>>>0>715827882&&(y=0,P(178,0|M),x=y,y=0,1&x)||(o=6),6==(0|o)&&(y=0,i=0|N(67,6*t|0),x=y,y=0,!(1&x))){for(d[k>>2]=i,d[M>>2]=i,r=i+(6*t|0)|0,d[M+8>>2]=r;h[i>>1]=0,h[i+2>>1]=0,h[i+4>>1]=0,t=t+-1|0;)i=i+6|0;d[k>>2]=r;break}r=0|ae(),(t=0|d[M>>2])||de(0|r),(0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(6*~(((i+-6-t|0)>>>0)/6)|0)),Ba(t),de(0|r)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(C){if(C>>>0>1073741823&&(y=0,P(178,0|I),v=y,y=0,1&v)||(o=18),18==(0|o)&&(y=0,a=0|N(67,0|(n=C<<2)),v=y,y=0,!(1&v))){d[I>>2]=a,o=a+(C<<2)|0,d[I+8>>2]=o,zn(0|a,0,0|n),d[x>>2]=o,o=20;break}r=0|ae(),i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}else o=20}while(0);if(20==(0|o)){a=e+8|0;e:do{if((0|d[a>>2])>0){o=e+4596|0,l=(s=0|E(C,T))+1|0,c=e+4600|0,u=(0|C)>0,f=e+160|0,m=e+168|0,g=e+164|0,p=e+156|0,A=e+88|0,S=e+4592|0,v=0;t:for(;;){if(i=(r=0|d[M>>2])+6|0,d[o>>2]=i,r=r+(6*l|0)|0,d[c>>2]=r,1&v?(d[o>>2]=r,d[c>>2]=i,t=i,i=r):t=r,u){n=0|d[I>>2],r=0;do{if(d[S>>2]=d[n+(r<<2)>>2],n=i+(6*(t=0|d[w>>2])|0)|0,i=i+(6*(t+-1|0)|0)|0,h[n>>1]=0|h[i>>1],h[n+2>>1]=0|h[i+2>>1],h[n+4>>1]=0|h[i+4>>1],n=(0|d[c>>2])-6|0,i=0|d[o>>2],h[n>>1]=0|h[i>>1],h[n+2>>1]=0|h[i+2>>1],h[n+4>>1]=0|h[i+4>>1],y=0,L(77,0|e,0),n=y,y=0,1&n){o=31;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[S>>2],i=(0|d[o>>2])+(6*T|0)|0,d[o>>2]=i,t=(0|d[c>>2])+(6*T|0)|0,d[c>>2]=t,r=r+1|0}while((0|r)<(0|C))}if((0|(n=0|d[f>>2]))<=(0|v)&&(0|v)<((0|d[m>>2])+n|0)&&(n=0|d[A>>2],y=0,j(0|d[8+(0|d[n>>2])>>2],0|n,t+(6*((0|d[p>>2])-s|0)|0)|0,0|d[g>>2],0|T),n=y,y=0,1&n)){o=32;break}if((0|(v=v+1|0))>=(0|d[a>>2])){o=44;break e}}if(31==(0|o)){r=0|ae();break}if(32==(0|o)){r=0|ae();break}}else o=44}while(0);do{if(44==(0|o)){if(y=0,P(183,0|e),e=y,y=0,1&e){r=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(6*~(((i+-6-t|0)>>>0)/6)|0)),Ba(t),void(b=D)):void(b=D)}}while(0);i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|r),i=0|d[k>>2],(0|i)!=(0|t)&&(d[k>>2]=i+(6*~(((i+-6-t|0)>>>0)/6)|0)),Ba(t),de(0|r)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){i|=0,r|=0,n|=0;var a=0,o=0;for(o=(e|=0)+88|0,a=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[o>>2],d[o>>2]=a,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),a=0|d[(o=r+4|0)>>2],f[e+4620|0]=1&n,d[(t=e+156|0)>>2]=d[i>>2],d[t+4>>2]=d[i+4>>2],d[t+8>>2]=d[i+8>>2],d[t+12>>2]=d[i+12>>2],at(e,r),function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,f=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,M=0,k=0;D=b,b=b+32|0,M=D+12|0,I=D,w=e+172|0,T=4+(0|d[w>>2])|0,C=1==(0|d[e+28>>2])?0|d[e+20>>2]:1,t=0|E(C<<1,T),d[M>>2]=0,d[(k=M+4|0)>>2]=0,d[M+8>>2]=0;do{if(t){if((0|t)<0&&(y=0,P(178,0|M),x=y,y=0,1&x)||(o=6),6==(0|o)&&(y=0,r=0|N(67,0|(i=t<<1)),x=y,y=0,!(1&x))){d[M>>2]=r,x=r+(t<<1)|0,d[M+8>>2]=x,zn(0|r,0,0|i),d[k>>2]=x;break}r=0|ae(),(t=0|d[M>>2])||de(0|r),(0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),de(0|r)}}while(0);d[I>>2]=0,d[(x=I+4|0)>>2]=0,d[I+8>>2]=0;do{if(C){if(C>>>0>1073741823&&(y=0,P(178,0|I),v=y,y=0,1&v)||(o=16),16==(0|o)&&(y=0,a=0|N(67,0|(n=C<<2)),v=y,y=0,!(1&v))){d[I>>2]=a,o=a+(C<<2)|0,d[I+8>>2]=o,zn(0|a,0,0|n),d[x>>2]=o,o=18;break}r=0|ae(),i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}else o=18}while(0);if(18==(0|o)){a=e+8|0;e:do{if((0|d[a>>2])>0){o=e+4596|0,l=(s=0|E(C,T))+1|0,c=e+4600|0,u=(0|C)>0,f=e+160|0,m=e+168|0,g=e+164|0,p=e+156|0,A=e+88|0,S=e+4592|0,v=0;t:for(;;){if(i=(r=0|d[M>>2])+2|0,d[o>>2]=i,r=r+(l<<1)|0,d[c>>2]=r,1&v?(d[o>>2]=r,d[c>>2]=i,t=i,i=r):t=r,u){n=0|d[I>>2],r=0;do{if(d[S>>2]=d[n+(r<<2)>>2],n=0|d[w>>2],h[i+(n<<1)>>1]=0|h[i+(n+-1<<1)>>1],h[t+-2>>1]=0|h[i>>1],y=0,L(76,0|e,0),n=y,y=0,1&n){o=29;break t}n=0|d[I>>2],d[n+(r<<2)>>2]=d[S>>2],i=(0|d[o>>2])+(T<<1)|0,d[o>>2]=i,t=(0|d[c>>2])+(T<<1)|0,d[c>>2]=t,r=r+1|0}while((0|r)<(0|C))}if((0|(n=0|d[f>>2]))<=(0|v)&&(0|v)<((0|d[m>>2])+n|0)&&(n=0|d[A>>2],y=0,j(0|d[8+(0|d[n>>2])>>2],0|n,t+((0|d[p>>2])-s<<1)|0,0|d[g>>2],0|T),n=y,y=0,1&n)){o=30;break}if((0|(v=v+1|0))>=(0|d[a>>2])){o=42;break e}}if(29==(0|o)){r=0|ae();break}if(30==(0|o)){r=0|ae();break}}else o=42}while(0);do{if(42==(0|o)){if(y=0,P(183,0|e),e=y,y=0,1&e){r=0|ae();break}return i=t=0|d[I>>2],t&&((0|(r=0|d[x>>2]))!=(0|t)&&(d[x>>2]=r+(~((r+-4-i|0)>>>2)<<2)),Ba(t)),(t=0|d[M>>2])?((0|(i=0|d[k>>2]))!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),void(b=D)):void(b=D)}}while(0);i=t=0|d[I>>2],t&&((0|(n=0|d[x>>2]))!=(0|t)&&(d[x>>2]=n+(~((n+-4-i|0)>>>2)<<2)),Ba(t))}t=0|d[M>>2],t||de(0|r),i=0|d[k>>2],(0|i)!=(0|t)&&(d[k>>2]=i+(~((i+-2-t|0)>>>1)<<1)),Ba(t),de(0|r)}(e),t=0|d[e+116>>2],e=0|d[e+112>>2];!((0|e)<(0|(i=-1==(0|f[(n=t+-1|0)|0])?7:8)));)t=n,e=e-i|0;t=t-a|0,(n=0|d[o>>2])&&(d[o>>2]=n+t,d[(r=r+8|0)>>2]=(0|d[r>>2])-t)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0;do{if((0|e)==(0|d[t+8>>2]))(0|d[t+4>>2])==(0|i)&&1!=(0|d[(o=t+28|0)>>2])&&(d[o>>2]=r);else if((0|e)==(0|d[t>>2])){if((0|d[t+16>>2])!=(0|i)&&(0|d[(a=t+20|0)>>2])!=(0|i)){d[t+32>>2]=r,d[a>>2]=i,d[(n=t+40|0)>>2]=1+(0|d[n>>2]),1==(0|d[t+36>>2])&&2==(0|d[t+24>>2])&&(f[t+54|0]=1),d[t+44>>2]=4;break}1==(0|r)&&(d[t+32>>2]=1)}}while(0)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0;e:do{if((0|e)==(0|d[t+8>>2]))(0|d[t+4>>2])==(0|i)&&(a=t+28|0,1!=(0|d[a>>2]))&&(d[a>>2]=r);else{if((0|e)!=(0|d[t>>2])){s=0|d[e+8>>2],jo[15&d[24+(0|d[s>>2])>>2]](s,t,i,r,n);break}if((0|d[t+16>>2])!=(0|i)&&(0|d[(o=t+20|0)>>2])!=(0|i)){if(d[t+32>>2]=r,4==(0|d[(r=t+44|0)>>2]))break;f[(a=t+52|0)|0]=0,f[(l=t+53|0)|0]=0,e=0|d[e+8>>2],as[15&d[20+(0|d[e>>2])>>2]](e,t,i,i,1,n),0|f[l|0]?0|f[a|0]||(a=1,s=13):(a=0,s=13);do{if(13==(0|s)){if(d[o>>2]=i,d[(l=t+40|0)>>2]=1+(0|d[l>>2]),1==(0|d[t+36>>2])&&2==(0|d[t+24>>2])){if(f[t+54|0]=1,a)break}else s=16;if(16==(0|s)&&a)break;d[r>>2]=4;break e}}while(0);d[r>>2]=3;break}1==(0|r)&&(d[t+32>>2]=1)}}while(0)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;e:do{if((0|e)==(0|d[t+8>>2]))(0|d[t+4>>2])==(0|i)&&(a=t+28|0,1!=(0|d[a>>2]))&&(d[a>>2]=r);else{if((0|e)!=(0|d[t>>2])){if(s=e+16+((p=0|d[e+12>>2])<<3)|0,Xa(e+16|0,t,i,r,n),a=e+24|0,(0|p)<=1)break;if(!(2&(o=0|d[e+8>>2]))&&1!=(0|d[(l=t+36|0)>>2])){if(!(1&o))for(o=t+54|0;;)if(0|f[o|0]||1==(0|d[l>>2])||(Xa(a,t,i,r,n),(a=a+8|0)>>>0>=s>>>0))break e;for(o=t+24|0,e=t+54|0;;)if(0|f[e|0]||1==(0|d[l>>2])&&1==(0|d[o>>2])||(Xa(a,t,i,r,n),(a=a+8|0)>>>0>=s>>>0))break e}for(o=t+54|0;;)if(0|f[o|0]||(Xa(a,t,i,r,n),(a=a+8|0)>>>0>=s>>>0))break e}if((0|d[t+16>>2])!=(0|i)&&(0|d[(g=t+20|0)>>2])!=(0|i)){if(d[t+32>>2]=r,4==(0|d[(u=t+44|0)>>2]))break;s=e+16+((o=0|d[e+12>>2])<<3)|0,l=t+52|0,r=t+53|0,h=t+54|0,c=e+8|0,m=t+24|0;t:do{if((0|o)>0)for(o=0,a=0,e=e+16|0;;){if(f[l|0]=0,f[r|0]=0,Wa(e,t,i,i,1,n),0|f[h|0]){p=20;break t}do{if(0|f[r|0]){if(!(0|f[l|0])){if(1&d[c>>2]){a=1;break}a=1,p=20;break t}if(1==(0|d[m>>2]))break t;if(!(2&d[c>>2]))break t;o=1,a=1}}while(0);if((e=e+8|0)>>>0>=s>>>0){p=20;break}}else o=0,a=0,p=20}while(0);do{if(20==(0|p)){if(o||(d[g>>2]=i,d[(i=t+40|0)>>2]=1+(0|d[i>>2]),1!=(0|d[t+36>>2]))||2!=(0|d[m>>2]))p=24;else if(f[h|0]=1,a)break;if(24==(0|p)&&a)break;d[u>>2]=4;break e}}while(0);d[u>>2]=3;break}1==(0|r)&&(d[t+32>>2]=1)}}while(0)},ia,ia,ia,ia],Zo=[ra,function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a=+a;var o,s,l,c,u,h,m,g,p,S,v,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0;m=b,b=b+384|0,o=m+8|0,w=m,C=m+284|0,T=m+184|0,g=m+68|0,h=m+80|0,l=m+77|0,F=m+76|0,p=m+56|0,v=m+44|0,S=m+32|0,D=m+28|0,R=m+84|0,u=m+24|0,c=m+20|0,s=m+16|0,d[(I=m+72|0)>>2]=C,A[o>>3]=a,C=0|Fo(C,100,59018,o);do{if(C>>>0>99)if(y=0,e=0|H(3),P=y,y=0,1&P||(y=0,A[w>>3]=a,M=0|Y(17,0|I,0|e,59018,0|w),P=y,y=0,1&P))e=0,w=0,P=7;else{if(!(e=0|d[I>>2])){if(y=0,X(6),P=y,y=0,1&P){e=0,w=0,P=7;break}e=0|d[I>>2]}w=T=0|Dr(M),T?(k=T,P=10):(y=0,X(6),P=y,y=0,1&P?P=7:(k=0,P=10))}else w=0,e=0,k=T,M=C,P=10}while(0);if(10==(0|P))if(y=0,T=0|N(68,0|r),E=y,y=0,1&E)P=7;else{if(d[g>>2]=T,y=0,E=0|G(37,0|g,44220),x=y,y=0,1&x||(x=0|d[I>>2],y=0,Y(0|d[32+(0|d[E>>2])>>2],0|E,0|x,x+M|0,0|k),x=y,y=0,1&x))C=0|ae();else{if(x=M?45==(0|f[d[I>>2]|0]):0,d[p>>2]=0,d[p+4>>2]=0,d[p+8>>2]=0,d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,d[S>>2]=0,d[S+4>>2]=0,d[S+8>>2]=0,y=0,q(3,0|i,0|x,0|g,0|h,0|l,0|F,0|p,0|v,0|S,0|D),i=y,y=0,1&i)C=0|ae();else{if((0|M)>(0|(D=0|d[D>>2]))?(i=0|f[S|0],C=0|f[v|0],C=(M-D<<1|1)+D+(1&i?0|d[S+4>>2]:(255&i)>>>1)+(1&C?0|d[v+4>>2]:(255&C)>>>1)|0):(i=0|f[S|0],C=0|f[v|0],C=D+2+(1&i?0|d[S+4>>2]:(255&i)>>>1)+(1&C?0|d[v+4>>2]:(255&C)>>>1)|0),C>>>0>100?(I=C=0|Dr(C),C?P=26:(y=0,X(6),R=y,y=0,1&R||(C=0,P=26))):(I=0,C=R,P=26),26==(0|P)&&(y=0,B(1,0|C,0|u,0|c,0|d[r+4>>2],0|k,k+M|0,0|E,0|x,0|h,0|f[l|0],0|f[F|0],0|p,0|v,0|S,0|D),F=y,y=0,!(1&F||(d[s>>2]=d[t>>2],t=0|d[u>>2],L=0|d[c>>2],y=0,d[o>>2]=d[s>>2],L=0|_(39,0|o,0|C,0|t,0|L,0|r,0|n),t=y,y=0,1&t))))return I&&(xr(I),T=0|d[g>>2]),qr(S),qr(v),qr(p),Nr(T),w&&xr(w),e&&xr(e),b=m,0|L;C=0|ae(),I&&(xr(I),T=0|d[g>>2])}qr(S),qr(v),qr(p)}Nr(T)}return 7==(0|P)&&(C=0|ae()),w&&xr(w),e&&xr(e),de(0|C),0},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a=+a;var o,s,l,c,u,h,m,g,p,S,v,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0;m=b,b=b+992|0,o=m+8|0,w=m,C=m+888|0,T=m+480|0,g=m+76|0,h=m+884|0,l=m+72|0,F=m+68|0,p=m+56|0,v=m+44|0,S=m+32|0,D=m+28|0,R=m+80|0,u=m+24|0,c=m+20|0,s=m+16|0,d[(I=m+880|0)>>2]=C,A[o>>3]=a,C=0|Fo(C,100,59018,o);do{if(C>>>0>99)if(y=0,e=0|H(3),P=y,y=0,1&P||(y=0,A[w>>3]=a,M=0|Y(17,0|I,0|e,59018,0|w),P=y,y=0,1&P))e=0,w=0,P=7;else{if(!(e=0|d[I>>2])){if(y=0,X(6),P=y,y=0,1&P){e=0,w=0,P=7;break}e=0|d[I>>2]}w=T=0|Dr(M<<2),T?(k=T,P=10):(y=0,X(6),P=y,y=0,1&P?P=7:(k=0,P=10))}else w=0,e=0,k=T,M=C,P=10}while(0);if(10==(0|P))if(y=0,T=0|N(68,0|r),E=y,y=0,1&E)P=7;else{if(d[g>>2]=T,y=0,E=0|G(37,0|g,44212),x=y,y=0,1&x||(x=0|d[I>>2],y=0,Y(0|d[48+(0|d[E>>2])>>2],0|E,0|x,x+M|0,0|k),x=y,y=0,1&x))C=0|ae();else{if(x=M?45==(0|f[d[I>>2]|0]):0,d[p>>2]=0,d[p+4>>2]=0,d[p+8>>2]=0,d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,d[S>>2]=0,d[S+4>>2]=0,d[S+8>>2]=0,y=0,q(4,0|i,0|x,0|g,0|h,0|l,0|F,0|p,0|v,0|S,0|D),i=y,y=0,1&i)C=0|ae();else{if((0|M)>(0|(D=0|d[D>>2]))?(i=0|f[S|0],C=0|f[v|0],C=(M-D<<1|1)+D+(1&i?0|d[S+4>>2]:(255&i)>>>1)+(1&C?0|d[v+4>>2]:(255&C)>>>1)|0):(i=0|f[S|0],C=0|f[v|0],C=D+2+(1&i?0|d[S+4>>2]:(255&i)>>>1)+(1&C?0|d[v+4>>2]:(255&C)>>>1)|0),C>>>0>100?(I=C=0|Dr(C<<2),C?P=26:(y=0,X(6),R=y,y=0,1&R||(C=0,P=26))):(I=0,C=R,P=26),26==(0|P)&&(y=0,B(2,0|C,0|u,0|c,0|d[r+4>>2],0|k,k+(M<<2)|0,0|E,0|x,0|h,0|d[l>>2],0|d[F>>2],0|p,0|v,0|S,0|D),F=y,y=0,!(1&F||(d[s>>2]=d[t>>2],t=0|d[u>>2],L=0|d[c>>2],y=0,d[o>>2]=d[s>>2],L=0|_(40,0|o,0|C,0|t,0|L,0|r,0|n),t=y,y=0,1&t))))return I&&(xr(I),T=0|d[g>>2]),Zr(S),Zr(v),qr(p),Nr(T),w&&xr(w),e&&xr(e),b=m,0|L;C=0|ae(),I&&(xr(I),T=0|d[g>>2])}Zr(S),Zr(v),qr(p)}Nr(T)}return 7==(0|P)&&(C=0|ae()),w&&xr(w),e&&xr(e),de(0|C),0},ra],Jo=[na,function(e){var t=0,i=0;d[(e|=0)>>2]=35660,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35660,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35688,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35688,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35716,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35716,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35744,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35744,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35772,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35772,(t=0|d[e+4584>>2])&&((0|d[(i=e+4588|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35800,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35800,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35828,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35828,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35856,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35856,(t=0|d[e+4608>>2])&&((0|d[(i=e+4612|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35884,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35884,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35912,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35912,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35940,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35940,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35968,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35968,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=35996,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=35996,(t=0|d[e+4592>>2])&&((0|d[(i=e+4596|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36024,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=36024,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36052,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=36052,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36080,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=36080,(t=0|d[e+4616>>2])&&((0|d[(i=e+4620|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),d[e>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){0},function(e){Ba(e|=0)},function(e){Ba(e|=0)},function(e){en((e|=0)+4|0)},dn,function(e){en((e|=0)+(4+(0|d[(0|d[e>>2])-12>>2]))|0)},function(e){dn((e|=0)+(0|d[(0|d[e>>2])-12>>2])|0)},function(e){var t,i;d[(e|=0)>>2]=36200,d[(t=e+56|0)>>2]=36220,d[(i=e+4|0)>>2]=36236,qr(e+36|0),an(i),tn(t)},function(e){var t,i;d[(e|=0)>>2]=36200,d[(t=e+56|0)>>2]=36220,d[(i=e+4|0)>>2]=36236,qr(e+36|0),an(i),tn(t),Ba(e)},function(e){var t,i,r;r=0|d[(0|d[(e|=0)>>2])-12>>2],d[e+r>>2]=36200,d[(t=e+(r+56)|0)>>2]=36220,d[(i=e+(r+4)|0)>>2]=36236,qr(e+(r+36)|0),an(i),tn(t)},function(e){var t,i,r,n;n=0|d[(0|d[(e|=0)>>2])-12>>2],d[(t=e+n|0)>>2]=36200,d[(i=e+(n+56)|0)>>2]=36220,d[(r=e+(n+4)|0)>>2]=36236,qr(e+(n+36)|0),an(r),tn(i),Ba(t)},function(e){d[(e|=0)>>2]=36236,qr(e+32|0),an(e)},function(e){d[(e|=0)>>2]=36236,qr(e+32|0),an(e),Ba(e)},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36316,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])&&((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t))},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36316,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])?((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t),Ba(e)):Ba(e)},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36340,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])&&((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t))},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36340,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])?((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t),Ba(e)):Ba(e)},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36364,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])&&((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t))},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36364,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])?((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t),Ba(e)):Ba(e)},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36388,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])&&((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t))},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36388,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])?((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t),Ba(e)):Ba(e)},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36412,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])&&((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t))},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36412,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])?((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t),Ba(e)):Ba(e)},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36436,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])&&((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t))},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36436,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])?((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t),Ba(e)):Ba(e)},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36460,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])&&((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t))},function(e){var t,i=0,r=0;d[(e|=0)>>2]=36460,(i=0|d[e+20>>2])&&((0|d[(r=e+24|0)>>2])!=(0|i)&&(d[r>>2]=i),Ba(i)),(t=0|d[e+8>>2])?((0|(r=0|d[(i=e+12|0)>>2]))!=(0|t)&&(d[i>>2]=r+(~((r+-2-t|0)>>>1)<<1)),Ba(t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(e=e+4|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=36612,(t=0|d[e+120>>2])&&((0|d[(i=e+124|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+92|0)>>2],d[i>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),t=0|d[(i=e+4|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36640,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(i=0|d[e+8>>2])&&((0|d[(t=e+12|0)>>2])!=(0|i)&&(d[t>>2]=i),Ba(i))},function(e){var t=0,i=0;d[(e|=0)>>2]=36640,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(t=0|d[e+8>>2])?((0|d[(i=e+12|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36664,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(i=0|d[e+8>>2])&&((0|d[(t=e+12|0)>>2])!=(0|i)&&(d[t>>2]=i),Ba(i))},function(e){var t=0,i=0;d[(e|=0)>>2]=36664,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(t=0|d[e+8>>2])?((0|d[(i=e+12|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36688,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(i=0|d[e+8>>2])&&((0|d[(t=e+12|0)>>2])!=(0|i)&&(d[t>>2]=i),Ba(i))},function(e){var t=0,i=0;d[(e|=0)>>2]=36688,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(t=0|d[e+8>>2])?((0|d[(i=e+12|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36712,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(i=0|d[e+8>>2])&&((0|d[(t=e+12|0)>>2])!=(0|i)&&(d[t>>2]=i),Ba(i))},function(e){var t=0,i=0;d[(e|=0)>>2]=36712,(t=0|d[e+20>>2])&&((0|d[(i=e+24|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),(t=0|d[e+8>>2])?((0|d[(i=e+12|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t),Ba(e)):Ba(e)},function(e){var t=0,i=0;d[(e|=0)>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(e=e+88|0)>>2],d[e>>2]=0,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t)},function(e){var t=0,i=0;d[(e|=0)>>2]=36736,(t=0|d[e+92>>2])&&((0|d[(i=e+96|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t)),t=0|d[(i=e+88|0)>>2],d[i>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),Ba(e)):Ba(e)},function(e){0},function(e){Ba(e|=0)},function(e){var t;d[(e|=0)>>2]=36800,(t=0|d[e+8>>2])&&((0|d[(e=e+12|0)>>2])!=(0|t)&&(d[e>>2]=t),Ba(t))},function(e){var t,i;d[(e|=0)>>2]=36800,(t=0|d[e+8>>2])?((0|d[(i=e+12|0)>>2])!=(0|t)&&(d[i>>2]=t),Ba(t),Ba(e)):Ba(e)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},Ga,function(e){Ga(e|=0),Ba(e)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){0},function(e){Ba(e|=0)},function(e){Ba(e|=0)},sn,function(e){sn(e|=0),Ba(e)},function(e){sn(e|=0),Ba(e)},an,function(e){an(e|=0),Ba(e)},function(e){an(e|=0),Ba(e)},Ur,function(e){Ga(e|=0),Ba(e)},function(e){d[(e|=0)>>2]=42760,mr(e+4|0),Ba(e)},function(e){d[(e|=0)>>2]=42824,mr(e+4|0),Ba(e)},function(e){en((e|=0)+8|0)},cn,function(e){en((e|=0)+(8+(0|d[(0|d[e>>2])-12>>2]))|0)},function(e){cn((e|=0)+(0|d[(0|d[e>>2])-12>>2])|0)},function(e){en((e|=0)+8|0)},fn,function(e){en((e|=0)+(8+(0|d[(0|d[e>>2])-12>>2]))|0)},function(e){fn((e|=0)+(0|d[(0|d[e>>2])-12>>2])|0)},function(e){en((e|=0)+4|0)},gn,function(e){en((e|=0)+(4+(0|d[(0|d[e>>2])-12>>2]))|0)},function(e){gn((e|=0)+(0|d[(0|d[e>>2])-12>>2])|0)},function(e){Ur(e|=0)},function(e){Ur(e|=0),Ba(e)},en,function(e){en(e|=0),Ba(e)},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){(e|=0)&&Jo[255&d[4+(0|d[e>>2])>>2]](e)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){ar((e|=0)+8|0)},function(e){ar((e|=0)+8|0),Ba(e)},function(e){ar((e|=0)+8|0)},function(e){ar((e|=0)+8|0),Ba(e)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},function(e){0},function(e){Ba(e|=0)},ur,function(e){ur(e|=0),Ba(e)},vr,function(e){vr(e|=0),Ba(e)},Ln,function(e){Ln(e|=0),Ba(e)},Rn,function(e){Rn(e|=0),Ba(e)},Fn,function(e){Fn(e|=0),Ba(e)},function(e){0},function(e){Ba(e|=0)},function(e){Ba(e|=0)},function(e){Ba(e|=0)},function(e){Ba(e|=0)},function(e){Ba(e|=0)},function(e){Ba(e|=0)},function(e){Ba(e|=0)},function(e){f[(e|=0)|0]=0,d[(e=e+4|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[e+16>>2]=0,d[e+20>>2]=0,d[e+24>>2]=0,d[e+28>>2]=0},Ma,Na,function(e){var t;(t=0|d[(e|=0)>>2])&&((0|d[(e=e+4|0)>>2])!=(0|t)&&(d[e>>2]=t),Ba(t))},on,function(e){var t;d[(t=(e|=0)+16|0)>>2]=1|d[t>>2],1&d[e+20>>2]&&xe()},function(e){var t,i,r,n,a,o,s=0,l=0,c=0,u=0;(0|d[(t=(e|=0)+104|0)>>2])>>>0<4&<(e),r=e+112|0,n=e+96|0,a=e+108|0,o=e+116|0,s=0|d[(i=e+100|0)>>2],c=0;do{if(l=0|f[r|0],(0|s)>31)break;s=0|d[n>>2],l<<24>>24?(f[d[a>>2]|0]=s>>>25,d[n>>2]=d[n>>2]<<7,s=7+(0|d[i>>2])|0):(f[d[a>>2]|0]=s>>>24,d[n>>2]=d[n>>2]<<8,s=8+(0|d[i>>2])|0),d[i>>2]=s,u=0|d[a>>2],l=-1==(0|f[u|0])&1,f[r|0]=l,d[a>>2]=u+1,d[t>>2]=(0|d[t>>2])-1,d[o>>2]=1+(0|d[o>>2]),c=c+1|0}while((0|c)<4);ct(e,0,l<<24>>24?(s+-1|0)%8|0:(0|s)%8|0),(0|d[t>>2])>>>0<4&<(e),s=0|d[i>>2],l=0;do{if((0|s)>31)break;s=0|d[n>>2],0|f[r|0]?(f[d[a>>2]|0]=s>>>25,d[n>>2]=d[n>>2]<<7,s=7+(0|d[i>>2])|0):(f[d[a>>2]|0]=s>>>24,d[n>>2]=d[n>>2]<<8,s=8+(0|d[i>>2])|0),d[i>>2]=s,u=0|d[a>>2],f[r|0]=-1==(0|f[u|0])&1,d[a>>2]=u+1,d[t>>2]=(0|d[t>>2])-1,d[o>>2]=1+(0|d[o>>2]),l=l+1|0}while((0|l)<4);0|d[e+132>>2]&<(e)},function(e){var t=0,i=0,r=0,n=0;i=0|d[(r=(e|=0)+116|0)>>2],-1!=(0|f[i|0])?((0|(t=0|d[(n=e+112|0)>>2]))<1&&(mt(e),t=0|d[n>>2],i=0|d[r>>2]),r=0|d[(e=e+108|0)>>2],d[n>>2]=t+-1,t=r<<1,d[e>>2]=t,-1!=(0|f[i|0])&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,6,35648),e=y,y=0,1&e||De(0|t,824,96),e=0|ae(),re(0|t),de(0|e))):t=0|d[e+108>>2],t&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,6,35648),e=y,y=0,1&e||De(0|t,824,96),e=0|ae(),re(0|t),de(0|e))},function(e){var t;t=b,b=b+16|0,xr(e|=0),0|Ce(0|d[9255],0)?La(51780,t):b=t},function(e){0|d[(e|=0)+68>>2]||To()},function(e){0|d[(e|=0)+68>>2]||To()},function(e){e|=0,y=0,N(70,41456),e=y,y=0,(1&e||(y=0,N(70,41624),e=y,y=0,1&e)||(y=0,N(71,41796),e=y,y=0,1&e)||(y=0,N(71,41964),e=y,y=0,1&e))&&Ue(e=0|ae(0))},function(e){xr(e|=0)},function(e){0},sr,function(e){var t;e|=0,t=0|d[11052],d[11052]=t+1,d[e+4>>2]=t+1},function(e){var t=0,i=0;t=0|d[(i=(e|=0)+4|0)>>2],i=0|d[i+4>>2],e=(0|d[e>>2])+(i>>1)|0,1&i&&(t=0|d[(0|d[e>>2])+t>>2]),Jo[255&t](e)},function(e){qr(45196),qr(45184),qr(45172),qr(45160),qr(45148),qr(45136),qr(45124),qr(45112),qr(45100),qr(45088),qr(45076),qr(45064),qr(45052),qr(45040)},function(e){Zr(45368),Zr(45356),Zr(45344),Zr(45332),Zr(45320),Zr(45308),Zr(45296),Zr(45284),Zr(45272),Zr(45260),Zr(45248),Zr(45236),Zr(45224),Zr(45212)},function(e){qr(46e3),qr(45988),qr(45976),qr(45964),qr(45952),qr(45940),qr(45928),qr(45916),qr(45904),qr(45892),qr(45880),qr(45868),qr(45856),qr(45844),qr(45832),qr(45820),qr(45808),qr(45796),qr(45784),qr(45772),qr(45760),qr(45748),qr(45736),qr(45724)},function(e){Zr(46292),Zr(46280),Zr(46268),Zr(46256),Zr(46244),Zr(46232),Zr(46220),Zr(46208),Zr(46196),Zr(46184),Zr(46172),Zr(46160),Zr(46148),Zr(46136),Zr(46124),Zr(46112),Zr(46100),Zr(46088),Zr(46076),Zr(46064),Zr(46052),Zr(46040),Zr(46028),Zr(46016)},function(e){qr(47104),qr(47092),qr(47080),qr(47068),qr(47056),qr(47044),qr(47032),qr(47020),qr(47008),qr(46996),qr(46984),qr(46972),qr(46960),qr(46948),qr(46936),qr(46924),qr(46912),qr(46900),qr(46888),qr(46876),qr(46864),qr(46852),qr(46840),qr(46828)},function(e){Zr(47396),Zr(47384),Zr(47372),Zr(47360),Zr(47348),Zr(47336),Zr(47324),Zr(47312),Zr(47300),Zr(47288),Zr(47276),Zr(47264),Zr(47252),Zr(47240),Zr(47228),Zr(47216),Zr(47204),Zr(47192),Zr(47180),Zr(47168),Zr(47156),Zr(47144),Zr(47132),Zr(47120)},qr,Zr,xr,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na,na],$o=[aa,function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+128>>2],0|d[e+136>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+176>>2]=0|s?s:0|d[l+4>>2],d[e+180>>2]=o,d[e+184>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+136|0;e:do{if(0|d[h>>2])t=e+144|0;else if(i=0|d[e+128>>2],t=e+144|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+176>>2]))&&(0|d[r+8>>2])==(0|d[e+180>>2])&&(0|d[r+12>>2])==(0|d[e+184>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4604>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4604>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4604>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4604>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4608|0,r=u<<1,n=e+4612|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4604|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+184|0,l=e+180|0,o=e+176|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+132|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+188+(12*o|0)>>2]=t,d[e+188+(12*o|0)+4>>2]=0,h[e+188+(12*o|0)+8>>1]=0,h[e+188+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4568>>2]=s,d[e+4572>>2]=0,f[e+4576|0]=l,f[e+4577|0]=1,f[e+4578|0]=0,d[e+4580>>2]=s,d[e+4584>>2]=1,f[e+4588|0]=l,f[e+4589|0]=1,f[e+4590|0]=0,d[e+4592>>2]=0,b=n},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,255,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+152>>2]=0|n?n:0|d[s+4>>2],d[e+156>>2]=o,d[e+160>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,255,0),l=e+152|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+156>>2])&&(0|d[s+12>>2])==(0|d[e+160>>2]))return l=0|d[8900],d[e+4580>>2]=l+(((0|d[8901])-l|0)>>>1),void(b=c);for(i=e+4584|0,n=0|d[(r=e+4588|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=512?a>>>0>512&&(0|n)!=(0|(o=t+512|0))&&(d[r>>2]=o):(gt(i,512-a|0),t=0|d[i>>2]),d[(s=e+4580|0)>>2]=t+256,o=e+160|0,n=e+156|0,a=-256;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,256==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+164+(12*a|0)>>2]=4,d[e+164+(12*a|0)+4>>2]=0,h[e+164+(12*a|0)+8>>1]=0,h[e+164+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4544>>2]=4,d[e+4548>>2]=0,f[e+4552|0]=s,f[e+4553|0]=1,f[e+4554|0]=0,d[e+4556>>2]=4,d[e+4560>>2]=1,f[e+4564|0]=s,f[e+4565|0]=1,f[e+4566|0]=0,d[e+4568>>2]=0,b=r},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,255,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+152>>2]=0|n?n:0|d[s+4>>2],d[e+156>>2]=o,d[e+160>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,255,0),l=e+152|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+156>>2])&&(0|d[s+12>>2])==(0|d[e+160>>2]))return l=0|d[8900],d[e+4580>>2]=l+(((0|d[8901])-l|0)>>>1),void(b=c);for(i=e+4584|0,n=0|d[(r=e+4588|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=512?a>>>0>512&&(0|n)!=(0|(o=t+512|0))&&(d[r>>2]=o):(gt(i,512-a|0),t=0|d[i>>2]),d[(s=e+4580|0)>>2]=t+256,o=e+160|0,n=e+156|0,a=-256;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,256==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+164+(12*a|0)>>2]=4,d[e+164+(12*a|0)+4>>2]=0,h[e+164+(12*a|0)+8>>1]=0,h[e+164+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4544>>2]=4,d[e+4548>>2]=0,f[e+4552|0]=s,f[e+4553|0]=1,f[e+4554|0]=0,d[e+4556>>2]=4,d[e+4560>>2]=1,f[e+4564|0]=s,f[e+4565|0]=1,f[e+4566|0]=0,d[e+4568>>2]=0,b=r},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,4095,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+152>>2]=0|n?n:0|d[s+4>>2],d[e+156>>2]=o,d[e+160>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,4095,0),l=e+152|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+156>>2])&&(0|d[s+12>>2])==(0|d[e+160>>2]))return l=0|d[8906],d[e+4580>>2]=l+(((0|d[8907])-l|0)>>>1),void(b=c);for(i=e+4584|0,n=0|d[(r=e+4588|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=8192?a>>>0>8192&&(0|n)!=(0|(o=t+8192|0))&&(d[r>>2]=o):(gt(i,8192-a|0),t=0|d[i>>2]),d[(s=e+4580|0)>>2]=t+4096,o=e+160|0,n=e+156|0,a=-4096;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,4096==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+164+(12*a|0)>>2]=64,d[e+164+(12*a|0)+4>>2]=0,h[e+164+(12*a|0)+8>>1]=0,h[e+164+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4544>>2]=64,d[e+4548>>2]=0,f[e+4552|0]=s,f[e+4553|0]=1,f[e+4554|0]=0,d[e+4556>>2]=64,d[e+4560>>2]=1,f[e+4564|0]=s,f[e+4565|0]=1,f[e+4566|0]=0,d[e+4568>>2]=0,b=r},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,65535,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+152>>2]=0|n?n:0|d[s+4>>2],d[e+156>>2]=o,d[e+160>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,65535,0),l=e+152|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+156>>2])&&(0|d[s+12>>2])==(0|d[e+160>>2]))return l=0|d[8909],d[e+4580>>2]=l+(((0|d[8910])-l|0)>>>1),void(b=c);for(i=e+4584|0,n=0|d[(r=e+4588|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=131072?a>>>0>131072&&(0|n)!=(0|(o=t+131072|0))&&(d[r>>2]=o):(gt(i,131072-a|0),t=0|d[i>>2]),d[(s=e+4580|0)>>2]=t+65536,o=e+160|0,n=e+156|0,a=-65536;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,65536==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+164+(12*a|0)>>2]=1024,d[e+164+(12*a|0)+4>>2]=0,h[e+164+(12*a|0)+8>>1]=0,h[e+164+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4544>>2]=1024,d[e+4548>>2]=0,f[e+4552|0]=s,f[e+4553|0]=1,f[e+4554|0]=0,d[e+4556>>2]=1024,d[e+4560>>2]=1,f[e+4564|0]=s,f[e+4565|0]=1,f[e+4566|0]=0,d[e+4568>>2]=0,b=r},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+128>>2],0|d[e+136>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+176>>2]=0|s?s:0|d[l+4>>2],d[e+180>>2]=o,d[e+184>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+136|0;e:do{if(0|d[h>>2])t=e+144|0;else if(i=0|d[e+128>>2],t=e+144|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+176>>2]))&&(0|d[r+8>>2])==(0|d[e+180>>2])&&(0|d[r+12>>2])==(0|d[e+184>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4604>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4604>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4604>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4604>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4608|0,r=u<<1,n=e+4612|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4604|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+184|0,l=e+180|0,o=e+176|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+132|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+188+(12*o|0)>>2]=t,d[e+188+(12*o|0)+4>>2]=0,h[e+188+(12*o|0)+8>>1]=0,h[e+188+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4568>>2]=s,d[e+4572>>2]=0,f[e+4576|0]=l,f[e+4577|0]=1,f[e+4578|0]=0,d[e+4580>>2]=s,d[e+4584>>2]=1,f[e+4588|0]=l,f[e+4589|0]=1,f[e+4590|0]=0,d[e+4592>>2]=0,b=n},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+128>>2],0|d[e+136>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+176>>2]=0|s?s:0|d[l+4>>2],d[e+180>>2]=o,d[e+184>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+136|0;e:do{if(0|d[h>>2])t=e+144|0;else if(i=0|d[e+128>>2],t=e+144|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+176>>2]))&&(0|d[r+8>>2])==(0|d[e+180>>2])&&(0|d[r+12>>2])==(0|d[e+184>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4604>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4604>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4604>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4604>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4608|0,r=u<<1,n=e+4612|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4604|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+184|0,l=e+180|0,o=e+176|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+132|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+188+(12*o|0)>>2]=t,d[e+188+(12*o|0)+4>>2]=0,h[e+188+(12*o|0)+8>>1]=0,h[e+188+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4568>>2]=s,d[e+4572>>2]=0,f[e+4576|0]=l,f[e+4577|0]=1,f[e+4578|0]=0,d[e+4580>>2]=s,d[e+4584>>2]=1,f[e+4588|0]=l,f[e+4589|0]=1,f[e+4590|0]=0,d[e+4592>>2]=0,b=n},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+128>>2],0|d[e+136>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+176>>2]=0|s?s:0|d[l+4>>2],d[e+180>>2]=o,d[e+184>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+136|0;e:do{if(0|d[h>>2])t=e+144|0;else if(i=0|d[e+128>>2],t=e+144|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+176>>2]))&&(0|d[r+8>>2])==(0|d[e+180>>2])&&(0|d[r+12>>2])==(0|d[e+184>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4604>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4604>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4604>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4604>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4608|0,r=u<<1,n=e+4612|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4604|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+184|0,l=e+180|0,o=e+176|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+132|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+188+(12*o|0)>>2]=t,d[e+188+(12*o|0)+4>>2]=0,h[e+188+(12*o|0)+8>>1]=0,h[e+188+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4568>>2]=s,d[e+4572>>2]=0,f[e+4576|0]=l,f[e+4577|0]=1,f[e+4578|0]=0,d[e+4580>>2]=s,d[e+4584>>2]=1,f[e+4588|0]=l,f[e+4589|0]=1,f[e+4590|0]=0,d[e+4592>>2]=0,b=n},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+136>>2],0|d[e+144>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+184>>2]=0|s?s:0|d[l+4>>2],d[e+188>>2]=o,d[e+192>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+144|0;e:do{if(0|d[h>>2])t=e+152|0;else if(i=0|d[e+136>>2],t=e+152|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+184>>2]))&&(0|d[r+8>>2])==(0|d[e+188>>2])&&(0|d[r+12>>2])==(0|d[e+192>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4612>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4612>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4612>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4612>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4616|0,r=u<<1,n=e+4620|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4612|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+192|0,l=e+188|0,o=e+184|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+140|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+196+(12*o|0)>>2]=t,d[e+196+(12*o|0)+4>>2]=0,h[e+196+(12*o|0)+8>>1]=0,h[e+196+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4576>>2]=s,d[e+4580>>2]=0,f[e+4584|0]=l,f[e+4585|0]=1,f[e+4586|0]=0,d[e+4588>>2]=s,d[e+4592>>2]=1,f[e+4596|0]=l,f[e+4597|0]=1,f[e+4598|0]=0,d[e+4600>>2]=0,b=n},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,255,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+160>>2]=0|n?n:0|d[s+4>>2],d[e+164>>2]=o,d[e+168>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,255,0),l=e+160|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+164>>2])&&(0|d[s+12>>2])==(0|d[e+168>>2]))return l=0|d[8900],d[e+4588>>2]=l+(((0|d[8901])-l|0)>>>1),void(b=c);for(i=e+4592|0,n=0|d[(r=e+4596|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=512?a>>>0>512&&(0|n)!=(0|(o=t+512|0))&&(d[r>>2]=o):(gt(i,512-a|0),t=0|d[i>>2]),d[(s=e+4588|0)>>2]=t+256,o=e+168|0,n=e+164|0,a=-256;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,256==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+172+(12*a|0)>>2]=4,d[e+172+(12*a|0)+4>>2]=0,h[e+172+(12*a|0)+8>>1]=0,h[e+172+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4552>>2]=4,d[e+4556>>2]=0,f[e+4560|0]=s,f[e+4561|0]=1,f[e+4562|0]=0,d[e+4564>>2]=4,d[e+4568>>2]=1,f[e+4572|0]=s,f[e+4573|0]=1,f[e+4574|0]=0,d[e+4576>>2]=0,b=r},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,255,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+160>>2]=0|n?n:0|d[s+4>>2],d[e+164>>2]=o,d[e+168>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,255,0),l=e+160|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+164>>2])&&(0|d[s+12>>2])==(0|d[e+168>>2]))return l=0|d[8900],d[e+4588>>2]=l+(((0|d[8901])-l|0)>>>1),void(b=c);for(i=e+4592|0,n=0|d[(r=e+4596|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=512?a>>>0>512&&(0|n)!=(0|(o=t+512|0))&&(d[r>>2]=o):(gt(i,512-a|0),t=0|d[i>>2]),d[(s=e+4588|0)>>2]=t+256,o=e+168|0,n=e+164|0,a=-256;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,256==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+172+(12*a|0)>>2]=4,d[e+172+(12*a|0)+4>>2]=0,h[e+172+(12*a|0)+8>>1]=0,h[e+172+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4552>>2]=4,d[e+4556>>2]=0,f[e+4560|0]=s,f[e+4561|0]=1,f[e+4562|0]=0,d[e+4564>>2]=4,d[e+4568>>2]=1,f[e+4572|0]=s,f[e+4573|0]=1,f[e+4574|0]=0,d[e+4576>>2]=0,b=r},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,4095,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+160>>2]=0|n?n:0|d[s+4>>2],d[e+164>>2]=o,d[e+168>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,4095,0),l=e+160|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+164>>2])&&(0|d[s+12>>2])==(0|d[e+168>>2]))return l=0|d[8906],d[e+4588>>2]=l+(((0|d[8907])-l|0)>>>1),void(b=c);for(i=e+4592|0,n=0|d[(r=e+4596|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=8192?a>>>0>8192&&(0|n)!=(0|(o=t+8192|0))&&(d[r>>2]=o):(gt(i,8192-a|0),t=0|d[i>>2]),d[(s=e+4588|0)>>2]=t+4096,o=e+168|0,n=e+164|0,a=-4096;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,4096==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+172+(12*a|0)>>2]=64,d[e+172+(12*a|0)+4>>2]=0,h[e+172+(12*a|0)+8>>1]=0,h[e+172+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4552>>2]=64,d[e+4556>>2]=0,f[e+4560|0]=s,f[e+4561|0]=1,f[e+4562|0]=0,d[e+4564>>2]=64,d[e+4568>>2]=1,f[e+4572|0]=s,f[e+4573|0]=1,f[e+4574|0]=0,d[e+4576>>2]=0,b=r},function(e,t){e|=0,t|=0;var i,r,n,a=0,o=0,s=0;r=b,b=b+32|0,Ea(s=r,65535,0),n=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[s+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[s+12>>2],t=0|d[t+16>>2],i=0|d[s+16>>2],d[e+160>>2]=0|n?n:0|d[s+4>>2],d[e+164>>2]=o,d[e+168>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0;if(c=b,b=b+32|0,s=c,Ea(s,65535,0),l=e+160|0,(0|d[s+4>>2])==(0|d[l>>2])&&(0|d[s+8>>2])==(0|d[e+164>>2])&&(0|d[s+12>>2])==(0|d[e+168>>2]))return l=0|d[8909],d[e+4588>>2]=l+(((0|d[8910])-l|0)>>>1),void(b=c);for(i=e+4592|0,n=0|d[(r=e+4596|0)>>2],t=0|d[i>>2],(a=n-t|0)>>>0>=131072?a>>>0>131072&&(0|n)!=(0|(o=t+131072|0))&&(d[r>>2]=o):(gt(i,131072-a|0),t=0|d[i>>2]),d[(s=e+4588|0)>>2]=t+65536,o=e+168|0,n=e+164|0,a=-65536;;){if((0|a)>(0-(t=0|d[o>>2])|0))if((0|a)>(0-(i=0|d[n>>2])|0))if((0|a)>(0-(r=0|d[l>>2])|0))if((0|a)>=0){if((0|a)<1){f[(0|d[s>>2])+a|0]=0,a=1;continue}t=(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1}else t=-1;else t=-2;else t=-3;else t=-4;if(f[(0|d[s>>2])+a|0]=t,65536==(0|(a=a+1|0)))break}b=c}(e),a=0;do{d[e+172+(12*a|0)>>2]=1024,d[e+172+(12*a|0)+4>>2]=0,h[e+172+(12*a|0)+8>>1]=0,h[e+172+(12*a|0)+10>>1]=1,a=a+1|0}while(365!=(0|a));s=255&(0|t?t:i),d[e+4552>>2]=1024,d[e+4556>>2]=0,f[e+4560|0]=s,f[e+4561|0]=1,f[e+4562|0]=0,d[e+4564>>2]=1024,d[e+4568>>2]=1,f[e+4572|0]=s,f[e+4573|0]=1,f[e+4574|0]=0,d[e+4576>>2]=0,b=r},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+136>>2],0|d[e+144>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+184>>2]=0|s?s:0|d[l+4>>2],d[e+188>>2]=o,d[e+192>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+144|0;e:do{if(0|d[h>>2])t=e+152|0;else if(i=0|d[e+136>>2],t=e+152|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+184>>2]))&&(0|d[r+8>>2])==(0|d[e+188>>2])&&(0|d[r+12>>2])==(0|d[e+192>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4612>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4612>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4612>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4612>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4616|0,r=u<<1,n=e+4620|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4612|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+192|0,l=e+188|0,o=e+184|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+140|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+196+(12*o|0)>>2]=t,d[e+196+(12*o|0)+4>>2]=0,h[e+196+(12*o|0)+8>>1]=0,h[e+196+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4576>>2]=s,d[e+4580>>2]=0,f[e+4584|0]=l,f[e+4585|0]=1,f[e+4586|0]=0,d[e+4588>>2]=s,d[e+4592>>2]=1,f[e+4596|0]=l,f[e+4597|0]=1,f[e+4598|0]=0,d[e+4600>>2]=0,b=n},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+136>>2],0|d[e+144>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+184>>2]=0|s?s:0|d[l+4>>2],d[e+188>>2]=o,d[e+192>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+144|0;e:do{if(0|d[h>>2])t=e+152|0;else if(i=0|d[e+136>>2],t=e+152|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+184>>2]))&&(0|d[r+8>>2])==(0|d[e+188>>2])&&(0|d[r+12>>2])==(0|d[e+192>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4612>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4612>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4612>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4612>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4616|0,r=u<<1,n=e+4620|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4612|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+192|0,l=e+188|0,o=e+184|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+140|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+196+(12*o|0)>>2]=t,d[e+196+(12*o|0)+4>>2]=0,h[e+196+(12*o|0)+8>>1]=0,h[e+196+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4576>>2]=s,d[e+4580>>2]=0,f[e+4584|0]=l,f[e+4585|0]=1,f[e+4586|0]=0,d[e+4588>>2]=s,d[e+4592>>2]=1,f[e+4596|0]=l,f[e+4597|0]=1,f[e+4598|0]=0,d[e+4600>>2]=0,b=n},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0;n=b,b=b+32|0,Ea(l=n,0|d[(e|=0)+136>>2],0|d[e+144>>2]),s=0|d[t+4>>2],o=0|(o=0|d[t+8>>2])?o:0|d[l+8>>2],a=0|(a=0|d[t+12>>2])?a:0|d[l+12>>2],i=0|d[t+16>>2],r=0|d[l+16>>2],d[e+184>>2]=0|s?s:0|d[l+4>>2],d[e+188>>2]=o,d[e+192>>2]=a,function(e){e|=0;var t=0,i=0,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;m=b,b=b+32|0,r=m,h=e+144|0;e:do{if(0|d[h>>2])t=e+152|0;else if(i=0|d[e+136>>2],t=e+152|0,(0|i)==((1<>2])-1|0)&&(Ea(r,i,0),(0|d[r+4>>2])==(0|d[e+184>>2]))&&(0|d[r+8>>2])==(0|d[e+188>>2])&&(0|d[r+12>>2])==(0|d[e+192>>2]))switch(0|d[t>>2]){case 8:return h=0|d[8900],d[e+4612>>2]=h+(((0|d[8901])-h|0)>>>1),void(b=m);case 10:return h=0|d[8903],d[e+4612>>2]=h+(((0|d[8904])-h|0)>>>1),void(b=m);case 12:return h=0|d[8906],d[e+4612>>2]=h+(((0|d[8907])-h|0)>>>1),void(b=m);case 16:return h=0|d[8909],d[e+4612>>2]=h+(((0|d[8910])-h|0)>>>1),void(b=m);default:break e}}while(0);if(u=1<>2],i=e+4616|0,r=u<<1,n=e+4620|0,a=0|d[n>>2],t=0|d[i>>2],o=a-t|0,r>>>0<=o>>>0?r>>>0>>0&&(s=t+r|0,(0|a)!=(0|s))&&(d[n>>2]=s):(gt(i,r-o|0),t=0|d[i>>2]),c=e+4612|0,d[c>>2]=t+u,t=0-u|0,(0|u)<=(0|t))return void(b=m);s=e+192|0,l=e+188|0,o=e+184|0,a=t;do{t=0|d[s>>2],(0|a)>(0-t|0)?(i=0|d[l>>2],(0|a)>(0-i|0)?(r=0|d[o>>2],(0|a)>(0-r|0)?(n=0|d[h>>2],t=(0|a)>=(0-n|0)?(0|n)<(0|a)?(0|r)<=(0|a)?(0|i)>(0|a)?2:(0|t)>(0|a)?3:4:1:0:-1):t=-2):t=-3):t=-4,f[(0|d[c>>2])+a|0]=t,a=a+1|0}while((0|a)!=(0|u));b=m}(e),t=(0|(t=32+(0|d[(a=e+140|0)>>2])|0))<128?2:(0|t)/64|0,o=0;do{d[e+196+(12*o|0)>>2]=t,d[e+196+(12*o|0)+4>>2]=0,h[e+196+(12*o|0)+8>>1]=0,h[e+196+(12*o|0)+10>>1]=1,o=o+1|0}while(365!=(0|o));s=(0|(s=32+(0|d[a>>2])|0))<128?2:(0|s)/64|0,l=255&(0|i?i:r),d[e+4576>>2]=s,d[e+4580>>2]=0,f[e+4584|0]=l,f[e+4585|0]=1,f[e+4586|0]=0,d[e+4588>>2]=s,d[e+4592>>2]=1,f[e+4596|0]=l,f[e+4597|0]=1,f[e+4598|0]=0,d[e+4600>>2]=0,b=n},function(e,t){0},function(e,t){e|=0;var i,r,n=0;if(xa(t|=0,-1),xa(t,0|f[e+4|0]),i=e+8|0,xa(t,(65535&(e=(0|d[(r=e+12|0)>>2])-(0|d[i>>2])+2|0))>>>8&255),xa(t,255&e),e=0|d[i>>2],(0|d[r>>2])!=(0|e)){n=0;do{xa(t,0|f[e+n|0]),n=n+1|0,e=0|d[i>>2]}while(n>>>0<((0|d[r>>2])-e|0)>>>0)}},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0,c=0,u=0;r=b,b=b+128|0,c=r+100|0,a=r+112|0,u=r+4|0,n=r,l=(e|=0)+20|0,i=(s=o=r+16|0)+84|0;do{d[s>>2]=d[l>>2],s=s+4|0,l=l+4|0}while((0|s)<(0|i));d[o+16>>2]=d[e+4>>2],l=0|function(e,t,i){e|=0,t|=0;var r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,g=0,p=0;switch(0|(r=0|d[16+(i|=0)>>2])){case 64:case 0:y=0,e=0|G(35,0|e,0|t),t=y,y=0,1&t?p=16:n=e;break;default:for(a=(1<>2])-1|0,m=1+(((m=(g=0|d[t+20>>2])<<1)+a|0)/(1|m)|0)|0,e=0;1<>2],y=0,n=0|N(67,4632),u=y,y=0,1&u)p=16;else{o=((0|s)<8?8:s)+s<<1,d[n+4>>2]=0,c=t,u=84+(l=n+8|0)|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[n+92>>2]=0,d[n+96>>2]=0,d[n+100>>2]=32,d[n+104>>2]=0,d[n+108>>2]=0,f[n+112|0]=0,d[(u=n+116|0)>>2]=0,d[u+4>>2]=0,d[u+8>>2]=0,d[u+12>>2]=0,d[u+16>>2]=0,d[n>>2]=35884,d[n+136>>2]=a,d[n+140>>2]=m,d[n+144>>2]=g,d[n+148>>2]=e,d[n+152>>2]=s,d[n+156>>2]=o,d[n+160>>2]=r,d[(e=n+164|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[n+180>>2]=d[t>>2],d[n+184>>2]=0,d[n+188>>2]=0,d[n+192>>2]=0,e=n+4576|0,a=n+196|0;do{d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,h[a+10>>1]=1,a=a+12|0}while((0|a)!=(0|e));d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=n+4588|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=n+4600|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[n+32>>2]||(d[n+24>>2]=1)}}return 16==(0|p)&&(p=0|ae(),de(0|p)),n&&(y=0,L(0|d[8+(0|d[n>>2])>>2],0|n,0|i),p=y,y=0,1&p)?(e=0|ae(),n||de(0|(p=e)),Jo[255&d[4+(0|d[n>>2])>>2]](n),de(0|(p=e)),0):0|n}(a,o,e+56|0),a=0|d[16+(0|d[l>>2])>>2],e=e+8|0,y=0,d[c>>2]=d[e>>2],d[c+4>>2]=d[e+4>>2],d[c+8>>2]=d[e+8>>2],a=0|G(0|a,0|l,0|c),e=y,y=0;do{if(!(1&e)){if(s=t+4|0,d[u>>2]=d[s>>2],d[u+4>>2]=d[s+4>>2],d[u+8>>2]=d[s+8>>2],e=0|d[(s=t+16|0)>>2],d[(c=u+8|0)>>2]=(0|d[c>>2])-e,d[(c=u+4|0)>>2]=(0|d[c>>2])+e,c=0|d[12+(0|d[l>>2])>>2],d[n>>2]=a,y=0,a=0|Y(0|c,0|l,0|n,0|u,0|(0|f[t|0]?(0|d[t+8>>2])+e:0)),u=y,y=0,1&u){if(a=0|ae(),o=0|d[n>>2],d[n>>2]=0,!o)break;Jo[255&d[4+(0|d[o>>2])>>2]](o);break}return o=0|d[n>>2],d[n>>2]=0,o&&Jo[255&d[4+(0|d[o>>2])>>2]](o),0|d[t+4>>2]||(d[s>>2]=(0|d[s>>2])+a),l?(Jo[255&d[4+(0|d[l>>2])>>2]](l),void(b=r)):void(b=r)}a=0|ae()}while(0);l||de(0|a),Jo[255&d[4+(0|d[l>>2])>>2]](l),de(0|a)},function(e,t){t|=0,ts[127&d[24+(0|d[(e|=0)>>2])>>2]](e),t=0|pr(t,44288),d[e+36>>2]=t,t=1&ts[127&d[28+(0|d[t>>2])>>2]](t),f[e+44|0]=t},function(e,t){e|=0;var i=0,r=0;r=0|pr(t|=0,44288),d[(i=e+36|0)>>2]=r,r=0|ts[127&d[24+(0|d[r>>2])>>2]](r),d[(t=e+44|0)>>2]=r,i=0|d[i>>2],i=1&ts[127&d[28+(0|d[i>>2])>>2]](i),f[e+53|0]=i,(0|d[t>>2])>8&&sr(56783)},function(e,t){t|=0,ts[127&d[24+(0|d[(e|=0)>>2])>>2]](e),t=0|pr(t,44280),d[e+36>>2]=t,t=1&ts[127&d[28+(0|d[t>>2])>>2]](t),f[e+44|0]=t},function(e,t){e|=0;var i=0,r=0;r=0|pr(t|=0,44280),d[(i=e+36|0)>>2]=r,r=0|ts[127&d[24+(0|d[r>>2])>>2]](r),d[(t=e+44|0)>>2]=r,i=0|d[i>>2],i=1&ts[127&d[28+(0|d[i>>2])>>2]](i),f[e+53|0]=i,(0|d[t>>2])>8&&sr(56783)},function(e,t){0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){Vr(e|=0,1,45)},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){Vr(e|=0,1,45)},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){jr(e|=0,1,45)},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0},function(e,t){jr(e|=0,1,45)},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){f[(e|=0)|0]=2,f[e+1|0]=3,f[e+2|0]=0,f[e+3|0]=4},function(e,t){0},function(e,t){0},function(e,t){Or(e|=0,(t|=0)+12|0)},function(e,t){Br(e|=0,59024,4)},function(e,t){Br(e|=0,59029,5)},function(e,t){Or(e|=0,(t|=0)+16|0)},function(e,t){Kr(e|=0,44996,0|zo(44996))},function(e,t){Kr(e|=0,45016,0|zo(45016))},function(e,t){t|=0;var i,r,n,a=0,o=0,s=0,l=0,c=0,u=0;if(r=(e|=0)+4|0,a=0|d[e>>2],(s=1+((0|d[r>>2])-a>>2)|0)>>>0>1073741823&&(Na(e),a=0|d[e>>2]),(o=(0|d[(n=e+8|0)>>2])-a|0)>>2>>>0<536870911?(o=(o>>=1)>>>0>>0?s:o,a=(0|d[r>>2])-a>>2,o?u=6:(l=0,c=0)):(o=1073741823,a=(0|d[r>>2])-a>>2,u=6),6==(0|u)&&(l=o,c=0|Oa(o<<2)),o=s=c+(a<<2)|0,i=c+(l<<2)|0,u=0|d[t>>2],d[t>>2]=0,d[s>>2]=u,u=c+(a+1<<2)|0,c=0|d[e>>2],(0|(a=0|d[r>>2]))==(0|c))s=e,l=r;else{do{t=0|d[(a=a+-4|0)>>2],d[a>>2]=0,d[s+-4>>2]=t,o=s=o+-4|0}while((0|a)!=(0|c));s=e,l=r,o=a=o,c=0|d[e>>2],a=0|d[r>>2]}if(d[s>>2]=o,d[l>>2]=u,d[n>>2]=i,(0|a)!=(0|(s=c)))do{o=0|d[(a=a+-4|0)>>2],d[a>>2]=0,o&&Jo[255&d[4+(0|d[o>>2])>>2]](o)}while((0|a)!=(0|s));c&&Ba(c)},function(e,t){e|=0;var i,r,n,a=0;return r=b,b=b+16|0,n=r,t=0|function(e){e|=0;var t,i,r,n=0,a=0,o=0;return r=0|Oa(5),f[0|r]=109,f[r+1|0]=114,f[r+2|0]=102,f[r+3|0]=120,f[r+4|0]=e,y=0,a=0|N(67,20),n=y,y=0,1&n&&(a=0|ae(),Ba(r),de(0|a)),d[a>>2]=36800,f[a+4|0]=-24,d[(e=a+8|0)>>2]=0,d[(t=a+12|0)>>2]=0,d[(i=a+16|0)>>2]=0,y=0,n=0|N(67,5),o=y,y=0,1&o?(o=0|ae(),Ba(a),Ba(r),de(0|o),0):(d[t>>2]=n,d[e>>2]=n,d[i>>2]=n+5,f[0|n]=109,o=1+(0|d[t>>2])|0,d[t>>2]=o,n=r+1|0,f[0|o]=0|f[0|n],o=1+(0|d[t>>2])|0,d[t>>2]=o,n=n+1|0,f[0|o]=0|f[0|n],o=1+(0|d[t>>2])|0,d[t>>2]=o,n=n+1|0,f[0|o]=0|f[0|n],o=1+(0|d[t>>2])|0,d[t>>2]=o,f[0|o]=0|f[n+1|0],d[t>>2]=1+(0|d[t>>2]),Ba(r),0|a)}(t|=0),d[n>>2]=t,(i=0|d[(a=e+28|0)>>2])>>>0<(0|d[e+32>>2])>>>0?(d[i>>2]=t,d[a>>2]=i+4,d[n>>2]=0,void(b=r)):(y=0,L(57,e+24|0,0|n),e=y,y=0,1&e?(t=0|ae(),a=0|d[n>>2],d[n>>2]=0,a||de(0|t),Jo[255&d[4+(0|d[a>>2])>>2]](a),void de(0|t)):(t=0|d[n>>2],d[n>>2]=0,t?(Jo[255&d[4+(0|d[t>>2])>>2]](t),void(b=r)):void(b=r)))},function(e,t){t|=0,d[(e|=0)>>2]=d[t>>2],d[e+4>>2]=d[t+4>>2],d[e+8>>2]=d[t+8>>2],f[e+12|0]=0,e=(t=e+16|0)+100|0;do{d[t>>2]=0,t=t+4|0}while((0|t)<(0|e))},function(e,t){t|=0;var i,r,n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0;a=b,b=b+32|0,n=a+4|0,i=a+16|0,w=a,Ma(e|=0),r=e+16|0,l=0|d[e+24>>2];e:do{if((l+-2|0)>>>0<=14)if(S=e+40|0,o=0|d[S>>2],o>>>0>2)o=5;else{switch(0|(c=0|d[(v=e+32|0)>>2])){case 0:o=1;break e;case 4:if(2==(0|o)){o=2;break e}break;case 3:break;default:if(o){o=2;break e}}if(A=e+100|0,(0|(s=0|d[(o=e+108|0)>>2]))<1?(s=0|d[r>>2],d[o>>2]=s,o=0|d[e+20>>2],d[e+112>>2]=o):o=0|d[e+112>>2],m=0|Zn(0|o,((0|o)<0)<<31>>31,0|s,((0|s)<0)<<31>>31),h=0|Zn(0|m,0|D,0|(h=(l+7|0)/8|0),((0|h)<0)<<31>>31),u=t+8|0,0|(o=0|d[(m=t+4|0)>>2])&&(g=0|d[u>>2],p=0|Zn(0|c,((0|c)<0)<<31>>31,0|h,0|D),0<(0|(l=D))|!(0|l)&g>>>0

>>0)&&(o=0|ne(16),y=0,s=0|H(1),w=y,y=0,!(1&w)&&(y=0,W(7,0|o,3,0|s),w=y,y=0,!(1&w))&&De(0|o,824,96),w=0|ae(),re(0|o),de(0|w)),g=e+52|0,p=e+12|0,!((0|c)>0))return void(b=a);for(c=0;;){if(ka(e,!(0|c)),s=0|Ge(i,r,g),l=0|d[8+(0|d[s>>2])>>2],y=0,d[n>>2]=d[t>>2],d[n+4>>2]=d[t+4>>2],d[n+8>>2]=d[t+8>>2],l=0|G(0|l,0|s,0|n),T=y,y=0,1&T){l=32;break}if(T=0|d[16+(0|d[s>>2])>>2],d[w>>2]=l,y=0,F(0|T,0|s,0|w,0|A,0|e,0|!!(0|f[p|0])),T=y,y=0,1&T){l=30;break}if(l=0|d[w>>2],d[w>>2]=0,l&&Jo[255&d[4+(0|d[l>>2])>>2]](l),o?(o=o+h|0,d[m>>2]=o,d[u>>2]=(0|d[u>>2])-h):o=0,c=(1&(l=!(0|d[S>>2])))+c|0,s&&Jo[255&d[4+(0|d[s>>2])>>2]](s),!l){l=34;break}if((0|c)>=(0|d[v>>2])){l=34;break}}if(30==(0|l))o=0|ae(),l=0|d[w>>2],d[w>>2]=0,l&&Jo[255&d[4+(0|d[l>>2])>>2]](l);else if(32==(0|l))o=0|ae(),s||de(0|(T=o));else if(34==(0|l))return void(b=a);Jo[255&d[4+(0|d[s>>2])>>2]](s),de(0|(T=o))}else o=2}while(0);s=0|ne(16),y=0,l=0|H(1),T=y,y=0,!(1&T)&&(y=0,W(7,0|s,0|o,0|l),T=y,y=0,!(1&T))&&De(0|s,824,96),T=0|ae(),re(0|s),de(0|T)},ka,function(e,t){var i;t|=0,d[(e|=0)+24>>2]=t,d[e+16>>2]=1&!(0|t),d[e+20>>2]=0,d[e+4>>2]=4098,d[e+12>>2]=0,d[e+8>>2]=6,i=e+28|0,e=(t=e+32|0)+40|0;do{d[t>>2]=0,t=t+4|0}while((0|t)<(0|e));hr(i)},function(e,t){var i,r,n=0,a=0,o=0,s=0;(function(e,t){e|=0,t|=0;var i=0,r=0;(0|e)!=(0|t)&&(i=0|f[t|0],r=!(1&i),Gr(e,r?t+1|0:0|d[t+8>>2],r?(255&i)>>>1:0|d[t+4>>2]))})(i=(e|=0)+32|0,t|=0),d[(s=e+44|0)>>2]=0,8&(o=0|d[(r=e+48|0)>>2])&&(1&(t=0|f[i|0])?(t=(0|d[e+40>>2])+(0|d[e+36>>2])|0,d[s>>2]=t,n=a=0|d[e+40>>2]):(t=((255&t)>>>1)+(i+1)|0,d[s>>2]=t,n=i+1|0,a=i+1|0),d[e+8>>2]=n,d[e+12>>2]=a,d[e+16>>2]=t),16&o&&(1&(t=0|f[i|0])?(o=0|d[e+36>>2],d[s>>2]=(0|d[e+40>>2])+o,t=(-2&d[i>>2])-1|0,s=o):(o=(255&t)>>>1,d[s>>2]=i+1+o,t=10,s=o),Qr(i,t,0),1&(t=0|f[i|0])?(o=n=0|d[e+40>>2],a=0|d[e+36>>2]):(o=i+1|0,a=(255&t)>>>1,n=i+1|0),d[(t=e+24|0)>>2]=n,d[e+20>>2]=n,d[e+28>>2]=o+a,3&d[r>>2]&&(d[t>>2]=n+s))},function(e,t){e|=0;var i=0,r=0,n=0,a=0;if(16&(i=0|d[(t|=0)+48>>2])){if((r=0|d[(i=t+44|0)>>2])>>>0<(n=0|d[t+24>>2])>>>0?d[i>>2]=n:n=r,(a=n-(r=0|d[t+20>>2])|0)>>>0>4294967279&&_a(e),a>>>0<11?(f[e|0]=a<<1,i=e+1|0):(i=0|Oa(t=a+16&-16),d[e+8>>2]=i,d[e>>2]=1|t,d[e+4>>2]=a),(0|r)!=(0|n)){for(t=i;f[t|0]=0|f[r|0],(0|(r=r+1|0))!=(0|n);)t=t+1|0;i=i+a|0}f[i|0]=0}else{if(!(8&i))return d[e>>2]=0,d[e+4>>2]=0,void(d[e+8>>2]=0);if(r=0|d[t+8>>2],(a=(t=0|d[t+16>>2])-r|0)>>>0>4294967279&&_a(e),a>>>0<11?(f[e|0]=a<<1,i=e+1|0):(i=0|Oa(n=a+16&-16),d[e+8>>2]=i,d[e>>2]=1|n,d[e+4>>2]=a),(0|r)!=(0|t)){for(n=i;f[n|0]=0|f[r|0],(0|(r=r+1|0))!=(0|t);)n=n+1|0;i=i+a|0}f[i|0]=0}},function(e,t){t|=0;var i=0;f[(e|=0)|0]=0,d[e+4>>2]=t,i=0|d[(0|d[t>>2])-12>>2],0|d[t+(i+16)>>2]||((i=0|d[t+(i+72)>>2])&&un(i),f[e|0]=1)},function(e,t){t|=0;var i,r,n=0;i=b,b=b+16|0,r=i,n=!(0|d[(e|=0)+24>>2]),d[e+16>>2]=1&n|t,(1&n|t)&d[e+20>>2]?(t=0|ne(16),!(0|f[1048])&&0|te(1048)&&(d[10778]=43084,Ie(72,43112,0|T),oe(1048)),d[r>>2]=1,d[r+4>>2]=43112,y=0,W(11,0|t,57437,0|r),n=y,y=0,1&n?(n=0|ae(),re(0|t),de(0|n)):De(0|t,864,112)):b=i},function(e,t){t|=0;var i=0,r=0,n=0,a=0;(r=!!(1&(i=0|f[(e|=0)|0])))?(n=(-2&d[e>>2])-1|0,a=0|d[e+4>>2]):(n=10,a=(255&i)>>>1),(0|a)==(0|n)?(Xr(e,n,1,n,n,0,0),n=1&f[e|0]?8:7):n=r?8:7,7==(0|n)?(f[e|0]=2+(a<<1),i=e+1|0,r=a+1|0):8==(0|n)&&(i=0|d[e+8>>2],r=a+1|0,d[e+4>>2]=r),f[i+a|0]=t,f[i+r|0]=0},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0;if(t=0|d[(i=(e|=0)+4604|0)>>2],!((0|d[(r=e+180|0)>>2])<=0))for(A=e+4608|0,S=e+4612|0,o=t,s=0|g[t+-2>>1],t=0|g[t>>1],p=0;m=0|d[A>>2],u=0|g[m+(p+-1<<1)>>1],n=0|g[o+((a=p+1|0)<<1)>>1],c=0|d[S>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,m=0|ut(e,c,0|g[m+(p<<1)>>1],o,0),h[(0|d[A>>2])+(p<<1)>>1]=m):(a=(0|ft(e,p,0))+p|0,n=0|d[i>>2],t=0|g[n+(a+-1<<1)>>1],n=0|g[n+(a<<1)>>1]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,p=a},function(e,t){t|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0,b=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0;if(!((0|d[(i=(e|=0)+180|0)>>2])<=0))for(E=e+4608|0,M=e+4604|0,k=e+4612|0,x=0;C=x+-1|0,o=0|d[E>>2],s=0|d[M>>2],t=x+1|0,a=0|g[s+(6*x|0)>>1],D=0|d[k>>2],c=a-(l=0|g[s+(6*C|0)>>1])|0,m=l-(u=0|g[o+(6*C|0)>>1])|0,p=(9*((9*(0|f[D+((0|g[s+(6*t|0)>>1])-a)|0])|0)+(0|f[D+c|0])|0)|0)+(0|f[D+m|0])|0,S=(n=0|g[s+(6*x|0)+2>>1])-(A=0|g[s+(6*C|0)+2>>1])|0,v=A-(b=0|g[o+(6*C|0)+2>>1])|0,w=(9*((9*(0|f[D+((0|g[s+(6*t|0)+2>>1])-n)|0])|0)+(0|f[D+S|0])|0)|0)+(0|f[D+v|0])|0,y=(r=0|g[s+(6*x|0)+4>>1])-(T=0|g[s+(6*C|0)+4>>1])|0,I=T-(C=0|g[o+(6*C|0)+4>>1])|0,w|p|(D=(9*((9*(0|f[D+((0|g[s+(6*t|0)+4>>1])-r)|0])|0)+(0|f[D+y|0])|0)|0)+(0|f[D+I|0])|0)?(s=0|g[o+(6*x|0)>>1],((o=a-u>>31)^m)>=0&&(a=(o^c)<0?u:u-l+a|0),s=0|St(e,p,s,a,0),((a=n-b>>31)^v)>=0&&(n=(a^S)<0?b:b-A+n|0),a=0|St(e,w,o=0|g[(0|d[E>>2])+(6*x|0)+2>>1],n,0),((n=r-C>>31)^I)>=0&&(r=(n^y)<0?C:C-T+r|0),I=0|St(e,D,o=0|g[(0|d[E>>2])+(6*x|0)+4>>1],r,0),D=0|d[E>>2],h[D+(6*x|0)>>1]=s,h[D+(6*x|0)+2>>1]=a,h[D+(6*x|0)+4>>1]=I):t=(0|At(e,x,0))+x|0,(0|t)<(0|d[i>>2]);)x=t},function(e,t){t|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,b=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0;if(!((0|d[(i=(e|=0)+180|0)>>2])<=0))for(x=e+4608|0,E=e+4604|0,M=e+4612|0,D=0;y=D+-1|0,o=0|d[x>>2],s=0|d[E>>2],t=D+1|0,a=0|m[s+(3*D|0)|0],I=0|d[M>>2],c=a-(l=0|m[s+(3*y|0)|0])|0,h=l-(u=0|m[o+(3*y|0)|0])|0,g=(9*((9*(0|f[I+((0|m[s+(3*t|0)|0])-a)|0])|0)+(0|f[I+c|0])|0)|0)+(0|f[I+h|0])|0,A=(n=0|m[s+(3*D|0)+1|0])-(p=0|m[s+(3*y|0)+1|0])|0,b=p-(S=0|m[o+(3*y|0)+1|0])|0,v=(9*((9*(0|f[I+((0|m[s+(3*t|0)+1|0])-n)|0])|0)+(0|f[I+A|0])|0)|0)+(0|f[I+b|0])|0,T=(r=0|m[s+(3*D|0)+2|0])-(w=0|m[s+(3*y|0)+2|0])|0,C=w-(y=0|m[o+(3*y|0)+2|0])|0,v|g|(I=(9*((9*(0|f[I+((0|m[s+(3*t|0)+2|0])-r)|0])|0)+(0|f[I+T|0])|0)|0)+(0|f[I+C|0])|0)?(s=0|m[o+(3*D|0)|0],((o=a-u>>31)^h)>=0&&(a=(o^c)<0?u:u-l+a|0),s=0|Rt(e,g,s,a,0),((a=n-S>>31)^b)>=0&&(n=(a^A)<0?S:S-p+n|0),a=0|Rt(e,v,o=0|m[(0|d[x>>2])+(3*D|0)+1|0],n,0),((n=r-y>>31)^C)>=0&&(r=(n^T)<0?y:y-w+r|0),I=0|Rt(e,I,o=0|m[(0|d[x>>2])+(3*D|0)+2|0],r,0),D=(0|d[x>>2])+(3*D|0)|0,f[D|0]=s,f[D+1|0]=a,f[D+2|0]=I):t=(0|kt(e,D,0))+D|0,(0|t)<(0|d[i>>2]);)D=t},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0;if(t=0|d[(i=(e|=0)+4580|0)>>2],!((0|d[(r=e+156|0)>>2])<=0))for(A=e+4584|0,S=e+4588|0,o=t,s=0|g[t+-2>>1],t=0|g[t>>1],p=0;m=0|d[A>>2],u=0|g[m+(p+-1<<1)>>1],n=0|g[o+((a=p+1|0)<<1)>>1],c=0|d[S>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,m=0|_t(e,c,0|g[m+(p<<1)>>1],o,0),h[(0|d[A>>2])+(p<<1)>>1]=m):(a=(0|Nt(e,p,0))+p|0,n=0|d[i>>2],t=0|g[n+(a+-1<<1)>>1],n=0|g[n+(a<<1)>>1]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,p=a},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0;if(t=0|d[(i=(e|=0)+4580|0)>>2],!((0|d[(r=e+156|0)>>2])<=0))for(A=e+4584|0,S=e+4588|0,o=t,s=0|g[t+-2>>1],t=0|g[t>>1],p=0;m=0|d[A>>2],u=0|g[m+(p+-1<<1)>>1],n=0|g[o+((a=p+1|0)<<1)>>1],c=0|d[S>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,m=0|Bt(e,c,0|g[m+(p<<1)>>1],o,0),h[(0|d[A>>2])+(p<<1)>>1]=m):(a=(0|Vt(e,p,0))+p|0,n=0|d[i>>2],t=0|g[n+(a+-1<<1)>>1],n=0|g[n+(a<<1)>>1]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,p=a},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0;if(t=0|d[(i=(e|=0)+4580|0)>>2],!((0|d[(r=e+156|0)>>2])<=0))for(p=e+4584|0,A=e+4588|0,o=t,s=0|m[t+-1|0],t=0|m[t|0],g=0;h=0|d[p>>2],u=0|m[h+(g+-1)|0],n=0|m[o+(a=g+1|0)|0],c=0|d[A>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,h=0|Qt(e,c,0|m[h+g|0],o,0),f[(0|d[p>>2])+g|0]=h):(a=(0|zt(e,g,0))+g|0,n=0|d[i>>2],t=0|m[n+(a+-1)|0],n=0|m[n+a|0]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,g=a},function(e,t){t|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,b=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0;if(!((0|d[(i=(e|=0)+156|0)>>2])<=0))for(x=e+4584|0,E=e+4580|0,M=e+4588|0,D=0;y=D+-1|0,o=0|d[x>>2],s=0|d[E>>2],t=D+1|0,a=0|m[s+(3*D|0)|0],I=0|d[M>>2],c=a-(l=0|m[s+(3*y|0)|0])|0,h=l-(u=0|m[o+(3*y|0)|0])|0,g=(9*((9*(0|f[I+((0|m[s+(3*t|0)|0])-a)|0])|0)+(0|f[I+c|0])|0)|0)+(0|f[I+h|0])|0,A=(n=0|m[s+(3*D|0)+1|0])-(p=0|m[s+(3*y|0)+1|0])|0,b=p-(S=0|m[o+(3*y|0)+1|0])|0,v=(9*((9*(0|f[I+((0|m[s+(3*t|0)+1|0])-n)|0])|0)+(0|f[I+A|0])|0)|0)+(0|f[I+b|0])|0,T=(r=0|m[s+(3*D|0)+2|0])-(w=0|m[s+(3*y|0)+2|0])|0,C=w-(y=0|m[o+(3*y|0)+2|0])|0,v|g|(I=(9*((9*(0|f[I+((0|m[s+(3*t|0)+2|0])-r)|0])|0)+(0|f[I+T|0])|0)|0)+(0|f[I+C|0])|0)?(s=0|m[o+(3*D|0)|0],((o=a-u>>31)^h)>=0&&(a=(o^c)<0?u:u-l+a|0),s=0|Xt(e,g,s,a,0),((a=n-S>>31)^b)>=0&&(n=(a^A)<0?S:S-p+n|0),a=0|Xt(e,v,o=0|m[(0|d[x>>2])+(3*D|0)+1|0],n,0),((n=r-y>>31)^C)>=0&&(r=(n^T)<0?y:y-w+r|0),I=0|Xt(e,I,o=0|m[(0|d[x>>2])+(3*D|0)+2|0],r,0),D=(0|d[x>>2])+(3*D|0)|0,f[D|0]=s,f[D+1|0]=a,f[D+2|0]=I):t=(0|Wt(e,D,0))+D|0,(0|t)<(0|d[i>>2]);)D=t},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0;if(t=0|d[(i=(e|=0)+4604|0)>>2],!((0|d[(r=e+180|0)>>2])<=0))for(p=e+4608|0,A=e+4612|0,o=t,s=0|m[t+-1|0],t=0|m[t|0],g=0;h=0|d[p>>2],u=0|m[h+(g+-1)|0],n=0|m[o+(a=g+1|0)|0],c=0|d[A>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,h=0|Zt(e,c,0|m[h+g|0],o,0),f[(0|d[p>>2])+g|0]=h):(a=(0|Jt(e,g,0))+g|0,n=0|d[i>>2],t=0|m[n+(a+-1)|0],n=0|m[n+a|0]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,g=a},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0,b=0,v=0;if(n=0|d[(i=(e|=0)+4596|0)>>2],!((0|(t=0|d[(r=e+172|0)>>2]))<=0))for(S=e+4600|0,b=e+4604|0,v=e+4592|0,c=n,s=0|g[n+-2>>1],n=0|g[n>>1],A=0;m=0|d[S>>2],p=65535&(l=0|h[m+(A+-1<<1)>>1]),a=0|g[c+((o=A+1|0)<<1)>>1],u=0|d[b>>2],c=n-s|0,s=s-p|0,m=m+(A<<1)|0,(u=(9*((9*(0|f[u+(a-n)|0])|0)+(0|f[u+c|0])|0)|0)+(0|f[u+s|0])|0)?(t=((t=n-p>>31)^s)<0?n:p+((t^c)<0?0:c)|0,p=0|ti(e,u,0|g[m>>1],t,0),h[(0|d[S>>2])+(A<<1)>>1]=p):((0|(n=(t=0|ii(e,l,m,t-A|0))+A|0))!=(0|d[r>>2])&&(p=0|ri(e,p,0|g[(0|d[i>>2])+(n<<1)>>1]),h[(0|d[S>>2])+(n<<1)>>1]=p,p=0|d[v>>2],d[v>>2]=(0|p)<1?0:p+-1|0,t=t+1|0),o=t+A|0,a=0|d[i>>2],n=0|g[a+(o+-1<<1)>>1],a=0|g[a+(o<<1)>>1]),!((0|(t=0|d[r>>2]))<=(0|o));)c=0|d[i>>2],s=n,n=a,A=o},function(e,t){t|=0;var i,r,n,a,o,s,l,c,u,m,p,A=0,S=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0,_=0,N=0,U=0,O=0,B=0,V=0;if(p=b,b=b+32|0,i=p+24|0,m=p+18|0,u=p+12|0,r=p+6|0,n=p,(0|(t=0|d[(a=(e|=0)+172|0)>>2]))<=0)b=p;else{for(o=e+4600|0,s=e+4596|0,l=e+4604|0,c=e+4592|0,B=0;S=B+-1|0,v=0|d[o>>2],V=0|d[s>>2],A=B+1|0,w=0|g[V+(6*B|0)>>1],O=0|d[l>>2],y=w-(T=0|g[V+(6*S|0)>>1])|0,I=T-(C=0|g[v+(6*S|0)>>1])|0,D=(9*((9*(0|f[O+((0|g[V+(6*A|0)>>1])-w)|0])|0)+(0|f[O+y|0])|0)|0)+(0|f[O+I|0])|0,M=(x=0|g[V+(6*B|0)+2>>1])-(E=0|g[V+(6*S|0)+2>>1])|0,R=E-(k=0|g[v+(6*S|0)+2>>1])|0,F=(9*((9*(0|f[O+((0|g[V+(6*A|0)+2>>1])-x)|0])|0)+(0|f[O+M|0])|0)|0)+(0|f[O+R|0])|0,_=(P=0|g[V+(6*B|0)+4>>1])-(L=0|g[V+(6*S|0)+4>>1])|0,U=L-(N=0|g[v+(6*S|0)+4>>1])|0,F|D|(O=(9*((9*(0|f[O+((0|g[V+(6*A|0)+4>>1])-P)|0])|0)+(0|f[O+_|0])|0)|0)+(0|f[O+U|0])|0)?(w=0|ci(e,D,S=0|g[v+(6*B|0)>>1],t=((t=w-C>>31)^I)>=0?(t^y)<0?C:C-T+w|0:w,0),S=0|ci(e,F,S=0|g[(0|d[o>>2])+(6*B|0)+2>>1],t=((t=x-k>>31)^R)>=0?(t^M)<0?k:k-E+x|0:x,0),O=0|ci(e,O,v=0|g[(0|d[o>>2])+(6*B|0)+4>>1],t=((t=P-N>>31)^U)>=0?(t^_)<0?N:N-L+P|0:P,0),V=0|d[o>>2],h[V+(6*B|0)>>1]=w,h[V+(6*B|0)+2>>1]=S,h[V+(6*B|0)+4>>1]=O):(A=v+(6*S|0)|0,h[u>>1]=0|h[A>>1],h[u+2>>1]=0|h[A+2>>1],h[u+4>>1]=0|h[A+4>>1],h[i>>1]=0|h[A>>1],h[i+2>>1]=0|h[A+2>>1],h[i+4>>1]=0|h[A+4>>1],(0|(A=(t=0|si(e,i,v+(6*B|0)|0,t-B|0))+B|0))!=(0|d[a>>2])&&(V=(0|d[s>>2])+(6*A|0)|0,h[n>>1]=0|h[V>>1],h[n+2>>1]=0|h[V+2>>1],h[n+4>>1]=0|h[V+4>>1],V=(0|d[o>>2])+(6*A|0)|0,h[m>>1]=0|h[u>>1],h[m+2>>1]=0|h[u+2>>1],h[m+4>>1]=0|h[u+4>>1],h[i>>1]=0|h[n>>1],h[i+2>>1]=0|h[n+2>>1],h[i+4>>1]=0|h[n+4>>1],li(r,e,m,i),h[V>>1]=0|h[r>>1],h[V+2>>1]=0|h[r+2>>1],h[V+4>>1]=0|h[r+4>>1],V=0|d[c>>2],d[c>>2]=(0|V)<1?0:V+-1|0,t=t+1|0),A=t+B|0),!((0|A)>=(0|(t=0|d[a>>2])));)B=A;b=p}},function(e,t){t|=0;var i,r,n,a,o,s,l,c,u,h,g,p=0,A=0,S=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0,_=0,N=0,U=0,O=0,B=0;if(g=b,b=b+16|0,i=g+12|0,h=g+9|0,u=g+6|0,r=g+3|0,n=g,(0|(t=0|d[(a=(e|=0)+172|0)>>2]))<=0)b=g;else{for(o=e+4600|0,s=e+4596|0,l=e+4604|0,c=e+4592|0,O=0;_=O+-1|0,S=(A=0|d[o>>2])+(3*_|0)|0,B=0|d[s>>2],p=O+1|0,v=0|m[B+(3*O|0)|0],U=0|d[l>>2],T=v-(w=0|m[B+(3*_|0)|0])|0,C=w-(y=0|m[S|0])|0,I=(9*((9*(0|f[U+((0|m[B+(3*p|0)|0])-v)|0])|0)+(0|f[U+T|0])|0)|0)+(0|f[U+C|0])|0,E=(D=0|m[B+(3*O|0)+1|0])-(x=0|m[B+(3*_|0)+1|0])|0,k=x-(M=0|m[A+(3*_|0)+1|0])|0,R=(9*((9*(0|f[U+((0|m[B+(3*p|0)+1|0])-D)|0])|0)+(0|f[U+E|0])|0)|0)+(0|f[U+k|0])|0,L=(F=0|m[B+(3*O|0)+2|0])-(P=0|m[B+(3*_|0)+2|0])|0,N=P-(_=0|m[A+(3*_|0)+2|0])|0,R|I|(U=(9*((9*(0|f[U+((0|m[B+(3*p|0)+2|0])-F)|0])|0)+(0|f[U+L|0])|0)|0)+(0|f[U+N|0])|0)?(v=0|di(e,I,A=0|m[A+(3*O|0)|0],t=((t=v-y>>31)^C)>=0?(t^T)<0?y:y-w+v|0:v,0),A=0|di(e,R,A=0|m[(0|d[o>>2])+(3*O|0)+1|0],t=((t=D-M>>31)^k)>=0?(t^E)<0?M:M-x+D|0:D,0),U=0|di(e,U,S=0|m[(0|d[o>>2])+(3*O|0)+2|0],t=((t=F-_>>31)^N)>=0?(t^L)<0?_:_-P+F|0:F,0),B=(0|d[o>>2])+(3*O|0)|0,f[B|0]=v,f[B+1|0]=A,f[B+2|0]=U):(f[u|0]=0|f[S|0],f[u+1|0]=0|f[S+1|0],f[u+2|0]=0|f[S+2|0],f[i|0]=0|f[S|0],f[i+1|0]=0|f[S+1|0],f[i+2|0]=0|f[S+2|0],(0|(p=(t=0|fi(e,i,A+(3*O|0)|0,t-O|0))+O|0))!=(0|d[a>>2])&&(B=(0|d[s>>2])+(3*p|0)|0,f[n|0]=0|f[B|0],f[n+1|0]=0|f[B+1|0],f[n+2|0]=0|f[B+2|0],B=0|d[o>>2],f[h|0]=0|f[u|0],f[h+1|0]=0|f[u+1|0],f[h+2|0]=0|f[u+2|0],f[i|0]=0|f[n|0],f[i+1|0]=0|f[n+1|0],f[i+2|0]=0|f[n+2|0],hi(r,e,h,i),f[(B=B+(3*p|0)|0)|0]=0|f[r|0],f[B+1|0]=0|f[r+1|0],f[B+2|0]=0|f[r+2|0],B=0|d[c>>2],d[c>>2]=(0|B)<1?0:B+-1|0,t=t+1|0),p=t+O|0),!((0|p)>=(0|(t=0|d[a>>2])));)O=p;b=g}},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0;if(t=0|d[(i=(e|=0)+4572|0)>>2],!((0|d[(r=e+148|0)>>2])<=0))for(A=e+4576|0,S=e+4580|0,o=t,s=0|g[t+-2>>1],t=0|g[t>>1],p=0;m=0|d[A>>2],u=0|g[m+(p+-1<<1)>>1],n=0|g[o+((a=p+1|0)<<1)>>1],c=0|d[S>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,m=0|gi(e,c,0|g[m+(p<<1)>>1],o,0),h[(0|d[A>>2])+(p<<1)>>1]=m):(a=(0|pi(e,p,0))+p|0,n=0|d[i>>2],t=0|g[n+(a+-1<<1)>>1],n=0|g[n+(a<<1)>>1]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,p=a},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,m=0,p=0,A=0,S=0;if(t=0|d[(i=(e|=0)+4572|0)>>2],!((0|d[(r=e+148|0)>>2])<=0))for(A=e+4576|0,S=e+4580|0,o=t,s=0|g[t+-2>>1],t=0|g[t>>1],p=0;m=0|d[A>>2],u=0|g[m+(p+-1<<1)>>1],n=0|g[o+((a=p+1|0)<<1)>>1],c=0|d[S>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,m=0|Si(e,c,0|g[m+(p<<1)>>1],o,0),h[(0|d[A>>2])+(p<<1)>>1]=m):(a=(0|bi(e,p,0))+p|0,n=0|d[i>>2],t=0|g[n+(a+-1<<1)>>1],n=0|g[n+(a<<1)>>1]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,p=a},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0;if(t=0|d[(i=(e|=0)+4572|0)>>2],!((0|d[(r=e+148|0)>>2])<=0))for(p=e+4576|0,A=e+4580|0,o=t,s=0|m[t+-1|0],t=0|m[t|0],g=0;h=0|d[p>>2],u=0|m[h+(g+-1)|0],n=0|m[o+(a=g+1|0)|0],c=0|d[A>>2],l=t-s|0,o=s-u|0,(c=(9*((9*(0|f[c+(n-t)|0])|0)+(0|f[c+l|0])|0)|0)+(0|f[c+o|0])|0)?(o=((s=t-u>>31)^o)<0?t:u+((s^l)<0?0:l)|0,h=0|wi(e,c,0|m[h+g|0],o,0),f[(0|d[p>>2])+g|0]=h):(a=(0|Ti(e,g,0))+g|0,n=0|d[i>>2],t=0|m[n+(a+-1)|0],n=0|m[n+a|0]),!((0|a)>=(0|d[r>>2]));)o=0|d[i>>2],s=t,t=n,g=a},function(e,t){t|=0;var i,r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,b=0,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0;if(!((0|d[(i=(e|=0)+148|0)>>2])<=0))for(x=e+4576|0,E=e+4572|0,M=e+4580|0,D=0;y=D+-1|0,o=0|d[x>>2],s=0|d[E>>2],t=D+1|0,a=0|m[s+(3*D|0)|0],I=0|d[M>>2],c=a-(l=0|m[s+(3*y|0)|0])|0,h=l-(u=0|m[o+(3*y|0)|0])|0,g=(9*((9*(0|f[I+((0|m[s+(3*t|0)|0])-a)|0])|0)+(0|f[I+c|0])|0)|0)+(0|f[I+h|0])|0,A=(n=0|m[s+(3*D|0)+1|0])-(p=0|m[s+(3*y|0)+1|0])|0,b=p-(S=0|m[o+(3*y|0)+1|0])|0,v=(9*((9*(0|f[I+((0|m[s+(3*t|0)+1|0])-n)|0])|0)+(0|f[I+A|0])|0)|0)+(0|f[I+b|0])|0,T=(r=0|m[s+(3*D|0)+2|0])-(w=0|m[s+(3*y|0)+2|0])|0,C=w-(y=0|m[o+(3*y|0)+2|0])|0,v|g|(I=(9*((9*(0|f[I+((0|m[s+(3*t|0)+2|0])-r)|0])|0)+(0|f[I+T|0])|0)|0)+(0|f[I+C|0])|0)?(s=0|m[o+(3*D|0)|0],((o=a-u>>31)^h)>=0&&(a=(o^c)<0?u:u-l+a|0),s=0|Ii(e,g,s,a,0),((a=n-S>>31)^b)>=0&&(n=(a^A)<0?S:S-p+n|0),a=0|Ii(e,v,o=0|m[(0|d[x>>2])+(3*D|0)+1|0],n,0),((n=r-y>>31)^C)>=0&&(r=(n^T)<0?y:y-w+r|0),I=0|Ii(e,I,o=0|m[(0|d[x>>2])+(3*D|0)+2|0],r,0),D=(0|d[x>>2])+(3*D|0)|0,f[D|0]=s,f[D+1|0]=a,f[D+2|0]=I):t=(0|Ci(e,D,0))+D|0,(0|t)<(0|d[i>>2]);)D=t},function(e,t){t|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,b=0;if(n=0|d[(i=(e|=0)+4596|0)>>2],!((0|(t=0|d[(r=e+172|0)>>2]))<=0))for(A=e+4600|0,S=e+4604|0,b=e+4592|0,c=n,s=0|m[n+-1|0],n=0|m[n|0],p=0;h=0|d[A>>2],g=255&(l=0|f[h+(p+-1)|0]),a=0|m[c+(o=p+1|0)|0],u=0|d[S>>2],c=n-s|0,s=s-g|0,h=h+p|0,(u=(9*((9*(0|f[u+(a-n)|0])|0)+(0|f[u+c|0])|0)|0)+(0|f[u+s|0])|0)?(t=((t=n-g>>31)^s)<0?n:g+((t^c)<0?0:c)|0,g=0|Ta(e,u,0|m[h|0],t,0),f[(0|d[A>>2])+p|0]=g):((0|(n=(t=0|ya(e,l,h,t-p|0))+p|0))!=(0|d[r>>2])&&(g=0|Ca(e,g,0|m[(0|d[i>>2])+n|0]),f[(0|d[A>>2])+n|0]=g,g=0|d[b>>2],d[b>>2]=(0|g)<1?0:g+-1|0,t=t+1|0),o=t+p|0,a=0|d[i>>2],n=0|m[a+(o+-1)|0],a=0|m[a+o|0]),!((0|(t=0|d[r>>2]))<=(0|o));)c=0|d[i>>2],s=n,n=a,p=o},function(e,t){var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;if(g=(65535&(t|=0))>>>8&255,(n=0|d[(i=(e|=0)+4|0)>>2])>>>0>=(a=0|d[(r=e+8|0)>>2])>>>0?((0|(l=n-(s=o=0|d[e>>2])+1|0))<0&&(Na(e),s=0|d[e>>2],a=0|d[r>>2],o=s),(n=a-(m=o)|0)>>>0<1073741823?(n=(n<<=1)>>>0>>0?l:n,a=(l=0|d[i>>2])-m|0,n?p=8:(h=0,u=0,c=a,n=l)):(n=2147483647,l=a=0|d[i>>2],a=a-m|0,p=8),8==(0|p)&&(h=n,u=0|Oa(n),c=a,n=l),f[u+c|0]=g,a=u+(c+1)|0,Wn(0|(g=u+(c-(m=n-m|0))|0),0|o,0|m),d[e>>2]=g,d[i>>2]=a,d[r>>2]=u+h,s&&(Ba(s),a=0|d[i>>2])):(f[n|0]=g,a=1+(0|d[i>>2])|0,d[i>>2]=a),m=255&t,a>>>0<(n=0|d[r>>2])>>>0)return f[a|0]=m,void(d[i>>2]=1+(0|d[i>>2]));(0|(a=a-(s=o=0|d[e>>2])+1|0))<0&&(Na(e),s=0|d[e>>2],n=0|d[r>>2],o=s),(n=n-(h=o)|0)>>>0<1073741823?(n=(n<<=1)>>>0>>0?a:n,a=(l=0|d[i>>2])-h|0,n?p=18:(u=0,c=0,n=l)):(n=2147483647,l=a=0|d[i>>2],a=a-h|0,p=18),18==(0|p)&&(u=n,c=0|Oa(n),n=l),f[c+a|0]=m,Wn(0|(p=c+(a-(t=n-h|0))|0),0|o,0|t),d[e>>2]=p,d[i>>2]=c+(a+1),d[r>>2]=c+u,s&&Ba(s)},La,function(e,t){e|=0;var i,r=0;r=0|Oa((i=0|Go(t|=0))+13|0),d[r>>2]=i,d[r+4>>2]=i,d[r+8>>2]=0,Wn(0|(r=r+12|0),0|t,i+1|0),d[e>>2]=r},function(e,t){t|=0,d[(e|=0)>>2]=36868,y=0,L(86,e+4|0,0|(1&f[t|0]?d[t+8>>2]:t+1)),e=y,y=0,1&e&&(e=0|ae(),de(0|e))},function(e,t){t|=0;var i,r,n=0;if(i=(e|=0)+32|0,r=e+36|0,n=0|d[e+40>>2])do{n=n+-1|0,ds[15&d[(0|d[i>>2])+(n<<2)>>2]](t,e,0|d[(0|d[r>>2])+(n<<2)>>2])}while(0|n)},function(e,t){t|=0;var i=0;f[(e|=0)|0]=0,d[e+4>>2]=t,i=0|d[(0|d[t>>2])-12>>2],0|d[t+(i+16)>>2]||((i=0|d[t+(i+72)>>2])&&hn(i),f[e|0]=1)},function(e,t){t|=0,d[(e|=0)>>2]=36868,y=0,L(86,e+4|0,0|t),e=y,y=0,1&e&&(e=0|ae(),de(0|e))},function(e,t){e|=0;var i=0,r=0,n=0,a=0,o=0,s=0;(t|=0)>>>0>4294967279&&_a(e),1&(i=0|f[e|0])?(r=(-2&(i=0|d[e>>2]))-1|0,i&=255):r=10,o=(t=(s=1&i?0|d[e+4>>2]:(255&i)>>>1)>>>0>t>>>0?s:t)>>>0<11?10:(t+16&-16)-1|0;e:do{if((0|o)!=(0|r)){do{if(10!=(0|o)){if(t=o+1|0,o>>>0<=r>>>0){if(y=0,t=0|N(67,0|t),a=y,y=0,1&a){e=0|ae(0),ue(0|e),he();break e}}else t=0|Oa(t);if(1&i){r=1,n=0|d[e+8>>2],a=1;break}r=1,n=e+1|0,a=0;break}t=e+1|0,r=0,n=0|d[e+8>>2],a=1}while(0);if(Wn(0|t,0|n,(i=1&i?0|d[e+4>>2]:(255&i)>>>1)+1|0),a&&Ba(n),r){d[e>>2]=o+1|1,d[e+4>>2]=s,d[e+8>>2]=t;break}f[e|0]=s<<1;break}}while(0)},function(e,t){t|=0;var i=0,r=0,n=0,a=0;(r=!!(1&(i=0|f[(e|=0)|0])))?(n=(-2&d[e>>2])-1|0,a=0|d[e+4>>2]):(n=1,a=(255&i)>>>1),(0|a)==(0|n)?($r(e,n,1,n,n,0,0),n=1&f[e|0]?8:7):n=r?8:7,7==(0|n)?(f[e|0]=2+(a<<1),i=e+4|0,r=a+1|0):8==(0|n)&&(i=0|d[e+8>>2],r=a+1|0,d[e+4>>2]=r),d[i+(a<<2)>>2]=t,d[i+(r<<2)>>2]=0},function(e,t){e|=0;var i=0,r=0,n=0,a=0,o=0,s=0;(t|=0)>>>0>1073741807&&_a(e),1&(i=0|f[e|0])?(r=(-2&(i=0|d[e>>2]))-1|0,i&=255):r=1,o=(t=(s=1&i?0|d[e+4>>2]:(255&i)>>>1)>>>0>t>>>0?s:t)>>>0<2?1:(t+4&-4)-1|0;e:do{if((0|o)!=(0|r)){do{if(1!=(0|o)){if(t=4+(o<<2)|0,o>>>0<=r>>>0){if(y=0,t=0|N(67,0|t),a=y,y=0,1&a){e=0|ae(0),ue(0|e),he();break e}}else t=0|Oa(t);if(1&i){r=1,n=0|d[e+8>>2],a=1;break}r=1,n=e+4|0,a=0;break}t=e+4|0,r=0,n=0|d[e+8>>2],a=1}while(0);if(Ho(t,n,(i=1&i?0|d[e+4>>2]:(255&i)>>>1)+1|0),a&&Ba(n),r){d[e>>2]=o+1|1,d[e+4>>2]=s,d[e+8>>2]=t;break}f[e|0]=s<<1;break}}while(0)},function(e,t){t|=0;var i=0;d[(e|=0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,f[e+128|0]=0;do{if(t){if(y=0,L(125,0|e,0|t),i=y,y=0,!(1&i)){Gn(e,t);break}i=0|ae(),qn(e),de(0|i)}}while(0)},function(e,t){cr(e|=0,t|=0,0|gr(43148))},function(e,t){cr(e|=0,t|=0,0|gr(43188))},function(e,t){cr(e|=0,t|=0,0|gr(44220))},function(e,t){cr(e|=0,t|=0,0|gr(44212))},function(e,t){cr(e|=0,t|=0,0|gr(44280))},function(e,t){t|=0;var i=0;d[(e|=0)+4>>2]=t+-1,d[e>>2]=44304,y=0,t=0|H(3),i=y,y=0,1&i?(i=0|ae(),de(0|i)):d[e+8>>2]=t},function(e,t){cr(e|=0,t|=0,0|gr(44288))},function(e,t){cr(e|=0,t|=0,0|gr(44344))},function(e,t){cr(e|=0,t|=0,0|gr(44352))},function(e,t){cr(e|=0,t|=0,0|gr(44360))},function(e,t){cr(e|=0,t|=0,0|gr(44368))},function(e,t){cr(e|=0,t|=0,0|gr(43260))},function(e,t){cr(e|=0,t|=0,0|gr(43332))},function(e,t){cr(e|=0,t|=0,0|gr(43392))},function(e,t){cr(e|=0,t|=0,0|gr(43452))},function(e,t){cr(e|=0,t|=0,0|gr(43764))},function(e,t){cr(e|=0,t|=0,0|gr(43828))},function(e,t){cr(e|=0,t|=0,0|gr(43892))},function(e,t){cr(e|=0,t|=0,0|gr(43956))},function(e,t){cr(e|=0,t|=0,0|gr(43992))},function(e,t){cr(e|=0,t|=0,0|gr(44028))},function(e,t){cr(e|=0,t|=0,0|gr(44064))},function(e,t){cr(e|=0,t|=0,0|gr(44100))},function(e,t){cr(e|=0,t|=0,0|gr(43544))},function(e,t){cr(e|=0,t|=0,0|gr(43636))},function(e,t){cr(e|=0,t|=0,0|gr(43668))},function(e,t){cr(e|=0,t|=0,0|gr(43700))},function(e,t){cr(e|=0,t|=0,0|gr(44140))},function(e,t){cr(e|=0,t|=0,0|gr(44180))},function(e,t){t|=0;var i,r,n,a=0,o=0;if((r=(a=0|d[(n=(e|=0)+4|0)>>2])-(i=0|d[e>>2])>>2)>>>0>=t>>>0){if(r>>>0>t>>>0&&(0|a)!=(0|(o=i+(t<<2)|0))){do{a=a+-4|0}while((0|a)!=(0|o));d[n>>2]=a}}else!function(e,t){e|=0,t|=0;var i=0,r=0,n=0,a=0,o=0,s=0,l=0;l=b,b=b+32|0,s=l,a=0|d[e+8>>2],i=0|d[e+4>>2],a-i>>2>>>0>>0?(r=0|d[e>>2],o=i-r>>2,n=o+t|0,n>>>0>1073741823&&Na(e),i=a-r|0,i>>2>>>0<536870911?(i>>=1,i=i>>>0>>0?n:i):i=1073741823,function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n=0;d[e+12>>2]=0,d[e+16>>2]=r;do{if(t){if(t>>>0<29&!(0|f[(n=r+112|0)|0])){f[n|0]=1;break}r=0|Oa(t<<2);break}r=0}while(0);d[e>>2]=r,i=r+(i<<2)|0,d[e+8>>2]=i,d[e+4>>2]=i,d[e+12>>2]=r+(t<<2)}(s,i,o,e+16|0),o=s+8|0,a=0|d[o>>2],zn(0|a,0,t<<2),d[o>>2]=a+(t<<2),function(e,t){e|=0,t|=0;var i=0,r=0,n=0,a=0,o=0;r=0|d[e>>2],a=e+4|0,i=t+4|0,n=(0|d[a>>2])-r|0,o=(0|d[i>>2])+(0-(n>>2)<<2)|0,d[i>>2]=o,Wn(0|o,0|r,0|n),n=0|d[e>>2],d[e>>2]=d[i>>2],d[i>>2]=n,n=t+8|0,r=0|d[a>>2],d[a>>2]=d[n>>2],d[n>>2]=r,n=e+8|0,e=t+12|0,r=0|d[n>>2],d[n>>2]=d[e>>2],d[e>>2]=r,d[t>>2]=d[i>>2]}(e,s),function(e){e|=0;var t=0,i=0,r=0;if(i=0|d[e+4>>2],r=e+8|0,t=0|d[r>>2],(0|t)!=(0|i)){do{t=t+-4|0}while((0|t)!=(0|i));d[r>>2]=t}i=0|d[e>>2];do{if(i){if((0|(t=0|d[e+16>>2]))==(0|i)){f[t+112|0]=0;break}Ba(i);break}}while(0)}(s)):Gn(e,t),b=l}(e,t-r|0)},function(e,t){e|=0;var i=0;(t|=0)>>>0>1073741823&&Na(e),t>>>0<29&!(0|f[(i=e+128|0)|0])?(f[i|0]=1,i=e+16|0):i=0|Oa(t<<2),d[e+4>>2]=i,d[e>>2]=i,d[e+8>>2]=i+(t<<2)},aa,aa],es=[oa,function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u=0,h=0,m=0,g=0,p=0,A=0;c=b,b=b+64|0,s=c+56|0,u=c+52|0,g=c+48|0,h=c+44|0,m=c+40|0,o=c+36|0,p=c+32|0,A=c+8|0,l=c;e:do{if(1&d[r+4>>2]){u=0|rn(r),d[o>>2]=u,y=0,e=0|G(37,0|o,44220),g=y,y=0;do{if(1&g)A=0|ae(),Nr(u),u=A;else{if(Nr(u),u=0|rn(r),d[p>>2]=u,y=0,m=0|G(37,0|p,44360),p=y,y=0,1&p){A=0|ae(),Nr(u),u=A;break}if(Nr(u),y=0,L(0|d[24+(0|d[m>>2])>>2],0|A,0|m),p=y,y=0,1&p)h=A;else if(h=A+12|0,y=0,L(0|d[28+(0|d[m>>2])>>2],0|h,0|m),p=y,y=0,!(1&p)){if(d[l>>2]=d[i>>2],y=0,d[s>>2]=d[l>>2],u=0|R(7,0|t,0|s,0|A,A+24|0,0|e,0|n,1),n=y,y=0,1&n){u=0|ae(),qr(A+12|0),qr(A);break}f[a|0]=(0|u)==(0|A)&1,u=0|d[t>>2],qr(A+12|0),qr(A);break e}if(u=0|ae(),m=D,(0|A)!=(0|h))do{qr(h=h+-12|0)}while((0|h)!=(0|A))}}while(0);de(0|u)}else switch(d[g>>2]=-1,A=0|d[16+(0|d[e>>2])>>2],d[h>>2]=d[t>>2],d[m>>2]=d[i>>2],d[u>>2]=d[h>>2],d[s>>2]=d[m>>2],u=0|es[63&A](e,u,s,r,n,g),d[t>>2]=u,0|d[g>>2]){case 0:f[a|0]=0;break e;case 1:f[a|0]=1;break e;default:f[a|0]=1,d[n>>2]=4;break e}}while(0);return b=c,0|u},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0;D=b,b=b+240|0,A=D+202|0,o=D+200|0,E=D+24|0,x=D+12|0,v=D+8|0,C=D+40|0,I=D+4|0,w=D,S=0|Pn(r),vn(E,r,A,o),d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),p=y,y=0;e:do{if(1&p)M=25;else{h=x+8|0,g=x+1|0,r=1&f[x|0]?0|d[h>>2]:g,d[v>>2]=r,d[I>>2]=C,d[w>>2]=0,p=x+4|0,u=0|f[o|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),c=y,y=0,1&c){M=24;break}-1==(0|o)&&(d[t>>2]=0,e=0)}}else e=0;s=!(0|e),o=0|d[i>>2];do{if(o){if((0|d[o+12>>2])!=(0|d[o+16>>2])){if(s)break;break t}if(y=0,l=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){M=24;break t}if(-1!=(0|l)){if(s)break;break t}d[i>>2]=0,M=16;break}M=16}while(0);if(16==(0|M)){if(M=0,s){o=0;break}o=0}if(s=1&(s=0|f[x|0])?0|d[p>>2]:(255&s)>>>1,(0|d[v>>2])==(r+s|0)){if(y=0,W(8,0|x,s<<1,0),c=y,y=0,1&c){M=24;break}if(r=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|r,0),c=y,y=0,1&c){M=24;break}r=1&f[x|0]?0|d[h>>2]:g,d[v>>2]=r+s}if((0|(s=0|d[(l=e+12|0)>>2]))==(0|d[(c=e+16|0)>>2])){if(y=0,s=0|N(0|d[36+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=24;break}}else s=0|m[s|0];if(0|An(255&s,S,r,v,w,u,E,C,I,A))break;if((0|(o=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=o+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=24;break}}if(24==(0|M)){e=0|ae();break}if(0|(1&(k=0|f[E|0])?d[E+4>>2]:(255&k)>>>1)&&((T=0|d[I>>2])-C|0)<160&&(k=0|d[w>>2],d[I>>2]=T+4,d[T>>2]=k),y=0,r=0|Y(21,0|r,0|d[v>>2],0|n,0|S),k=y,y=0,!(1&k)){if(d[a>>2]=r,lr(E,C,0|d[I>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(o){if((0|d[o+12>>2])==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=25;break e}if(-1==(0|e)){d[i>>2]=0,M=49;break}}r||(M=50)}else M=49}while(0);return 49==(0|M)&&r&&(M=50),50==(0|M)&&(d[n>>2]=2|d[n>>2]),k=0|d[t>>2],qr(x),qr(E),b=D,0|k}M=25}}while(0);return 25==(0|M)&&(e=0|ae()),qr(x),qr(E),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,x=0,E=0,M=0,k=0,R=0;x=b,b=b+240|0,A=x+202|0,o=x+200|0,M=x+24|0,E=x+12|0,v=x+8|0,C=x+40|0,I=x+4|0,w=x,S=0|Pn(r),vn(M,r,A,o),d[E>>2]=0,d[E+4>>2]=0,d[E+8>>2]=0,e=1&f[E|0]?(-2&d[E>>2])-1|0:10,y=0,W(8,0|E,0|e,0),p=y,y=0;e:do{if(1&p)k=25;else{h=E+8|0,g=E+1|0,r=1&f[E|0]?0|d[h>>2]:g,d[v>>2]=r,d[I>>2]=C,d[w>>2]=0,p=E+4|0,u=0|f[o|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),c=y,y=0,1&c){k=24;break}-1==(0|o)&&(d[t>>2]=0,e=0)}}else e=0;o=!(0|e),s=0|d[i>>2];do{if(s){if((0|d[s+12>>2])!=(0|d[s+16>>2])){if(o)break;break t}if(y=0,l=0|N(0|d[36+(0|d[s>>2])>>2],0|s),c=y,y=0,1&c){k=24;break t}if(-1!=(0|l)){if(o)break;break t}d[i>>2]=0,k=16;break}k=16}while(0);if(16==(0|k)){if(k=0,o){s=0;break}s=0}if(o=1&(o=0|f[E|0])?0|d[p>>2]:(255&o)>>>1,(0|d[v>>2])==(r+o|0)){if(y=0,W(8,0|E,o<<1,0),c=y,y=0,1&c){k=24;break}if(r=1&f[E|0]?(-2&d[E>>2])-1|0:10,y=0,W(8,0|E,0|r,0),c=y,y=0,1&c){k=24;break}r=1&f[E|0]?0|d[h>>2]:g,d[v>>2]=r+o}if((0|(o=0|d[(l=e+12|0)>>2]))==(0|d[(c=e+16|0)>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=24;break}}else o=0|m[o|0];if(0|An(255&o,S,r,v,w,u,M,C,I,A))break;if((0|(o=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=o+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=24;break}}if(24==(0|k)){e=0|ae();break}if(0|(1&(R=0|f[M|0])?d[M+4>>2]:(255&R)>>>1)&&((T=0|d[I>>2])-C|0)<160&&(R=0|d[w>>2],d[I>>2]=T+4,d[T>>2]=R),y=0,r=0|Y(22,0|r,0|d[v>>2],0|n,0|S),o=D,R=y,y=0,!(1&R)){if(d[(R=a)>>2]=r,d[R+4>>2]=o,lr(M,C,0|d[I>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),R=y,y=0,1&R){k=25;break e}if(-1==(0|e)){d[i>>2]=0,k=49;break}}r||(k=50)}else k=49}while(0);return 49==(0|k)&&r&&(k=50),50==(0|k)&&(d[n>>2]=2|d[n>>2]),R=0|d[t>>2],qr(E),qr(M),b=x,0|R}k=25}}while(0);return 25==(0|k)&&(e=0|ae()),qr(E),qr(M),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0;x=b,b=b+240|0,S=x+202|0,o=x+200|0,M=x+24|0,E=x+12|0,w=x+8|0,I=x+40|0,D=x+4|0,T=x,v=0|Pn(r),vn(M,r,S,o),d[E>>2]=0,d[E+4>>2]=0,d[E+8>>2]=0,e=1&f[E|0]?(-2&d[E>>2])-1|0:10,y=0,W(8,0|E,0|e,0),A=y,y=0;e:do{if(1&A)k=25;else{g=E+8|0,p=E+1|0,r=1&f[E|0]?0|d[g>>2]:p,d[w>>2]=r,d[D>>2]=I,d[T>>2]=0,A=E+4|0,u=0|f[o|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),c=y,y=0,1&c){k=24;break}-1==(0|o)&&(d[t>>2]=0,e=0)}}else e=0;s=!(0|e),o=0|d[i>>2];do{if(o){if((0|d[o+12>>2])!=(0|d[o+16>>2])){if(s)break;break t}if(y=0,l=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){k=24;break t}if(-1!=(0|l)){if(s)break;break t}d[i>>2]=0,k=16;break}k=16}while(0);if(16==(0|k)){if(k=0,s){o=0;break}o=0}if(s=1&(s=0|f[E|0])?0|d[A>>2]:(255&s)>>>1,(0|d[w>>2])==(r+s|0)){if(y=0,W(8,0|E,s<<1,0),c=y,y=0,1&c){k=24;break}if(r=1&f[E|0]?(-2&d[E>>2])-1|0:10,y=0,W(8,0|E,0|r,0),c=y,y=0,1&c){k=24;break}r=1&f[E|0]?0|d[g>>2]:p,d[w>>2]=r+s}if((0|(s=0|d[(l=e+12|0)>>2]))==(0|d[(c=e+16|0)>>2])){if(y=0,s=0|N(0|d[36+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=24;break}}else s=0|m[s|0];if(0|An(255&s,v,r,w,T,u,M,I,D,S))break;if((0|(o=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=o+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=24;break}}if(24==(0|k)){e=0|ae();break}if(0|(1&(R=0|f[M|0])?d[M+4>>2]:(255&R)>>>1)&&((C=0|d[D>>2])-I|0)<160&&(R=0|d[T>>2],d[D>>2]=C+4,d[C>>2]=R),y=0,r=0|Y(23,0|r,0|d[w>>2],0|n,0|v),R=y,y=0,!(1&R)){if(h[a>>1]=r,lr(M,I,0|d[D>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(o){if((0|d[o+12>>2])==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),R=y,y=0,1&R){k=25;break e}if(-1==(0|e)){d[i>>2]=0,k=49;break}}r||(k=50)}else k=49}while(0);return 49==(0|k)&&r&&(k=50),50==(0|k)&&(d[n>>2]=2|d[n>>2]),R=0|d[t>>2],qr(E),qr(M),b=x,0|R}k=25}}while(0);return 25==(0|k)&&(e=0|ae()),qr(E),qr(M),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0;D=b,b=b+240|0,A=D+202|0,o=D+200|0,E=D+24|0,x=D+12|0,v=D+8|0,C=D+40|0,I=D+4|0,w=D,S=0|Pn(r),vn(E,r,A,o),d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),p=y,y=0;e:do{if(1&p)M=25;else{h=x+8|0,g=x+1|0,r=1&f[x|0]?0|d[h>>2]:g,d[v>>2]=r,d[I>>2]=C,d[w>>2]=0,p=x+4|0,u=0|f[o|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),c=y,y=0,1&c){M=24;break}-1==(0|o)&&(d[t>>2]=0,e=0)}}else e=0;s=!(0|e),o=0|d[i>>2];do{if(o){if((0|d[o+12>>2])!=(0|d[o+16>>2])){if(s)break;break t}if(y=0,l=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){M=24;break t}if(-1!=(0|l)){if(s)break;break t}d[i>>2]=0,M=16;break}M=16}while(0);if(16==(0|M)){if(M=0,s){o=0;break}o=0}if(s=1&(s=0|f[x|0])?0|d[p>>2]:(255&s)>>>1,(0|d[v>>2])==(r+s|0)){if(y=0,W(8,0|x,s<<1,0),c=y,y=0,1&c){M=24;break}if(r=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|r,0),c=y,y=0,1&c){M=24;break}r=1&f[x|0]?0|d[h>>2]:g,d[v>>2]=r+s}if((0|(s=0|d[(l=e+12|0)>>2]))==(0|d[(c=e+16|0)>>2])){if(y=0,s=0|N(0|d[36+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=24;break}}else s=0|m[s|0];if(0|An(255&s,S,r,v,w,u,E,C,I,A))break;if((0|(o=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=o+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=24;break}}if(24==(0|M)){e=0|ae();break}if(0|(1&(k=0|f[E|0])?d[E+4>>2]:(255&k)>>>1)&&((T=0|d[I>>2])-C|0)<160&&(k=0|d[w>>2],d[I>>2]=T+4,d[T>>2]=k),y=0,r=0|Y(24,0|r,0|d[v>>2],0|n,0|S),k=y,y=0,!(1&k)){if(d[a>>2]=r,lr(E,C,0|d[I>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(o){if((0|d[o+12>>2])==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=25;break e}if(-1==(0|e)){d[i>>2]=0,M=49;break}}r||(M=50)}else M=49}while(0);return 49==(0|M)&&r&&(M=50),50==(0|M)&&(d[n>>2]=2|d[n>>2]),k=0|d[t>>2],qr(x),qr(E),b=D,0|k}M=25}}while(0);return 25==(0|M)&&(e=0|ae()),qr(x),qr(E),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0;D=b,b=b+240|0,A=D+202|0,o=D+200|0,E=D+24|0,x=D+12|0,v=D+8|0,C=D+40|0,I=D+4|0,w=D,S=0|Pn(r),vn(E,r,A,o),d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),p=y,y=0;e:do{if(1&p)M=25;else{h=x+8|0,g=x+1|0,r=1&f[x|0]?0|d[h>>2]:g,d[v>>2]=r,d[I>>2]=C,d[w>>2]=0,p=x+4|0,u=0|f[o|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),c=y,y=0,1&c){M=24;break}-1==(0|o)&&(d[t>>2]=0,e=0)}}else e=0;s=!(0|e),o=0|d[i>>2];do{if(o){if((0|d[o+12>>2])!=(0|d[o+16>>2])){if(s)break;break t}if(y=0,l=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){M=24;break t}if(-1!=(0|l)){if(s)break;break t}d[i>>2]=0,M=16;break}M=16}while(0);if(16==(0|M)){if(M=0,s){o=0;break}o=0}if(s=1&(s=0|f[x|0])?0|d[p>>2]:(255&s)>>>1,(0|d[v>>2])==(r+s|0)){if(y=0,W(8,0|x,s<<1,0),c=y,y=0,1&c){M=24;break}if(r=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|r,0),c=y,y=0,1&c){M=24;break}r=1&f[x|0]?0|d[h>>2]:g,d[v>>2]=r+s}if((0|(s=0|d[(l=e+12|0)>>2]))==(0|d[(c=e+16|0)>>2])){if(y=0,s=0|N(0|d[36+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=24;break}}else s=0|m[s|0];if(0|An(255&s,S,r,v,w,u,E,C,I,A))break;if((0|(o=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=o+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=24;break}}if(24==(0|M)){e=0|ae();break}if(0|(1&(k=0|f[E|0])?d[E+4>>2]:(255&k)>>>1)&&((T=0|d[I>>2])-C|0)<160&&(k=0|d[w>>2],d[I>>2]=T+4,d[T>>2]=k),y=0,r=0|Y(25,0|r,0|d[v>>2],0|n,0|S),k=y,y=0,!(1&k)){if(d[a>>2]=r,lr(E,C,0|d[I>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),k=y,y=0,1&k){M=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(o){if((0|d[o+12>>2])==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=25;break e}if(-1==(0|e)){d[i>>2]=0,M=49;break}}r||(M=50)}else M=49}while(0);return 49==(0|M)&&r&&(M=50),50==(0|M)&&(d[n>>2]=2|d[n>>2]),k=0|d[t>>2],qr(x),qr(E),b=D,0|k}M=25}}while(0);return 25==(0|M)&&(e=0|ae()),qr(x),qr(E),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,x=0,E=0,M=0,k=0,R=0;x=b,b=b+240|0,A=x+202|0,o=x+200|0,M=x+24|0,E=x+12|0,v=x+8|0,C=x+40|0,I=x+4|0,w=x,S=0|Pn(r),vn(M,r,A,o),d[E>>2]=0,d[E+4>>2]=0,d[E+8>>2]=0,e=1&f[E|0]?(-2&d[E>>2])-1|0:10,y=0,W(8,0|E,0|e,0),p=y,y=0;e:do{if(1&p)k=25;else{h=E+8|0,g=E+1|0,r=1&f[E|0]?0|d[h>>2]:g,d[v>>2]=r,d[I>>2]=C,d[w>>2]=0,p=E+4|0,u=0|f[o|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),c=y,y=0,1&c){k=24;break}-1==(0|o)&&(d[t>>2]=0,e=0)}}else e=0;o=!(0|e),s=0|d[i>>2];do{if(s){if((0|d[s+12>>2])!=(0|d[s+16>>2])){if(o)break;break t}if(y=0,l=0|N(0|d[36+(0|d[s>>2])>>2],0|s),c=y,y=0,1&c){k=24;break t}if(-1!=(0|l)){if(o)break;break t}d[i>>2]=0,k=16;break}k=16}while(0);if(16==(0|k)){if(k=0,o){s=0;break}s=0}if(o=1&(o=0|f[E|0])?0|d[p>>2]:(255&o)>>>1,(0|d[v>>2])==(r+o|0)){if(y=0,W(8,0|E,o<<1,0),c=y,y=0,1&c){k=24;break}if(r=1&f[E|0]?(-2&d[E>>2])-1|0:10,y=0,W(8,0|E,0|r,0),c=y,y=0,1&c){k=24;break}r=1&f[E|0]?0|d[h>>2]:g,d[v>>2]=r+o}if((0|(o=0|d[(l=e+12|0)>>2]))==(0|d[(c=e+16|0)>>2])){if(y=0,o=0|N(0|d[36+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=24;break}}else o=0|m[o|0];if(0|An(255&o,S,r,v,w,u,M,C,I,A))break;if((0|(o=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=o+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=24;break}}if(24==(0|k)){e=0|ae();break}if(0|(1&(R=0|f[M|0])?d[M+4>>2]:(255&R)>>>1)&&((T=0|d[I>>2])-C|0)<160&&(R=0|d[w>>2],d[I>>2]=T+4,d[T>>2]=R),y=0,r=0|Y(26,0|r,0|d[v>>2],0|n,0|S),o=D,R=y,y=0,!(1&R)){if(d[(R=a)>>2]=r,d[R+4>>2]=o,lr(M,C,0|d[I>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),R=y,y=0,1&R){k=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),R=y,y=0,1&R){k=25;break e}if(-1==(0|e)){d[i>>2]=0,k=49;break}}r||(k=50)}else k=49}while(0);return 49==(0|k)&&r&&(k=50),50==(0|k)&&(d[n>>2]=2|d[n>>2]),R=0|d[t>>2],qr(E),qr(M),b=x,0|R}k=25}}while(0);return 25==(0|k)&&(e=0|ae()),qr(E),qr(M),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0;k=b,b=b+240|0,s=k+203|0,l=k+202|0,R=k+12|0,C=k+8|0,E=k+40|0,M=k+4|0,I=k,D=k+201|0,T=k+200|0,wn(F=k+24|0,r,w=k+208|0,s,l),d[R>>2]=0,d[R+4>>2]=0,d[R+8>>2]=0,e=1&f[R|0]?(-2&d[R>>2])-1|0:10,y=0,W(8,0|R,0|e,0),v=y,y=0;e:do{if(1&v)P=25;else{A=R+8|0,S=R+1|0,r=1&f[R|0]?0|d[A>>2]:S,d[C>>2]=r,d[M>>2]=E,d[I>>2]=0,f[D|0]=1,f[T|0]=69,v=R+4|0,g=0|f[s|0],h=0|f[l|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[e>>2])>>2],0|e),u=y,y=0,1&u){P=24;break}-1==(0|s)&&(d[t>>2]=0,e=0)}}else e=0;l=!(0|e),s=0|d[i>>2];do{if(s){if((0|d[s+12>>2])!=(0|d[s+16>>2])){if(l)break;break t}if(y=0,c=0|N(0|d[36+(0|d[s>>2])>>2],0|s),u=y,y=0,1&u){P=24;break t}if(-1!=(0|c)){if(l)break;break t}d[i>>2]=0,P=16;break}P=16}while(0);if(16==(0|P)){if(P=0,l){s=0;break}s=0}if(l=1&(l=0|f[R|0])?0|d[v>>2]:(255&l)>>>1,(0|d[C>>2])==(r+l|0)){if(y=0,W(8,0|R,l<<1,0),u=y,y=0,1&u){P=24;break}if(r=1&f[R|0]?(-2&d[R>>2])-1|0:10,y=0,W(8,0|R,0|r,0),u=y,y=0,1&u){P=24;break}r=1&f[R|0]?0|d[A>>2]:S,d[C>>2]=r+l}if((0|(l=0|d[(c=e+12|0)>>2]))==(0|d[(u=e+16|0)>>2])){if(y=0,l=0|N(0|d[36+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=24;break}}else l=0|m[l|0];if(0|Tn(255&l,D,T,r,C,g,h,F,E,M,I,w))break;if((0|(s=0|d[c>>2]))!=(0|d[u>>2]))d[c>>2]=s+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=24;break}}if(24==(0|P)){e=0|ae();break}if(L=0|f[F|0],!!(0|f[D|0]&&0|(1&L?d[F+4>>2]:(255&L)>>>1))&&((x=0|d[M>>2])-E|0)<160&&(L=0|d[I>>2],d[M>>2]=x+4,d[x>>2]=L),y=0,o=+z(1,0|r,0|d[C>>2],0|n),L=y,y=0,!(1&L)){if(p[a>>2]=o,lr(F,E,0|d[M>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),L=y,y=0,1&L){P=25;break e}if(-1==(0|e)){d[i>>2]=0,P=49;break}}r||(P=50)}else P=49}while(0);return 49==(0|P)&&r&&(P=50),50==(0|P)&&(d[n>>2]=2|d[n>>2]),L=0|d[t>>2],qr(R),qr(F),b=k,0|L}P=25}}while(0);return 25==(0|P)&&(e=0|ae()),qr(R),qr(F),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0;k=b,b=b+240|0,s=k+203|0,l=k+202|0,R=k+12|0,C=k+8|0,E=k+40|0,M=k+4|0,I=k,D=k+201|0,T=k+200|0,wn(F=k+24|0,r,w=k+208|0,s,l),d[R>>2]=0,d[R+4>>2]=0,d[R+8>>2]=0,e=1&f[R|0]?(-2&d[R>>2])-1|0:10,y=0,W(8,0|R,0|e,0),v=y,y=0;e:do{if(1&v)P=25;else{p=R+8|0,S=R+1|0,r=1&f[R|0]?0|d[p>>2]:S,d[C>>2]=r,d[M>>2]=E,d[I>>2]=0,f[D|0]=1,f[T|0]=69,v=R+4|0,g=0|f[s|0],h=0|f[l|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[e>>2])>>2],0|e),u=y,y=0,1&u){P=24;break}-1==(0|s)&&(d[t>>2]=0,e=0)}}else e=0;l=!(0|e),s=0|d[i>>2];do{if(s){if((0|d[s+12>>2])!=(0|d[s+16>>2])){if(l)break;break t}if(y=0,c=0|N(0|d[36+(0|d[s>>2])>>2],0|s),u=y,y=0,1&u){P=24;break t}if(-1!=(0|c)){if(l)break;break t}d[i>>2]=0,P=16;break}P=16}while(0);if(16==(0|P)){if(P=0,l){s=0;break}s=0}if(l=1&(l=0|f[R|0])?0|d[v>>2]:(255&l)>>>1,(0|d[C>>2])==(r+l|0)){if(y=0,W(8,0|R,l<<1,0),u=y,y=0,1&u){P=24;break}if(r=1&f[R|0]?(-2&d[R>>2])-1|0:10,y=0,W(8,0|R,0|r,0),u=y,y=0,1&u){P=24;break}r=1&f[R|0]?0|d[p>>2]:S,d[C>>2]=r+l}if((0|(l=0|d[(c=e+12|0)>>2]))==(0|d[(u=e+16|0)>>2])){if(y=0,l=0|N(0|d[36+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=24;break}}else l=0|m[l|0];if(0|Tn(255&l,D,T,r,C,g,h,F,E,M,I,w))break;if((0|(s=0|d[c>>2]))!=(0|d[u>>2]))d[c>>2]=s+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=24;break}}if(24==(0|P)){e=0|ae();break}if(L=0|f[F|0],!!(0|f[D|0]&&0|(1&L?d[F+4>>2]:(255&L)>>>1))&&((x=0|d[M>>2])-E|0)<160&&(L=0|d[I>>2],d[M>>2]=x+4,d[x>>2]=L),y=0,o=+z(2,0|r,0|d[C>>2],0|n),L=y,y=0,!(1&L)){if(A[a>>3]=o,lr(F,E,0|d[M>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),L=y,y=0,1&L){P=25;break e}if(-1==(0|e)){d[i>>2]=0,P=49;break}}r||(P=50)}else P=49}while(0);return 49==(0|P)&&r&&(P=50),50==(0|P)&&(d[n>>2]=2|d[n>>2]),L=0|d[t>>2],qr(R),qr(F),b=k,0|L}P=25}}while(0);return 25==(0|P)&&(e=0|ae()),qr(R),qr(F),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0;k=b,b=b+240|0,s=k+203|0,l=k+202|0,R=k+12|0,C=k+8|0,E=k+40|0,M=k+4|0,I=k,D=k+201|0,T=k+200|0,wn(F=k+24|0,r,w=k+208|0,s,l),d[R>>2]=0,d[R+4>>2]=0,d[R+8>>2]=0,e=1&f[R|0]?(-2&d[R>>2])-1|0:10,y=0,W(8,0|R,0|e,0),v=y,y=0;e:do{if(1&v)P=25;else{p=R+8|0,S=R+1|0,r=1&f[R|0]?0|d[p>>2]:S,d[C>>2]=r,d[M>>2]=E,d[I>>2]=0,f[D|0]=1,f[T|0]=69,v=R+4|0,g=0|f[s|0],h=0|f[l|0],e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[e>>2])>>2],0|e),u=y,y=0,1&u){P=24;break}-1==(0|s)&&(d[t>>2]=0,e=0)}}else e=0;l=!(0|e),s=0|d[i>>2];do{if(s){if((0|d[s+12>>2])!=(0|d[s+16>>2])){if(l)break;break t}if(y=0,c=0|N(0|d[36+(0|d[s>>2])>>2],0|s),u=y,y=0,1&u){P=24;break t}if(-1!=(0|c)){if(l)break;break t}d[i>>2]=0,P=16;break}P=16}while(0);if(16==(0|P)){if(P=0,l){s=0;break}s=0}if(l=1&(l=0|f[R|0])?0|d[v>>2]:(255&l)>>>1,(0|d[C>>2])==(r+l|0)){if(y=0,W(8,0|R,l<<1,0),u=y,y=0,1&u){P=24;break}if(r=1&f[R|0]?(-2&d[R>>2])-1|0:10,y=0,W(8,0|R,0|r,0),u=y,y=0,1&u){P=24;break}r=1&f[R|0]?0|d[p>>2]:S,d[C>>2]=r+l}if((0|(l=0|d[(c=e+12|0)>>2]))==(0|d[(u=e+16|0)>>2])){if(y=0,l=0|N(0|d[36+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=24;break}}else l=0|m[l|0];if(0|Tn(255&l,D,T,r,C,g,h,F,E,M,I,w))break;if((0|(s=0|d[c>>2]))!=(0|d[u>>2]))d[c>>2]=s+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=24;break}}if(24==(0|P)){e=0|ae();break}if(L=0|f[F|0],!!(0|f[D|0]&&0|(1&L?d[F+4>>2]:(255&L)>>>1))&&((x=0|d[M>>2])-E|0)<160&&(L=0|d[I>>2],d[M>>2]=x+4,d[x>>2]=L),y=0,o=+z(3,0|r,0|d[C>>2],0|n),L=y,y=0,!(1&L)){if(A[a>>3]=o,lr(F,E,0|d[M>>2],n),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),L=y,y=0,1&L){P=25;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),L=y,y=0,1&L){P=25;break e}if(-1==(0|e)){d[i>>2]=0,P=49;break}}r||(P=50)}else P=49}while(0);return 49==(0|P)&&r&&(P=50),50==(0|P)&&(d[n>>2]=2|d[n>>2]),L=0|d[t>>2],qr(R),qr(F),b=k,0|L}P=25}}while(0);return 25==(0|P)&&(e=0|ae()),qr(R),qr(F),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,h,g,p,A,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0;g=b,b=b+240|0,h=g,o=g+208|0,e=g+28|0,p=g+16|0,u=g+12|0,l=g+48|0,c=g+8|0,s=g+4|0,d[(A=g+32|0)>>2]=0,d[A+4>>2]=0,d[A+8>>2]=0,y=0,r=0|N(68,0|r),D=y,y=0;do{if(1&D)e=0|ae();else{if(d[e>>2]=r,y=0,e=0|G(37,0|e,44220),D=y,y=0,!(1&D||(y=0,Y(0|d[32+(0|d[e>>2])>>2],0|e,57498,57524,0|o),D=y,y=0,1&D))){Nr(r),d[p>>2]=0,d[p+4>>2]=0,d[p+8>>2]=0,e=1&f[p|0]?(-2&d[p>>2])-1|0:10,y=0,W(8,0|p,0|e,0),D=y,y=0;e:do{if(1&D)R=30;else{I=p+8|0,D=p+1|0,r=1&f[p|0]?0|d[I>>2]:D,d[u>>2]=r,d[c>>2]=l,d[s>>2]=0,C=p+4|0,e=0|d[t>>2];t:for(;;){if(e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,S=0|N(0|d[36+(0|d[e>>2])>>2],0|e),T=y,y=0,1&T){R=29;break}-1==(0|S)&&(d[t>>2]=0,e=0)}}else e=0;v=!(0|e),S=0|d[i>>2];do{if(S){if((0|d[S+12>>2])!=(0|d[S+16>>2])){if(v)break;break t}if(y=0,w=0|N(0|d[36+(0|d[S>>2])>>2],0|S),T=y,y=0,1&T){R=29;break t}if(-1!=(0|w)){if(v)break;break t}d[i>>2]=0,R=19;break}R=19}while(0);if(19==(0|R)){if(R=0,v){S=0;break}S=0}if(v=1&(v=0|f[p|0])?0|d[C>>2]:(255&v)>>>1,(0|d[u>>2])==(r+v|0)){if(y=0,W(8,0|p,v<<1,0),T=y,y=0,1&T){R=29;break}if(r=1&f[p|0]?(-2&d[p>>2])-1|0:10,y=0,W(8,0|p,0|r,0),T=y,y=0,1&T){R=29;break}r=1&f[p|0]?0|d[I>>2]:D,d[u>>2]=r+v}if((0|(v=0|d[(w=e+12|0)>>2]))==(0|d[(T=e+16|0)>>2])){if(y=0,v=0|N(0|d[36+(0|d[e>>2])>>2],0|e),F=y,y=0,1&F){R=29;break}}else v=0|m[v|0];if(0|An(255&v,16,r,u,s,0,A,l,c,o))break;if((0|(S=0|d[w>>2]))!=(0|d[T>>2]))d[w>>2]=S+1;else if(y=0,N(0|d[40+(0|d[e>>2])>>2],0|e),F=y,y=0,1&F){R=29;break}}if(29==(0|R)){e=0|ae();break}if(y=0,W(8,0|p,(0|d[u>>2])-r|0,0),F=y,y=0,!(1&F||(x=0|f[p|0],E=0|d[I>>2],y=0,M=0|H(3),F=y,y=0,1&F)||(y=0,d[h>>2]=a,k=0|Y(16,0|(1&x?E:D),0|M,58882,0|h),F=y,y=0,1&F))){if(1!=(0|k)&&(d[n>>2]=4),e){if((0|d[e+12>>2])==(0|d[e+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[e>>2])>>2],0|e),F=y,y=0,1&F){R=30;break}-1==(0|r)&&(d[t>>2]=0,e=0)}}else e=0;r=!(0|e);do{if(S){if((0|d[S+12>>2])==(0|d[S+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[S>>2])>>2],0|S),F=y,y=0,1&F){R=30;break e}if(-1==(0|e)){d[i>>2]=0,R=55;break}}r||(R=56)}else R=55}while(0);return 55==(0|R)&&r&&(R=56),56==(0|R)&&(d[n>>2]=2|d[n>>2]),F=0|d[t>>2],qr(p),qr(A),b=g,0|F}R=30}}while(0);30==(0|R)&&(e=0|ae()),qr(p);break}e=0|ae(),Nr(r)}}while(0);return qr(A),de(0|e),0},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u=0,h=0,m=0,g=0,p=0,A=0;c=b,b=b+64|0,s=c+56|0,u=c+52|0,g=c+48|0,h=c+44|0,m=c+40|0,o=c+36|0,p=c+32|0,A=c+8|0,l=c;e:do{if(1&d[r+4>>2]){u=0|rn(r),d[o>>2]=u,y=0,e=0|G(37,0|o,44212),g=y,y=0;do{if(1&g)A=0|ae(),Nr(u),u=A;else{if(Nr(u),u=0|rn(r),d[p>>2]=u,y=0,m=0|G(37,0|p,44368),p=y,y=0,1&p){A=0|ae(),Nr(u),u=A;break}if(Nr(u),y=0,L(0|d[24+(0|d[m>>2])>>2],0|A,0|m),p=y,y=0,1&p)h=A;else if(h=A+12|0,y=0,L(0|d[28+(0|d[m>>2])>>2],0|h,0|m),p=y,y=0,!(1&p)){if(d[l>>2]=d[i>>2],y=0,d[s>>2]=d[l>>2],u=0|R(8,0|t,0|s,0|A,A+24|0,0|e,0|n,1),n=y,y=0,1&n){u=0|ae(),Zr(A+12|0),Zr(A);break}f[a|0]=(0|u)==(0|A)&1,u=0|d[t>>2],Zr(A+12|0),Zr(A);break e}if(u=0|ae(),m=D,(0|A)!=(0|h))do{Zr(h=h+-12|0)}while((0|h)!=(0|A))}}while(0);de(0|u)}else switch(d[g>>2]=-1,A=0|d[16+(0|d[e>>2])>>2],d[h>>2]=d[t>>2],d[m>>2]=d[i>>2],d[u>>2]=d[h>>2],d[s>>2]=d[m>>2],u=0|es[63&A](e,u,s,r,n,g),d[t>>2]=u,0|d[g>>2]){case 0:f[a|0]=0;break e;case 1:f[a|0]=1;break e;default:f[a|0]=1,d[n>>2]=4;break e}}while(0);return b=c,0|u},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0;I=b,b=b+320|0,p=I+208|0,o=I+200|0,x=I+24|0,D=I+12|0,S=I+8|0,T=I+40|0,C=I+4|0,v=I,A=0|Pn(r),yn(x,r,p,o),d[D>>2]=0,d[D+4>>2]=0,d[D+8>>2]=0,e=1&f[D|0]?(-2&d[D>>2])-1|0:10,y=0,W(8,0|D,0|e,0),g=y,y=0;e:do{if(1&g)E=26;else{h=D+8|0,m=D+1|0,e=1&f[D|0]?0|d[h>>2]:m,d[S>>2]=e,d[C>>2]=T,d[v>>2]=0,g=D+4|0,u=0|d[o>>2],o=0|d[t>>2];t:for(;;){if(o){if((0|(r=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){E=25;break}}else r=0|d[r>>2];-1==(0|r)?(d[t>>2]=0,r=0,s=1):(r=o,s=0)}else r=0,s=1;l=0|d[i>>2];do{if(l){if((0|(o=0|d[l+12>>2]))==(0|d[l+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[l>>2])>>2],0|l),c=y,y=0,1&c){E=25;break t}}else o=0|d[o>>2];if(-1!=(0|o)){if(s)break;o=l;break t}d[i>>2]=0,E=17;break}E=17}while(0);if(17==(0|E)){if(E=0,s){o=0;break}l=0}if(o=1&(o=0|f[D|0])?0|d[g>>2]:(255&o)>>>1,(0|d[S>>2])==(e+o|0)){if(y=0,W(8,0|D,o<<1,0),c=y,y=0,1&c){E=25;break}if(e=1&f[D|0]?(-2&d[D>>2])-1|0:10,y=0,W(8,0|D,0|e,0),c=y,y=0,1&c){E=25;break}e=1&f[D|0]?0|d[h>>2]:m,d[S>>2]=e+o}if((0|(o=0|d[(s=r+12|0)>>2]))==(0|d[(c=r+16|0)>>2])){if(y=0,o=0|N(0|d[36+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=25;break}}else o=0|d[o>>2];if(0|bn(o,A,e,S,v,u,x,T,C,p)){o=l;break}if((0|(o=0|d[s>>2]))!=(0|d[c>>2]))d[s>>2]=o+4,o=r;else{if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=25;break}o=r}}if(25==(0|E)){e=0|ae();break}if(0|(1&(M=0|f[x|0])?d[x+4>>2]:(255&M)>>>1)&&((w=0|d[C>>2])-T|0)<160&&(M=0|d[v>>2],d[C>>2]=w+4,d[w>>2]=M),y=0,e=0|Y(21,0|e,0|d[S>>2],0|n,0|A),M=y,y=0,!(1&M)){if(d[a>>2]=e,lr(x,T,0|d[C>>2],n),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(o){if((0|(e=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),M=y,y=0,1&M){E=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;E=53;break}d[i>>2]=0,E=51;break}E=51}while(0);return 51==(0|E)&&r&&(E=53),53==(0|E)&&(d[n>>2]=2|d[n>>2]),M=0|d[t>>2],qr(D),qr(x),b=I,0|M}E=26}}while(0);return 26==(0|E)&&(e=0|ae()),qr(D),qr(x),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,x=0,E=0,M=0,k=0;I=b,b=b+320|0,p=I+208|0,o=I+200|0,E=I+24|0,x=I+12|0,S=I+8|0,T=I+40|0,C=I+4|0,v=I,A=0|Pn(r),yn(E,r,p,o),d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),g=y,y=0;e:do{if(1&g)M=26;else{h=x+8|0,m=x+1|0,e=1&f[x|0]?0|d[h>>2]:m,d[S>>2]=e,d[C>>2]=T,d[v>>2]=0,g=x+4|0,u=0|d[o>>2],o=0|d[t>>2];t:for(;;){if(o){if((0|(r=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){M=25;break}}else r=0|d[r>>2];-1==(0|r)?(d[t>>2]=0,o=0,l=1):l=0}else o=0,l=1;s=0|d[i>>2];do{if(s){if((0|(r=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[s>>2])>>2],0|s),c=y,y=0,1&c){M=25;break t}}else r=0|d[r>>2];if(-1!=(0|r)){if(l)break;break t}d[i>>2]=0,M=17;break}M=17}while(0);if(17==(0|M)){if(M=0,l){s=0;break}s=0}if(r=1&(r=0|f[x|0])?0|d[g>>2]:(255&r)>>>1,(0|d[S>>2])==(e+r|0)){if(y=0,W(8,0|x,r<<1,0),c=y,y=0,1&c){M=25;break}if(e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),c=y,y=0,1&c){M=25;break}e=1&f[x|0]?0|d[h>>2]:m,d[S>>2]=e+r}if((0|(r=0|d[(l=o+12|0)>>2]))==(0|d[(c=o+16|0)>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=25;break}}else r=0|d[r>>2];if(0|bn(r,A,e,S,v,u,E,T,C,p))break;if((0|(r=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=r+4;else if(y=0,N(0|d[40+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=25;break}}if(25==(0|M)){e=0|ae();break}if(0|(1&(k=0|f[E|0])?d[E+4>>2]:(255&k)>>>1)&&((w=0|d[C>>2])-T|0)<160&&(k=0|d[v>>2],d[C>>2]=w+4,d[w>>2]=k),y=0,e=0|Y(22,0|e,0|d[S>>2],0|n,0|A),r=D,k=y,y=0,!(1&k)){if(d[(k=a)>>2]=e,d[k+4>>2]=r,lr(E,T,0|d[C>>2],n),o){if((0|(e=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(s){if((0|(e=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),k=y,y=0,1&k){M=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;M=53;break}d[i>>2]=0,M=51;break}M=51}while(0);return 51==(0|M)&&r&&(M=53),53==(0|M)&&(d[n>>2]=2|d[n>>2]),k=0|d[t>>2],qr(x),qr(E),b=I,0|k}M=26}}while(0);return 26==(0|M)&&(e=0|ae()),qr(x),qr(E),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0;D=b,b=b+320|0,A=D+208|0,o=D+200|0,E=D+24|0,x=D+12|0,v=D+8|0,C=D+40|0,I=D+4|0,w=D,S=0|Pn(r),yn(E,r,A,o),d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),p=y,y=0;e:do{if(1&p)M=26;else{m=x+8|0,g=x+1|0,e=1&f[x|0]?0|d[m>>2]:g,d[v>>2]=e,d[I>>2]=C,d[w>>2]=0,p=x+4|0,u=0|d[o>>2],o=0|d[t>>2];t:for(;;){if(o){if((0|(r=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){M=25;break}}else r=0|d[r>>2];-1==(0|r)?(d[t>>2]=0,r=0,s=1):(r=o,s=0)}else r=0,s=1;l=0|d[i>>2];do{if(l){if((0|(o=0|d[l+12>>2]))==(0|d[l+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[l>>2])>>2],0|l),c=y,y=0,1&c){M=25;break t}}else o=0|d[o>>2];if(-1!=(0|o)){if(s)break;o=l;break t}d[i>>2]=0,M=17;break}M=17}while(0);if(17==(0|M)){if(M=0,s){o=0;break}l=0}if(o=1&(o=0|f[x|0])?0|d[p>>2]:(255&o)>>>1,(0|d[v>>2])==(e+o|0)){if(y=0,W(8,0|x,o<<1,0),c=y,y=0,1&c){M=25;break}if(e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),c=y,y=0,1&c){M=25;break}e=1&f[x|0]?0|d[m>>2]:g,d[v>>2]=e+o}if((0|(o=0|d[(s=r+12|0)>>2]))==(0|d[(c=r+16|0)>>2])){if(y=0,o=0|N(0|d[36+(0|d[r>>2])>>2],0|r),k=y,y=0,1&k){M=25;break}}else o=0|d[o>>2];if(0|bn(o,S,e,v,w,u,E,C,I,A)){o=l;break}if((0|(o=0|d[s>>2]))!=(0|d[c>>2]))d[s>>2]=o+4,o=r;else{if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),k=y,y=0,1&k){M=25;break}o=r}}if(25==(0|M)){e=0|ae();break}if(0|(1&(k=0|f[E|0])?d[E+4>>2]:(255&k)>>>1)&&((T=0|d[I>>2])-C|0)<160&&(k=0|d[w>>2],d[I>>2]=T+4,d[T>>2]=k),y=0,e=0|Y(23,0|e,0|d[v>>2],0|n,0|S),k=y,y=0,!(1&k)){if(h[a>>1]=e,lr(E,C,0|d[I>>2],n),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),k=y,y=0,1&k){M=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(o){if((0|(e=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;M=53;break}d[i>>2]=0,M=51;break}M=51}while(0);return 51==(0|M)&&r&&(M=53),53==(0|M)&&(d[n>>2]=2|d[n>>2]),k=0|d[t>>2],qr(x),qr(E),b=D,0|k}M=26}}while(0);return 26==(0|M)&&(e=0|ae()),qr(x),qr(E),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0;I=b,b=b+320|0,p=I+208|0,o=I+200|0,x=I+24|0,D=I+12|0,S=I+8|0,T=I+40|0,C=I+4|0,v=I,A=0|Pn(r),yn(x,r,p,o),d[D>>2]=0,d[D+4>>2]=0,d[D+8>>2]=0,e=1&f[D|0]?(-2&d[D>>2])-1|0:10,y=0,W(8,0|D,0|e,0),g=y,y=0;e:do{if(1&g)E=26;else{h=D+8|0,m=D+1|0,e=1&f[D|0]?0|d[h>>2]:m,d[S>>2]=e,d[C>>2]=T,d[v>>2]=0,g=D+4|0,u=0|d[o>>2],o=0|d[t>>2];t:for(;;){if(o){if((0|(r=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){E=25;break}}else r=0|d[r>>2];-1==(0|r)?(d[t>>2]=0,r=0,s=1):(r=o,s=0)}else r=0,s=1;l=0|d[i>>2];do{if(l){if((0|(o=0|d[l+12>>2]))==(0|d[l+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[l>>2])>>2],0|l),c=y,y=0,1&c){E=25;break t}}else o=0|d[o>>2];if(-1!=(0|o)){if(s)break;o=l;break t}d[i>>2]=0,E=17;break}E=17}while(0);if(17==(0|E)){if(E=0,s){o=0;break}l=0}if(o=1&(o=0|f[D|0])?0|d[g>>2]:(255&o)>>>1,(0|d[S>>2])==(e+o|0)){if(y=0,W(8,0|D,o<<1,0),c=y,y=0,1&c){E=25;break}if(e=1&f[D|0]?(-2&d[D>>2])-1|0:10,y=0,W(8,0|D,0|e,0),c=y,y=0,1&c){E=25;break}e=1&f[D|0]?0|d[h>>2]:m,d[S>>2]=e+o}if((0|(o=0|d[(s=r+12|0)>>2]))==(0|d[(c=r+16|0)>>2])){if(y=0,o=0|N(0|d[36+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=25;break}}else o=0|d[o>>2];if(0|bn(o,A,e,S,v,u,x,T,C,p)){o=l;break}if((0|(o=0|d[s>>2]))!=(0|d[c>>2]))d[s>>2]=o+4,o=r;else{if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=25;break}o=r}}if(25==(0|E)){e=0|ae();break}if(0|(1&(M=0|f[x|0])?d[x+4>>2]:(255&M)>>>1)&&((w=0|d[C>>2])-T|0)<160&&(M=0|d[v>>2],d[C>>2]=w+4,d[w>>2]=M),y=0,e=0|Y(24,0|e,0|d[S>>2],0|n,0|A),M=y,y=0,!(1&M)){if(d[a>>2]=e,lr(x,T,0|d[C>>2],n),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(o){if((0|(e=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),M=y,y=0,1&M){E=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;E=53;break}d[i>>2]=0,E=51;break}E=51}while(0);return 51==(0|E)&&r&&(E=53),53==(0|E)&&(d[n>>2]=2|d[n>>2]),M=0|d[t>>2],qr(D),qr(x),b=I,0|M}E=26}}while(0);return 26==(0|E)&&(e=0|ae()),qr(D),qr(x),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0;I=b,b=b+320|0,p=I+208|0,o=I+200|0,x=I+24|0,D=I+12|0,S=I+8|0,T=I+40|0,C=I+4|0,v=I,A=0|Pn(r),yn(x,r,p,o),d[D>>2]=0,d[D+4>>2]=0,d[D+8>>2]=0,e=1&f[D|0]?(-2&d[D>>2])-1|0:10,y=0,W(8,0|D,0|e,0),g=y,y=0;e:do{if(1&g)E=26;else{h=D+8|0,m=D+1|0,e=1&f[D|0]?0|d[h>>2]:m,d[S>>2]=e,d[C>>2]=T,d[v>>2]=0,g=D+4|0,u=0|d[o>>2],o=0|d[t>>2];t:for(;;){if(o){if((0|(r=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){E=25;break}}else r=0|d[r>>2];-1==(0|r)?(d[t>>2]=0,r=0,s=1):(r=o,s=0)}else r=0,s=1;l=0|d[i>>2];do{if(l){if((0|(o=0|d[l+12>>2]))==(0|d[l+16>>2])){if(y=0,o=0|N(0|d[36+(0|d[l>>2])>>2],0|l),c=y,y=0,1&c){E=25;break t}}else o=0|d[o>>2];if(-1!=(0|o)){if(s)break;o=l;break t}d[i>>2]=0,E=17;break}E=17}while(0);if(17==(0|E)){if(E=0,s){o=0;break}l=0}if(o=1&(o=0|f[D|0])?0|d[g>>2]:(255&o)>>>1,(0|d[S>>2])==(e+o|0)){if(y=0,W(8,0|D,o<<1,0),c=y,y=0,1&c){E=25;break}if(e=1&f[D|0]?(-2&d[D>>2])-1|0:10,y=0,W(8,0|D,0|e,0),c=y,y=0,1&c){E=25;break}e=1&f[D|0]?0|d[h>>2]:m,d[S>>2]=e+o}if((0|(o=0|d[(s=r+12|0)>>2]))==(0|d[(c=r+16|0)>>2])){if(y=0,o=0|N(0|d[36+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=25;break}}else o=0|d[o>>2];if(0|bn(o,A,e,S,v,u,x,T,C,p)){o=l;break}if((0|(o=0|d[s>>2]))!=(0|d[c>>2]))d[s>>2]=o+4,o=r;else{if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=25;break}o=r}}if(25==(0|E)){e=0|ae();break}if(0|(1&(M=0|f[x|0])?d[x+4>>2]:(255&M)>>>1)&&((w=0|d[C>>2])-T|0)<160&&(M=0|d[v>>2],d[C>>2]=w+4,d[w>>2]=M),y=0,e=0|Y(25,0|e,0|d[S>>2],0|n,0|A),M=y,y=0,!(1&M)){if(d[a>>2]=e,lr(x,T,0|d[C>>2],n),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),M=y,y=0,1&M){E=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(o){if((0|(e=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),M=y,y=0,1&M){E=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;E=53;break}d[i>>2]=0,E=51;break}E=51}while(0);return 51==(0|E)&&r&&(E=53),53==(0|E)&&(d[n>>2]=2|d[n>>2]),M=0|d[t>>2],qr(D),qr(x),b=I,0|M}E=26}}while(0);return 26==(0|E)&&(e=0|ae()),qr(D),qr(x),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,x=0,E=0,M=0,k=0;I=b,b=b+320|0,p=I+208|0,o=I+200|0,E=I+24|0,x=I+12|0,S=I+8|0,T=I+40|0,C=I+4|0,v=I,A=0|Pn(r),yn(E,r,p,o),d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),g=y,y=0;e:do{if(1&g)M=26;else{h=x+8|0,m=x+1|0,e=1&f[x|0]?0|d[h>>2]:m,d[S>>2]=e,d[C>>2]=T,d[v>>2]=0,g=x+4|0,u=0|d[o>>2],o=0|d[t>>2];t:for(;;){if(o){if((0|(r=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),c=y,y=0,1&c){M=25;break}}else r=0|d[r>>2];-1==(0|r)?(d[t>>2]=0,o=0,l=1):l=0}else o=0,l=1;s=0|d[i>>2];do{if(s){if((0|(r=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[s>>2])>>2],0|s),c=y,y=0,1&c){M=25;break t}}else r=0|d[r>>2];if(-1!=(0|r)){if(l)break;break t}d[i>>2]=0,M=17;break}M=17}while(0);if(17==(0|M)){if(M=0,l){s=0;break}s=0}if(r=1&(r=0|f[x|0])?0|d[g>>2]:(255&r)>>>1,(0|d[S>>2])==(e+r|0)){if(y=0,W(8,0|x,r<<1,0),c=y,y=0,1&c){M=25;break}if(e=1&f[x|0]?(-2&d[x>>2])-1|0:10,y=0,W(8,0|x,0|e,0),c=y,y=0,1&c){M=25;break}e=1&f[x|0]?0|d[h>>2]:m,d[S>>2]=e+r}if((0|(r=0|d[(l=o+12|0)>>2]))==(0|d[(c=o+16|0)>>2])){if(y=0,r=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=25;break}}else r=0|d[r>>2];if(0|bn(r,A,e,S,v,u,E,T,C,p))break;if((0|(r=0|d[l>>2]))!=(0|d[c>>2]))d[l>>2]=r+4;else if(y=0,N(0|d[40+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=25;break}}if(25==(0|M)){e=0|ae();break}if(0|(1&(k=0|f[E|0])?d[E+4>>2]:(255&k)>>>1)&&((w=0|d[C>>2])-T|0)<160&&(k=0|d[v>>2],d[C>>2]=w+4,d[w>>2]=k),y=0,e=0|Y(26,0|e,0|d[S>>2],0|n,0|A),r=D,k=y,y=0,!(1&k)){if(d[(k=a)>>2]=e,d[k+4>>2]=r,lr(E,T,0|d[C>>2],n),o){if((0|(e=0|d[o+12>>2]))==(0|d[o+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[o>>2])>>2],0|o),k=y,y=0,1&k){M=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(s){if((0|(e=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),k=y,y=0,1&k){M=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;M=53;break}d[i>>2]=0,M=51;break}M=51}while(0);return 51==(0|M)&&r&&(M=53),53==(0|M)&&(d[n>>2]=2|d[n>>2]),k=0|d[t>>2],qr(x),qr(E),b=I,0|k}M=26}}while(0);return 26==(0|M)&&(e=0|ae()),qr(x),qr(E),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0;M=b,b=b+352|0,s=M+40|0,l=M+36|0,k=M+12|0,T=M+8|0,x=M+48|0,E=M+4|0,C=M,I=M+337|0,w=M+336|0,Cn(R=M+24|0,r,v=M+208|0,s,l),d[k>>2]=0,d[k+4>>2]=0,d[k+8>>2]=0,e=1&f[k|0]?(-2&d[k>>2])-1|0:10,y=0,W(8,0|k,0|e,0),S=y,y=0;e:do{if(1&S)F=26;else{g=k+8|0,A=k+1|0,e=1&f[k|0]?0|d[g>>2]:A,d[T>>2]=e,d[E>>2]=x,d[C>>2]=0,f[I|0]=1,f[w|0]=69,S=k+4|0,m=0|d[s>>2],h=0|d[l>>2],r=0|d[t>>2];t:for(;;){if(r){if((0|(s=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[r>>2])>>2],0|r),u=y,y=0,1&u){F=25;break}}else s=0|d[s>>2];-1==(0|s)?(d[t>>2]=0,r=0,c=1):c=0}else r=0,c=1;s=0|d[i>>2];do{if(s){if((0|(l=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,l=0|N(0|d[36+(0|d[s>>2])>>2],0|s),u=y,y=0,1&u){F=25;break t}}else l=0|d[l>>2];if(-1!=(0|l)){if(c)break;break t}d[i>>2]=0,F=17;break}F=17}while(0);if(17==(0|F)){if(F=0,c){s=0;break}s=0}if(l=1&(l=0|f[k|0])?0|d[S>>2]:(255&l)>>>1,(0|d[T>>2])==(e+l|0)){if(y=0,W(8,0|k,l<<1,0),u=y,y=0,1&u){F=25;break}if(e=1&f[k|0]?(-2&d[k>>2])-1|0:10,y=0,W(8,0|k,0|e,0),u=y,y=0,1&u){F=25;break}e=1&f[k|0]?0|d[g>>2]:A,d[T>>2]=e+l}if((0|(l=0|d[(c=r+12|0)>>2]))==(0|d[(u=r+16|0)>>2])){if(y=0,l=0|N(0|d[36+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=25;break}}else l=0|d[l>>2];if(0|In(l,I,w,e,T,m,h,R,x,E,C,v))break;if((0|(s=0|d[c>>2]))!=(0|d[u>>2]))d[c>>2]=s+4;else if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=25;break}}if(25==(0|F)){e=0|ae();break}if(P=0|f[R|0],!!(0|f[I|0]&&0|(1&P?d[R+4>>2]:(255&P)>>>1))&&((D=0|d[E>>2])-x|0)<160&&(P=0|d[C>>2],d[E>>2]=D+4,d[D>>2]=P),y=0,o=+z(1,0|e,0|d[T>>2],0|n),P=y,y=0,!(1&P)){if(p[a>>2]=o,lr(R,x,0|d[E>>2],n),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(s){if((0|(e=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),P=y,y=0,1&P){F=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;F=53;break}d[i>>2]=0,F=51;break}F=51}while(0);return 51==(0|F)&&r&&(F=53),53==(0|F)&&(d[n>>2]=2|d[n>>2]),P=0|d[t>>2],qr(k),qr(R),b=M,0|P}F=26}}while(0);return 26==(0|F)&&(e=0|ae()),qr(k),qr(R),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0;M=b,b=b+352|0,s=M+40|0,l=M+36|0,k=M+12|0,T=M+8|0,x=M+48|0,E=M+4|0,C=M,I=M+337|0,w=M+336|0,Cn(R=M+24|0,r,v=M+208|0,s,l),d[k>>2]=0,d[k+4>>2]=0,d[k+8>>2]=0,e=1&f[k|0]?(-2&d[k>>2])-1|0:10,y=0,W(8,0|k,0|e,0),S=y,y=0;e:do{if(1&S)F=26;else{g=k+8|0,p=k+1|0,e=1&f[k|0]?0|d[g>>2]:p,d[T>>2]=e,d[E>>2]=x,d[C>>2]=0,f[I|0]=1,f[w|0]=69,S=k+4|0,m=0|d[s>>2],h=0|d[l>>2],r=0|d[t>>2];t:for(;;){if(r){if((0|(s=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[r>>2])>>2],0|r),u=y,y=0,1&u){F=25;break}}else s=0|d[s>>2];-1==(0|s)?(d[t>>2]=0,r=0,c=1):c=0}else r=0,c=1;s=0|d[i>>2];do{if(s){if((0|(l=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,l=0|N(0|d[36+(0|d[s>>2])>>2],0|s),u=y,y=0,1&u){F=25;break t}}else l=0|d[l>>2];if(-1!=(0|l)){if(c)break;break t}d[i>>2]=0,F=17;break}F=17}while(0);if(17==(0|F)){if(F=0,c){s=0;break}s=0}if(l=1&(l=0|f[k|0])?0|d[S>>2]:(255&l)>>>1,(0|d[T>>2])==(e+l|0)){if(y=0,W(8,0|k,l<<1,0),u=y,y=0,1&u){F=25;break}if(e=1&f[k|0]?(-2&d[k>>2])-1|0:10,y=0,W(8,0|k,0|e,0),u=y,y=0,1&u){F=25;break}e=1&f[k|0]?0|d[g>>2]:p,d[T>>2]=e+l}if((0|(l=0|d[(c=r+12|0)>>2]))==(0|d[(u=r+16|0)>>2])){if(y=0,l=0|N(0|d[36+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=25;break}}else l=0|d[l>>2];if(0|In(l,I,w,e,T,m,h,R,x,E,C,v))break;if((0|(s=0|d[c>>2]))!=(0|d[u>>2]))d[c>>2]=s+4;else if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=25;break}}if(25==(0|F)){e=0|ae();break}if(P=0|f[R|0],!!(0|f[I|0]&&0|(1&P?d[R+4>>2]:(255&P)>>>1))&&((D=0|d[E>>2])-x|0)<160&&(P=0|d[C>>2],d[E>>2]=D+4,d[D>>2]=P),y=0,o=+z(2,0|e,0|d[T>>2],0|n),P=y,y=0,!(1&P)){if(A[a>>3]=o,lr(R,x,0|d[E>>2],n),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(s){if((0|(e=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),P=y,y=0,1&P){F=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;F=53;break}d[i>>2]=0,F=51;break}F=51}while(0);return 51==(0|F)&&r&&(F=53),53==(0|F)&&(d[n>>2]=2|d[n>>2]),P=0|d[t>>2],qr(k),qr(R),b=M,0|P}F=26}}while(0);return 26==(0|F)&&(e=0|ae()),qr(k),qr(R),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0,P=0;M=b,b=b+352|0,s=M+40|0,l=M+36|0,k=M+12|0,T=M+8|0,x=M+48|0,E=M+4|0,C=M,I=M+337|0,w=M+336|0,Cn(R=M+24|0,r,v=M+208|0,s,l),d[k>>2]=0,d[k+4>>2]=0,d[k+8>>2]=0,e=1&f[k|0]?(-2&d[k>>2])-1|0:10,y=0,W(8,0|k,0|e,0),S=y,y=0;e:do{if(1&S)F=26;else{g=k+8|0,p=k+1|0,e=1&f[k|0]?0|d[g>>2]:p,d[T>>2]=e,d[E>>2]=x,d[C>>2]=0,f[I|0]=1,f[w|0]=69,S=k+4|0,m=0|d[s>>2],h=0|d[l>>2],r=0|d[t>>2];t:for(;;){if(r){if((0|(s=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[r>>2])>>2],0|r),u=y,y=0,1&u){F=25;break}}else s=0|d[s>>2];-1==(0|s)?(d[t>>2]=0,r=0,c=1):c=0}else r=0,c=1;s=0|d[i>>2];do{if(s){if((0|(l=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,l=0|N(0|d[36+(0|d[s>>2])>>2],0|s),u=y,y=0,1&u){F=25;break t}}else l=0|d[l>>2];if(-1!=(0|l)){if(c)break;break t}d[i>>2]=0,F=17;break}F=17}while(0);if(17==(0|F)){if(F=0,c){s=0;break}s=0}if(l=1&(l=0|f[k|0])?0|d[S>>2]:(255&l)>>>1,(0|d[T>>2])==(e+l|0)){if(y=0,W(8,0|k,l<<1,0),u=y,y=0,1&u){F=25;break}if(e=1&f[k|0]?(-2&d[k>>2])-1|0:10,y=0,W(8,0|k,0|e,0),u=y,y=0,1&u){F=25;break}e=1&f[k|0]?0|d[g>>2]:p,d[T>>2]=e+l}if((0|(l=0|d[(c=r+12|0)>>2]))==(0|d[(u=r+16|0)>>2])){if(y=0,l=0|N(0|d[36+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=25;break}}else l=0|d[l>>2];if(0|In(l,I,w,e,T,m,h,R,x,E,C,v))break;if((0|(s=0|d[c>>2]))!=(0|d[u>>2]))d[c>>2]=s+4;else if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=25;break}}if(25==(0|F)){e=0|ae();break}if(P=0|f[R|0],!!(0|f[I|0]&&0|(1&P?d[R+4>>2]:(255&P)>>>1))&&((D=0|d[E>>2])-x|0)<160&&(P=0|d[C>>2],d[E>>2]=D+4,d[D>>2]=P),y=0,o=+z(3,0|e,0|d[T>>2],0|n),P=y,y=0,!(1&P)){if(A[a>>3]=o,lr(R,x,0|d[E>>2],n),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),P=y,y=0,1&P){F=26;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(s){if((0|(e=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[s>>2])>>2],0|s),P=y,y=0,1&P){F=26;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;F=53;break}d[i>>2]=0,F=51;break}F=51}while(0);return 51==(0|F)&&r&&(F=53),53==(0|F)&&(d[n>>2]=2|d[n>>2]),P=0|d[t>>2],qr(k),qr(R),b=M,0|P}F=26}}while(0);return 26==(0|F)&&(e=0|ae()),qr(k),qr(R),de(0|e),0}(e,l,s,r,n,a),b=o,0|e},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,h,m,g,p,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0;m=b,b=b+320|0,h=m,o=m+208|0,e=m+28|0,g=m+16|0,u=m+12|0,l=m+48|0,c=m+8|0,s=m+4|0,d[(p=m+32|0)>>2]=0,d[p+4>>2]=0,d[p+8>>2]=0,y=0,r=0|N(68,0|r),I=y,y=0;do{if(1&I)e=0|ae();else{if(d[e>>2]=r,y=0,e=0|G(37,0|e,44212),I=y,y=0,!(1&I||(y=0,Y(0|d[48+(0|d[e>>2])>>2],0|e,57498,57524,0|o),I=y,y=0,1&I))){Nr(r),d[g>>2]=0,d[g+4>>2]=0,d[g+8>>2]=0,e=1&f[g|0]?(-2&d[g>>2])-1|0:10,y=0,W(8,0|g,0|e,0),I=y,y=0;e:do{if(1&I)k=31;else{C=g+8|0,I=g+1|0,e=1&f[g|0]?0|d[C>>2]:I,d[u>>2]=e,d[c>>2]=l,d[s>>2]=0,T=g+4|0,A=0|d[t>>2];t:for(;;){if(A){if((0|(r=0|d[A+12>>2]))==(0|d[A+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[A>>2])>>2],0|A),w=y,y=0,1&w){k=30;break}}else r=0|d[r>>2];-1==(0|r)?(d[t>>2]=0,r=0,S=1):(r=A,S=0)}else r=0,S=1;v=0|d[i>>2];do{if(v){if((0|(A=0|d[v+12>>2]))==(0|d[v+16>>2])){if(y=0,A=0|N(0|d[36+(0|d[v>>2])>>2],0|v),w=y,y=0,1&w){k=30;break t}}else A=0|d[A>>2];if(-1!=(0|A)){if(S){A=v;break}A=v;break t}d[i>>2]=0,k=20;break}k=20}while(0);if(20==(0|k)){if(k=0,S){A=0;break}A=0}if(S=1&(S=0|f[g|0])?0|d[T>>2]:(255&S)>>>1,(0|d[u>>2])==(e+S|0)){if(y=0,W(8,0|g,S<<1,0),w=y,y=0,1&w){k=30;break}if(e=1&f[g|0]?(-2&d[g>>2])-1|0:10,y=0,W(8,0|g,0|e,0),w=y,y=0,1&w){k=30;break}e=1&f[g|0]?0|d[C>>2]:I,d[u>>2]=e+S}if((0|(S=0|d[(v=r+12|0)>>2]))==(0|d[(w=r+16|0)>>2])){if(y=0,S=0|N(0|d[36+(0|d[r>>2])>>2],0|r),R=y,y=0,1&R){k=30;break}}else S=0|d[S>>2];if(0|bn(S,16,e,u,s,0,p,l,c,o))break;if((0|(A=0|d[v>>2]))!=(0|d[w>>2]))d[v>>2]=A+4,A=r;else{if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),R=y,y=0,1&R){k=30;break}A=r}}if(30==(0|k)){e=0|ae();break}if(y=0,W(8,0|g,(0|d[u>>2])-e|0,0),R=y,y=0,!(1&R||(D=0|f[g|0],x=0|d[C>>2],y=0,E=0|H(3),R=y,y=0,1&R)||(y=0,d[h>>2]=a,M=0|Y(16,0|(1&D?x:I),0|E,58882,0|h),R=y,y=0,1&R))){if(1!=(0|M)&&(d[n>>2]=4),r){if((0|(e=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[r>>2])>>2],0|r),R=y,y=0,1&R){k=31;break}}else e=0|d[e>>2];-1==(0|e)?(d[t>>2]=0,r=1):r=0}else r=1;do{if(A){if((0|(e=0|d[A+12>>2]))==(0|d[A+16>>2])){if(y=0,e=0|N(0|d[36+(0|d[A>>2])>>2],0|A),R=y,y=0,1&R){k=31;break e}}else e=0|d[e>>2];if(-1!=(0|e)){if(r)break;k=59;break}d[i>>2]=0,k=57;break}k=57}while(0);return 57==(0|k)&&r&&(k=59),59==(0|k)&&(d[n>>2]=2|d[n>>2]),R=0|d[t>>2],qr(g),qr(p),b=m,0|R}k=31}}while(0);31==(0|k)&&(e=0|ae()),qr(g);break}e=0|ae(),Nr(r)}}while(0);return qr(p),de(0|e),0},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,f,h,m,g=0,p=0;return f=b,b=b+96|0,o=f+8|0,m=f+74|0,l=f+32|0,u=f+28|0,c=f+24|0,h=f+20|0,s=f+16|0,d[(g=e=f)>>2]=37,d[g+4>>2]=0,Dn(e+1|0,58895,1,0|d[i+4>>2]),g=0|Sn(),d[(p=o)>>2]=n,d[p+4>>2]=a,n=0|xn(m,a=m+(0|Un(m,22,g,e,o))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(1,0|m,0|n,0|a,0|l,0|u,0|c,0|h),a=y,y=0,1&a?(p=0|ae(),Nr(e),de(0|p),0):(Nr(e),d[s>>2]=d[t>>2],g=0|d[u>>2],p=0|d[c>>2],d[o>>2]=d[s>>2],p=0|je(o,l,g,p,i,r),b=f,0|p)},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,f,h,m,g=0,p=0;return f=b,b=b+112|0,o=f+8|0,m=f+75|0,l=f+32|0,u=f+28|0,c=f+24|0,h=f+20|0,s=f+16|0,d[(g=e=f)>>2]=37,d[g+4>>2]=0,Dn(e+1|0,58895,0,0|d[i+4>>2]),g=0|Sn(),d[(p=o)>>2]=n,d[p+4>>2]=a,n=0|xn(m,a=m+(0|Un(m,23,g,e,o))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(1,0|m,0|n,0|a,0|l,0|u,0|c,0|h),a=y,y=0,1&a?(p=0|ae(),Nr(e),de(0|p),0):(Nr(e),d[s>>2]=d[t>>2],g=0|d[u>>2],p=0|d[c>>2],d[o>>2]=d[s>>2],p=0|je(o,l,g,p,i,r),b=f,0|p)},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,f,h,m,g=0,p=0;return f=b,b=b+224|0,o=f+8|0,m=f+196|0,l=f+32|0,u=f+28|0,c=f+24|0,h=f+20|0,s=f+16|0,d[(g=e=f)>>2]=37,d[g+4>>2]=0,Dn(e+1|0,58895,1,0|d[i+4>>2]),g=0|Sn(),d[(p=o)>>2]=n,d[p+4>>2]=a,n=0|xn(m,a=m+(0|Un(m,22,g,e,o))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(3,0|m,0|n,0|a,0|l,0|u,0|c,0|h),a=y,y=0,1&a?(p=0|ae(),Nr(e),de(0|p),0):(Nr(e),d[s>>2]=d[t>>2],g=0|d[u>>2],p=0|d[c>>2],d[o>>2]=d[s>>2],p=0|On(o,l,g,p,i,r),b=f,0|p)},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,f,h,m,g=0,p=0;return f=b,b=b+240|0,o=f+8|0,m=f+204|0,l=f+32|0,u=f+28|0,c=f+24|0,h=f+20|0,s=f+16|0,d[(g=e=f)>>2]=37,d[g+4>>2]=0,Dn(e+1|0,58895,0,0|d[i+4>>2]),g=0|Sn(),d[(p=o)>>2]=n,d[p+4>>2]=a,n=0|xn(m,a=m+(0|Un(m,23,g,e,o))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(3,0|m,0|n,0|a,0|l,0|u,0|c,0|h),a=y,y=0,1&a?(p=0|ae(),Nr(e),de(0|p),0):(Nr(e),d[s>>2]=d[t>>2],g=0|d[u>>2],p=0|d[c>>2],d[o>>2]=d[s>>2],p=0|On(o,l,g,p,i,r),b=f,0|p)},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|xi(e,l,s,r,n,a,58907,58915),b=o,0|e},function(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,h,m=0;return o=b,b=b+16|0,s=o+12|0,l=o+8|0,u=o+4|0,c=o,m=0|ts[127&d[20+(0|d[(m=(e|=0)+8|0)>>2])>>2]](m),d[u>>2]=d[t>>2],d[c>>2]=d[i>>2],i=(t=(h=!(1&(i=0|f[m|0])))?m+1|0:0|d[m+8>>2])+(h?(255&i)>>>1:0|d[m+4>>2])|0,d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|xi(e,l,s,r,n,a,t,i),b=o,0|e},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c=0,u=0;return l=b,b=b+16|0,o=l+8|0,c=l+4|0,s=l,r=0|rn(r|=0),d[c>>2]=r,y=0,c=0|G(37,0|c,44220),u=y,y=0,1&u?(u=0|ae(),Nr(r),de(0|u),0):(Nr(r),d[s>>2]=d[i>>2],d[o>>2]=d[s>>2],Ei(e,a+24|0,t,o,n,c),b=l,0|d[t>>2])},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c=0,u=0;return l=b,b=b+16|0,o=l+8|0,c=l+4|0,s=l,r=0|rn(r|=0),d[c>>2]=r,y=0,c=0|G(37,0|c,44220),u=y,y=0,1&u?(u=0|ae(),Nr(r),de(0|u),0):(Nr(r),d[s>>2]=d[i>>2],d[o>>2]=d[s>>2],Mi(e,a+16|0,t,o,n,c),b=l,0|d[t>>2])},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c=0,u=0;return l=b,b=b+16|0,o=l+8|0,c=l+4|0,s=l,r=0|rn(r|=0),d[c>>2]=r,y=0,c=0|G(37,0|c,44220),u=y,y=0,1&u?(u=0|ae(),Nr(r),de(0|u),0):(Nr(r),d[s>>2]=d[i>>2],d[o>>2]=d[s>>2],ki(e,a+20|0,t,o,n,c),b=l,0|d[t>>2])},function(e,t,i,r,n,a){var o,s,l,c,u;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o=b,b=b+16|0,s=o+12|0,l=o+8|0,c=o,d[(u=o+4|0)>>2]=d[t>>2],d[c>>2]=d[i>>2],d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|Qi(e,l,s,r,n,a,44788,44820),b=o,0|e},function(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,h,m,g=0;return o=b,b=b+16|0,s=o+12|0,l=o+8|0,u=o+4|0,c=o,g=0|ts[127&d[20+(0|d[(g=(e|=0)+8|0)>>2])>>2]](g),d[u>>2]=d[t>>2],d[c>>2]=d[i>>2],i=g+4|0,i=(t=(m=!(1&(h=0|f[g|0])))?i:0|d[g+8>>2])+((m?(255&h)>>>1:d[i>>2])<<2)|0,d[l>>2]=d[u>>2],d[s>>2]=d[c>>2],e=0|Qi(e,l,s,r,n,a,t,i),b=o,0|e},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c=0,u=0;return l=b,b=b+16|0,o=l+8|0,c=l+4|0,s=l,r=0|rn(r|=0),d[c>>2]=r,y=0,c=0|G(37,0|c,44212),u=y,y=0,1&u?(u=0|ae(),Nr(r),de(0|u),0):(Nr(r),d[s>>2]=d[i>>2],d[o>>2]=d[s>>2],zi(e,a+24|0,t,o,n,c),b=l,0|d[t>>2])},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c=0,u=0;return l=b,b=b+16|0,o=l+8|0,c=l+4|0,s=l,r=0|rn(r|=0),d[c>>2]=r,y=0,c=0|G(37,0|c,44212),u=y,y=0,1&u?(u=0|ae(),Nr(r),de(0|u),0):(Nr(r),d[s>>2]=d[i>>2],d[o>>2]=d[s>>2],Hi(e,a+16|0,t,o,n,c),b=l,0|d[t>>2])},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c=0,u=0;return l=b,b=b+16|0,o=l+8|0,c=l+4|0,s=l,r=0|rn(r|=0),d[c>>2]=r,y=0,c=0|G(37,0|c,44212),u=y,y=0,1&u?(u=0|ae(),Nr(r),de(0|u),0):(Nr(r),d[s>>2]=d[i>>2],d[o>>2]=d[s>>2],Yi(e,a+20|0,t,o,n,c),b=l,0|d[t>>2])},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c,u,h,m,g,p,A,S,v,w,T,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0;A=b,b=b+176|0,s=A+56|0,S=A+52|0,g=A+64|0,u=A+61|0,p=A+60|0,v=A+40|0,T=A+28|0,w=A+16|0,x=A+12|0,o=A+68|0,m=A+8|0,h=A+4|0,l=A,e=0|rn(r|=0),d[S>>2]=e,y=0,c=0|G(37,0|S,44220),M=y,y=0;do{if(1&M)R=13;else{if(M=a+4|0,0|((C=!(1&(E=0|f[a|0])))?(255&E)>>>1:d[M>>2])){if(C=0|f[(C?a+1:d[a+8>>2])|0],y=0,I=0|G(0|d[28+(0|d[c>>2])>>2],0|c,45),E=y,y=0,1&E){R=13;break}E=C<<24>>24==I<<24>>24}else E=0;if(d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,d[T>>2]=0,d[T+4>>2]=0,d[T+8>>2]=0,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,q(3,0|i,0|E,0|S,0|g,0|u,0|p,0|v,0|T,0|w,0|x),D=y,y=0,1&D)C=0|ae();else{if(D=0|f[a|0],i=0|d[M>>2],(0|(C=1&D?i:(255&D)>>>1))>(0|(x=0|d[x>>2]))?(F=0|f[w|0],I=0|f[T|0],C=(C-x<<1|1)+x+(1&F?0|d[w+4>>2]:(255&F)>>>1)+(1&I?0|d[T+4>>2]:(255&I)>>>1)|0):(F=0|f[w|0],C=0|f[T|0],C=x+2+(1&F?0|d[w+4>>2]:(255&F)>>>1)+(1&C?0|d[T+4>>2]:(255&C)>>>1)|0),C>>>0>100?(I=C=0|Dr(C),C?R=17:(y=0,X(6),F=y,y=0,1&F||(D=0|f[a|0],i=0|d[M>>2],C=0,R=17))):(I=0,C=o,R=17),17==(0|R)&&(a=(F=!(1&D))?a+1|0:0|d[a+8>>2],y=0,B(1,0|C,0|m,0|h,0|d[r+4>>2],0|a,a+(F?(255&D)>>>1:i)|0,0|c,0|E,0|g,0|f[u|0],0|f[p|0],0|v,0|T,0|w,0|x),F=y,y=0,!(1&F||(d[l>>2]=d[t>>2],F=0|d[m>>2],k=0|d[h>>2],y=0,d[s>>2]=d[l>>2],k=0|_(39,0|s,0|C,0|F,0|k,0|r,0|n),F=y,y=0,1&F))))return I&&(xr(I),e=0|d[S>>2]),qr(w),qr(T),qr(v),Nr(e),b=A,0|k;C=0|ae(),I&&(xr(I),e=0|d[S>>2])}qr(w),qr(T),qr(v)}}while(0);return 13==(0|R)&&(C=0|ae()),Nr(e),de(0|C),0},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,n|=0,a|=0;var o,s,l,c,u,h,m,g,p,A,S,v,w,T,C=0,I=0,D=0,x=0,E=0,M=0,k=0,R=0,F=0;A=b,b=b+480|0,s=A+468|0,S=A+464|0,g=A+472|0,u=A+56|0,p=A+52|0,v=A+40|0,T=A+28|0,w=A+16|0,x=A+12|0,o=A+64|0,m=A+8|0,h=A+4|0,l=A,e=0|rn(r|=0),d[S>>2]=e,y=0,c=0|G(37,0|S,44212),M=y,y=0;do{if(1&M)R=13;else{if(M=a+4|0,0|((C=!(1&(E=0|f[a|0])))?(255&E)>>>1:d[M>>2])){if(C=0|d[(C?M:d[a+8>>2])>>2],y=0,I=0|G(0|d[44+(0|d[c>>2])>>2],0|c,45),E=y,y=0,1&E){R=13;break}E=(0|C)==(0|I)}else E=0;if(d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,d[T>>2]=0,d[T+4>>2]=0,d[T+8>>2]=0,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,q(4,0|i,0|E,0|S,0|g,0|u,0|p,0|v,0|T,0|w,0|x),D=y,y=0,1&D)C=0|ae();else{if(D=0|f[a|0],i=0|d[M>>2],(0|(C=1&D?i:(255&D)>>>1))>(0|(x=0|d[x>>2]))?(F=0|f[w|0],I=0|f[T|0],C=(C-x<<1|1)+x+(1&F?0|d[w+4>>2]:(255&F)>>>1)+(1&I?0|d[T+4>>2]:(255&I)>>>1)|0):(F=0|f[w|0],C=0|f[T|0],C=x+2+(1&F?0|d[w+4>>2]:(255&F)>>>1)+(1&C?0|d[T+4>>2]:(255&C)>>>1)|0),C>>>0>100?(I=C=0|Dr(C<<2),C?R=17:(y=0,X(6),F=y,y=0,1&F||(D=0|f[a|0],i=0|d[M>>2],C=0,R=17))):(I=0,C=o,R=17),17==(0|R)&&(a=(F=!(1&D))?M:0|d[a+8>>2],y=0,B(2,0|C,0|m,0|h,0|d[r+4>>2],0|a,a+((F?(255&D)>>>1:i)<<2)|0,0|c,0|E,0|g,0|d[u>>2],0|d[p>>2],0|v,0|T,0|w,0|x),F=y,y=0,!(1&F||(d[l>>2]=d[t>>2],F=0|d[m>>2],k=0|d[h>>2],y=0,d[s>>2]=d[l>>2],k=0|_(40,0|s,0|C,0|F,0|k,0|r,0|n),F=y,y=0,1&F))))return I&&(xr(I),e=0|d[S>>2]),Zr(w),Zr(T),qr(v),Nr(e),b=A,0|k;C=0|ae(),I&&(xr(I),e=0|d[S>>2])}Zr(w),Zr(T),qr(v)}}while(0);return 13==(0|R)&&(C=0|ae()),Nr(e),de(0|C),0},je,On,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa,oa],ts=[sa,function(e){return 0},function(e){return 0},function(e){var t=0,i=0,r=0,n=0;return(i=0|d[(t=(e|=0)+44|0)>>2])>>>0<(r=0|d[e+24>>2])>>>0&&(d[t>>2]=r,i=r),!(8&d[e+48>>2])||(r=e+12|0,(t=0|d[(n=e+16|0)>>2])>>>0>>0?(r=0|d[r>>2],d[n>>2]=i,t=i):r=0|d[r>>2],r>>>0>=t>>>0)?0|(e=-1):0|(e=0|m[r|0])},function(e){var t=0;return-1==(0|ts[127&d[36+(0|d[(e|=0)>>2])>>2]](e))?e=-1:(e=0|d[(t=e+12|0)>>2],d[t>>2]=e+1,e=0|m[e|0]),0|e},function(e){return 50767},function(e){return 51611},function(e){return 0|d[(e|=0)+4>>2]},function(e){return 51716},function(e){var t,i;return e|=0,t=b,b=b+16|0,d[(i=t)>>2]=d[e+60>>2],e=0|ao(0|Ee(6,0|i)),b=t,0|e},function(e){var t,i,r,n,a,o,s,l,c=0,u=0;l=b,b=b+16|0,o=l,i=(e|=0)+36|0,r=e+40|0,n=(s=l+8|0)+8|0,a=s,t=e+32|0;e:for(;;){if(e=0|d[i>>2],e=0|cs[31&d[20+(0|d[e>>2])>>2]](e,0|d[r>>2],s,n,o),(0|ko(s,1,u=(0|d[o>>2])-a|0,0|d[t>>2]))!=(0|u)){e=-1;break}switch(0|e){case 1:break;case 2:e=-1;break e;default:c=4;break e}}return 4==(0|c)&&(e=!!(0|Eo(0|d[t>>2]))<<31>>31),b=l,0|e},function(e){return 0},function(e){return-1},function(e){var t=0;return-1==(0|ts[127&d[36+(0|d[(e|=0)>>2])>>2]](e))?e=-1:(e=0|d[(t=e+12|0)>>2],d[t>>2]=e+4,e=0|d[e>>2]),0|e},function(e){return 0},function(e){return 0|Pr(e|=0,0)},function(e){return 0|Pr(e|=0,1)},function(e){var t,i,r,n,a,o,s,l,c=0,u=0;l=b,b=b+16|0,o=l,i=(e|=0)+36|0,r=e+40|0,n=(s=l+8|0)+8|0,a=s,t=e+32|0;e:for(;;){if(e=0|d[i>>2],e=0|cs[31&d[20+(0|d[e>>2])>>2]](e,0|d[r>>2],s,n,o),(0|ko(s,1,u=(0|d[o>>2])-a|0,0|d[t>>2]))!=(0|u)){e=-1;break}switch(0|e){case 1:break;case 2:e=-1;break e;default:c=4;break e}}return 4==(0|c)&&(e=!!(0|Eo(0|d[t>>2]))<<31>>31),b=l,0|e},function(e){return-1},function(e){return 0|Lr(e|=0,0)},function(e){return 0|Lr(e|=0,1)},function(e){return 57453},function(e){return 2},function(e){e|=0;do{if(!(0|f[2464])&&0|te(2464)){if(!(0|f[2472])&&0|te(2472)){e=45040;do{d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,e=e+12|0}while(45208!=(0|e));Ie(193,0,0|T),oe(2472)}if(y=0,G(41,45040,59035),e=y,y=0,!(1&e||(y=0,G(41,45052,59042),e=y,y=0,1&e)||(y=0,G(41,45064,59049),e=y,y=0,1&e)||(y=0,G(41,45076,59057),e=y,y=0,1&e)||(y=0,G(41,45088,59067),e=y,y=0,1&e)||(y=0,G(41,45100,59076),e=y,y=0,1&e)||(y=0,G(41,45112,59083),e=y,y=0,1&e)||(y=0,G(41,45124,59092),e=y,y=0,1&e)||(y=0,G(41,45136,59096),e=y,y=0,1&e)||(y=0,G(41,45148,59100),e=y,y=0,1&e)||(y=0,G(41,45160,59104),e=y,y=0,1&e)||(y=0,G(41,45172,59108),e=y,y=0,1&e)||(y=0,G(41,45184,59112),e=y,y=0,1&e)||(y=0,G(41,45196,59116),e=y,y=0,1&e))){d[11302]=45040,oe(2464);break}e=0|ae(),Pe(2464),de(0|e)}}while(0);return 0|d[11302]},function(e){e|=0;e:do{if(!(0|f[2496])&&0|te(2496)){if(!(0|f[2504])&&0|te(2504)){e=45724;do{d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,e=e+12|0}while(46012!=(0|e));Ie(195,0,0|T),oe(2504)}y=0,G(41,45724,59120),e=y,y=0;do{if(!(1&e||(y=0,G(41,45736,59128),e=y,y=0,1&e)||(y=0,G(41,45748,59137),e=y,y=0,1&e)||(y=0,G(41,45760,59143),e=y,y=0,1&e)||(y=0,G(41,45772,59149),e=y,y=0,1&e)||(y=0,G(41,45784,59153),e=y,y=0,1&e)||(y=0,G(41,45796,59158),e=y,y=0,1&e)||(y=0,G(41,45808,59163),e=y,y=0,1&e)||(y=0,G(41,45820,59170),e=y,y=0,1&e)||(y=0,G(41,45832,59180),e=y,y=0,1&e)||(y=0,G(41,45844,59188),e=y,y=0,1&e)||(y=0,G(41,45856,59197),e=y,y=0,1&e)||(y=0,G(41,45868,59206),e=y,y=0,1&e)||(y=0,G(41,45880,59210),e=y,y=0,1&e)||(y=0,G(41,45892,59214),e=y,y=0,1&e))){if(y=0,G(41,45904,59218),e=y,y=0,1&e||(y=0,G(41,45916,59149),e=y,y=0,1&e)||(y=0,G(41,45928,59222),e=y,y=0,1&e)||(y=0,G(41,45940,59226),e=y,y=0,1&e)||(y=0,G(41,45952,59230),e=y,y=0,1&e)||(y=0,G(41,45964,59234),e=y,y=0,1&e)||(y=0,G(41,45976,59238),e=y,y=0,1&e)||(y=0,G(41,45988,59242),e=y,y=0,1&e)||(y=0,G(41,46e3,59246),e=y,y=0,1&e))break;d[11503]=45724,oe(2496);break e}}while(0);e=0|ae(),Pe(2496),de(0|e)}}while(0);return 0|d[11503]},function(e){e|=0;do{if(!(0|f[2528])&&0|te(2528)){if(!(0|f[2536])&&0|te(2536)){e=46828;do{d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,e=e+12|0}while(47116!=(0|e));Ie(197,0,0|T),oe(2536)}if(y=0,G(41,46828,59250),e=y,y=0,!(1&e||(y=0,G(41,46840,59253),e=y,y=0,1&e))){d[11779]=46828,oe(2528);break}e=0|ae(),Pe(2528),de(0|e)}}while(0);return 0|d[11779]},function(e){e|=0;do{if(!(0|f[2592])&&0|te(2592)){if(y=0,W(5,47556,59274,20),e=y,y=0,!(1&e)){Ie(199,47556,0|T),oe(2592);break}e=0|ae(),Pe(2592),de(0|e)}}while(0);return 47556},function(e){e|=0;do{if(!(0|f[2608])&&0|te(2608)){if(y=0,W(5,47664,59295,11),e=y,y=0,!(1&e)){Ie(199,47664,0|T),oe(2608);break}e=0|ae(),Pe(2608),de(0|e)}}while(0);return 47664},function(e){e|=0;do{if(!(0|f[2560])&&0|te(2560)){if(y=0,W(5,47436,59256,8),e=y,y=0,!(1&e)){Ie(199,47436,0|T),oe(2560);break}e=0|ae(),Pe(2560),de(0|e)}}while(0);return 47436},function(e){e|=0;do{if(!(0|f[2576])&&0|te(2576)){if(y=0,W(5,47496,59265,8),e=y,y=0,!(1&e)){Ie(199,47496,0|T),oe(2576);break}e=0|ae(),Pe(2576),de(0|e)}}while(0);return 47496},function(e){return 2},function(e){e|=0;do{if(!(0|f[2480])&&0|te(2480)){if(!(0|f[2488])&&0|te(2488)){e=45212;do{d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,e=e+12|0}while(45380!=(0|e));Ie(194,0,0|T),oe(2488)}if(y=0,G(42,45212,45380),e=y,y=0,!(1&e||(y=0,G(42,45224,45408),e=y,y=0,1&e)||(y=0,G(42,45236,45436),e=y,y=0,1&e)||(y=0,G(42,45248,45468),e=y,y=0,1&e)||(y=0,G(42,45260,45508),e=y,y=0,1&e)||(y=0,G(42,45272,45544),e=y,y=0,1&e)||(y=0,G(42,45284,45572),e=y,y=0,1&e)||(y=0,G(42,45296,45608),e=y,y=0,1&e)||(y=0,G(42,45308,45624),e=y,y=0,1&e)||(y=0,G(42,45320,45640),e=y,y=0,1&e)||(y=0,G(42,45332,45656),e=y,y=0,1&e)||(y=0,G(42,45344,45672),e=y,y=0,1&e)||(y=0,G(42,45356,45688),e=y,y=0,1&e)||(y=0,G(42,45368,45704),e=y,y=0,1&e))){d[11430]=45212,oe(2480);break}e=0|ae(),Pe(2480),de(0|e)}}while(0);return 0|d[11430]},function(e){e|=0;e:do{if(!(0|f[2512])&&0|te(2512)){if(!(0|f[2520])&&0|te(2520)){e=46016;do{d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,e=e+12|0}while(46304!=(0|e));Ie(196,0,0|T),oe(2520)}y=0,G(42,46016,46304),e=y,y=0;do{if(!(1&e||(y=0,G(42,46028,46336),e=y,y=0,1&e)||(y=0,G(42,46040,46372),e=y,y=0,1&e)||(y=0,G(42,46052,46396),e=y,y=0,1&e)||(y=0,G(42,46064,46420),e=y,y=0,1&e)||(y=0,G(42,46076,46436),e=y,y=0,1&e)||(y=0,G(42,46088,46456),e=y,y=0,1&e)||(y=0,G(42,46100,46476),e=y,y=0,1&e)||(y=0,G(42,46112,46504),e=y,y=0,1&e)||(y=0,G(42,46124,46544),e=y,y=0,1&e)||(y=0,G(42,46136,46576),e=y,y=0,1&e)||(y=0,G(42,46148,46612),e=y,y=0,1&e)||(y=0,G(42,46160,46648),e=y,y=0,1&e)||(y=0,G(42,46172,46664),e=y,y=0,1&e)||(y=0,G(42,46184,46680),e=y,y=0,1&e))){if(y=0,G(42,46196,46696),e=y,y=0,1&e||(y=0,G(42,46208,46420),e=y,y=0,1&e)||(y=0,G(42,46220,46712),e=y,y=0,1&e)||(y=0,G(42,46232,46728),e=y,y=0,1&e)||(y=0,G(42,46244,46744),e=y,y=0,1&e)||(y=0,G(42,46256,46760),e=y,y=0,1&e)||(y=0,G(42,46268,46776),e=y,y=0,1&e)||(y=0,G(42,46280,46792),e=y,y=0,1&e)||(y=0,G(42,46292,46808),e=y,y=0,1&e))break;d[11706]=46016,oe(2512);break e}}while(0);e=0|ae(),Pe(2512),de(0|e)}}while(0);return 0|d[11706]},function(e){e|=0;do{if(!(0|f[2544])&&0|te(2544)){if(!(0|f[2552])&&0|te(2552)){e=47120;do{d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,e=e+12|0}while(47408!=(0|e));Ie(198,0,0|T),oe(2552)}if(y=0,G(42,47120,47408),e=y,y=0,!(1&e||(y=0,G(42,47132,47420),e=y,y=0,1&e))){d[11858]=47120,oe(2544);break}e=0|ae(),Pe(2544),de(0|e)}}while(0);return 0|d[11858]},function(e){e|=0;var t=0;do{if(!(0|f[2600])&&0|te(2600)){if(y=0,e=0|N(76,47568),t=y,y=0,!(1&t||(y=0,W(15,47652,47568,0|e),t=y,y=0,1&t))){Ie(200,47652,0|T),oe(2600);break}t=0|ae(),Pe(2600),de(0|t)}}while(0);return 47652},function(e){e|=0;var t=0;do{if(!(0|f[2616])&&0|te(2616)){if(y=0,e=0|N(76,47676),t=y,y=0,!(1&t||(y=0,W(15,47724,47676,0|e),t=y,y=0,1&t))){Ie(200,47724,0|T),oe(2616);break}t=0|ae(),Pe(2616),de(0|t)}}while(0);return 47724},function(e){e|=0;var t=0;do{if(!(0|f[2568])&&0|te(2568)){if(y=0,e=0|N(76,47448),t=y,y=0,!(1&t||(y=0,W(15,47484,47448,0|e),t=y,y=0,1&t))){Ie(200,47484,0|T),oe(2568);break}t=0|ae(),Pe(2568),de(0|t)}}while(0);return 47484},function(e){e|=0;var t=0;do{if(!(0|f[2584])&&0|te(2584)){if(y=0,e=0|N(76,47508),t=y,y=0,!(1&t||(y=0,W(15,47544,47508,0|e),t=y,y=0,1&t))){Ie(200,47544,0|T),oe(2584);break}t=0|ae(),Pe(2584),de(0|t)}}while(0);return 47544},function(e){return 127},function(e){return 127},function(e){return 0},function(e){return 127},function(e){return 127},function(e){return 0},function(e){return 2147483647},function(e){return 2147483647},function(e){return 0},function(e){return 2147483647},function(e){return 2147483647},function(e){return 0},function(e){var t,i,r=0,n=0,a=0,o=0;y=0,i=0|N(75,0|d[(t=(e|=0)+8|0)>>2]),r=y,y=0;do{if(!(1&r)){if(y=0,r=0|O(35,0,0,4),e=y,y=0,1&e){if(e=0|ae(0),!(i&&(y=0,N(75,0|i),o=y,y=0,1&o)))break;Ue(o=0|ae(0))}if(0|i&&(y=0,N(75,0|i),o=y,y=0,1&o)&&Ue(o=0|ae(0)),r)a=-1;else if(e=0|d[t>>2]){if(y=0,e=0|N(75,0|e),o=y,y=0,1&o){n=16;break}0|e&&(y=0,N(75,0|e),o=y,y=0,1&o)?Ue(o=0|ae(0)):a=0}else a=1;return 0|a}n=16}while(0);return 16==(0|n)&&(e=0|ae(0)),Ue(e),0},function(e){return 0},function(e){var t=0,i=0;return(e=0|d[(e|=0)+8>>2])?(y=0,e=0|N(75,0|e),i=y,y=0,1&i&&Ue(i=0|ae(0)),0|e&&(y=0,N(75,0|e),i=y,y=0,1&i)?Ue(i=0|ae(0)):t=4):t=1,0|t},function(e){return 0|f[(e|=0)+8|0]},function(e){return 0|f[(e|=0)+9|0]},function(e){return 0|d[(e|=0)+8>>2]},function(e){return 0|d[(e|=0)+12>>2]},function(e){return 1},function(e){return 1},function(e){return 1},function(e){return 0},function(e){return 0},function(e){return 4},function(e){return 0},function(e){return 0},function(e){return 4},function(e){e|=0;var t,i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0;a=b,b=b+32|0,i=a+28|0,n=a+4|0,r=a,d[(o=a+16|0)>>2]=0,d[(s=o+4|0)>>2]=0,d[o+8>>2]=0,w=0|Oa(5),d[o>>2]=w,d[(t=o+8|0)>>2]=w+5,f[w|0]=74,f[w+1|0]=70,f[w+2|0]=73,f[w+3|0]=70,f[w+4|0]=0,d[s>>2]=w+5,y=0,L(84,0|o,65535&d[e>>2]),w=y,y=0;e:do{if(1&w)T=43;else{if(S=255&d[e+4>>2],(l=0|d[s>>2])>>>0>=(u=0|d[t>>2])>>>0){if((0|(g=l-(m=h=0|d[o>>2])+1|0))<0){if(y=0,P(178,0|o),w=y,y=0,1&w){T=43;break}m=0|d[o>>2],u=0|d[t>>2],h=m}if((l=u-(A=h)|0)>>>0<1073741823?(l=(l<<=1)>>>0>>0?g:l,p=(u=0|d[s>>2])-A|0,l?T=10:(l=0,g=0)):(l=2147483647,u=p=0|d[s>>2],p=p-A|0,T=10),10==(0|T)&&(y=0,g=0|N(67,0|l),w=y,y=0,1&w)){T=43;break}f[g+p|0]=S,Wn(0|(w=g+(p-(v=u-A|0))|0),0|h,0|v),d[o>>2]=w,d[s>>2]=g+(p+1),d[t>>2]=g+l,m&&Ba(m)}else f[l|0]=S,d[s>>2]=1+(0|d[s>>2]);if(y=0,L(84,0|o,65535&d[e+8>>2]),w=y,y=0,1&w||(y=0,L(84,0|o,65535&d[e+12>>2]),w=y,y=0,1&w))T=43;else{if(v=255&d[(w=e+16|0)>>2],(l=0|d[s>>2])>>>0>=(h=0|d[t>>2])>>>0){if((0|(g=l-(u=m=0|d[o>>2])+1|0))<0){if(y=0,P(178,0|o),S=y,y=0,1&S){T=43;break}u=m=0|d[o>>2],h=0|d[t>>2]}if((l=h-(S=m)|0)>>>0<1073741823?(l=(l<<=1)>>>0>>0?g:l,p=(g=0|d[s>>2])-S|0,l?T=23:(A=0,h=0)):(l=2147483647,g=p=0|d[s>>2],p=p-S|0,T=23),23==(0|T)){if(y=0,h=0|N(67,0|l),A=y,y=0,1&A){T=43;break}A=l}f[h+p|0]=v,l=h+(p+1)|0,Wn(0|(v=h+(p-(S=g-S|0))|0),0|m,0|S),d[o>>2]=v,d[s>>2]=l,d[t>>2]=h+A,u&&(Ba(u),l=0|d[s>>2])}else f[l|0]=v,l=1+(0|d[s>>2])|0,d[s>>2]=l;if(S=255&d[(v=e+20|0)>>2],l>>>0>=(u=0|d[t>>2])>>>0){if((0|(g=l-(m=h=0|d[o>>2])+1|0))<0){if(y=0,P(178,0|o),A=y,y=0,1&A){T=43;break}m=0|d[o>>2],u=0|d[t>>2],h=m}if((l=u-(A=h)|0)>>>0<1073741823?(l=(l<<=1)>>>0>>0?g:l,p=(u=0|d[s>>2])-A|0,l?T=34:(l=0,g=0)):(l=2147483647,u=p=0|d[s>>2],p=p-A|0,T=34),34==(0|T)&&(y=0,g=0|N(67,0|l),C=y,y=0,1&C)){T=43;break}f[g+p|0]=S,Wn(0|(C=g+(p-(S=u-A|0))|0),0|h,0|S),d[o>>2]=C,d[s>>2]=g+(p+1),d[t>>2]=g+l,m&&Ba(m)}else f[l|0]=S,d[s>>2]=1+(0|d[s>>2]);l=0|d[w>>2];do{if((0|l)>0){if(!(0|d[e+24>>2])){if(d[r>>2]=d[s>>2],C=0+(0|E(3*l|0,0|d[v>>2]))|0,y=0,d[i>>2]=d[r>>2],Y(15,0|o,0|i,0,0|C),C=y,y=0,1&C){T=43;break e}break}if(u=0|ne(16),y=0,W(5,0|n,50792,57),C=y,y=0,1&C)l=0|ae();else if(y=0,l=0|H(1),C=y,y=0,1&C||(y=0,j(36,0|u,1,0|l,0|n),C=y,y=0,1&C)?c=1:(y=0,W(6,0|u,824,96),y=0,c=0),l=0|ae(),qr(n),!c){c=l;break e}re(0|u),c=l;break e}}while(0);if(y=0,p=0|N(67,20),C=y,y=0,!(1&C)){d[p>>2]=36800,f[p+4|0]=-32,d[(m=p+8|0)>>2]=0,d[(g=p+12|0)>>2]=0,d[(u=p+16|0)>>2]=0,h=(l=0|d[s>>2])-(C=0|d[o>>2])|0;do{if((0|l)!=(0|C)){if((0|h)<0&&(y=0,P(178,0|m),C=y,y=0,1&C)||(T=53),53==(0|T)&&(y=0,c=0|N(67,0|h),C=y,y=0,!(1&C))){if(d[g>>2]=c,d[m>>2]=c,d[u>>2]=c+h,(0|(l=0|d[o>>2]))==(0|(u=0|d[s>>2])))break;do{f[c|0]=0|f[l|0],c=1+(0|d[g>>2])|0,d[g>>2]=c,l=l+1|0}while((0|l)!=(0|u));l=0|d[o>>2];break}l=0|ae(),(c=0|d[m>>2])&&((0|d[g>>2])!=(0|c)&&(d[g>>2]=c),Ba(c)),Ba(p),T=44;break e}}while(0);return l?((0|d[s>>2])!=(0|l)&&(d[s>>2]=l),Ba(l),b=a,0|p):(b=a,0|p)}T=43}}}while(0);return 43==(0|T)&&(l=0|ae(),T=44),44==(0|T)&&(c=l),(l=0|d[o>>2])||de(0|c),(0|d[s>>2])!=(0|l)&&(d[s>>2]=l),Ba(l),de(0|c),0},Oa,rn,Ra,un,hn,function(e){return 0|Se(0|(e|=0))},function(e){return 0|Fe(0|(e|=0))},function(e){return 0|ye(0|(e|=0))},so,zo,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa,sa],is=[la,function(e,t,i,r,n,a,o,s,l,c,u){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0;var g,p,A,S,v,w,T,C,I,D,x,E,M,k,R,F=0,_=0,U=0,O=0,B=0,V=0,G=0,Q=0,z=0,H=0,Y=0,X=0,K=0,j=0,Z=0,J=0,$=0,ee=0,te=0,ie=0,re=0,ne=0,oe=0,se=0,le=0,ce=0;k=b,b=b+512|0,O=k+96|0,ce=k+80|0,v=k+72|0,S=k+68|0,w=k+500|0,p=k+497|0,T=k+496|0,I=k+56|0,M=k+44|0,x=k+32|0,D=k+20|0,E=k+8|0,A=k+4|0,C=k,d[(g=k+88|0)>>2]=u,d[ce>>2]=O,d[(R=ce+4|0)>>2]=189,d[v>>2]=O,d[S>>2]=O+400,d[I>>2]=0,d[I+4>>2]=0,d[I+8>>2]=0,d[M>>2]=0,d[M+4>>2]=0,d[M+8>>2]=0,d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,d[D>>2]=0,d[D+4>>2]=0,d[D+8>>2]=0,d[E>>2]=0,d[E+4>>2]=0,d[E+8>>2]=0,y=0,q(1,0|i,0|r,0|w,0|p,0|T,0|I,0|M,0|x,0|D,0|A),se=y,y=0;e:do{if(!(1&se)){d[c>>2]=d[l>>2],ee=s+8|0,te=x+4|0,ie=D+4|0,re=D+8|0,ne=D+1|0,oe=x+8|0,se=x+1|0,z=!!(512&n),H=M+8|0,Y=M+1|0,X=M+4|0,K=E+4|0,j=E+8|0,Z=E+1|0,J=w+3|0,$=I+4|0,Q=0,U=0;t:for(;;){u=0|d[e>>2];do{if(u){if((0|d[u+12>>2])==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}if(-1==(0|u)){d[e>>2]=0,u=0;break}u=0|d[e>>2];break}}else u=0}while(0);u=!(0|u),s=0|d[t>>2];do{if(s){if((0|d[s+12>>2])!=(0|d[s+16>>2])){if(u){G=s;break}le=235;break t}if(y=0,i=0|N(0|d[36+(0|d[s>>2])>>2],0|s),G=y,y=0,1&G){le=24;break t}if(-1!=(0|i)){if(u){G=s;break}le=235;break t}d[t>>2]=0,le=15;break}le=15}while(0);if(15==(0|le)){if(le=0,u){le=235;break}G=0}i:do{switch(0|f[w+Q|0]){case 1:if(3!=(0|Q)){if(u=0|d[e>>2],(0|(s=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),le=y,y=0,1&le){le=24;break t}}else u=0|m[s|0];if((255&u)<<24>>24<=-1){le=40;break t}if(!(8192&h[(0|d[ee>>2])+(u<<24>>24<<1)>>1])){le=40;break t}if(u=0|d[e>>2],(0|(i=0|d[(s=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[40+(0|d[u>>2])>>2],0|u),le=y,y=0,1&le){le=24;break t}}else d[s>>2]=i+1,u=0|m[i|0];if(y=0,L(67,0|E,255&u),le=y,y=0,1&le){le=24;break t}u=G,r=G,le=42}break;case 0:3!=(0|Q)&&(u=G,r=G,le=42);break;case 3:if((0|(u=1&(s=0|f[x|0])?0|d[te>>2]:(255&s)>>>1))!=(0-(r=1&(i=0|f[D|0])?0|d[ie>>2]:(255&i)>>>1)|0)){if(!u){if(u=0|d[e>>2],(0|(s=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}s=0|f[D|0]}else u=0|m[s|0],s=i;if((255&u)<<24>>24!=(0|f[(1&s?d[re>>2]:ne)|0]))break i;if(u=0|d[e>>2],(0|(i=0|d[(s=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}}else d[s>>2]=i+1;f[o|0]=1,U=(1&(G=0|f[D|0])?0|d[ie>>2]:(255&G)>>>1)>>>0>1?D:U;break i}if(n=0|d[e>>2],u=(0|(F=0|d[n+12>>2]))==(0|(i=0|d[n+16>>2])),!r){if(u){if(y=0,u=0|N(0|d[36+(0|d[n>>2])>>2],0|n),G=y,y=0,1&G){le=24;break t}s=0|f[x|0]}else u=0|m[F|0];if((255&u)<<24>>24!=(0|f[(1&s?d[oe>>2]:se)|0])){f[o|0]=1;break i}if(u=0|d[e>>2],(0|(i=0|d[(s=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}}else d[s>>2]=i+1;U=(1&(G=0|f[x|0])?0|d[te>>2]:(255&G)>>>1)>>>0>1?x:U;break i}if(u){if(y=0,u=0|N(0|d[36+(0|d[n>>2])>>2],0|n),G=y,y=0,1&G){le=24;break t}i=0|d[e>>2],s=0|f[x|0],n=i,F=0|d[i+12>>2],i=0|d[i+16>>2]}else u=0|m[F|0];if(r=n+12|0,i=(0|F)==(0|i),(255&u)<<24>>24==(0|f[(1&s?d[oe>>2]:se)|0])){if(i){if(y=0,N(0|d[40+(0|d[n>>2])>>2],0|n),G=y,y=0,1&G){le=24;break t}}else d[r>>2]=F+1;U=(1&(G=0|f[x|0])?0|d[te>>2]:(255&G)>>>1)>>>0>1?x:U;break i}if(i){if(y=0,u=0|N(0|d[36+(0|d[n>>2])>>2],0|n),G=y,y=0,1&G){le=24;break t}}else u=0|m[F|0];if((255&u)<<24>>24!=(0|f[(1&f[D|0]?d[re>>2]:ne)|0])){le=104;break t}if(u=0|d[e>>2],(0|(i=0|d[(s=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}}else d[s>>2]=i+1;f[o|0]=1,U=(1&(G=0|f[D|0])?0|d[ie>>2]:(255&G)>>>1)>>>0>1?D:U}break;case 2:if(!(Q>>>0<2|!!(0|U)||z|2==(0|Q)&!!(0|f[J|0]))){U=0;break i}u=!(1&(B=0|f[M|0])),V=0|d[H>>2],_=i=u?Y:V;r:do{if(0|Q&&(0|m[w+(Q+-1)|0])<2){r=i+(F=u?(255&B)>>>1:0|d[X>>2])|0,n=0|d[ee>>2];n:do{if(F){F=i,s=_;do{if((u=0|f[F|0])<<24>>24<=-1||!(8192&h[n+(u<<24>>24<<1)>>1]))break n;s=F=F+1|0}while((0|F)!=(0|r))}else s=_}while(0);if(r=s-_|0,(n=(u=!(1&(n=0|f[E|0])))?(255&n)>>>1:0|d[K>>2])>>>0>=r>>>0){if(F=(u=u?Z:0|d[j>>2])+n|0,(0|s)!=(0|_))for(u=u+(n-r)|0;;){if((0|f[u|0])!=(0|f[i|0])){s=_;break r}if((0|(u=u+1|0))==(0|F))break;i=i+1|0}}else s=_}else s=_}while(0);u=((u=!(1&B))?Y:V)+(u?(255&B)>>>1:0|d[X>>2])|0;r:do{if((0|s)!=(0|u))for(n=G,r=G,u=s;;){s=0|d[e>>2];do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[s>>2])>>2],0|s),G=y,y=0,1&G){le=21;break t}if(-1==(0|s)){d[e>>2]=0,s=0;break}s=0|d[e>>2];break}}else s=0}while(0);i=!(0|s);do{if(r){if((0|d[r+12>>2])!=(0|d[r+16>>2])){if(i){s=n,F=r;break}break r}if(y=0,s=0|N(0|d[36+(0|d[r>>2])>>2],0|r),G=y,y=0,1&G){le=21;break t}if(-1!=(0|s)){if(i^!(0|n)){s=n,F=n;break}break r}d[t>>2]=0,s=0,le=131;break}s=n,le=131}while(0);if(131==(0|le)){if(le=0,i)break r;F=0}if(i=0|d[e>>2],(0|(r=0|d[i+12>>2]))==(0|d[i+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[i>>2])>>2],0|i),G=y,y=0,1&G){le=21;break t}}else i=0|m[r|0];if((255&i)<<24>>24!=(0|f[u|0]))break r;if(i=0|d[e>>2],(0|(n=0|d[(r=i+12|0)>>2]))==(0|d[i+16>>2])){if(y=0,N(0|d[40+(0|d[i>>2])>>2],0|i),G=y,y=0,1&G){le=21;break t}}else d[r>>2]=n+1;if((0|(u=u+1|0))==(0|(i=((G=!(1&(i=0|f[M|0])))?Y:0|d[H>>2])+(G?(255&i)>>>1:0|d[X>>2])|0))){u=i;break}n=s,r=F}}while(0);if(z&&(0|u)!=(((V=!(1&(G=0|f[M|0])))?Y:0|d[H>>2])+(V?(255&G)>>>1:0|d[X>>2])|0)){le=143;break t}break;case 4:_=0|f[T|0],s=G,n=G,u=0;r:for(;;){i=0|d[e>>2];do{if(i){if((0|d[i+12>>2])==(0|d[i+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[i>>2])>>2],0|i),G=y,y=0,1&G){le=23;break t}if(-1==(0|i)){d[e>>2]=0,i=0;break}i=0|d[e>>2];break}}else i=0}while(0);r=!(0|i);do{if(n){if((0|d[n+12>>2])!=(0|d[n+16>>2])){if(r){F=s;break}r=s;break r}if(y=0,i=0|N(0|d[36+(0|d[n>>2])>>2],0|n),G=y,y=0,1&G){le=23;break t}if(-1!=(0|i)){if(r^!(0|s)){F=s,n=s;break}r=s;break r}d[t>>2]=0,s=0,le=156;break}le=156}while(0);if(156==(0|le)){if(le=0,r){r=s;break}F=s,n=0}if(s=0|d[e>>2],(0|(i=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[s>>2])>>2],0|s),G=y,y=0,1&G){le=23;break t}}else s=0|m[i|0];if((i=255&s)<<24>>24>-1&&2048&h[(0|d[ee>>2])+(s<<24>>24<<1)>>1]){if((0|(s=0|d[c>>2]))==(0|d[g>>2])){if(y=0,W(12,0|l,0|c,0|g),G=y,y=0,1&G){le=23;break t}s=0|d[c>>2]}d[c>>2]=s+1,f[s|0]=i,u=u+1|0}else{if(G=0|f[I|0],!(i<<24>>24==_<<24>>24&(0|u?!!(0|(1&G?d[$>>2]:(255&G)>>>1)):0))){r=F;break}if((0|O)==(0|d[S>>2])){if(y=0,W(13,0|ce,0|v,0|S),G=y,y=0,1&G){le=23;break t}O=0|d[v>>2]}G=O+4|0,d[v>>2]=G,d[O>>2]=u,O=G,u=0}if(s=0|d[e>>2],(0|(r=0|d[(i=s+12|0)>>2]))!=(0|d[s+16>>2]))d[i>>2]=r+1,s=F;else{if(y=0,N(0|d[40+(0|d[s>>2])>>2],0|s),G=y,y=0,1&G){le=23;break t}s=F}}if(0|u&&(0|d[ce>>2])!=(0|O)){if((0|O)==(0|d[S>>2])){if(y=0,W(13,0|ce,0|v,0|S),G=y,y=0,1&G){le=24;break t}O=0|d[v>>2]}G=O+4|0,d[v>>2]=G,d[O>>2]=u,O=G}if((0|(F=0|d[A>>2]))>0){u=0|d[e>>2];do{if(u){if((0|d[u+12>>2])==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}if(-1==(0|u)){d[e>>2]=0,u=0;break}u=0|d[e>>2];break}}else u=0}while(0);u=!(0|u);do{if(r){if((0|d[r+12>>2])==(0|d[r+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[r>>2])>>2],0|r),G=y,y=0,1&G){le=24;break t}if(-1==(0|s)){d[t>>2]=0,le=193;break}}if(!u){le=198;break t}}else le=193}while(0);if(193==(0|le)){if(le=0,u){le=198;break t}r=0}if(u=0|d[e>>2],(0|(s=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}}else u=0|m[s|0];if((255&u)<<24>>24!=(0|f[p|0])){le=198;break t}if(u=0|d[e>>2],(0|(i=0|d[(s=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=24;break t}}else d[s>>2]=i+1;if((0|F)>0)for(n=r,i=r,_=F;;){u=0|d[e>>2];do{if(u){if((0|d[u+12>>2])==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=22;break t}if(-1==(0|u)){d[e>>2]=0,u=0;break}u=0|d[e>>2];break}}else u=0}while(0);s=!(0|u);do{if(i){if((0|d[i+12>>2])!=(0|d[i+16>>2])){if(s){u=n,F=i;break}le=222;break t}if(y=0,u=0|N(0|d[36+(0|d[i>>2])>>2],0|i),G=y,y=0,1&G){le=22;break t}if(-1!=(0|u)){if(s^!(0|n)){u=n,F=n;break}le=222;break t}d[t>>2]=0,u=0,le=215;break}u=n,le=215}while(0);if(215==(0|le)){if(le=0,s){le=222;break t}F=0}if(s=0|d[e>>2],(0|(i=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[s>>2])>>2],0|s),G=y,y=0,1&G){le=22;break t}}else s=0|m[i|0];if((255&s)<<24>>24<=-1){le=222;break t}if(!(2048&h[(0|d[ee>>2])+(s<<24>>24<<1)>>1])){le=222;break t}if((0|d[c>>2])==(0|d[g>>2])&&(y=0,W(12,0|l,0|c,0|g),G=y,y=0,1&G)){le=22;break t}if(s=0|d[e>>2],(0|(i=0|d[s+12>>2]))==(0|d[s+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[s>>2])>>2],0|s),G=y,y=0,1&G){le=22;break t}}else s=0|m[i|0];if(i=0|d[c>>2],d[c>>2]=i+1,f[i|0]=s,s=_,_=_+-1|0,d[A>>2]=_,i=0|d[e>>2],(0|(n=0|d[(r=i+12|0)>>2]))==(0|d[i+16>>2])){if(y=0,N(0|d[40+(0|d[i>>2])>>2],0|i),G=y,y=0,1&G){le=22;break t}}else d[r>>2]=n+1;if((0|s)<=1)break;n=u,i=F}}if((0|d[c>>2])==(0|d[l>>2])){le=233;break t}}}while(0);i:do{if(42==(0|le))for(;;){le=0,s=0|d[e>>2];do{if(s){if((0|d[s+12>>2])==(0|d[s+16>>2])){if(y=0,s=0|N(0|d[36+(0|d[s>>2])>>2],0|s),G=y,y=0,1&G){le=20;break t}if(-1==(0|s)){d[e>>2]=0,s=0;break}s=0|d[e>>2];break}}else s=0}while(0);i=!(0|s);do{if(r){if((0|d[r+12>>2])!=(0|d[r+16>>2])){if(i){n=u;break}break i}if(y=0,s=0|N(0|d[36+(0|d[r>>2])>>2],0|r),G=y,y=0,1&G){le=20;break t}if(-1!=(0|s)){if(i^!(0|u)){n=u,r=u;break}break i}d[t>>2]=0,u=0,le=54;break}le=54}while(0);if(54==(0|le)){if(le=0,i)break i;n=u,r=0}if(u=0|d[e>>2],(0|(s=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),G=y,y=0,1&G){le=20;break t}}else u=0|m[s|0];if((255&u)<<24>>24<=-1||!(8192&h[(0|d[ee>>2])+(u<<24>>24<<1)>>1]))break i;if(u=0|d[e>>2],(0|(i=0|d[(s=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[40+(0|d[u>>2])>>2],0|u),le=y,y=0,1&le){le=20;break t}}else d[s>>2]=i+1,u=0|m[i|0];if(y=0,L(67,0|E,255&u),le=y,y=0,1&le){le=20;break t}u=n,le=42}}while(0);if((Q=Q+1|0)>>>0>=4){le=235;break}}t:switch(0|le){case 20:case 21:case 22:case 23:case 24:s=0|ae();break e;case 40:case 104:case 143:case 198:case 222:case 233:d[a>>2]=4|d[a>>2],s=0;break;case 235:i:do{if(U){n=U+1|0,F=U+8|0,_=U+4|0,i=1;r:for(;;){if(i>>>0>=(u=1&(u=0|f[U|0])?0|d[_>>2]:(255&u)>>>1)>>>0)break i;u=0|d[e>>2];do{if(u){if((0|d[u+12>>2])==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),c=y,y=0,1&c){le=19;break r}if(-1==(0|u)){d[e>>2]=0,u=0;break}u=0|d[e>>2];break}}else u=0}while(0);s=!(0|u),u=0|d[t>>2];do{if(u){if((0|d[u+12>>2])==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),c=y,y=0,1&c){le=19;break r}if(-1==(0|u)){d[t>>2]=0,le=253;break}}if(!s){le=260;break r}}else le=253}while(0);if(253==(0|le)&&(le=0,s)){le=260;break}if(u=0|d[e>>2],(0|(s=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),c=y,y=0,1&c){le=19;break}}else u=0|m[s|0];if(s=1&f[U|0]?0|d[F>>2]:n,(255&u)<<24>>24!=(0|f[s+i|0])){le=260;break}if(u=i+1|0,s=0|d[e>>2],(0|(r=0|d[(i=s+12|0)>>2]))!=(0|d[s+16>>2]))d[i>>2]=r+1,i=u;else{if(y=0,N(0|d[40+(0|d[s>>2])>>2],0|s),c=y,y=0,1&c){le=19;break}i=u}}if(19==(0|le)){s=0|ae();break e}if(260==(0|le)){d[a>>2]=4|d[a>>2],s=0;break t}}}while(0);(0|(u=0|d[ce>>2]))!=(0|O)&&(d[C>>2]=0,lr(I,u,O,C),0|d[C>>2])?(d[a>>2]=4|d[a>>2],s=0):s=1}return qr(E),qr(D),qr(x),qr(M),qr(I),u=0|d[ce>>2],d[ce>>2]=0,0|u&&(y=0,P(0|d[R>>2],0|u),ce=y,y=0,1&ce)&&Ue(ce=0|ae(0)),b=k,0|s}s=0|ae()}while(0);return qr(E),qr(D),qr(x),qr(M),qr(I),u=0|d[ce>>2],d[ce>>2]=0,0|u&&(y=0,P(0|d[R>>2],0|u),ce=y,y=0,1&ce)&&Ue(ce=0|ae(0)),de(0|s),0},function(e,t,i,r,n,a,o,s,l,c,u){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0;var h,g,p,A,S,v,w,T,C,I,D,x,E,M,k,R=0,F=0,_=0,U=0,B=0,V=0,G=0,Q=0,z=0,H=0,Y=0,X=0,K=0,j=0,Z=0,J=0,$=0,ee=0,te=0,ie=0,re=0,ne=0;M=b,b=b+512|0,R=M+104|0,ne=M+88|0,S=M+80|0,A=M+76|0,v=M+504|0,g=M+72|0,w=M+68|0,C=M+56|0,E=M+44|0,D=M+32|0,I=M+20|0,x=M+8|0,p=M+4|0,T=M,d[(h=M+96|0)>>2]=u,d[ne>>2]=R,d[(k=ne+4|0)>>2]=189,d[S>>2]=R,d[A>>2]=R+400,d[C>>2]=0,d[C+4>>2]=0,d[C+8>>2]=0,d[E>>2]=0,d[E+4>>2]=0,d[E+8>>2]=0,d[D>>2]=0,d[D+4>>2]=0,d[D+8>>2]=0,d[I>>2]=0,d[I+4>>2]=0,d[I+8>>2]=0,d[x>>2]=0,d[x+4>>2]=0,d[x+8>>2]=0,y=0,q(2,0|i,0|r,0|v,0|g,0|w,0|C,0|E,0|D,0|I,0|p),ie=y,y=0;e:do{if(!(1&ie)){d[c>>2]=d[l>>2],$=D+4|0,ee=I+4|0,te=I+8|0,ie=D+8|0,H=!!(512&n),Y=E+8|0,X=E+4|0,K=x+4|0,j=x+8|0,Z=v+3|0,J=C+4|0,z=0,_=0;t:for(;;){u=0|d[e>>2];do{if(u){if((0|(i=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),Q=y,y=0,1&Q){re=26;break t}}else u=0|d[i>>2];if(-1==(0|u)){d[e>>2]=0,r=1;break}r=!(0|d[e>>2]);break}r=1}while(0);i=0|d[t>>2];do{if(i){if((0|(u=0|d[i+12>>2]))==(0|d[i+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[i>>2])>>2],0|i),Q=y,y=0,1&Q){re=26;break t}}else u=0|d[u>>2];if(-1!=(0|u)){if(r){Q=i;break}U=R,re=244;break t}d[t>>2]=0,re=16;break}re=16}while(0);if(16==(0|re)){if(re=0,r){U=R,re=244;break}Q=0}i:do{switch(0|f[v+z|0]){case 1:if(3!=(0|z)){if(u=0|d[e>>2],(0|(i=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),re=y,y=0,1&re){re=26;break t}}else u=0|d[i>>2];if(y=0,u=0|O(0|d[12+(0|d[s>>2])>>2],0|s,8192,0|u),re=y,y=0,1&re){re=26;break t}if(!u){re=42;break t}if(u=0|d[e>>2],(0|(r=0|d[(i=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[40+(0|d[u>>2])>>2],0|u),re=y,y=0,1&re){re=26;break t}}else d[i>>2]=r+4,u=0|d[r>>2];if(y=0,L(92,0|x,0|u),re=y,y=0,1&re){re=26;break t}u=Q,n=Q,re=44}else u=R;break;case 0:3==(0|z)?u=R:(u=Q,n=Q,re=44);break;case 3:if((0|(u=1&(i=0|f[D|0])?0|d[$>>2]:(255&i)>>>1))==(0-(n=1&(r=0|f[I|0])?0|d[ee>>2]:(255&r)>>>1)|0))u=R;else{if(!u){if(u=0|d[e>>2],(0|(i=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),Q=y,y=0,1&Q){re=26;break t}i=0|f[I|0]}else u=0|d[i>>2],i=r;if((0|u)!=(0|d[(1&i?d[te>>2]:ee)>>2])){u=R;break i}if(u=0|d[e>>2],(0|(r=0|d[(i=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),Q=y,y=0,1&Q){re=26;break t}}else d[i>>2]=r+4;f[o|0]=1,u=R,_=(1&(Q=0|f[I|0])?0|d[ee>>2]:(255&Q)>>>1)>>>0>1?I:_;break i}if(F=0|d[e>>2],u=(0|(U=0|d[F+12>>2]))==(0|(r=0|d[F+16>>2])),!n){if(u){if(y=0,u=0|N(0|d[36+(0|d[F>>2])>>2],0|F),Q=y,y=0,1&Q){re=26;break t}i=0|f[D|0]}else u=0|d[U>>2];if((0|u)!=(0|d[(1&i?d[ie>>2]:$)>>2])){f[o|0]=1,u=R;break i}if(u=0|d[e>>2],(0|(r=0|d[(i=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),Q=y,y=0,1&Q){re=26;break t}}else d[i>>2]=r+4;u=R,_=(1&(Q=0|f[D|0])?0|d[$>>2]:(255&Q)>>>1)>>>0>1?D:_;break i}if(u){if(y=0,u=0|N(0|d[36+(0|d[F>>2])>>2],0|F),Q=y,y=0,1&Q){re=26;break t}r=0|d[e>>2],i=0|f[D|0],F=r,U=0|d[r+12>>2],r=0|d[r+16>>2]}else u=0|d[U>>2];if(n=F+12|0,r=(0|U)==(0|r),(0|u)==(0|d[(1&i?d[ie>>2]:$)>>2])){if(r){if(y=0,N(0|d[40+(0|d[F>>2])>>2],0|F),Q=y,y=0,1&Q){re=26;break t}}else d[n>>2]=U+4;u=R,_=(1&(Q=0|f[D|0])?0|d[$>>2]:(255&Q)>>>1)>>>0>1?D:_;break i}if(r){if(y=0,u=0|N(0|d[36+(0|d[F>>2])>>2],0|F),Q=y,y=0,1&Q){re=26;break t}}else u=0|d[U>>2];if((0|u)!=(0|d[(1&f[I|0]?d[te>>2]:ee)>>2])){re=107;break t}if(u=0|d[e>>2],(0|(r=0|d[(i=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,N(0|d[40+(0|d[u>>2])>>2],0|u),Q=y,y=0,1&Q){re=26;break t}}else d[i>>2]=r+4;f[o|0]=1,u=R,_=(1&(Q=0|f[I|0])?0|d[ee>>2]:(255&Q)>>>1)>>>0>1?I:_}break;case 2:if(!(z>>>0<2|!!(0|_)||H|2==(0|z)&!!(0|f[Z|0]))){u=R,_=0;break i}n=0|f[E|0],r=0|d[Y>>2],u=i=1&n?r:X;r:do{if(0|z&&(0|m[v+(z+-1)|0])<2){G=!(1&n);n:do{if((0|i)!=((G?X:r)+((G?(255&n)>>>1:d[X>>2])<<2)|0)){for(n=i;;){if(y=0,i=0|O(0|d[12+(0|d[s>>2])>>2],0|s,8192,0|d[n>>2]),G=y,y=0,1&G){re=23;break t}if(!i)break;if(u=n=n+4|0,i=0|f[E|0],r=0|d[Y>>2],(0|n)==(((G=!(1&i))?X:r)+((G?(255&i)>>>1:d[X>>2])<<2)|0)){n=i;break n}}n=0|f[E|0],r=0|d[Y>>2]}}while(0);if(B=u-(i=U=1&n?r:X)>>2,(V=(F=!(1&(V=0|f[x|0])))?(255&V)>>>1:0|d[K>>2])>>>0>=B>>>0)if(G=(F=F?K:0|d[j>>2])+(V<<2)|0,B)for(F=F+(V-B<<2)|0;;){if((0|d[F>>2])!=(0|d[U>>2]))break r;if((0|(F=F+4|0))==(0|G)){i=u;break}U=U+4|0}else i=u}else i=u}while(0);u=((u=!(1&n))?X:r)+((u?(255&n)>>>1:d[X>>2])<<2)|0;r:do{if((0|i)!=(0|u))for(F=Q,n=Q,u=i;;){i=0|d[e>>2];do{if(i){if((0|(r=0|d[i+12>>2]))==(0|d[i+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[i>>2])>>2],0|i),Q=y,y=0,1&Q){re=22;break t}}else i=0|d[r>>2];if(-1==(0|i)){d[e>>2]=0,r=1;break}r=!(0|d[e>>2]);break}r=1}while(0);do{if(n){if((0|(i=0|d[n+12>>2]))==(0|d[n+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[n>>2])>>2],0|n),Q=y,y=0,1&Q){re=22;break t}}else i=0|d[i>>2];if(-1!=(0|i)){if(r^!(0|F)){i=F,U=F;break}break r}d[t>>2]=0,i=0,re=136;break}i=F,re=136}while(0);if(136==(0|re)){if(re=0,r)break r;U=0}if(r=0|d[e>>2],(0|(n=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[r>>2])>>2],0|r),Q=y,y=0,1&Q){re=22;break t}}else r=0|d[n>>2];if((0|r)!=(0|d[u>>2]))break r;if(r=0|d[e>>2],(0|(F=0|d[(n=r+12|0)>>2]))==(0|d[r+16>>2])){if(y=0,N(0|d[40+(0|d[r>>2])>>2],0|r),Q=y,y=0,1&Q){re=22;break t}}else d[n>>2]=F+4;if((0|(u=u+4|0))==(0|(r=((Q=!(1&(r=0|f[E|0])))?X:0|d[Y>>2])+((Q?(255&r)>>>1:d[X>>2])<<2)|0))){u=r;break}F=i,n=U}}while(0);if(H&&(0|u)!=(((G=!(1&(Q=0|f[E|0])))?X:0|d[Y>>2])+((G?(255&Q)>>>1:d[X>>2])<<2)|0)){re=148;break t}u=R;break;case 4:V=0|d[w>>2],B=Q,F=Q,u=R,i=0;r:for(;;){r=0|d[e>>2];do{if(r){if((0|(n=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[r>>2])>>2],0|r),Q=y,y=0,1&Q){re=25;break t}}else r=0|d[n>>2];if(-1==(0|r)){d[e>>2]=0,n=1;break}n=!(0|d[e>>2]);break}n=1}while(0);do{if(F){if((0|(r=0|d[F+12>>2]))==(0|d[F+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[F>>2])>>2],0|F),Q=y,y=0,1&Q){re=25;break t}}else r=0|d[r>>2];if(-1!=(0|r)){if(n^!(0|B)){r=B,U=B;break}R=B;break r}d[t>>2]=0,r=0,re=162;break}r=B,re=162}while(0);if(162==(0|re)){if(re=0,n){R=r;break}U=0}if(n=0|d[e>>2],(0|(R=0|d[n+12>>2]))==(0|d[n+16>>2])){if(y=0,n=0|N(0|d[36+(0|d[n>>2])>>2],0|n),Q=y,y=0,1&Q){re=25;break t}}else n=0|d[R>>2];if(y=0,R=0|O(0|d[12+(0|d[s>>2])>>2],0|s,2048,0|n),Q=y,y=0,1&Q){re=25;break t}if(R){if((0|(R=0|d[c>>2]))==(0|d[h>>2])){if(y=0,W(14,0|l,0|c,0|h),Q=y,y=0,1&Q){re=25;break t}R=0|d[c>>2]}d[c>>2]=R+4,d[R>>2]=n,i=i+1|0}else{if(Q=0|f[C|0],!((0|n)==(0|V)&(0|i?!!(0|(1&Q?d[J>>2]:(255&Q)>>>1)):0))){R=r;break}if((0|u)==(0|d[A>>2])){if(y=0,W(13,0|ne,0|S,0|A),Q=y,y=0,1&Q){re=25;break t}u=0|d[S>>2]}Q=u+4|0,d[S>>2]=Q,d[u>>2]=i,u=Q,i=0}if(n=0|d[e>>2],(0|(F=0|d[(R=n+12|0)>>2]))!=(0|d[n+16>>2]))d[R>>2]=F+4,B=r,F=U;else{if(y=0,N(0|d[40+(0|d[n>>2])>>2],0|n),Q=y,y=0,1&Q){re=25;break t}B=r,F=U}}if(0|i&&(0|d[ne>>2])!=(0|u)){if((0|u)==(0|d[A>>2])){if(y=0,W(13,0|ne,0|S,0|A),Q=y,y=0,1&Q){re=26;break t}u=0|d[S>>2]}Q=u+4|0,d[S>>2]=Q,d[u>>2]=i,u=Q}if((0|(U=0|d[p>>2]))>0){i=0|d[e>>2];do{if(i){if((0|(r=0|d[i+12>>2]))==(0|d[i+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[i>>2])>>2],0|i),Q=y,y=0,1&Q){re=26;break t}}else i=0|d[r>>2];if(-1==(0|i)){d[e>>2]=0,r=1;break}r=!(0|d[e>>2]);break}r=1}while(0);do{if(R){if((0|(i=0|d[R+12>>2]))==(0|d[R+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[R>>2])>>2],0|R),Q=y,y=0,1&Q){re=26;break t}}else i=0|d[i>>2];if(-1!=(0|i)){if(r)break;re=206;break t}d[t>>2]=0,re=200;break}re=200}while(0);if(200==(0|re)){if(re=0,r){re=206;break t}R=0}if(i=0|d[e>>2],(0|(r=0|d[i+12>>2]))==(0|d[i+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[i>>2])>>2],0|i),Q=y,y=0,1&Q){re=26;break t}}else i=0|d[r>>2];if((0|i)!=(0|d[g>>2])){re=206;break t}if(i=0|d[e>>2],(0|(n=0|d[(r=i+12|0)>>2]))==(0|d[i+16>>2])){if(y=0,N(0|d[40+(0|d[i>>2])>>2],0|i),Q=y,y=0,1&Q){re=26;break t}}else d[r>>2]=n+4;if((0|U)>0)for(F=R,n=R,B=U;;){i=0|d[e>>2];do{if(i){if((0|(r=0|d[i+12>>2]))==(0|d[i+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[i>>2])>>2],0|i),Q=y,y=0,1&Q){re=24;break t}}else i=0|d[r>>2];if(-1==(0|i)){d[e>>2]=0,r=1;break}r=!(0|d[e>>2]);break}r=1}while(0);do{if(n){if((0|(i=0|d[n+12>>2]))==(0|d[n+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[n>>2])>>2],0|n),Q=y,y=0,1&Q){re=24;break t}}else i=0|d[i>>2];if(-1!=(0|i)){if(r^!(0|F)){i=F,U=F;break}re=231;break t}d[t>>2]=0,i=0,re=224;break}i=F,re=224}while(0);if(224==(0|re)){if(re=0,r){re=231;break t}U=0}if(r=0|d[e>>2],(0|(n=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[r>>2])>>2],0|r),Q=y,y=0,1&Q){re=24;break t}}else r=0|d[n>>2];if(y=0,r=0|O(0|d[12+(0|d[s>>2])>>2],0|s,2048,0|r),Q=y,y=0,1&Q){re=24;break t}if(!r){re=231;break t}if((0|d[c>>2])==(0|d[h>>2])&&(y=0,W(14,0|l,0|c,0|h),Q=y,y=0,1&Q)){re=24;break t}if(r=0|d[e>>2],(0|(n=0|d[r+12>>2]))==(0|d[r+16>>2])){if(y=0,r=0|N(0|d[36+(0|d[r>>2])>>2],0|r),Q=y,y=0,1&Q){re=24;break t}}else r=0|d[n>>2];if(n=0|d[c>>2],d[c>>2]=n+4,d[n>>2]=r,r=B,B=B+-1|0,d[p>>2]=B,n=0|d[e>>2],(0|(F=0|d[(R=n+12|0)>>2]))==(0|d[n+16>>2])){if(y=0,N(0|d[40+(0|d[n>>2])>>2],0|n),Q=y,y=0,1&Q){re=24;break t}}else d[R>>2]=F+4;if((0|r)<=1)break;F=i,n=U}}if((0|d[c>>2])==(0|d[l>>2])){re=242;break t}break;default:u=R}}while(0);i:do{if(44==(0|re))for(;;){re=0,i=0|d[e>>2];do{if(i){if((0|(r=0|d[i+12>>2]))==(0|d[i+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[i>>2])>>2],0|i),Q=y,y=0,1&Q){re=21;break t}}else i=0|d[r>>2];if(-1==(0|i)){d[e>>2]=0,r=1;break}r=!(0|d[e>>2]);break}r=1}while(0);do{if(n){if((0|(i=0|d[n+12>>2]))==(0|d[n+16>>2])){if(y=0,i=0|N(0|d[36+(0|d[n>>2])>>2],0|n),Q=y,y=0,1&Q){re=21;break t}}else i=0|d[i>>2];if(-1!=(0|i)){if(r^!(0|u)){F=u,n=u;break}u=R;break i}d[t>>2]=0,u=0,re=57;break}re=57}while(0);if(57==(0|re)){if(re=0,r){u=R;break i}F=u,n=0}if(u=0|d[e>>2],(0|(i=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),Q=y,y=0,1&Q){re=21;break t}}else u=0|d[i>>2];if(y=0,u=0|O(0|d[12+(0|d[s>>2])>>2],0|s,8192,0|u),Q=y,y=0,1&Q){re=21;break t}if(!u){u=R;break i}if(u=0|d[e>>2],(0|(r=0|d[(i=u+12|0)>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[40+(0|d[u>>2])>>2],0|u),re=y,y=0,1&re){re=21;break t}}else d[i>>2]=r+4,u=0|d[r>>2];if(y=0,L(92,0|x,0|u),re=y,y=0,1&re){re=21;break t}u=F,re=44}}while(0);if((z=z+1|0)>>>0>=4){U=u,re=244;break}R=u}t:switch(0|re){case 21:case 22:case 23:case 24:case 25:case 26:i=0|ae();break e;case 42:case 107:case 148:case 206:case 231:case 242:d[a>>2]=4|d[a>>2],i=0;break;case 244:i:do{if(_){R=_+4|0,F=_+8|0,n=1;r:for(;;){if(n>>>0>=(u=1&(u=0|f[_|0])?0|d[R>>2]:(255&u)>>>1)>>>0)break i;u=0|d[e>>2];do{if(u){if((0|(i=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),c=y,y=0,1&c){re=20;break r}}else u=0|d[i>>2];if(-1==(0|u)){d[e>>2]=0,r=1;break}r=!(0|d[e>>2]);break}r=1}while(0);u=0|d[t>>2];do{if(u){if((0|(i=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),c=y,y=0,1&c){re=20;break r}}else u=0|d[i>>2];if(-1!=(0|u)){if(r)break;re=271;break r}d[t>>2]=0,re=263;break}re=263}while(0);if(263==(0|re)&&(re=0,r)){re=271;break}if(u=0|d[e>>2],(0|(i=0|d[u+12>>2]))==(0|d[u+16>>2])){if(y=0,u=0|N(0|d[36+(0|d[u>>2])>>2],0|u),c=y,y=0,1&c){re=20;break}}else u=0|d[i>>2];if(i=1&f[_|0]?0|d[F>>2]:R,(0|u)!=(0|d[i+(n<<2)>>2])){re=271;break}if(u=n+1|0,i=0|d[e>>2],(0|(n=0|d[(r=i+12|0)>>2]))!=(0|d[i+16>>2]))d[r>>2]=n+4,n=u;else{if(y=0,N(0|d[40+(0|d[i>>2])>>2],0|i),c=y,y=0,1&c){re=20;break}n=u}}if(20==(0|re)){i=0|ae();break e}if(271==(0|re)){d[a>>2]=4|d[a>>2],i=0;break t}}}while(0);(0|(u=0|d[ne>>2]))!=(0|U)&&(d[T>>2]=0,lr(C,u,U,T),0|d[T>>2])?(d[a>>2]=4|d[a>>2],i=0):i=1}return Zr(x),Zr(I),Zr(D),Zr(E),qr(C),u=0|d[ne>>2],d[ne>>2]=0,0|u&&(y=0,P(0|d[k>>2],0|u),ne=y,y=0,1&ne)&&Ue(ne=0|ae(0)),b=M,0|i}i=0|ae()}while(0);return Zr(x),Zr(I),Zr(D),Zr(E),qr(C),u=0|d[ne>>2],d[ne>>2]=0,0|u&&(y=0,P(0|d[k>>2],0|u),ne=y,y=0,1&ne)&&Ue(ne=0|ae(0)),de(0|i),0},la],rs=[ca,function(e,t,i){return 0|(e|=0)},function(e,t,i){t|=0,i|=0;var r,n,a=0,o=0;r=(e|=0)+12|0,n=e+16|0;e:do{if((0|i)>0)for(o=t,t=0;;){if((a=0|d[r>>2])>>>0<(0|d[n>>2])>>>0)d[r>>2]=a+1,a=0|f[a|0];else{if(-1==(0|(a=0|ts[127&d[40+(0|d[e>>2])>>2]](e))))break e;a&=255}if(f[o|0]=a,!((0|(t=t+1|0))<(0|i)))break;o=o+1|0}else t=0}while(0);return 0|t},function(e,t,i){t|=0,i|=0;var r,n,a=0,o=0,s=0;r=(e|=0)+24|0,n=e+28|0;e:do{if((0|i)>0)for(o=t,t=0;;){if((a=0|d[r>>2])>>>0>=(0|d[n>>2])>>>0){if(-1==(0|ls[63&d[52+(0|d[e>>2])>>2]](e,0|m[o|0])))break e}else s=0|f[o|0],d[r>>2]=a+1,f[a|0]=s;if(!((0|(t=t+1|0))<(0|i)))break;o=o+1|0}else t=0}while(0);return 0|t},function(e,t,i){t|=0,i|=0;var r,n=0;return r=b,b=b+16|0,n=r,ds[15&d[12+(0|d[(e|=0)>>2])>>2]](n,e,t),n=(0|d[n+4>>2])==(0|d[i+4>>2])?(0|d[n>>2])==(0|d[i>>2]):0,b=r,0|n},function(e,t,i){return e|=0,i|=0,0|((0|d[(t|=0)>>2])==(0|i)?(0|d[t+4>>2])==(0|e):0)},function(e,t,i){i|=0;var r,n,a=0,o=0;if(n=b,b=b+64|0,r=n,(0|(e|=0))!=(0|(t|=0)))if(0|t&&0|(o=0|Ha(t,656,672,0))){a=(t=r)+56|0;do{d[t>>2]=0,t=t+4|0}while((0|t)<(0|a));d[r>>2]=o,d[r+8>>2]=e,d[r+12>>2]=-1,d[r+48>>2]=1,As[63&d[28+(0|d[o>>2])>>2]](o,r,0|d[i>>2],1),1==(0|d[r+24>>2])?(d[i>>2]=d[r+16>>2],t=1):t=0}else t=0;else t=1;return b=n,0|t},function(e,t,i){var r,n;return t|=0,i|=0,Wn(0|(n=0|d[(r=(e|=0)+20|0)>>2]),0|t,0|(e=(e=(0|d[e+16>>2])-n|0)>>>0>i>>>0?i:e)),d[r>>2]=(0|d[r>>2])+e,0|i},Co,function(e,t,i){var r,n,a;return e|=0,t|=0,i|=0,n=b,b=b+32|0,r=n+20|0,d[(a=n)>>2]=d[e+60>>2],d[a+4>>2]=0,d[a+8>>2]=t,d[a+12>>2]=r,d[a+16>>2]=i,(0|ao(0|Le(140,0|a)))<0?(d[r>>2]=-1,e=-1):e=0|d[r>>2],b=n,0|e},function(e,t,i){e|=0,t|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0;return a=b,b=b+48|0,c=a+16|0,l=a,d[(s=a+32|0)>>2]=t,u=s+4|0,o=0|d[(n=e+48|0)>>2],d[u>>2]=i-(1&!!(0|o)),r=e+44|0,d[s+8>>2]=d[r>>2],d[s+12>>2]=o,0|d[9258]?(Me(185,0|e),d[l>>2]=d[e+60>>2],d[l+4>>2]=s,d[l+8>>2]=2,s=0|ao(0|_e(145,0|l)),Te(0)):(d[c>>2]=d[e+60>>2],d[c+4>>2]=s,d[c+8>>2]=2,s=0|ao(0|_e(145,0|c))),(0|s)>=1?s>>>0>(u=0|d[u>>2])>>>0&&(c=0|d[r>>2],d[(l=e+4|0)>>2]=c,d[e+8>>2]=c+(s-u),0|d[n>>2]&&(d[l>>2]=c+1,f[t+(i+-1)|0]=0|f[c|0]),s=i):(d[e>>2]=d[e>>2]|48&s^16,d[e+8>>2]=0,d[e+4>>2]=0),b=a,0|s},function(e,t,i){t|=0,i|=0;var r,n=0;return r=b,b=b+80|0,n=r,d[(e|=0)+36>>2]=8,!(64&d[e>>2])&&(d[n>>2]=d[e+60>>2],d[n+4>>2]=21505,d[n+8>>2]=r+12,!!(0|ve(54,0|n)))&&(f[e+75|0]=-1),n=0|Co(e,t,i),b=r,0|n},function(e,t,i){return 0|(e|=0)},function(e,t,i){t|=0,i|=0;var r,n,a=0,o=0;r=(e|=0)+12|0,n=e+16|0;e:do{if((0|i)>0)for(o=t,t=0;;){if((a=0|d[r>>2])>>>0>=(0|d[n>>2])>>>0){if(-1==(0|(a=0|ts[127&d[40+(0|d[e>>2])>>2]](e))))break e}else d[r>>2]=a+4,a=0|d[a>>2];if(d[o>>2]=a,!((0|(t=t+1|0))<(0|i)))break;o=o+4|0}else t=0}while(0);return 0|t},function(e,t,i){e|=0,t|=0,i|=0;var r=0;e:do{if(0|f[e+44|0])t=0|ko(t,4,i,0|d[e+32>>2]);else if((0|i)>0)for(r=t,t=0;;){if(-1==(0|ls[63&d[52+(0|d[e>>2])>>2]](e,0|d[r>>2])))break e;if(!((0|(t=t+1|0))<(0|i)))break;r=r+4|0}else t=0}while(0);return 0|t},function(e,t,i){t|=0,i|=0;var r,n,a=0,o=0,s=0;r=(e|=0)+24|0,n=e+28|0;e:do{if((0|i)>0)for(o=t,t=0;;){if((a=0|d[r>>2])>>>0>=(0|d[n>>2])>>>0){if(-1==(0|ls[63&d[52+(0|d[e>>2])>>2]](e,0|d[o>>2])))break e}else s=0|d[o>>2],d[r>>2]=a+4,d[a>>2]=s;if(!((0|(t=t+1|0))<(0|i)))break;o=o+4|0}else t=0}while(0);return 0|t},function(e,t,i){e|=0,t|=0,i|=0;var r=0;e:do{if(0|f[e+44|0])t=0|ko(t,1,i,0|d[e+32>>2]);else if((0|i)>0)for(r=t,t=0;;){if(-1==(0|ls[63&d[52+(0|d[e>>2])>>2]](e,0|m[r|0])))break e;if(!((0|(t=t+1|0))<(0|i)))break;r=r+1|0}else t=0}while(0);return 0|t},function(e,t,i){e|=0;var r=0;if((0|(t|=0))==(0|(i|=0)))e=0;else{e=0;do{e=(0|f[t|0])+(e<<4)|0,e^=(r=-268435456&e)>>>24|r,t=t+1|0}while((0|t)!=(0|i))}return 0|e},function(e,t,i){e|=0;var r=0;if((0|(t|=0))==(0|(i|=0)))e=0;else{e=0;do{e=(0|d[t>>2])+(e<<4)|0,e^=(r=-268435456&e)>>>24|r,t=t+4|0}while((0|t)!=(0|i))}return 0|e},function(e,t,i){return e|=0,(e=0|oo(1&f[(t|=0)|0]?0|d[t+8>>2]:t+1|0,1))>>>(-1!=(0|e)&1)|0},function(e,t,i){return e|=0,(e=0|oo(1&f[(t|=0)|0]?0|d[t+8>>2]:t+1|0,1))>>>(-1!=(0|e)&1)|0},function(e,t,i){if(e|=0,(0|(t|=0))!=(0|(i|=0))){e=t;do{(t=0|f[e|0])<<24>>24>-1&&(t=(0|Sr())+(t<<24>>24<<2)|0,t=255&d[t>>2]),f[e|0]=t,e=e+1|0}while((0|e)!=(0|i))}return 0|i},function(e,t,i){if(e|=0,(0|(t|=0))!=(0|(i|=0))){e=t;do{(t=0|f[e|0])<<24>>24>-1&&(t=(0|br())+(t<<24>>24<<2)|0,t=255&d[t>>2]),f[e|0]=t,e=e+1|0}while((0|e)!=(0|i))}return 0|i},function(e,t,i){return i|=0,0|((t|=0)<<24>>24>-1?t:i)},function(e,t,i){return t|=0,(i|=0)>>>0<128?(i=(0|Ar())+(i<<1)|0,i=!!((h[i>>1]&t)<<16>>16)):i=0,0|i},function(e,t,i){e|=0;var r,n=0;if(r=((i|=0)-(t|=0)|0)>>>2,(0|t)!=(0|i)){n=t;do{(e=0|d[n>>2])>>>0<128&&(e=(0|Sr())+(e<<2)|0,e=0|d[e>>2]),d[n>>2]=e,n=n+4|0}while((0|n)!=(0|i))}return t+(r<<2)|0},function(e,t,i){e|=0;var r,n=0;if(r=((i|=0)-(t|=0)|0)>>>2,(0|t)!=(0|i)){n=t;do{(e=0|d[n>>2])>>>0<128&&(e=(0|br())+(e<<2)|0,e=0|d[e>>2]),d[n>>2]=e,n=n+4|0}while((0|n)!=(0|i))}return t+(r<<2)|0},function(e,t,i){return i|=0,0|((t|=0)>>>0<128?255&t:i)},function(e,t,i){t|=0,i|=0;var r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0;o=b,b=b+32|0,r=o+16|0,n=o,y=0,L(65,0|(a=o+8|0),0|(e|=0)),h=y,y=0;e:do{if(!(1&h)){do{if(0|f[a|0]){s=0|d[(0|d[e>>2])-12>>2],d[n>>2]=d[e+(s+24)>>2],u=e+s|0,h=0|d[e+(s+4)>>2],l=t+i|0,i=0|d[(s=e+(s+76)|0)>>2];do{if(-1==(0|i))if(y=0,i=0|N(68,0|u),g=y,y=0,1&g)m=13;else{if(d[r>>2]=i,y=0,i=0|G(37,0|r,44220),g=y,y=0,!(1&g||(y=0,c=0|G(0|d[28+(0|d[i>>2])>>2],0|i,32),g=y,y=0,1&g))){mr(r),i=c<<24>>24,d[s>>2]=i,m=9;break}i=0|ae(0),mr(r)}else m=9}while(0);if(9==(0|m))if(y=0,d[r>>2]=d[n>>2],i=0|_(39,0|r,0|t,0|(32==(176&h)?l:t),0|l,0|u,255&i),g=y,y=0,1&g)m=13;else{if(i)break;if(g=0|d[(0|d[e>>2])-12>>2],y=0,L(66,e+g|0,5|d[e+(g+16)>>2]),g=y,y=0,!(1&g))break;m=13}13==(0|m)&&(i=0|ae(0)),mn(a),s=e,l=e;break e}}while(0);return mn(a),b=o,0|e}i=0|ae(0),s=e,l=e}while(0);return ue(0|i),y=0,P(181,s+(0|d[(0|d[l>>2])-12>>2])|0),g=y,y=0,1&g?(i=0|ae(),y=0,X(3),g=y,y=0,1&g?Ue(g=0|ae(0)):de(0|i),0):(he(),b=o,0|e)},function(e,t,i){return 0|function(e,t,i){e|=0,t|=0,i|=0;var r=0,n=0,a=0,o=0;return r=e+84|0,a=0|d[r>>2],o=i+256|0,n=0|Bo(a,0,o),i=(n=0|n?n-a|0:o)>>>0>>0?n:i,Wn(0|t,0|a,0|i),d[e+4>>2]=a+i,t=a+n|0,d[e+8>>2]=t,d[r>>2]=t,0|i}(e|=0,t|=0,i|=0)},Yr,function(e,t,i){return i|=0,0|f[(t|=0)|0]&&0|Vo(t,58885)&&0|Vo(t,54145)?i=0:i||(i=0|function(e,t){t|=0;var i=0;return(e|=0)?(i=0|E(t,e),(t|e)>>>0>65535&&(i=((i>>>0)/(e>>>0)|0)==(0|t)?i:-1)):i=0,!(t=0|Dr(i))||!(3&d[t+-4>>2])||zn(0|t,0,0|i),0|t}(1,4)),0|i},function(e,t,i){i|=0;var r,n=0,a=0,o=0,s=0,l=0;o=t|=0,1&(n=0|f[(e|=0)|0])?(a=(-2&(n=0|d[e>>2]))-1|0,l=0|d[e+4>>2],n&=255):(a=10,l=(255&n)>>>1),r=i-o|0;do{if((0|i)!=(0|t)){if((a-l|0)>>>0>>0&&(Xr(e,a,l+r-a|0,l,l,0,0),n=0|f[e|0]),s=1&n?0|d[e+8>>2]:e+1|0,o=i+(l-o)|0,(0|t)!=(0|i))for(n=t,a=s+l|0;f[a|0]=0|f[n|0],(0|(n=n+1|0))!=(0|i);)a=a+1|0;if(f[s+o|0]=0,n=l+r|0,1&f[e|0]){d[e+4>>2]=n;break}f[e|0]=n<<1;break}}while(0);return 0|e},function(e,t,i){i|=0;var r,n=0,a=0,o=0,s=0,l=0;o=t|=0,1&(n=0|f[(e|=0)|0])?(a=(-2&(n=0|d[e>>2]))-1|0,l=0|d[e+4>>2],n&=255):(a=1,l=(255&n)>>>1),r=i-o>>2;do{if(r){if((a-l|0)>>>0>>0&&($r(e,a,l+r-a|0,l,l,0,0),n=0|f[e|0]),s=1&n?0|d[e+8>>2]:e+4|0,o=l+((i-o|0)>>>2)|0,(0|t)!=(0|i))for(n=t,a=s+(l<<2)|0;d[a>>2]=d[n>>2],(0|(n=n+4|0))!=(0|i);)a=a+4|0;if(d[s+(o<<2)>>2]=0,n=l+r|0,1&f[e|0]){d[e+4>>2]=n;break}f[e|0]=n<<1;break}}while(0);return 0|e},So,function(e,t,i){e|=0,t|=0,i|=0;var r,n=0,a=0,o=0;r=b,b=b+16|0,n=r;e:do{if(t){do{if(i){if(o=0|e?e:n,e=255&(n=0|f[t|0]),n<<24>>24>-1){d[o>>2]=e,n=1&!!(n<<24>>24);break e}if((n=e+-194|0)>>>0<=50){if(e=t+1|0,a=0|d[37076+(n<<2)>>2],i>>>0<4&&a&-2147483648>>>((6*i|0)-6|0))break;if(((i=(n=0|m[e|0])>>>3)+-16|i+(a>>26))>>>0<=7){if((0|(n=n+-128|a<<6))>=0){d[o>>2]=n,n=2;break e}if(128==(192&(e=0|m[t+2|0]))){if((0|(e=e+-128|n<<6))>=0){d[o>>2]=e,n=3;break e}if(128==(192&(n=0|m[t+3|0]))){d[o>>2]=n+-128|e<<6,n=4;break e}}}}}}while(0);n=0|$a(),d[n>>2]=84,n=-1}else n=0}while(0);return b=r,0|n},function(e,t,i){return 0|go(0,e|=0,t|=0,0|(i|=0)?i:37344)},function(e,t,i){e|=0,t|=0,i|=0;var r,n,a=0,o=0,s=0;n=b,b=b+16|0,a=n,r=0|Dr(240);do{if(r){if(d[a>>2]=d[i>>2],(a=0|No(r,240,t,a))>>>0<240){t=0|Er(r,a+1|0),d[e>>2]=0|t?t:r;break}xr(r),a=(0|a)>=0&&(o=0|Dr(s=a+1|0),d[e>>2]=o,0|o)?0|No(o,s,t,i):-1}else a=-1}while(0);return b=n,0|a},ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca,ca],ns=[ua,function(e,t,i,r,n,a,o,s,l,c,u,m,g,p,A){e|=0,t|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0,m|=0,g|=0,p|=0,A|=0;var S,b,v,w,T,y,C,I,D,x,E,M,k,R,F,P=0,L=0,_=0,N=0,U=0,O=0,B=0,V=0,q=0;d[(i|=0)>>2]=e,k=p+4|0,R=p+8|0,F=p+1|0,C=g+4|0,I=!(512&r),D=g+8|0,x=g+1|0,E=o+8|0,M=(0|A)>0,S=m+4|0,b=m+8|0,v=m+1|0,w=A+1|0,T=-2-A-((0|A)<0?~A:-1)|0,y=(0|A)>0,V=0;do{switch(0|f[l+V|0]){case 0:d[t>>2]=d[i>>2];break;case 1:d[t>>2]=d[i>>2],O=0|ls[63&d[28+(0|d[o>>2])>>2]](o,32),B=0|d[i>>2],d[i>>2]=B+1,f[B|0]=O;break;case 3:0|((P=!(1&(B=0|f[p|0])))?(255&B)>>>1:d[k>>2])&&(O=0|f[(P?F:d[R>>2])|0],B=0|d[i>>2],d[i>>2]=B+1,f[B|0]=O);break;case 2:if(!(I|!(0|(_=(P=!(1&(_=0|f[g|0])))?(255&_)>>>1:0|d[C>>2])))){if(N=(L=P?x:0|d[D>>2])+_|0,P=0|d[i>>2],_)do{f[P|0]=0|f[L|0],L=L+1|0,P=P+1|0}while((0|L)!=(0|N));d[i>>2]=P}break;case 4:P=0|d[i>>2],U=n=s?n+1|0:n,N=0|d[E>>2];e:do{if(n>>>0>>0){L=n;do{if((_=0|f[L|0])<<24>>24<=-1||!(2048&h[N+(_<<24>>24<<1)>>1]))break e;L=L+1|0}while(L>>>0>>0)}else L=n}while(0);if(_=L,M){if(O=T>>>0>(O=-2-_-~(_>>>0>U>>>0?U:_)|0)>>>0?T:O,L>>>0>n>>>0&y)for(_=L,U=A;B=0|f[(_=_+-1|0)|0],N=0|d[i>>2],d[i>>2]=N+1,f[N|0]=B,_>>>0>n>>>0&(N=(0|U)>1);)U=U+-1|0;else N=y;if(B=w+O|0,_=L+(O+1)|0,U=N?0|ls[63&d[28+(0|d[o>>2])>>2]](o,48):0,L=0|d[i>>2],d[i>>2]=L+1,(0|B)>0)for(N=B;f[L|0]=U,L=0|d[i>>2],d[i>>2]=L+1,(0|N)>1;)N=N+-1|0;f[L|0]=c}else _=L;if((0|_)!=(0|n)){if(L=0|((L=!(1&(B=0|f[m|0])))?(255&B)>>>1:d[S>>2])?0|f[(L?v:d[b>>2])|0]:-1,(0|_)!=(0|n))for(N=0,U=0;(0|U)==(0|L)&&(B=0|d[i>>2],d[i>>2]=B+1,f[B|0]=u,(N=N+1|0)>>>0<((L=!(1&(B=0|f[m|0])))?(255&B)>>>1:0|d[S>>2])>>>0?(L=(L=0|f[(L?v:0|d[b>>2])+N|0])<<24>>24==127?-1:L<<24>>24,U=0):(L=U,U=0)),O=0|f[(_=_+-1|0)|0],B=0|d[i>>2],d[i>>2]=B+1,f[B|0]=O,(0|_)!=(0|n);)U=U+1|0}else O=0|ls[63&d[28+(0|d[o>>2])>>2]](o,48),B=0|d[i>>2],d[i>>2]=B+1,f[B|0]=O;if((0|P)!=(0|(L=0|d[i>>2]))&&P>>>0<(q=L+-1|0)>>>0){L=q;do{B=0|f[P|0],f[P|0]=0|f[L|0],f[L|0]=B,P=P+1|0,L=L+-1|0}while(P>>>0>>0)}}V=V+1|0}while(4!=(0|V));if((L=(n=!(1&(L=0|f[p|0])))?(255&L)>>>1:0|d[k>>2])>>>0>1){if(_=(P=n?F:0|d[R>>2])+L|0,n=0|d[i>>2],1!=(0|L)){P=P+1|0;do{f[n|0]=0|f[P|0],n=n+1|0,P=P+1|0}while((0|P)!=(0|_))}d[i>>2]=n}switch(176&r){case 32:d[t>>2]=d[i>>2];break;case 16:break;default:d[t>>2]=e}},function(e,t,i,r,n,a,o,s,l,c,u,h,m,g,p){e|=0,t|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0,h|=0,m|=0,g|=0,p|=0;var A,S,b,v,w,T,y,C,I,D,x=0,E=0,M=0,k=0,R=0,F=0,P=0,L=0,_=0,N=0;d[(i|=0)>>2]=e,I=g+4|0,D=g+8|0,S=m+4|0,b=!(512&r),v=m+8|0,w=(0|p)>0,T=h+4|0,y=h+8|0,C=h+1|0,A=(0|p)>0,_=0;do{switch(0|f[l+_|0]){case 0:d[t>>2]=d[i>>2];break;case 1:d[t>>2]=d[i>>2],P=0|ls[63&d[44+(0|d[o>>2])>>2]](o,32),L=0|d[i>>2],d[i>>2]=L+4,d[L>>2]=P;break;case 3:0|((x=!(1&(L=0|f[g|0])))?(255&L)>>>1:d[I>>2])&&(P=0|d[(x?I:d[D>>2])>>2],L=0|d[i>>2],d[i>>2]=L+4,d[L>>2]=P);break;case 2:if(!(b|!(0|(R=(x=!(1&(R=0|f[m|0])))?(255&R)>>>1:0|d[S>>2])))){if(M=(x=x?S:0|d[v>>2])+(R<<2)|0,k=0|d[i>>2],R)for(E=k;d[E>>2]=d[x>>2],(0|(x=x+4|0))!=(0|M);)E=E+4|0;d[i>>2]=k+(R<<2)}break;case 4:x=0|d[i>>2],n=s?n+4|0:n;e:do{if(n>>>0>>0){E=n;do{if(!(0|rs[63&d[12+(0|d[o>>2])>>2]](o,2048,0|d[E>>2])))break e;E=E+4|0}while(E>>>0>>0)}else E=n}while(0);if(w){if(E>>>0>n>>>0&A){for(R=0|d[i>>2],k=p;;){if(E=E+-4|0,M=R+4|0,d[R>>2]=d[E>>2],F=k+-1|0,!(E>>>0>n>>>0&(k=(0|k)>1))){R=F;break}R=M,k=F}d[i>>2]=M,M=R}else k=A,M=p;if(F=k?0|ls[63&d[44+(0|d[o>>2])>>2]](o,48):0,P=0|d[i>>2],k=M+((0|M)<0?~M:-1)|0,(0|M)>0)for(R=P;d[R>>2]=F,(0|M)>1;)R=R+4|0,M=M+-1|0;d[i>>2]=P+(k+2<<2),d[P+(k+1<<2)>>2]=c}if((0|E)==(0|n))P=0|ls[63&d[44+(0|d[o>>2])>>2]](o,48),E=(L=0|d[i>>2])+4|0,d[i>>2]=E,d[L>>2]=P;else{if(M=!(1&(P=0|f[h|0])),L=0|d[T>>2],M=0|(M?(255&P)>>>1:L)?0|f[(M?C:d[y>>2])|0]:-1,(0|E)!=(0|n))for(F=0,P=0;k=0|d[i>>2],(0|P)==(0|M)?(R=k+4|0,d[i>>2]=R,d[k>>2]=u,(F=F+1|0)>>>0<((M=!(1&(k=0|f[h|0])))?(255&k)>>>1:L)>>>0?(k=R,M=(M=0|f[(M?C:0|d[y>>2])+F|0])<<24>>24==127?-1:M<<24>>24,R=0):(k=R,M=P,R=0)):R=P,P=0|d[(E=E+-4|0)>>2],d[i>>2]=k+4,d[k>>2]=P,(0|E)!=(0|n);)P=R+1|0;E=0|d[i>>2]}if((0|x)!=(0|E)&&x>>>0<(N=E+-4|0)>>>0){E=N;do{L=0|d[x>>2],d[x>>2]=d[E>>2],d[E>>2]=L,x=x+4|0,E=E+-4|0}while(x>>>0>>0)}}_=_+1|0}while(4!=(0|_));if((x=(n=!(1&(x=0|f[g|0])))?(255&x)>>>1:0|d[I>>2])>>>0>1){if(n=(E=n?I:0|d[D>>2])+4|0,E=E+(x<<2)|0,M=0|d[i>>2],k=E-n|0,1!=(0|x))for(x=M;d[x>>2]=d[n>>2],(0|(n=n+4|0))!=(0|E);)x=x+4|0;d[i>>2]=M+(k>>>2<<2)}switch(176&r){case 32:d[t>>2]=d[i>>2];break;case 16:break;default:d[t>>2]=e}},ua],as=[fa,function(e,t,i,r,n,a){e|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c=0,u=0;if((u=0|d[(c=(t|=0)+44|0)>>2])>>>0<(l=0|d[(s=t+24|0)>>2])>>>0&&(d[c>>2]=l,u=l),o=u,!(c=24&a))return d[(t=e)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,void(d[t+4>>2]=-1);if(1==(0|n)&24==(0|c))return d[(t=e)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,void(d[t+4>>2]=-1);e:do{switch(0|n){case 0:c=0,n=0;break;case 1:if(8&a){c=n=(0|d[t+12>>2])-(0|d[t+8>>2])|0,n=((0|n)<0)<<31>>31;break e}c=n=l-(0|d[t+20>>2])|0,n=((0|n)<0)<<31>>31;break e;case 2:c=n=u-(c=1&f[(c=t+32|0)|0]?0|d[t+40>>2]:c+1|0)|0,n=((0|n)<0)<<31>>31;break;default:return d[(t=e)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,void(d[t+4>>2]=-1)}}while(0);if(n=0|Hn(0|c,0|n,0|i,0|r),(0|(i=D))>=0&&!((0|(u=((0|(r=u-(c=1&f[(c=t+32|0)|0]?0|d[t+40>>2]:c+1|0)|0))<0)<<31>>31))<(0|i)|(0|u)==(0|i)&r>>>0>>0)){if(c=8&a,!(!(0|n)&!(0|i))){if(0|c&&!(0|d[t+12>>2]))return d[(t=e)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,void(d[t+4>>2]=-1);if(!!(16&a)&!(0|l))return d[(t=e)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,void(d[t+4>>2]=-1)}return c&&(d[t+12>>2]=(0|d[t+8>>2])+n,d[t+16>>2]=o),16&a&&(d[s>>2]=(0|d[t+20>>2])+n),d[(t=e)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=n,void(d[t+4>>2]=i)}d[(t=e)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,d[t+4>>2]=-1},function(e,t,i,r,n,a){i|=0,r|=0,n|=0,(0|(e|=0))==(0|d[(t|=0)+8>>2])&&Ya(0,t,i,r,n)},function(e,t,i,r,n,a){i|=0,r|=0,n|=0,a|=0,(0|(e|=0))==(0|d[(t|=0)+8>>2])?Ya(0,t,i,r,n):(e=0|d[e+8>>2],as[15&d[20+(0|d[e>>2])>>2]](e,t,i,r,n,a))},function(e,t,i,r,n,a){i|=0,r|=0,n|=0,a|=0;var o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;if((0|(e|=0))==(0|d[(t|=0)+8>>2]))Ya(0,t,i,r,n);else{h=0|f[(u=t+52|0)|0],g=0|f[(m=t+53|0)|0],o=e+16+((c=0|d[e+12>>2])<<3)|0,f[u|0]=0,f[m|0]=0,Wa(e+16|0,t,i,r,n,a);e:do{if((0|c)>1){s=t+24|0,l=e+8|0,c=t+54|0,e=e+24|0;do{if(0|f[c|0])break e;if(0|f[u|0]){if(1==(0|d[s>>2])||!(2&d[l>>2]))break e}else if(0|f[m|0]&&!(1&d[l>>2]))break e;f[u|0]=0,f[m|0]=0,Wa(e,t,i,r,n,a),e=e+8|0}while(e>>>0>>0)}}while(0);f[u|0]=h,f[m|0]=g}},function(e,t,i,r,n,a){t|=0,d[(t=e|=0)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,d[t+4>>2]=-1},function(e,t,i,r,n,a){t|=0,d[(t=e|=0)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,d[t+4>>2]=-1},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l=0,c=0;o=b,b=b+16|0,d[(s=o)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,a=(t=(c=!(1&(l=0|f[a|0])))?a+1|0:0|d[a+8>>2])+(l=c?(255&l)>>>1:0|d[a+4>>2])|0;e:do{if((0|l)>0){for(;y=0,L(67,0|s,0|f[t|0]),c=y,y=0,!(1&c);)if((t=t+1|0)>>>0>=a>>>0){l=4;break e}t=0|ae(),l=7}else l=4}while(0);e:do{if(4==(0|l)){if(y=0,t=0|Y(19,0|(-1==(0|i)?-1:i<<1),0|r,0|n,0|(1&f[s|0]?d[s+8>>2]:s+1)),c=y,y=0,1&c){t=0|ae(),l=7;break}d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,a=t+(c=0|Go(t))|0;t:do{if((0|c)>0){for(;y=0,L(67,0|e,0|f[t|0]),c=y,y=0,!(1&c);)if((t=t+1|0)>>>0>=a>>>0)break t;t=0|ae(),qr(e);break e}}while(0);return qr(s),void(b=o)}}while(0);qr(s),de(0|t)},function(e,t,i,r,n,a){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var o,s,l,c,u,h,m,g,p,A,S,v=0,w=0,T=0,C=0;A=b,b=b+224|0,l=A+184|0,s=A+192|0,o=A+180|0,c=A+176|0,g=A+168|0,m=A+40|0,h=A+32|0,p=A+28|0,T=A+8|0,u=A,d[(S=A+16|0)>>2]=0,d[S+4>>2]=0,d[S+8>>2]=0,d[T+4>>2]=0,d[T>>2]=44696,v=a+4|0,v=(t=(C=!(1&(w=0|f[a|0])))?v:0|d[a+8>>2])+((a=C?(255&w)>>>1:0|d[v>>2])<<2)|0,w=s+32|0;e:do{if((0|a)>0){t:for(;;){if(d[c>>2]=t,y=0,a=0|K(0|d[12+(0|d[T>>2])>>2],0|T,0|l,0|t,0|v,0|c,0|s,0|w,0|o),C=y,y=0,1&C){a=12;break}if(2==(0|a)||(0|d[c>>2])==(0|t)){a=5;break}if(s>>>0<(0|d[o>>2])>>>0){t=s;do{if(y=0,L(67,0|S,0|f[t|0]),C=y,y=0,1&C){a=11;break t}t=t+1|0}while(t>>>0<(0|d[o>>2])>>>0)}if(!(2!=(0|a)&(t=0|d[c>>2])>>>0>>0)){a=9;break e}}5==(0|a)?(y=0,P(190,58955),y=0,t=0|ae()):(11==(0|a)||12==(0|a))&&(t=0|ae())}else a=9}while(0);e:do{if(9==(0|a)){if(y=0,t=0|Y(19,0|(-1==(0|i)?-1:i<<1),0|r,0|n,0|(1&f[S|0]?d[S+8>>2]:S+1)),C=y,y=0,1&C){t=0|ae();break}d[e>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[u+4>>2]=0,d[u>>2]=44744,w=v=t+(C=0|Go(t))|0,T=m+128|0;t:do{if((0|C)>0){i:for(;;){if(d[p>>2]=t,y=0,a=0|K(0|d[16+(0|d[u>>2])>>2],0|u,0|g,0|t,0|((w-t|0)>32?t+32:v),0|p,0|m,0|T,0|h),C=y,y=0,1&C){a=24;break}if(2==(0|a)||(0|d[p>>2])==(0|t)){a=18;break}if(m>>>0<(0|d[h>>2])>>>0){t=m;do{if(y=0,L(92,0|e,0|d[t>>2]),C=y,y=0,1&C){a=23;break i}t=t+4|0}while(t>>>0<(0|d[h>>2])>>>0)}if(!(2!=(0|a)&(t=0|d[p>>2])>>>0>>0))break t}18==(0|a)?(y=0,P(190,58955),y=0,t=0|ae()):(23==(0|a)||24==(0|a))&&(t=0|ae()),Zr(e);break e}}while(0);return qr(S),void(b=A)}}while(0);qr(S),de(0|t)},fa,fa,fa,fa,fa,fa,fa],os=[ha,function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var s,l,c,u,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0;c=b,b=b+16|0,u=c,l=0|pr(o|=0,44220),g=0|pr(o,44360),$o[127&d[20+(0|d[g>>2])>>2]](u,g),v=0|f[u|0],s=u+4|0;e:do{if(0|(1&v?d[s>>2]:(255&v)>>>1)){switch(d[a>>2]=r,(o=0|f[e|0])<<24>>24){case 43:case 45:if(y=0,o=0|G(0|d[28+(0|d[l>>2])>>2],0|l,0|o),v=y,y=0,1&v){w=5;break e}m=0|d[a>>2],d[a>>2]=m+1,f[m|0]=o,m=e+1|0;break;default:m=e}t:do{if((i-m|0)>1&&48==(0|f[m|0])){switch(0|f[(o=m+1|0)|0]){case 88:case 120:break;default:break t}if(y=0,h=0|G(0|d[28+(0|d[l>>2])>>2],0|l,48),v=y,y=0,1&v){w=5;break e}if(v=0|d[a>>2],d[a>>2]=v+1,f[v|0]=h,y=0,o=0|G(0|d[28+(0|d[l>>2])>>2],0|l,0|f[o|0]),v=y,y=0,1&v){w=5;break e}v=0|d[a>>2],d[a>>2]=v+1,f[v|0]=o,m=m+2|0}}while(0);if((0|m)!=(0|i)&&m>>>0<(p=i+-1|0)>>>0){h=m,o=p;do{v=0|f[h|0],f[h|0]=0|f[o|0],f[o|0]=v,h=h+1|0,o=o+-1|0}while(h>>>0>>0)}if(y=0,p=0|N(0|d[16+(0|d[g>>2])>>2],0|g),v=y,y=0,1&v)w=5;else{A=u+8|0,S=u+1|0;t:do{if(m>>>0>>0){for(o=0,h=0,v=m;!!((g=0|f[(1&f[u|0]?0|d[A>>2]:S)+h|0])<<24>>24)&(0|o)==g<<24>>24?(o=0|d[a>>2],d[a>>2]=o+1,f[o|0]=p,g=0,h=(h>>>0<((1&(o=0|f[u|0])?0|d[s>>2]:(255&o)>>>1)-1|0)>>>0&1)+h|0):g=o,y=0,o=0|G(0|d[28+(0|d[l>>2])>>2],0|l,0|f[v|0]),T=y,y=0,!(1&T);){if(T=0|d[a>>2],d[a>>2]=T+1,f[T|0]=o,(v=v+1|0)>>>0>=i>>>0)break t;o=g+1|0}o=0|ae();break e}}while(0);if((0|(o=r+(m-(h=e))|0))==(0|(e=0|d[a>>2])))e=h,w=29;else{if(o>>>0<(e=e+-1|0)>>>0)do{T=0|f[o|0],f[o|0]=0|f[e|0],f[e|0]=T,o=o+1|0,e=e+-1|0}while(o>>>0>>0);e=h,o=0|d[a>>2],w=29}}}else y=0,Y(0|d[32+(0|d[l>>2])>>2],0|l,0|e,0|i,0|r),w=y,y=0,1&w?w=5:(o=r+(i-e)|0,d[a>>2]=o,w=29)}while(0);if(5==(0|w))o=0|ae();else if(29==(0|w))return d[n>>2]=(0|t)==(0|i)?o:r+(t-e)|0,qr(u),void(b=c);qr(u),de(0|o)},function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var s,l,c,u,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0,x=0;switch(c=b,b=b+16|0,u=c,l=0|pr(o|=0,44220),s=0|pr(o,44360),$o[127&d[20+(0|d[s>>2])>>2]](u,s),d[a>>2]=r,(o=0|f[e|0])<<24>>24){case 43:case 45:y=0,o=0|G(0|d[28+(0|d[l>>2])>>2],0|l,0|o),D=y,y=0,1&D?I=8:(p=0|d[a>>2],d[a>>2]=p+1,f[p|0]=o,p=e+1|0,I=10);break;default:p=e,I=10}e:do{if(10==(0|I)){D=i;t:do{if((D-p|0)>1&&48==(0|f[p|0])){switch(0|f[(m=p+1|0)|0]){case 88:case 120:break;default:I=11;break t}if(y=0,o=0|G(0|d[28+(0|d[l>>2])>>2],0|l,48),C=y,y=0,1&C){I=8;break e}if(C=0|d[a>>2],d[a>>2]=C+1,f[C|0]=o,p=p+2|0,y=0,o=0|G(0|d[28+(0|d[l>>2])>>2],0|l,0|f[m|0]),C=y,y=0,1&C){I=8;break e}if(C=0|d[a>>2],d[a>>2]=C+1,f[C|0]=o,p>>>0>>0){for(o=p;m=0|f[o|0],y=0,g=0|H(3),C=y,y=0,!(1&C||(y=0,m=0|G(39,m<<24>>24,0|g),C=y,y=0,1&C));){if(!m){C=p;break t}if((o=o+1|0)>>>0>=i>>>0){C=p;break t}}o=0|ae();break e}C=p,o=p}else I=11}while(0);t:do{if(11==(0|I)){if(p>>>0>>0){for(o=p;m=0|f[o|0],y=0,g=0|H(3),C=y,y=0,!(1&C||(y=0,m=0|G(40,m<<24>>24,0|g),C=y,y=0,1&C));){if(!m){C=p;break t}if((o=o+1|0)>>>0>=i>>>0){C=p;break t}}o=0|ae();break e}C=p,o=p}}while(0);if(T=u+4|0,0|(1&(w=0|f[u|0])?d[T>>2]:(255&w)>>>1)){if((0|C)!=(0|o)&&C>>>0<(A=o+-1|0)>>>0){g=C,m=A;do{w=0|f[g|0],f[g|0]=0|f[m|0],f[m|0]=w,g=g+1|0,m=m+-1|0}while(g>>>0>>0)}if(y=0,A=0|N(0|d[16+(0|d[s>>2])>>2],0|s),w=y,y=0,1&w){I=8;break}S=u+8|0,v=u+1|0;t:do{if(C>>>0>>0){for(m=0,g=0,w=C;(p=0|f[(1&f[u|0]?0|d[S>>2]:v)+g|0])<<24>>24>0&(0|m)==p<<24>>24?(m=0|d[a>>2],d[a>>2]=m+1,f[m|0]=A,p=0,g=(g>>>0<((1&(m=0|f[u|0])?0|d[T>>2]:(255&m)>>>1)-1|0)>>>0&1)+g|0):p=m,y=0,m=0|G(0|d[28+(0|d[l>>2])>>2],0|l,0|f[w|0]),x=y,y=0,!(1&x);){if(x=0|d[a>>2],d[a>>2]=x+1,f[x|0]=m,(w=w+1|0)>>>0>=o>>>0)break t;m=p+1|0}o=0|ae();break e}}while(0);if((0|(m=r+(C-e)|0))!=(0|(g=0|d[a>>2]))&&m>>>0<(h=g+-1|0)>>>0){do{x=0|f[m|0],f[m|0]=0|f[h|0],f[h|0]=x,m=m+1|0,h=h+-1|0}while(m>>>0>>0);m=l}else m=l}else{if(y=0,Y(0|d[32+(0|d[l>>2])>>2],0|l,0|C,0|o,0|d[a>>2]),x=y,y=0,1&x){I=8;break}d[a>>2]=(0|d[a>>2])+(o-C),m=l}t:do{if(o>>>0>>0){for(;(h=0|f[o|0])<<24>>24!=46;){if(y=0,h=0|G(0|d[28+(0|d[m>>2])>>2],0|l,0|h),x=y,y=0,1&x){I=4;break}if(x=0|d[a>>2],d[a>>2]=x+1,f[x|0]=h,(o=o+1|0)>>>0>=i>>>0)break t}if(4==(0|I)){o=0|ae();break e}if(y=0,h=0|N(0|d[12+(0|d[s>>2])>>2],0|s),x=y,y=0,1&x){I=8;break e}x=0|d[a>>2],d[a>>2]=x+1,f[x|0]=h,o=o+1|0}}while(0);if(y=0,Y(0|d[32+(0|d[l>>2])>>2],0|l,0|o,0|i,0|d[a>>2]),x=y,y=0,!(1&x))return x=(0|d[a>>2])+(D-o)|0,d[a>>2]=x,d[n>>2]=(0|t)==(0|i)?x:r+(t-e)|0,qr(u),void(b=c);I=8}}while(0);8==(0|I)&&(o=0|ae()),qr(u),de(0|o)},function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var s,l,c,u,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0;c=b,b=b+16|0,u=c,l=0|pr(o|=0,44212),g=0|pr(o,44368),$o[127&d[20+(0|d[g>>2])>>2]](u,g),v=0|f[u|0],s=u+4|0;e:do{if(0|(1&v?d[s>>2]:(255&v)>>>1)){switch(d[a>>2]=r,(o=0|f[e|0])<<24>>24){case 43:case 45:if(y=0,o=0|G(0|d[44+(0|d[l>>2])>>2],0|l,0|o),v=y,y=0,1&v){w=5;break e}m=0|d[a>>2],d[a>>2]=m+4,d[m>>2]=o,m=e+1|0;break;default:m=e}t:do{if((i-m|0)>1&&48==(0|f[m|0])){switch(0|f[(o=m+1|0)|0]){case 88:case 120:break;default:v=m;break t}if(y=0,h=0|G(0|d[44+(0|d[l>>2])>>2],0|l,48),v=y,y=0,1&v){w=5;break e}if(v=0|d[a>>2],d[a>>2]=v+4,d[v>>2]=h,y=0,o=0|G(0|d[44+(0|d[l>>2])>>2],0|l,0|f[o|0]),v=y,y=0,1&v){w=5;break e}v=0|d[a>>2],d[a>>2]=v+4,d[v>>2]=o,v=m+2|0}else v=m}while(0);if((0|v)!=(0|i)&&v>>>0<(p=i+-1|0)>>>0){h=v,o=p;do{S=0|f[h|0],f[h|0]=0|f[o|0],f[o|0]=S,h=h+1|0,o=o+-1|0}while(h>>>0>>0)}if(y=0,g=0|N(0|d[16+(0|d[g>>2])>>2],0|g),S=y,y=0,1&S)w=5;else{p=u+8|0,A=u+1|0;t:do{if(v>>>0>>0){for(o=0,h=0,S=v;!!((m=0|f[(1&f[u|0]?0|d[p>>2]:A)+h|0])<<24>>24)&(0|o)==m<<24>>24?(o=0|d[a>>2],d[a>>2]=o+4,d[o>>2]=g,m=0,h=(h>>>0<((1&(o=0|f[u|0])?0|d[s>>2]:(255&o)>>>1)-1|0)>>>0&1)+h|0):m=o,y=0,o=0|G(0|d[44+(0|d[l>>2])>>2],0|l,0|f[S|0]),T=y,y=0,!(1&T);){if(T=0|d[a>>2],d[a>>2]=T+4,d[T>>2]=o,(S=S+1|0)>>>0>=i>>>0)break t;o=m+1|0}o=0|ae();break e}}while(0);if((0|(o=r+(v-(m=e)<<2)|0))!=(0|(h=0|d[a>>2])))if(o>>>0<(e=h+-4|0)>>>0){do{T=0|d[o>>2],d[o>>2]=d[e>>2],d[e>>2]=T,o=o+4|0,e=e+-4|0}while(o>>>0>>0);e=m,o=h,w=28}else e=m,o=h,w=28;else e=m,w=28}}else y=0,Y(0|d[48+(0|d[l>>2])>>2],0|l,0|e,0|i,0|r),w=y,y=0,1&w?w=5:(o=r+(i-e<<2)|0,d[a>>2]=o,w=28)}while(0);if(5==(0|w))o=0|ae();else if(28==(0|w))return d[n>>2]=(0|t)==(0|i)?o:r+(t-e<<2)|0,qr(u),void(b=c);qr(u),de(0|o)},function(e,t,i,r,n,a,o){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0;var s,l,c,u,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;switch(c=b,b=b+16|0,u=c,l=0|pr(o|=0,44212),s=0|pr(o,44368),$o[127&d[20+(0|d[s>>2])>>2]](u,s),d[a>>2]=r,(o=0|f[e|0])<<24>>24){case 43:case 45:y=0,o=0|G(0|d[44+(0|d[l>>2])>>2],0|l,0|o),I=y,y=0,1&I?C=8:(g=0|d[a>>2],d[a>>2]=g+4,d[g>>2]=o,g=e+1|0,C=10);break;default:g=e,C=10}e:do{if(10==(0|C)){I=i;t:do{if((I-g|0)>1&&48==(0|f[g|0])){switch(0|f[(h=g+1|0)|0]){case 88:case 120:break;default:C=11;break t}if(y=0,o=0|G(0|d[44+(0|d[l>>2])>>2],0|l,48),T=y,y=0,1&T){C=8;break e}if(T=0|d[a>>2],d[a>>2]=T+4,d[T>>2]=o,g=g+2|0,y=0,o=0|G(0|d[44+(0|d[l>>2])>>2],0|l,0|f[h|0]),T=y,y=0,1&T){C=8;break e}if(T=0|d[a>>2],d[a>>2]=T+4,d[T>>2]=o,g>>>0>>0){for(o=g;h=0|f[o|0],y=0,m=0|H(3),T=y,y=0,!(1&T||(y=0,h=0|G(39,h<<24>>24,0|m),T=y,y=0,1&T));){if(!h){T=g;break t}if((o=o+1|0)>>>0>=i>>>0){T=g;break t}}o=0|ae();break e}T=g,o=g}else C=11}while(0);t:do{if(11==(0|C)){if(g>>>0>>0){for(o=g;h=0|f[o|0],y=0,m=0|H(3),T=y,y=0,!(1&T||(y=0,h=0|G(40,h<<24>>24,0|m),T=y,y=0,1&T));){if(!h){T=g;break t}if((o=o+1|0)>>>0>=i>>>0){T=g;break t}}o=0|ae();break e}T=g,o=g}}while(0);if(w=u+4|0,0|(1&(v=0|f[u|0])?d[w>>2]:(255&v)>>>1)){if((0|T)!=(0|o)&&T>>>0<(p=o+-1|0)>>>0){m=T,h=p;do{v=0|f[m|0],f[m|0]=0|f[h|0],f[h|0]=v,m=m+1|0,h=h+-1|0}while(m>>>0>>0)}if(y=0,p=0|N(0|d[16+(0|d[s>>2])>>2],0|s),v=y,y=0,1&v){C=8;break}A=u+8|0,S=u+1|0;t:do{if(T>>>0>>0){for(h=0,m=0,v=T;(g=0|f[(1&f[u|0]?0|d[A>>2]:S)+m|0])<<24>>24>0&(0|h)==g<<24>>24?(h=0|d[a>>2],d[a>>2]=h+4,d[h>>2]=p,g=0,m=(m>>>0<((1&(h=0|f[u|0])?0|d[w>>2]:(255&h)>>>1)-1|0)>>>0&1)+m|0):g=h,y=0,h=0|G(0|d[44+(0|d[l>>2])>>2],0|l,0|f[v|0]),D=y,y=0,!(1&D);){if(D=0|d[a>>2],d[a>>2]=D+4,d[D>>2]=h,(v=v+1|0)>>>0>=o>>>0)break t;h=g+1|0}o=0|ae();break e}}while(0);if((0|(h=r+(T-e<<2)|0))!=(0|(g=0|d[a>>2])))if(h>>>0<(m=g+-4|0)>>>0){do{D=0|d[h>>2],d[h>>2]=d[m>>2],d[m>>2]=D,h=h+4|0,m=m+-4|0}while(h>>>0>>0);p=l,h=g}else p=l,h=g;else p=l}else{if(y=0,Y(0|d[48+(0|d[l>>2])>>2],0|l,0|T,0|o,0|d[a>>2]),D=y,y=0,1&D){C=8;break}h=(0|d[a>>2])+(o-T<<2)|0,d[a>>2]=h,p=l}t:do{if(o>>>0>>0){for(;;){if((h=0|f[o|0])<<24>>24==46){m=o;break}if(y=0,m=0|G(0|d[44+(0|d[p>>2])>>2],0|l,0|h),D=y,y=0,1&D){C=4;break}if(h=(D=0|d[a>>2])+4|0,d[a>>2]=h,d[D>>2]=m,(o=o+1|0)>>>0>=i>>>0)break t}if(4==(0|C)){o=0|ae();break e}if(y=0,o=0|N(0|d[12+(0|d[s>>2])>>2],0|s),D=y,y=0,1&D){C=8;break e}h=(D=0|d[a>>2])+4|0,d[a>>2]=h,d[D>>2]=o,o=m+1|0}}while(0);if(y=0,Y(0|d[48+(0|d[l>>2])>>2],0|l,0|o,0|i,0|h),D=y,y=0,!(1&D))return D=(0|d[a>>2])+(I-o<<2)|0,d[a>>2]=D,d[n>>2]=(0|t)==(0|i)?D:r+(t-e<<2)|0,qr(u),void(b=c);C=8}}while(0);8==(0|C)&&(o=0|ae()),qr(u),de(0|o)},ha,ha,ha],ss=[da,function(e,t,i,r,n,a,o,s,l,c){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0;var u,h,m,g,p,A,S,v,w,T=0,C=0,I=0;w=b,b=b+112|0,u=w+100|0,h=w+88|0,m=w+76|0,g=w+64|0,p=w+52|0,T=w+48|0,A=w+36|0,S=w+24|0,v=w+12|0,C=w;do{if(e){if(e=0|pr(t,43828),$o[127&d[44+(0|d[e>>2])>>2]](u,e),C=0|d[u>>2],f[i|0]=C,f[i+1|0]=C>>8,f[i+2|0]=C>>16,f[i+3|0]=C>>24,$o[127&d[32+(0|d[e>>2])>>2]](h,e),1&f[l|0]?(f[d[l+8>>2]|0]=0,d[l+4>>2]=0):(f[l+1|0]=0,f[l|0]=0),y=0,L(91,0|l,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[l>>2]=d[h>>2],d[l+4>>2]=d[h+4>>2],d[l+8>>2]=d[h+8>>2],d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,qr(h),$o[127&d[28+(0|d[e>>2])>>2]](m,e),1&f[s|0]?(f[d[s+8>>2]|0]=0,d[s+4>>2]=0):(f[s+1|0]=0,f[s|0]=0),y=0,L(91,0|s,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[s>>2]=d[m>>2],d[s+4>>2]=d[m+4>>2],d[s+8>>2]=d[m+8>>2],d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,qr(m),s=0|ts[127&d[12+(0|d[e>>2])>>2]](e),f[r|0]=s,s=0|ts[127&d[16+(0|d[e>>2])>>2]](e),f[n|0]=s,$o[127&d[20+(0|d[e>>2])>>2]](g,e),1&f[a|0]?(f[d[a+8>>2]|0]=0,d[a+4>>2]=0):(f[a+1|0]=0,f[a|0]=0),y=0,L(91,0|a,0),n=y,y=0,1&n&&Ue(n=0|ae(0)),d[a>>2]=d[g>>2],d[a+4>>2]=d[g+4>>2],d[a+8>>2]=d[g+8>>2],d[g>>2]=0,d[g+4>>2]=0,d[g+8>>2]=0,qr(g),$o[127&d[24+(0|d[e>>2])>>2]](p,e),1&f[o|0]?(f[d[o+8>>2]|0]=0,d[o+4>>2]=0):(f[o+1|0]=0,f[o|0]=0),y=0,L(91,0|o,0),n=y,y=0,!(1&n)){d[o>>2]=d[p>>2],d[o+4>>2]=d[p+4>>2],d[o+8>>2]=d[p+8>>2],d[p>>2]=0,d[p+4>>2]=0,d[p+8>>2]=0,qr(p),I=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(n=0|ae(0))}else{if(e=0|pr(t,43764),$o[127&d[44+(0|d[e>>2])>>2]](T,e),T=0|d[T>>2],f[i|0]=T,f[i+1|0]=T>>8,f[i+2|0]=T>>16,f[i+3|0]=T>>24,$o[127&d[32+(0|d[e>>2])>>2]](A,e),1&f[l|0]?(f[d[l+8>>2]|0]=0,d[l+4>>2]=0):(f[l+1|0]=0,f[l|0]=0),y=0,L(91,0|l,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[l>>2]=d[A>>2],d[l+4>>2]=d[A+4>>2],d[l+8>>2]=d[A+8>>2],d[A>>2]=0,d[A+4>>2]=0,d[A+8>>2]=0,qr(A),$o[127&d[28+(0|d[e>>2])>>2]](S,e),1&f[s|0]?(f[d[s+8>>2]|0]=0,d[s+4>>2]=0):(f[s+1|0]=0,f[s|0]=0),y=0,L(91,0|s,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[s>>2]=d[S>>2],d[s+4>>2]=d[S+4>>2],d[s+8>>2]=d[S+8>>2],d[S>>2]=0,d[S+4>>2]=0,d[S+8>>2]=0,qr(S),s=0|ts[127&d[12+(0|d[e>>2])>>2]](e),f[r|0]=s,s=0|ts[127&d[16+(0|d[e>>2])>>2]](e),f[n|0]=s,$o[127&d[20+(0|d[e>>2])>>2]](v,e),1&f[a|0]?(f[d[a+8>>2]|0]=0,d[a+4>>2]=0):(f[a+1|0]=0,f[a|0]=0),y=0,L(91,0|a,0),n=y,y=0,1&n&&Ue(n=0|ae(0)),d[a>>2]=d[v>>2],d[a+4>>2]=d[v+4>>2],d[a+8>>2]=d[v+8>>2],d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,qr(v),$o[127&d[24+(0|d[e>>2])>>2]](C,e),1&f[o|0]?(f[d[o+8>>2]|0]=0,d[o+4>>2]=0):(f[o+1|0]=0,f[o|0]=0),y=0,L(91,0|o,0),n=y,y=0,!(1&n)){d[o>>2]=d[C>>2],d[o+4>>2]=d[C+4>>2],d[o+8>>2]=d[C+8>>2],d[C>>2]=0,d[C+4>>2]=0,d[C+8>>2]=0,qr(C),I=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(n=0|ae(0))}}while(0);d[c>>2]=I,b=w},function(e,t,i,r,n,a,o,s,l,c){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0;var u,h,m,g,p,A,S,v,w,T=0,C=0,I=0;w=b,b=b+112|0,u=w+100|0,h=w+88|0,m=w+76|0,g=w+64|0,p=w+52|0,T=w+48|0,A=w+36|0,S=w+24|0,v=w+12|0,C=w;do{if(e){if(e=0|pr(t,43956),$o[127&d[44+(0|d[e>>2])>>2]](u,e),C=0|d[u>>2],f[i|0]=C,f[i+1|0]=C>>8,f[i+2|0]=C>>16,f[i+3|0]=C>>24,$o[127&d[32+(0|d[e>>2])>>2]](h,e),1&f[l|0]?d[d[l+8>>2]>>2]=0:f[l|0]=0,d[l+4>>2]=0,y=0,L(93,0|l,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[l>>2]=d[h>>2],d[l+4>>2]=d[h+4>>2],d[l+8>>2]=d[h+8>>2],d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,Zr(h),$o[127&d[28+(0|d[e>>2])>>2]](m,e),1&f[s|0]?d[d[s+8>>2]>>2]=0:f[s|0]=0,d[s+4>>2]=0,y=0,L(93,0|s,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[s>>2]=d[m>>2],d[s+4>>2]=d[m+4>>2],d[s+8>>2]=d[m+8>>2],d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,Zr(m),s=0|ts[127&d[12+(0|d[e>>2])>>2]](e),d[r>>2]=s,s=0|ts[127&d[16+(0|d[e>>2])>>2]](e),d[n>>2]=s,$o[127&d[20+(0|d[e>>2])>>2]](g,e),1&f[a|0]?(f[d[a+8>>2]|0]=0,d[a+4>>2]=0):(f[a+1|0]=0,f[a|0]=0),y=0,L(91,0|a,0),n=y,y=0,1&n&&Ue(n=0|ae(0)),d[a>>2]=d[g>>2],d[a+4>>2]=d[g+4>>2],d[a+8>>2]=d[g+8>>2],d[g>>2]=0,d[g+4>>2]=0,d[g+8>>2]=0,qr(g),$o[127&d[24+(0|d[e>>2])>>2]](p,e),1&f[o|0]?d[d[o+8>>2]>>2]=0:f[o|0]=0,d[o+4>>2]=0,y=0,L(93,0|o,0),n=y,y=0,!(1&n)){d[o>>2]=d[p>>2],d[o+4>>2]=d[p+4>>2],d[o+8>>2]=d[p+8>>2],d[p>>2]=0,d[p+4>>2]=0,d[p+8>>2]=0,Zr(p),I=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(n=0|ae(0))}else{if(e=0|pr(t,43892),$o[127&d[44+(0|d[e>>2])>>2]](T,e),T=0|d[T>>2],f[i|0]=T,f[i+1|0]=T>>8,f[i+2|0]=T>>16,f[i+3|0]=T>>24,$o[127&d[32+(0|d[e>>2])>>2]](A,e),1&f[l|0]?d[d[l+8>>2]>>2]=0:f[l|0]=0,d[l+4>>2]=0,y=0,L(93,0|l,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[l>>2]=d[A>>2],d[l+4>>2]=d[A+4>>2],d[l+8>>2]=d[A+8>>2],d[A>>2]=0,d[A+4>>2]=0,d[A+8>>2]=0,Zr(A),$o[127&d[28+(0|d[e>>2])>>2]](S,e),1&f[s|0]?d[d[s+8>>2]>>2]=0:f[s|0]=0,d[s+4>>2]=0,y=0,L(93,0|s,0),i=y,y=0,1&i&&Ue(i=0|ae(0)),d[s>>2]=d[S>>2],d[s+4>>2]=d[S+4>>2],d[s+8>>2]=d[S+8>>2],d[S>>2]=0,d[S+4>>2]=0,d[S+8>>2]=0,Zr(S),s=0|ts[127&d[12+(0|d[e>>2])>>2]](e),d[r>>2]=s,s=0|ts[127&d[16+(0|d[e>>2])>>2]](e),d[n>>2]=s,$o[127&d[20+(0|d[e>>2])>>2]](v,e),1&f[a|0]?(f[d[a+8>>2]|0]=0,d[a+4>>2]=0):(f[a+1|0]=0,f[a|0]=0),y=0,L(91,0|a,0),n=y,y=0,1&n&&Ue(n=0|ae(0)),d[a>>2]=d[v>>2],d[a+4>>2]=d[v+4>>2],d[a+8>>2]=d[v+8>>2],d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,qr(v),$o[127&d[24+(0|d[e>>2])>>2]](C,e),1&f[o|0]?d[d[o+8>>2]>>2]=0:f[o|0]=0,d[o+4>>2]=0,y=0,L(93,0|o,0),n=y,y=0,!(1&n)){d[o>>2]=d[C>>2],d[o+4>>2]=d[C+4>>2],d[o+8>>2]=d[C+8>>2],d[C>>2]=0,d[C+4>>2]=0,d[C+8>>2]=0,Zr(C),I=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(n=0|ae(0))}}while(0);d[c>>2]=I,b=w},function(e,t,i,r,n,a,o,s,l,c){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0;var u,h,m,g,p,A,S,v,w,T,C,I,D,x=0,E=0,M=0;D=b,b=b+112|0,u=D+108|0,h=D+96|0,p=D+92|0,A=D+80|0,S=D+68|0,v=D+56|0,w=D+52|0,T=D+40|0,C=D+36|0,I=D+24|0,m=D+12|0,g=D;do{if(e){e=0|pr(i,43828),i=0|d[e>>2];do{if(t){if($o[127&d[i+44>>2]](u,e),t=0|d[u>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[32+(0|d[e>>2])>>2]](h,e),1&f[l|0]?(f[d[l+8>>2]|0]=0,d[l+4>>2]=0):(f[l+1|0]=0,f[l|0]=0),y=0,L(91,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[h>>2],d[l+4>>2]=d[h+4>>2],d[l+8>>2]=d[h+8>>2],d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,qr(h),E=e;break}Ue(l=0|ae(0))}else{if($o[127&d[i+40>>2]](p,e),t=0|d[p>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[28+(0|d[e>>2])>>2]](A,e),1&f[l|0]?(f[d[l+8>>2]|0]=0,d[l+4>>2]=0):(f[l+1|0]=0,f[l|0]=0),y=0,L(91,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[A>>2],d[l+4>>2]=d[A+4>>2],d[l+8>>2]=d[A+8>>2],d[A>>2]=0,d[A+4>>2]=0,d[A+8>>2]=0,qr(A),E=e;break}Ue(l=0|ae(0))}}while(0);if(l=0|ts[127&d[12+(0|d[e>>2])>>2]](e),f[n|0]=l,l=0|ts[127&d[16+(0|d[e>>2])>>2]](e),f[a|0]=l,$o[127&d[20+(0|d[E>>2])>>2]](S,e),1&f[o|0]?(f[d[o+8>>2]|0]=0,d[o+4>>2]=0):(f[o+1|0]=0,f[o|0]=0),y=0,L(91,0|o,0),a=y,y=0,1&a&&Ue(a=0|ae(0)),d[o>>2]=d[S>>2],d[o+4>>2]=d[S+4>>2],d[o+8>>2]=d[S+8>>2],d[S>>2]=0,d[S+4>>2]=0,d[S+8>>2]=0,qr(S),$o[127&d[24+(0|d[E>>2])>>2]](v,e),1&f[s|0]?(f[d[s+8>>2]|0]=0,d[s+4>>2]=0):(f[s+1|0]=0,f[s|0]=0),y=0,L(91,0|s,0),a=y,y=0,!(1&a)){d[s>>2]=d[v>>2],d[s+4>>2]=d[v+4>>2],d[s+8>>2]=d[v+8>>2],d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,qr(v),M=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(a=0|ae(0))}else{e=0|pr(i,43764),i=0|d[e>>2];do{if(t){if($o[127&d[i+44>>2]](w,e),t=0|d[w>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[32+(0|d[e>>2])>>2]](T,e),1&f[l|0]?(f[d[l+8>>2]|0]=0,d[l+4>>2]=0):(f[l+1|0]=0,f[l|0]=0),y=0,L(91,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[T>>2],d[l+4>>2]=d[T+4>>2],d[l+8>>2]=d[T+8>>2],d[T>>2]=0,d[T+4>>2]=0,d[T+8>>2]=0,qr(T),x=e;break}Ue(l=0|ae(0))}else{if($o[127&d[i+40>>2]](C,e),t=0|d[C>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[28+(0|d[e>>2])>>2]](I,e),1&f[l|0]?(f[d[l+8>>2]|0]=0,d[l+4>>2]=0):(f[l+1|0]=0,f[l|0]=0),y=0,L(91,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[I>>2],d[l+4>>2]=d[I+4>>2],d[l+8>>2]=d[I+8>>2],d[I>>2]=0,d[I+4>>2]=0,d[I+8>>2]=0,qr(I),x=e;break}Ue(l=0|ae(0))}}while(0);if(l=0|ts[127&d[12+(0|d[e>>2])>>2]](e),f[n|0]=l,l=0|ts[127&d[16+(0|d[e>>2])>>2]](e),f[a|0]=l,$o[127&d[20+(0|d[x>>2])>>2]](m,e),1&f[o|0]?(f[d[o+8>>2]|0]=0,d[o+4>>2]=0):(f[o+1|0]=0,f[o|0]=0),y=0,L(91,0|o,0),a=y,y=0,1&a&&Ue(a=0|ae(0)),d[o>>2]=d[m>>2],d[o+4>>2]=d[m+4>>2],d[o+8>>2]=d[m+8>>2],d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,qr(m),$o[127&d[24+(0|d[x>>2])>>2]](g,e),1&f[s|0]?(f[d[s+8>>2]|0]=0,d[s+4>>2]=0):(f[s+1|0]=0,f[s|0]=0),y=0,L(91,0|s,0),a=y,y=0,!(1&a)){d[s>>2]=d[g>>2],d[s+4>>2]=d[g+4>>2],d[s+8>>2]=d[g+8>>2],d[g>>2]=0,d[g+4>>2]=0,d[g+8>>2]=0,qr(g),M=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(a=0|ae(0))}}while(0);d[c>>2]=M,b=D},function(e,t,i,r,n,a,o,s,l,c){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0;var u,h,m,g,p,A,S,v,w,T,C,I,D,x=0;D=b,b=b+112|0,u=D+108|0,h=D+96|0,p=D+92|0,A=D+80|0,S=D+68|0,v=D+56|0,w=D+52|0,T=D+40|0,C=D+36|0,I=D+24|0,m=D+12|0,g=D;do{if(e){e=0|pr(i,43956),i=0|d[e>>2];do{if(t){if($o[127&d[i+44>>2]](u,e),t=0|d[u>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[32+(0|d[e>>2])>>2]](h,e),1&f[l|0]?d[d[l+8>>2]>>2]=0:f[l|0]=0,d[l+4>>2]=0,y=0,L(93,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[h>>2],d[l+4>>2]=d[h+4>>2],d[l+8>>2]=d[h+8>>2],d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,Zr(h);break}Ue(l=0|ae(0))}else{if($o[127&d[i+40>>2]](p,e),t=0|d[p>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[28+(0|d[e>>2])>>2]](A,e),1&f[l|0]?d[d[l+8>>2]>>2]=0:f[l|0]=0,d[l+4>>2]=0,y=0,L(93,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[A>>2],d[l+4>>2]=d[A+4>>2],d[l+8>>2]=d[A+8>>2],d[A>>2]=0,d[A+4>>2]=0,d[A+8>>2]=0,Zr(A);break}Ue(l=0|ae(0))}}while(0);if(l=0|ts[127&d[12+(0|d[e>>2])>>2]](e),d[n>>2]=l,l=0|ts[127&d[16+(0|d[e>>2])>>2]](e),d[a>>2]=l,$o[127&d[20+(0|d[e>>2])>>2]](S,e),1&f[o|0]?(f[d[o+8>>2]|0]=0,d[o+4>>2]=0):(f[o+1|0]=0,f[o|0]=0),y=0,L(91,0|o,0),a=y,y=0,1&a&&Ue(a=0|ae(0)),d[o>>2]=d[S>>2],d[o+4>>2]=d[S+4>>2],d[o+8>>2]=d[S+8>>2],d[S>>2]=0,d[S+4>>2]=0,d[S+8>>2]=0,qr(S),$o[127&d[24+(0|d[e>>2])>>2]](v,e),1&f[s|0]?d[d[s+8>>2]>>2]=0:f[s|0]=0,d[s+4>>2]=0,y=0,L(93,0|s,0),a=y,y=0,!(1&a)){d[s>>2]=d[v>>2],d[s+4>>2]=d[v+4>>2],d[s+8>>2]=d[v+8>>2],d[v>>2]=0,d[v+4>>2]=0,d[v+8>>2]=0,Zr(v),x=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(a=0|ae(0))}else{e=0|pr(i,43892),i=0|d[e>>2];do{if(t){if($o[127&d[i+44>>2]](w,e),t=0|d[w>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[32+(0|d[e>>2])>>2]](T,e),1&f[l|0]?d[d[l+8>>2]>>2]=0:f[l|0]=0,d[l+4>>2]=0,y=0,L(93,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[T>>2],d[l+4>>2]=d[T+4>>2],d[l+8>>2]=d[T+8>>2],d[T>>2]=0,d[T+4>>2]=0,d[T+8>>2]=0,Zr(T);break}Ue(l=0|ae(0))}else{if($o[127&d[i+40>>2]](C,e),t=0|d[C>>2],f[r|0]=t,f[r+1|0]=t>>8,f[r+2|0]=t>>16,f[r+3|0]=t>>24,$o[127&d[28+(0|d[e>>2])>>2]](I,e),1&f[l|0]?d[d[l+8>>2]>>2]=0:f[l|0]=0,d[l+4>>2]=0,y=0,L(93,0|l,0),r=y,y=0,!(1&r)){d[l>>2]=d[I>>2],d[l+4>>2]=d[I+4>>2],d[l+8>>2]=d[I+8>>2],d[I>>2]=0,d[I+4>>2]=0,d[I+8>>2]=0,Zr(I);break}Ue(l=0|ae(0))}}while(0);if(l=0|ts[127&d[12+(0|d[e>>2])>>2]](e),d[n>>2]=l,l=0|ts[127&d[16+(0|d[e>>2])>>2]](e),d[a>>2]=l,$o[127&d[20+(0|d[e>>2])>>2]](m,e),1&f[o|0]?(f[d[o+8>>2]|0]=0,d[o+4>>2]=0):(f[o+1|0]=0,f[o|0]=0),y=0,L(91,0|o,0),a=y,y=0,1&a&&Ue(a=0|ae(0)),d[o>>2]=d[m>>2],d[o+4>>2]=d[m+4>>2],d[o+8>>2]=d[m+8>>2],d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,qr(m),$o[127&d[24+(0|d[e>>2])>>2]](g,e),1&f[s|0]?d[d[s+8>>2]>>2]=0:f[s|0]=0,d[s+4>>2]=0,y=0,L(93,0|s,0),a=y,y=0,!(1&a)){d[s>>2]=d[g>>2],d[s+4>>2]=d[g+4>>2],d[s+8>>2]=d[g+8>>2],d[g>>2]=0,d[g+4>>2]=0,d[g+8>>2]=0,Zr(g),x=0|ts[127&d[36+(0|d[e>>2])>>2]](e);break}Ue(a=0|ae(0))}}while(0);d[c>>2]=x,b=D},da,da,da],ls=[ma,function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=6,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=6,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+28>>2]&&1!=(0|d[e+20>>2])){if(A=e+4|0,!(m=0|d[(S=e+32|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+12>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+16>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=1,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(44,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(8==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(45,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(46,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(47,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=3,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=6,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=6,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,C=0,I=0;if(v=b,b=b+352|0,w=v+328|0,C=v+192|0,l=v+343|0,c=v+342|0,u=v+341|0,h=v+340|0,a=v+176|0,i=v+168|0,r=v+160|0,n=v+152|0,s=v,o=v+136|0,0|d[(e|=0)+32>>2]&&1!=(0|d[e+24>>2])){if(A=e+8|0,!(m=0|d[(S=e+36|0)>>2])){if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[l|0],j(37,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I)}if(16==(0|(e=0|d[e+16>>2])))switch(0|m){case 1:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[c|0],j(38,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[u|0],j(39,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(48),y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],f[w|0]=0|f[h|0],j(40,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=C+56|0,u=C+4|0,d[C>>2]=36160,d[m>>2]=36180,y=0,L(62,C+56|0,0|u),v=y,y=0,1&v&&(I=0|ae(),tn(m),de(0|I)),d[C+128>>2]=0,d[C+132>>2]=-1,d[C>>2]=36200,d[C+56>>2]=36220,y=0,P(180,0|u),v=y,y=0;do{if(1&v)e=0|ae();else{if(d[u>>2]=36236,d[(h=C+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[C+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),v=y,y=0,1&v){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|C,49007,21),w=y,y=0;do{if(1&w||(y=0,g=0|G(36,0|e,0|d[S>>2]),w=y,y=0,1&w)||(y=0,O(28,0|g,50997,18),w=y,y=0,1&w))I=34;else{if(c=0|ne(16),y=0,L(64,0|a,0|u),w=y,y=0,1&w)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|a),w=y,y=0,1&w?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(a),!l)break;re(0|c)}}while(0);34==(0|I)&&(e=0|ae()),d[C>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}switch((0|e)<=8&&(e=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|e,8,35648),I=y,y=0,1&I||De(0|e,824,96),I=0|ae(),re(0|e),de(0|I)),l=16-e|0,0|m){case 1:if(e=0|Oa(60),d[i>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[i>>2],d[w+4>>2]=d[i+4>>2],j(41,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 2:if(e=0|Oa(60),d[r>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[r>>2],d[w+4>>2]=d[r+4>>2],j(42,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);case 3:if(e=0|Oa(60),d[n>>2]=l,y=0,d[C>>2]=d[t>>2],d[C+4>>2]=d[t+4>>2],d[C+8>>2]=d[t+8>>2],d[w>>2]=d[n>>2],d[w+4>>2]=d[n+4>>2],j(43,0|e,0|C,0|A,0|w),I=y,y=0,!(1&I))return b=v,0|(I=e);I=0|ae(),Ba(e),de(0|I);default:m=s+56|0,u=s+4|0,d[s>>2]=36160,d[m>>2]=36180,y=0,L(62,s+56|0,0|u),C=y,y=0,1&C&&(I=0|ae(),tn(m),de(0|I)),d[s+128>>2]=0,d[s+132>>2]=-1,d[s>>2]=36200,d[s+56>>2]=36220,y=0,P(180,0|u),C=y,y=0;do{if(1&C)e=0|ae();else{if(d[u>>2]=36236,d[(h=s+36|0)>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,d[h+12>>2]=0,d[s+52>>2]=16,d[w>>2]=0,d[w+4>>2]=0,d[w+8>>2]=0,y=0,L(63,0|u,0|w),C=y,y=0,1&C){e=0|ae(),qr(w),qr(h),an(u);break}qr(w),y=0,e=0|O(28,0|s,49007,21),C=y,y=0;do{if(1&C||(y=0,p=0|G(36,0|e,0|d[S>>2]),C=y,y=0,1&C)||(y=0,O(28,0|p,50997,18),C=y,y=0,1&C))I=64;else{if(c=0|ne(16),y=0,L(64,0|o,0|u),C=y,y=0,1&C)e=0|ae();else if(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|c,9,35648,0|o),C=y,y=0,1&C?l=1:(y=0,W(6,0|c,824,96),y=0,l=0),e=0|ae(),qr(o),!l)break;re(0|c)}}while(0);64==(0|I)&&(e=0|ae()),d[s>>2]=36200,d[m>>2]=36220,d[u>>2]=36236,qr(h),an(u),tn(m),de(0|(I=e))}}while(0);I=e,tn(m),de(0|I)}}return l=0|d[t+4>>2],c=0|Oa(16),e=0|d[e+20>>2],l?(d[c>>2]=36108,d[c+4>>2]=l,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c)):(I=0|d[t>>2],d[c>>2]=36132,d[c+4>>2]=I,d[c+8>>2]=2,d[c+12>>2]=e,b=v,0|(I=c))},function(e,t){t|=0;var i,r,n,a,o=0,s=0,l=0;if((o=0|d[(s=(e|=0)+44|0)>>2])>>>0<(l=0|d[e+24>>2])>>>0&&(d[s>>2]=l,o=l),r=s=0|d[(n=e+8|0)>>2],s>>>0>=(i=0|d[(a=e+12|0)>>2])>>>0)return 0|(e=-1);if(-1==(0|t))return d[n>>2]=s,d[a>>2]=i+-1,d[e+16>>2]=o,0|(e=0);if(16&d[e+48>>2])l=255&t,s=i+-1|0;else if((l=255&t)<<24>>24!=(0|f[(s=i+-1|0)|0]))return 0|(e=-1);return d[n>>2]=r,d[a>>2]=s,d[e+16>>2]=o,f[s|0]=l,0|(e=t)},function(e,t){e|=0;var i,r,n,a,o,s,l,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0;if(l=b,b=b+16|0,r=l,-1==(0|(t|=0)))return b=l,0|(e=0);a=e+8|0,o=(0|d[(n=e+12|0)>>2])-(0|d[a>>2])|0,c=0|d[(s=e+24|0)>>2],u=0|d[(i=e+28|0)>>2];do{if((0|c)==(0|u)){if(!(16&d[(p=e+48|0)>>2]))return b=l,0|(e=-1);if(h=c-(g=0|d[(A=e+20|0)>>2])|0,g=(0|d[(m=e+44|0)>>2])-g|0,y=0,L(67,0|(u=e+32|0),0),c=y,y=0,!(1&c||(c=1&f[u|0]?(-2&d[u>>2])-1|0:10,y=0,W(8,0|u,0|c,0),c=y,y=0,1&c))){1&(c=0|f[u|0])?(u=0|d[e+40>>2],c=0|d[e+36>>2]):(u=u+1|0,c=(255&c)>>>1),S=u+c|0,d[A>>2]=u,d[i>>2]=S,A=u+h|0,d[s>>2]=A,c=u+g|0,d[m>>2]=c,u=S;break}return S=0|ae(0),ue(0|S),he(),b=l,0|(S=-1)}p=e+48|0,m=S=e+44|0,A=c,c=0|d[S>>2]}while(0);return g=A+1|0,d[r>>2]=g,h=0|d[(g>>>0>>0?m:r)>>2],d[m>>2]=h,8&d[p>>2]&&(c=1&f[(c=e+32|0)|0]?0|d[e+40>>2]:c+1|0,d[a>>2]=c,d[n>>2]=c+o,d[e+16>>2]=h),(0|A)==(0|u)?(S=0|ls[63&d[52+(0|d[e>>2])>>2]](e,255&t),b=l,0|S):(d[s>>2]=g,f[A|0]=t,b=l,0|(S=255&t))},function(e,t){return-1},function(e,t){e|=0;var i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0;o=b,b=b+32|0,n=o+16|0,s=o+8|0,r=o+4|0,i=o,a=-1==(0|(t|=0));e:do{if(a)A=11;else{if(d[s>>2]=t,0|f[e+44|0]){if(1==(0|ko(s,4,1,0|d[e+32>>2]))){A=11;break}s=-1;break}for(d[r>>2]=n,g=s+4|0,p=e+36|0,c=e+40|0,u=n+8|0,h=n,m=e+32|0;;){if(e=0|d[p>>2],e=0|gs[15&d[12+(0|d[e>>2])>>2]](e,0|d[c>>2],s,g,i,n,u,r),(0|d[i>>2])==(0|s)){s=-1;break e}if(3==(0|e))break;if(l=1==(0|e),e>>>0>=2){s=-1;break e}if((0|ko(n,1,e=(0|d[r>>2])-h|0,0|d[m>>2]))!=(0|e)){s=-1;break e}if(!l){A=11;break e}s=l?0|d[i>>2]:s}1!=(0|ko(s,1,1,0|d[m>>2]))?s=-1:A=11}}while(0);return 11==(0|A)&&(s=a?0:t),b=o,0|s},function(e,t){t|=0;var i,r,n,a,o,s=0,l=0,c=0;o=b,b=b+32|0,a=o+16|0,n=o+8|0,l=o+4|0,i=o,s=!!(0|f[(r=(e|=0)+52|0)|0]);e:do{if(-1==(0|t))s?t=-1:(t=0|d[e+48>>2],f[r|0]=-1!=(0|t)&1);else{c=e+48|0;t:do{if(s){switch(d[l>>2]=d[c>>2],s=0|d[e+36>>2],0|gs[15&d[12+(0|d[s>>2])>>2]](s,0|d[e+40>>2],l,l+4|0,i,a,a+8|0,n)){case 1:case 2:t=-1;break e;case 3:f[a|0]=d[c>>2],d[n>>2]=a+1}for(s=e+32|0;;){if((l=0|d[n>>2])>>>0<=a>>>0)break t;if(e=l+-1|0,d[n>>2]=e,-1==(0|Lo(0|f[e|0],0|d[s>>2]))){t=-1;break e}}}}while(0);d[c>>2]=t,f[r|0]=1}}while(0);return b=o,0|t},function(e,t){return-1},function(e,t){return-1},function(e,t){e|=0;var i,r,n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0;o=b,b=b+32|0,n=o+16|0,s=o+8|0,r=o+4|0,i=o,a=-1==(0|(t|=0));e:do{if(a)A=11;else{if(f[s|0]=t,0|f[e+44|0]){if(1==(0|ko(s,1,1,0|d[e+32>>2]))){A=11;break}s=-1;break}for(d[r>>2]=n,p=s+1|0,c=e+36|0,u=e+40|0,h=n+8|0,m=n,g=e+32|0;;){if(e=0|d[c>>2],e=0|gs[15&d[12+(0|d[e>>2])>>2]](e,0|d[u>>2],s,p,i,n,h,r),(0|d[i>>2])==(0|s)){s=-1;break e}if(3==(0|e))break;if(l=1==(0|e),e>>>0>=2){s=-1;break e}if((0|ko(n,1,e=(0|d[r>>2])-m|0,0|d[g>>2]))!=(0|e)){s=-1;break e}if(!l){A=11;break e}s=l?0|d[i>>2]:s}1!=(0|ko(s,1,1,0|d[g>>2]))?s=-1:A=11}}while(0);return 11==(0|A)&&(s=a?0:t),b=o,0|s},function(e,t){t|=0;var i,r,n,a,o,s=0,l=0,c=0;o=b,b=b+32|0,a=o+16|0,n=o+4|0,l=o+8|0,i=o,s=!!(0|f[(r=(e|=0)+52|0)|0]);e:do{if(-1==(0|t))s?t=-1:(t=0|d[e+48>>2],f[r|0]=-1!=(0|t)&1);else{c=e+48|0;t:do{if(s){switch(f[l|0]=d[c>>2],s=0|d[e+36>>2],0|gs[15&d[12+(0|d[s>>2])>>2]](s,0|d[e+40>>2],l,l+1|0,i,a,a+8|0,n)){case 1:case 2:t=-1;break e;case 3:f[a|0]=d[c>>2],d[n>>2]=a+1}for(s=e+32|0;;){if((l=0|d[n>>2])>>>0<=a>>>0)break t;if(e=l+-1|0,d[n>>2]=e,-1==(0|Lo(0|f[e|0],0|d[s>>2]))){t=-1;break e}}}}while(0);d[c>>2]=t,f[r|0]=1}}while(0);return b=o,0|t},function(e,t){return-1},function(e,t){return(t|=0)<<24>>24>-1&&(t=(0|Sr())+((255&t)<<2)|0,t=255&d[t>>2]),0|t},function(e,t){return(t|=0)<<24>>24>-1&&(t=(0|br())+(t<<24>>24<<2)|0,t=255&d[t>>2]),0|t},function(e,t){return 0|(t|=0)},function(e,t){return(t|=0)>>>0<128&&(t=(0|Sr())+(t<<2)|0,t=0|d[t>>2]),0|t},function(e,t){return(t|=0)>>>0<128&&(t=(0|br())+(t<<2)|0,t=0|d[t>>2]),0|t},function(e,t){return(t|=0)<<24>>24},function(e,t){t|=0;var i,r=0,n=0,a=0;if(d[(n=(e|=0)+4|0)>>2]=d[t>>2],d[n+4>>2]=d[t+4>>2],d[n+8>>2]=d[t+8>>2],xa(e,-1),xa(e,-40),n=e+28|0,t=0|d[(i=e+24|0)>>2],(0|d[n>>2])==(0|t))return xa(e,-1),xa(e,-39),0|(e=0|d[(e=e+16|0)>>2]);r=0;do{a=0|d[t+(r<<2)>>2],$o[127&d[8+(0|d[a>>2])>>2]](a,e),r=r+1|0,t=0|d[i>>2]}while(r>>>0<(0|d[n>>2])-t>>2>>>0);return xa(e,-1),xa(e,-39),0|(a=0|d[(a=e+16|0)>>2])},function(e,t){e|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0;if((n=2==(0|d[(t|=0)+24>>2]))&&3!=(0|d[t+16>>2]))return 0|(t=0);r=0|d[t+20>>2],e=0|d[t+8>>2];e:do{if(!r){if(n){if(8!=(0|e))break;c=t,u=(l=(a=0|Oa(4600))+4|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=a+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[a>>2]=35688,d[(e=a+132|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+148>>2]=d[t>>2],d[a+152>>2]=0,d[a+156>>2]=0,d[a+160>>2]=0,e=a+4544|0,n=a+164|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4556|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4568|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+28>>2]||(d[a+20>>2]=1),0|(t=a)}switch(0|e){case 8:c=t,u=(l=(a=0|Oa(4600))+4|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=a+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[a>>2]=35716,d[(e=a+132|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+148>>2]=d[t>>2],d[a+152>>2]=0,d[a+156>>2]=0,d[a+160>>2]=0,e=a+4544|0,n=a+164|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4556|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4568|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+28>>2]||(d[a+20>>2]=1),0|(t=a);case 12:c=t,u=(l=(a=0|Oa(4600))+4|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=a+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[a>>2]=35744,d[(e=a+132|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+148>>2]=d[t>>2],d[a+152>>2]=0,d[a+156>>2]=0,d[a+160>>2]=0,e=a+4544|0,n=a+164|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4556|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4568|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+28>>2]||(d[a+20>>2]=1),0|(t=a);case 16:c=t,u=(l=(a=0|Oa(4600))+4|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=a+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[a>>2]=35772,d[(e=a+132|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+148>>2]=d[t>>2],d[a+152>>2]=0,d[a+156>>2]=0,d[a+160>>2]=0,e=a+4544|0,n=a+164|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4556|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4568|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+28>>2]||(d[a+20>>2]=1),0|(t=a);default:break e}}}while(0);if(i=(1<>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=o+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[o>>2]=35800,d[o+128>>2]=i,d[o+132>>2]=s,d[o+136>>2]=r,d[o+140>>2]=e,d[o+144>>2]=n,d[o+148>>2]=a,d[o+152>>2]=64,d[(e=o+156|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+172>>2]=d[t>>2],d[o+176>>2]=0,d[o+180>>2]=0,d[o+184>>2]=0,e=o+4568|0,n=o+188|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4580|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4592|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+28>>2]||(d[o+20>>2]=1),0|(t=o)}for(e=0;1<>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=o+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[o>>2]=35660,d[o+128>>2]=i,d[o+132>>2]=s,d[o+136>>2]=r,d[o+140>>2]=e,d[o+144>>2]=n,d[o+148>>2]=a,d[o+152>>2]=64,d[(e=o+156|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+172>>2]=d[t>>2],d[o+176>>2]=0,d[o+180>>2]=0,d[o+184>>2]=0,e=o+4568|0,n=o+188|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4580|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4592|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+28>>2]||(d[o+20>>2]=1),0|(t=o)}if((0|e)>=17)return 0|(t=0);if(s=1+(((s=r<<1)+i|0)/(1|s)|0)|0,n){for(e=0;1<>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=o+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[o>>2]=35828,d[o+128>>2]=i,d[o+132>>2]=s,d[o+136>>2]=r,d[o+140>>2]=e,d[o+144>>2]=n,d[o+148>>2]=a,d[o+152>>2]=64,d[(e=o+156|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+172>>2]=d[t>>2],d[o+176>>2]=0,d[o+180>>2]=0,d[o+184>>2]=0,e=o+4568|0,n=o+188|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4580|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4592|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+28>>2]||(d[o+20>>2]=1),0|(t=o)}for(e=0;1<>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));u=(l=o+88|0)+40|0;do{d[l>>2]=0,l=l+4|0}while((0|l)<(0|u));d[o>>2]=35856,d[o+128>>2]=i,d[o+132>>2]=s,d[o+136>>2]=r,d[o+140>>2]=e,d[o+144>>2]=n,d[o+148>>2]=a,d[o+152>>2]=64,d[(e=o+156|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+172>>2]=d[t>>2],d[o+176>>2]=0,d[o+180>>2]=0,d[o+184>>2]=0,e=o+4568|0,n=o+188|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4580|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4592|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+28>>2]||(d[o+20>>2]=1),0|(t=o)},function(e,t){e|=0;var i,r,n=0,a=0,o=0,s=0,l=0,c=0,u=0;if((n=2==(0|d[(t|=0)+24>>2]))&&3!=(0|d[t+16>>2]))return 0|(t=0);r=0|d[t+20>>2],e=0|d[t+8>>2];e:do{if(!r){if(n){if(8!=(0|e))break;a=0|Oa(4608),d[a+4>>2]=0,c=t,u=(l=a+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[a+92>>2]=0,d[a+96>>2]=0,d[a+100>>2]=32,d[a+104>>2]=0,d[a+108>>2]=0,f[a+112|0]=0,d[(e=a+116|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[e+16>>2]=0,d[a>>2]=35912,d[(e=a+140|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+156>>2]=d[t>>2],d[a+160>>2]=0,d[a+164>>2]=0,d[a+168>>2]=0,e=a+4552|0,n=a+172|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4564|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4576|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+32>>2]||(d[a+24>>2]=1),0|(t=a)}switch(0|e){case 8:a=0|Oa(4608),d[a+4>>2]=0,c=t,u=(l=a+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[a+92>>2]=0,d[a+96>>2]=0,d[a+100>>2]=32,d[a+104>>2]=0,d[a+108>>2]=0,f[a+112|0]=0,d[(e=a+116|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[e+16>>2]=0,d[a>>2]=35940,d[(e=a+140|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+156>>2]=d[t>>2],d[a+160>>2]=0,d[a+164>>2]=0,d[a+168>>2]=0,e=a+4552|0,n=a+172|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4564|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4576|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+32>>2]||(d[a+24>>2]=1),0|(t=a);case 12:a=0|Oa(4608),d[a+4>>2]=0,c=t,u=(l=a+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[a+92>>2]=0,d[a+96>>2]=0,d[a+100>>2]=32,d[a+104>>2]=0,d[a+108>>2]=0,f[a+112|0]=0,d[(e=a+116|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[e+16>>2]=0,d[a>>2]=35968,d[(e=a+140|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+156>>2]=d[t>>2],d[a+160>>2]=0,d[a+164>>2]=0,d[a+168>>2]=0,e=a+4552|0,n=a+172|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4564|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4576|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+32>>2]||(d[a+24>>2]=1),0|(t=a);case 16:a=0|Oa(4608),d[a+4>>2]=0,c=t,u=(l=a+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[a+92>>2]=0,d[a+96>>2]=0,d[a+100>>2]=32,d[a+104>>2]=0,d[a+108>>2]=0,f[a+112|0]=0,d[(e=a+116|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[e+16>>2]=0,d[a>>2]=35996,d[(e=a+140|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[a+156>>2]=d[t>>2],d[a+160>>2]=0,d[a+164>>2]=0,d[a+168>>2]=0,e=a+4552|0,n=a+172|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=a+4564|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=a+4576|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[a+32>>2]||(d[a+24>>2]=1),0|(t=a);default:break e}}}while(0);if(i=(1<>2]=0,c=t,u=(l=o+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[o+92>>2]=0,d[o+96>>2]=0,d[o+100>>2]=32,d[o+104>>2]=0,d[o+108>>2]=0,f[o+112|0]=0,d[(u=o+116|0)>>2]=0,d[u+4>>2]=0,d[u+8>>2]=0,d[u+12>>2]=0,d[u+16>>2]=0,d[o>>2]=36024,d[o+136>>2]=i,d[o+140>>2]=s,d[o+144>>2]=r,d[o+148>>2]=e,d[o+152>>2]=n,d[o+156>>2]=a,d[o+160>>2]=64,d[(e=o+164|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+180>>2]=d[t>>2],d[o+184>>2]=0,d[o+188>>2]=0,d[o+192>>2]=0,e=o+4576|0,n=o+196|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4588|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4600|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+32>>2]||(d[o+24>>2]=1),0|(t=o)}for(e=0;1<>2]=0,c=t,u=(l=o+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[o+92>>2]=0,d[o+96>>2]=0,d[o+100>>2]=32,d[o+104>>2]=0,d[o+108>>2]=0,f[o+112|0]=0,d[(u=o+116|0)>>2]=0,d[u+4>>2]=0,d[u+8>>2]=0,d[u+12>>2]=0,d[u+16>>2]=0,d[o>>2]=35884,d[o+136>>2]=i,d[o+140>>2]=s,d[o+144>>2]=r,d[o+148>>2]=e,d[o+152>>2]=n,d[o+156>>2]=a,d[o+160>>2]=64,d[(e=o+164|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+180>>2]=d[t>>2],d[o+184>>2]=0,d[o+188>>2]=0,d[o+192>>2]=0,e=o+4576|0,n=o+196|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4588|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4600|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+32>>2]||(d[o+24>>2]=1),0|(t=o)}if((0|e)>=17)return 0|(t=0);if(s=1+(((s=r<<1)+i|0)/(1|s)|0)|0,n){for(e=0;1<>2]=0,c=t,u=(l=o+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[o+92>>2]=0,d[o+96>>2]=0,d[o+100>>2]=32,d[o+104>>2]=0,d[o+108>>2]=0,f[o+112|0]=0,d[(u=o+116|0)>>2]=0,d[u+4>>2]=0,d[u+8>>2]=0,d[u+12>>2]=0,d[u+16>>2]=0,d[o>>2]=36052,d[o+136>>2]=i,d[o+140>>2]=s,d[o+144>>2]=r,d[o+148>>2]=e,d[o+152>>2]=n,d[o+156>>2]=a,d[o+160>>2]=64,d[(e=o+164|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+180>>2]=d[t>>2],d[o+184>>2]=0,d[o+188>>2]=0,d[o+192>>2]=0,e=o+4576|0,n=o+196|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4588|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4600|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+32>>2]||(d[o+24>>2]=1),0|(t=o)}for(e=0;1<>2]=0,c=t,u=(l=o+8|0)+84|0;do{d[l>>2]=d[c>>2],l=l+4|0,c=c+4|0}while((0|l)<(0|u));d[o+92>>2]=0,d[o+96>>2]=0,d[o+100>>2]=32,d[o+104>>2]=0,d[o+108>>2]=0,f[o+112|0]=0,d[(u=o+116|0)>>2]=0,d[u+4>>2]=0,d[u+8>>2]=0,d[u+12>>2]=0,d[u+16>>2]=0,d[o>>2]=36080,d[o+136>>2]=i,d[o+140>>2]=s,d[o+144>>2]=r,d[o+148>>2]=e,d[o+152>>2]=n,d[o+156>>2]=a,d[o+160>>2]=64,d[(e=o+164|0)>>2]=0,d[e+4>>2]=0,d[e+8>>2]=0,d[e+12>>2]=0,d[o+180>>2]=d[t>>2],d[o+184>>2]=0,d[o+188>>2]=0,d[o+192>>2]=0,e=o+4576|0,n=o+196|0;do{d[n>>2]=0,d[n+4>>2]=0,h[n+8>>1]=0,h[n+10>>1]=1,n=n+12|0}while((0|n)!=(0|e));return d[e>>2]=0,d[e+4>>2]=0,h[e+8>>1]=0,f[e+10|0]=0,d[(t=o+4588|0)>>2]=0,d[t+4>>2]=0,h[t+8>>1]=0,f[t+10|0]=0,d[(t=o+4600|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[t+16>>2]=0,d[t+20>>2]=0,d[t+24>>2]=0,f[t+28|0]=0,0|d[o+32>>2]||(d[o+24>>2]=1),0|(t=o)},function(e,t){t|=0;var i,r,n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;a=b,b=b+32|0,i=a+20|0,r=a+16|0,o=a,y=0,L(65,0|(n=a+8|0),0|(e|=0)),h=y,y=0;e:do{if(1&h)o=0|ae(0),s=e,l=e,m=19;else{do{if(0|f[n|0]){if(h=0|rn(e+(0|d[(0|d[e>>2])-12>>2])|0),d[o>>2]=h,y=0,h=0|G(37,0|o,43392),u=y,y=0,1&u)m=0|ae(0),mr(o),o=m;else{mr(o),l=0|d[(0|d[e>>2])-12>>2],u=0|d[e+(l+24)>>2],s=e+l|0,o=0|d[(l=e+(l+76)|0)>>2];do{if(-1==(0|o)){if(o=0|rn(s),d[i>>2]=o,y=0,o=0|G(37,0|i,44220),g=y,y=0,!(1&g||(y=0,c=0|G(0|d[28+(0|d[o>>2])>>2],0|o,32),g=y,y=0,1&g))){mr(i),o=c<<24>>24,d[l>>2]=o,m=10;break}o=0|ae(0),mr(i)}else m=10}while(0);if(10==(0|m)){if(g=0|d[16+(0|d[h>>2])>>2],d[r>>2]=u,y=0,d[i>>2]=d[r>>2],o=0|Q(0|g,0|h,0|i,0|s,255&o,0|t),g=y,y=0,!(1&g)&&(o||(g=0|d[(0|d[e>>2])-12>>2],y=0,L(66,e+g|0,5|d[e+(g+16)>>2]),g=y,y=0,!(1&g))))break;o=0|ae(0)}}mn(n),s=e,l=e,m=19;break e}}while(0);mn(n)}}while(0);do{if(19==(0|m)){if(ue(0|o),y=0,P(181,s+(0|d[(0|d[l>>2])-12>>2])|0),g=y,y=0,!(1&g)){he();break}o=0|ae(),y=0,X(3),g=y,y=0,1&g?Ue(g=0|ae(0)):de(0|o)}}while(0);return b=a,0|e},pr,function(e,t){t|=0;var i,r,n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;a=b,b=b+32|0,i=a+20|0,r=a+16|0,o=a,y=0,L(65,0|(n=a+8|0),0|(e|=0)),h=y,y=0;e:do{if(1&h)o=0|ae(0),s=e,l=e,m=19;else{do{if(0|f[n|0]){if(h=0|rn(e+(0|d[(0|d[e>>2])-12>>2])|0),d[o>>2]=h,y=0,h=0|G(37,0|o,43392),u=y,y=0,1&u)m=0|ae(0),mr(o),o=m;else{mr(o),l=0|d[(0|d[e>>2])-12>>2],u=0|d[e+(l+24)>>2],s=e+l|0,o=0|d[(l=e+(l+76)|0)>>2];do{if(-1==(0|o)){if(o=0|rn(s),d[i>>2]=o,y=0,o=0|G(37,0|i,44220),g=y,y=0,!(1&g||(y=0,c=0|G(0|d[28+(0|d[o>>2])>>2],0|o,32),g=y,y=0,1&g))){mr(i),o=c<<24>>24,d[l>>2]=o,m=10;break}o=0|ae(0),mr(i)}else m=10}while(0);if(10==(0|m)){if(g=0|d[24+(0|d[h>>2])>>2],d[r>>2]=u,y=0,d[i>>2]=d[r>>2],o=0|Q(0|g,0|h,0|i,0|s,255&o,0|t),g=y,y=0,!(1&g)&&(o||(g=0|d[(0|d[e>>2])-12>>2],y=0,L(66,e+g|0,5|d[e+(g+16)>>2]),g=y,y=0,!(1&g))))break;o=0|ae(0)}}mn(n),s=e,l=e,m=19;break e}}while(0);mn(n)}}while(0);do{if(19==(0|m)){if(ue(0|o),y=0,P(181,s+(0|d[(0|d[l>>2])-12>>2])|0),g=y,y=0,!(1&g)){he();break}o=0|ae(),y=0,X(3),g=y,y=0,1&g?Ue(g=0|ae(0)):de(0|o)}}while(0);return b=a,0|e},function(e,t){return 0|function(e){return 1&(((e|=0)-48|0)>>>0<10?1:((32|e)-97|0)>>>0<6)}(e|=0)},function(e,t){return((e|=0)+-48|0)>>>0<10|0},function(e,t){return 0|Gr(e|=0,t|=0,0|Go(t))},function(e,t){return 0|function(e,t,i){e|=0,t|=0,i|=0;var r=0,n=0,a=0;r=0|f[e|0],1&r?(r=0|d[e>>2],a=(-2&r)-1|0,r&=255):a=1,n=!(1&r);do{if(a>>>0>=i>>>0){if(Yo(r=n?e+4|0:0|d[e+8>>2],t,i),d[r+(i<<2)>>2]=0,1&f[e|0]){d[e+4>>2]=i;break}f[e|0]=i<<1;break}Jr(e,a,i-a|0,r=n?(255&r)>>>1:0|d[e+4>>2],0,r,i,t)}while(0);return 0|e}(e|=0,t|=0,0|zo(t))},ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma],cs=[ga,function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0;e:do{if((0|r)==(0|n))o=6;else for(;;){if((0|t)==(0|i)){t=-1;break e}if((e=0|f[t|0])<<24>>24<(a=0|f[r|0])<<24>>24){t=-1;break e}if(a<<24>>24>24){t=1;break e}if(t=t+1|0,(0|(r=r+1|0))==(0|n)){o=6;break}}}while(0);return 6==(0|o)&&(t=(0|t)!=(0|i)&1),0|t},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0;e:do{if((0|r)==(0|n))o=6;else for(;;){if((0|t)==(0|i)){t=-1;break e}if((0|(e=0|d[t>>2]))<(0|(a=0|d[r>>2]))){t=-1;break e}if((0|a)<(0|e)){t=1;break e}if(t=t+4|0,(0|(r=r+4|0))==(0|n)){o=6;break}}}while(0);return 6==(0|o)&&(t=(0|t)!=(0|i)&1),0|t},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0;u=b,b=b+32|0,a=u+20|0,o=u+16|0,s=u+12|0,c=u;e:do{if(1&d[i+4>>2]){a=0|rn(i),d[s>>2]=a,y=0,o=0|G(37,0|s,44360),l=y,y=0;t:do{if(!(1&l)){Nr(a),a=0|d[o>>2],n?$o[127&d[a+24>>2]](c,o):$o[127&d[a+28>>2]](c,o),a=c+1|0,n=c+8|0,s=(l=!(1&(e=0|f[c|0])))?a:c+1|0,a=l?a:0|d[c+8>>2],l=c+4|0,i=!(1&e);i:do{if((0|a)!=((i?s:0|d[n>>2])+(i?(255&e)>>>1:0|d[l>>2])|0)){r:for(;;){o=0|f[a|0],r=0|d[t>>2];do{if(r){if((0|(e=0|d[(i=r+24|0)>>2]))!=(0|d[r+28>>2])){d[i>>2]=e+1,f[e|0]=o;break}if(y=0,o=0|G(0|d[52+(0|d[r>>2])>>2],0|r,255&o),e=y,y=0,1&e)break r;-1==(0|o)&&(d[t>>2]=0)}}while(0);if((0|(a=a+1|0))==(((i=!(1&(e=0|f[c|0])))?s:0|d[n>>2])+(i?(255&e)>>>1:0|d[l>>2])|0))break i}a=0|ae(),qr(c);break t}}while(0);a=0|d[t>>2],qr(c);break e}u=0|ae(),Nr(a),a=u}while(0);de(0|a)}else c=0|d[24+(0|d[e>>2])>>2],d[o>>2]=d[t>>2],d[a>>2]=d[o>>2],a=0|cs[31&c](e,a,i,r,1&n)}while(0);return b=u,0|a},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s,l,c,u,h,m=0,g=0;return u=b,b=b+64|0,a=u,g=u+44|0,s=u+20|0,c=u+16|0,l=u+12|0,h=u+8|0,o=u+4|0,f[(m=u+56|0)|0]=0|f[58887],f[m+1|0]=0|f[58888],f[m+2|0]=0|f[58889],f[m+3|0]=0|f[58890],f[m+4|0]=0|f[58891],f[m+5|0]=0|f[58892],Dn(m+1|0,58893,1,0|d[i+4>>2]),e=0|Sn(),d[a>>2]=n,m=0|xn(g,n=g+(0|Un(g,12,e,m,a))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(1,0|g,0|m,0|n,0|s,0|c,0|l,0|h),n=y,y=0,1&n?(g=0|ae(),Nr(e),de(0|g),0):(Nr(e),d[o>>2]=d[t>>2],m=0|d[c>>2],g=0|d[l>>2],d[a>>2]=d[o>>2],g=0|je(a,s,m,g,i,r),b=u,0|g)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s,l,c,u,h,m=0,g=0;return u=b,b=b+64|0,a=u,g=u+44|0,s=u+20|0,c=u+16|0,l=u+12|0,h=u+8|0,o=u+4|0,f[(m=u+56|0)|0]=0|f[58887],f[m+1|0]=0|f[58888],f[m+2|0]=0|f[58889],f[m+3|0]=0|f[58890],f[m+4|0]=0|f[58891],f[m+5|0]=0|f[58892],Dn(m+1|0,58893,0,0|d[i+4>>2]),e=0|Sn(),d[a>>2]=n,m=0|xn(g,n=g+(0|Un(g,12,e,m,a))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(1,0|g,0|m,0|n,0|s,0|c,0|l,0|h),n=y,y=0,1&n?(g=0|ae(),Nr(e),de(0|g),0):(Nr(e),d[o>>2]=d[t>>2],m=0|d[c>>2],g=0|d[l>>2],d[a>>2]=d[o>>2],g=0|je(a,s,m,g,i,r),b=u,0|g)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s,l,c,u,h=0,m=0,g=0;return u=b,b=b+80|0,o=u,l=u+12|0,c=u+32|0,m=u+8|0,s=u+4|0,f[(e=u+70|0)|0]=0|f[58901],f[e+1|0]=0|f[58902],f[e+2|0]=0|f[58903],f[e+3|0]=0|f[58904],f[e+4|0]=0|f[58905],f[e+5|0]=0|f[58906],h=0|Sn(),d[o>>2]=n,h=0|xn(l,n=l+(e=0|Un(l,20,h,e,o))|0,i),a=0|rn(i),d[m>>2]=a,y=0,m=0|G(37,0|m,44220),g=y,y=0,1&g?(g=0|ae(),Nr(a),de(0|g),0):(Nr(a),hs[31&d[32+(0|d[m>>2])>>2]](m,l,n,c),g=c+e|0,d[s>>2]=d[t>>2],d[o>>2]=d[s>>2],g=0|je(o,c,(0|h)==(0|n)?g:c+(h-l)|0,g,i,r),b=u,0|g)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0;c=b,b=b+32|0,a=c+20|0,o=c+16|0,s=c+12|0,l=c;e:do{if(1&d[i+4>>2]){a=0|rn(i),d[s>>2]=a,y=0,o=0|G(37,0|s,44368),s=y,y=0;t:do{if(!(1&s)){Nr(a),a=0|d[o>>2],n?$o[127&d[a+24>>2]](l,o):$o[127&d[a+28>>2]](l,o),a=l+4|0,n=l+8|0,s=(i=!(1&(e=0|f[l|0])))?a:l+4|0,a=i?a:0|d[l+8>>2],i=!(1&e);i:do{if((0|a)!=((i?s:0|d[n>>2])+((i?(255&e)>>>1:d[s>>2])<<2)|0)){for(;;){if(o=0|d[a>>2],r=0|d[t>>2]){if((0|(e=0|d[(i=r+24|0)>>2]))==(0|d[r+28>>2])){if(y=0,o=0|G(0|d[52+(0|d[r>>2])>>2],0|r,0|o),e=y,y=0,1&e)break}else d[i>>2]=e+4,d[e>>2]=o;-1==(0|o)&&(d[t>>2]=0)}if((0|(a=a+4|0))==(((i=!(1&(e=0|f[l|0])))?s:0|d[n>>2])+((i?(255&e)>>>1:d[s>>2])<<2)|0))break i}a=0|ae(),Zr(l);break t}}while(0);a=0|d[t>>2],Zr(l);break e}c=0|ae(),Nr(a),a=c}while(0);de(0|a)}else l=0|d[24+(0|d[e>>2])>>2],d[o>>2]=d[t>>2],d[a>>2]=d[o>>2],a=0|cs[31&l](e,a,i,r,1&n)}while(0);return b=c,0|a},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s,l,c,u,h,m=0,g=0;return u=b,b=b+128|0,a=u,g=u+104|0,s=u+20|0,c=u+16|0,l=u+12|0,h=u+8|0,o=u+4|0,f[(m=u+116|0)|0]=0|f[58887],f[m+1|0]=0|f[58888],f[m+2|0]=0|f[58889],f[m+3|0]=0|f[58890],f[m+4|0]=0|f[58891],f[m+5|0]=0|f[58892],Dn(m+1|0,58893,1,0|d[i+4>>2]),e=0|Sn(),d[a>>2]=n,m=0|xn(g,n=g+(0|Un(g,12,e,m,a))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(3,0|g,0|m,0|n,0|s,0|c,0|l,0|h),n=y,y=0,1&n?(g=0|ae(),Nr(e),de(0|g),0):(Nr(e),d[o>>2]=d[t>>2],m=0|d[c>>2],g=0|d[l>>2],d[a>>2]=d[o>>2],g=0|On(a,s,m,g,i,r),b=u,0|g)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s,l,c,u,h,m=0,g=0;return u=b,b=b+128|0,a=u,g=u+104|0,s=u+20|0,c=u+16|0,l=u+12|0,h=u+8|0,o=u+4|0,f[(m=u+116|0)|0]=0|f[58887],f[m+1|0]=0|f[58888],f[m+2|0]=0|f[58889],f[m+3|0]=0|f[58890],f[m+4|0]=0|f[58891],f[m+5|0]=0|f[58892],Dn(m+1|0,58893,0,0|d[i+4>>2]),e=0|Sn(),d[a>>2]=n,m=0|xn(g,n=g+(0|Un(g,12,e,m,a))|0,i),e=0|rn(i),d[h>>2]=e,y=0,V(3,0|g,0|m,0|n,0|s,0|c,0|l,0|h),n=y,y=0,1&n?(g=0|ae(),Nr(e),de(0|g),0):(Nr(e),d[o>>2]=d[t>>2],m=0|d[c>>2],g=0|d[l>>2],d[a>>2]=d[o>>2],g=0|On(a,s,m,g,i,r),b=u,0|g)},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a,o,s,l,c,u,h=0,m=0,g=0;return u=b,b=b+192|0,o=u,l=u+160|0,c=u+12|0,m=u+8|0,s=u+4|0,f[(e=u+180|0)|0]=0|f[58901],f[e+1|0]=0|f[58902],f[e+2|0]=0|f[58903],f[e+3|0]=0|f[58904],f[e+4|0]=0|f[58905],f[e+5|0]=0|f[58906],h=0|Sn(),d[o>>2]=n,h=0|xn(l,n=l+(e=0|Un(l,20,h,e,o))|0,i),a=0|rn(i),d[m>>2]=a,y=0,m=0|G(37,0|m,44212),g=y,y=0,1&g?(g=0|ae(),Nr(a),de(0|g),0):(Nr(a),hs[31&d[48+(0|d[m>>2])>>2]](m,l,n,c),g=c+(e<<2)|0,d[s>>2]=d[t>>2],d[o>>2]=d[s>>2],g=0|On(o,c,(0|h)==(0|n)?g:c+(h-l<<2)|0,g,i,r),b=u,0|g)},function(e,t,i,r,n){if(e|=0,r|=0,n|=0,(0|(t|=0))!=(0|(i|=0)))for(;e=0|f[t|0],f[n|0]=e<<24>>24>-1?e:r,(0|(t=t+1|0))!=(0|i);)n=n+1|0;return 0|i},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0;var a=0,o=0;switch(o=b,b=b+16|0,a=o,d[(n|=0)>>2]=i,i=0|so(0|d[e+8>>2]),y=0,e=0|O(34,0|a,0,0|t),t=y,y=0,1&t&&(a=0|ae(),0|i&&(y=0,N(75,0|i),o=y,y=0,1&o)&&Ue(o=0|ae(0)),de(0|a)),0|i&&(y=0,N(75,0|i),t=y,y=0,1&t)&&Ue(t=0|ae(0)),0|e){case 0:case-1:a=2;break;default:if((e=e+-1|0)>>>0<=(r-(0|d[n>>2])|0)>>>0)if(e)for(;;){if(t=0|f[a|0],r=0|d[n>>2],d[n>>2]=r+1,f[r|0]=t,!(e=e+-1|0)){a=0;break}a=a+1|0}else a=0;else a=1}return b=o,0|a},function(e,t,i,r,n){t|=0,i|=0,n|=0;var a,o,s=0,l=0,c=0,u=0,f=0,h=0;o=r|=0,a=(e|=0)+8|0;e:do{if((0|i)==(0|r)|!(0|n))e=0;else{for(e=0,c=0;;){if(l=0|so(0|d[a>>2]),y=0,s=0|O(36,0|i,o-i|0,0|t),h=y,y=0,1&h){f=l;break}if(0|l&&(y=0,N(75,0|l),h=y,y=0,1&h)){u=5;break}switch(0|s){case-2:case-1:break e;case 0:i=i+1|0,s=1;break;default:i=i+s|0}if(e=s+e|0,(0|i)==(0|r)|(c=c+1|0)>>>0>=n>>>0)break e}5==(0|u)&&Ue(h=0|ae(0)),e=0|ae(),0|f&&(y=0,N(75,0|f),h=y,y=0,1&h)&&Ue(h=0|ae(0)),de(0|e)}}while(0);return 0|e},function(e,t,i,r,n){e|=0,r|=0,n|=0;var a,o=0;if(a=((i|=0)-(t|=0)|0)>>>2,(0|t)!=(0|i))for(o=t,e=n;n=0|d[o>>2],f[e|0]=n>>>0<128?255&n:r,(0|(o=o+4|0))!=(0|i);)e=e+1|0;return t+(a<<2)|0},function(e,t,i,r,n){return i|=0,d[(n|=0)>>2]=i,3},function(e,t,i,r,n){return e|=0,0|((e=(r|=0)-(i|=0)|0)>>>0<(n|=0)>>>0?e:n)},function(e,t,i,r,n){return i|=0,d[(n|=0)>>2]=i,3},function(e,t,i,r,n){return 0|function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0;h=t,n=4&n&&(h-e|0)>2&&-17==(0|f[e|0])&&-69==(0|f[e+1|0])&&-65==(0|f[e+2|0])?e+3|0:e;e:do{if(!!(0|i)&n>>>0>>0){u=n,a=0;t:for(;;){if((c=255&(n=0|f[u|0]))>>>0>r>>>0){n=u,a=42;break e}do{if(n<<24>>24>-1)n=u+1|0;else{if((255&n)<194){n=u,a=42;break e}if((255&n)<224){if((h-u|0)<2){n=u,a=42;break e}if(128!=(192&(n=0|m[u+1|0]))){n=u,a=42;break e}if((63&n|c<<6&1984)>>>0>r>>>0){n=u,a=42;break e}n=u+2|0;break}if((255&n)<240){if((h-(n=u)|0)<3){n=u,a=42;break e}switch(s=0|f[u+1|0],o=0|f[u+2|0],0|c){case 224:if((-32&s)<<24>>24!=-96){a=20;break t}break;case 237:if((-32&s)<<24>>24!=-128){a=22;break t}break;default:if((-64&s)<<24>>24!=-128){a=24;break t}}if(128!=(192&(n=255&o))){n=u,a=42;break e}if(((255&s)<<6&4032|c<<12&61440|63&n)>>>0>r>>>0){n=u,a=42;break e}n=u+3|0;break}if((255&n)>=245){n=u,a=42;break e}if((i-a|0)>>>0<2|(h-(n=u)|0)<4){n=u,a=42;break e}switch(l=0|f[u+1|0],o=0|f[u+2|0],s=0|f[u+3|0],0|c){case 240:if((l+112&255)>=48){a=32;break t}break;case 244:if((-16&l)<<24>>24!=-128){a=34;break t}break;default:if((-64&l)<<24>>24!=-128){a=36;break t}}if(128!=(192&(o&=255))){n=u,a=42;break e}if(128!=(192&(n=255&s))){n=u,a=42;break e}if(((255&l)<<12&258048|c<<18&1835008|o<<6&4032|63&n)>>>0>r>>>0){n=u,a=42;break e}n=u+4|0,a=a+1|0}}while(0);if(!((a=a+1|0)>>>0>>0&n>>>0>>0)){a=42;break e}u=n}if(20==(0|a)){n=n-e|0;break}if(22==(0|a)){n=n-e|0;break}if(24==(0|a)){n=n-e|0;break}if(32==(0|a)){n=n-e|0;break}if(34==(0|a)){n=n-e|0;break}if(36==(0|a)){n=n-e|0;break}}else a=42}while(0);return 42==(0|a)&&(n=n-e|0),0|n}(i|=0,r|=0,n|=0,1114111,0)},function(e,t,i,r,n){return i|=0,d[(n|=0)>>2]=i,3},function(e,t,i,r,n){return 0|function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0;h=t,n=4&n&&(h-e|0)>2&&-17==(0|f[e|0])&&-69==(0|f[e+1|0])&&-65==(0|f[e+2|0])?e+3|0:e;e:do{if(!!(0|i)&n>>>0>>0){c=n,u=0;t:for(;;){l=255&(n=0|f[c|0]);do{if(n<<24>>24>-1){if(l>>>0>r>>>0){n=c,a=42;break e}n=c+1|0}else{if((255&n)<194){n=c,a=42;break e}if((255&n)<224){if((h-c|0)<2){n=c,a=42;break e}if(128!=(192&(n=0|m[c+1|0]))){n=c,a=42;break e}if((63&n|l<<6&1984)>>>0>r>>>0){n=c,a=42;break e}n=c+2|0;break}if((255&n)<240){if((h-(n=c)|0)<3){n=c,a=42;break e}switch(o=0|f[c+1|0],a=0|f[c+2|0],0|l){case 224:if((-32&o)<<24>>24!=-96){a=20;break t}break;case 237:if((-32&o)<<24>>24!=-128){a=22;break t}break;default:if((-64&o)<<24>>24!=-128){a=24;break t}}if(128!=(192&(n=255&a))){n=c,a=42;break e}if(((255&o)<<6&4032|l<<12&61440|63&n)>>>0>r>>>0){n=c,a=42;break e}n=c+3|0;break}if((255&n)>=245){n=c,a=42;break e}if((h-(n=c)|0)<4){n=c,a=42;break e}switch(s=0|f[c+1|0],a=0|f[c+2|0],o=0|f[c+3|0],0|l){case 240:if((s+112&255)>=48){a=32;break t}break;case 244:if((-16&s)<<24>>24!=-128){a=34;break t}break;default:if((-64&s)<<24>>24!=-128){a=36;break t}}if(128!=(192&(a&=255))){n=c,a=42;break e}if(128!=(192&(n=255&o))){n=c,a=42;break e}if(((255&s)<<12&258048|l<<18&1835008|a<<6&4032|63&n)>>>0>r>>>0){n=c,a=42;break e}n=c+4|0}}while(0);if(!((u=u+1|0)>>>0>>0&n>>>0>>0)){a=42;break e}c=n}if(20==(0|a)){n=n-e|0;break}if(22==(0|a)){n=n-e|0;break}if(24==(0|a)){n=n-e|0;break}if(32==(0|a)){n=n-e|0;break}if(34==(0|a)){n=n-e|0;break}if(36==(0|a)){n=n-e|0;break}}else a=42}while(0);return 42==(0|a)&&(n=n-e|0),0|n}(i|=0,r|=0,n|=0,1114111,0)},function(e,t,i,r,n){e|=0,i|=0,r|=0,n|=0;var a,o,s,l,c=0,u=0,f=0,h=0;l=b,b=b+272|0,a=l+8|0,s=l,u=0|d[(t|=0)>>2],d[s>>2]=u,n=(o=!!(0|e))?r:256,r=o?e:a,e=u;e:do{if(!!(0|n)&!!(0|u)){for(u=n,c=e,n=0;;){if(!((e=i>>>0>=u>>>0)|i>>>0>32)){e=c;break e}if(i=i-(e=e?u:i)|0,-1==(0|(e=0|bo(r,s,e,0)))){n=i;break}if(c=u-(f=(h=(0|r)==(0|a))?0:e)|0,r=h?r:r+e|0,n=e+n|0,!((0|u)!=(0|f)&!!(0|(e=0|d[s>>2])))){u=c;break e}u=c,c=e}i=n,u=0,e=0|d[s>>2],n=-1}else u=n,n=0}while(0);e:do{if(0|e&&!!(0|u)&!!(0|i)){for(c=e,e=r;!(((r=0|So(e,0|d[c>>2]))+1|0)>>>0<2);){if(c=4+(0|d[s>>2])|0,d[s>>2]=c,n=n+1|0,!((0|u)!=(0|r)&!!(0|(i=i+-1|0))))break e;u=u-r|0,e=e+r|0}r?n=-1:d[s>>2]=0}}while(0);return o&&(d[t>>2]=d[s>>2]),b=l,0|n},function(e,t,i,r,n){e|=0,i|=0,r|=0,n|=0;var a,o,s,l,c=0,u=0,f=0,h=0,m=0;l=b,b=b+1040|0,a=l+8|0,s=l,h=0|d[(t|=0)>>2],d[s>>2]=h,r=(o=!!(0|e))?r:256,e=o?e:a,c=h;e:do{if(!!(0|r)&!!(0|h)){for(f=r,h=c,r=0;;){if(!(i>>>0>131|(u=(c=i>>>2)>>>0>=f>>>0))){c=h;break e}if(i=i-(c=u?f:c)|0,-1==(0|(c=0|Ao(e,s,c,n)))){r=i;break}if(u=f-(h=(m=(0|e)==(0|a))?0:c)|0,e=m?e:e+(c<<2)|0,r=c+r|0,!((0|f)!=(0|h)&!!(0|(c=0|d[s>>2])))){f=u;break e}f=u,h=c}i=r,f=0,c=0|d[s>>2],r=-1}else f=r,r=0}while(0);e:do{if(0|c&&!!(0|f)&!!(0|i)){for(u=c,c=e;!(((e=0|go(c,u,i,n))+2|0)>>>0<3);){if(u=(0|d[s>>2])+e|0,d[s>>2]=u,r=r+1|0,!(!!(0|(f=f+-1|0))&(0|i)!=(0|e)))break e;i=i-e|0,c=c+4|0}switch(0|e){case-1:r=-1;break e;case 0:d[s>>2]=0;break e;default:d[n>>2]=0;break e}}}while(0);return o&&(d[t>>2]=d[s>>2]),b=l,0|r},ga,ga,ga,ga,ga,ga,ga,ga,ga],us=[function(e,t,i){return k(15),0},function(e,t,i){e|=0,t|=0,i|=0;var r,n,a=0,o=0,s=0;n=b,b=b+16|0,r=n;do{if((0|e)==(0|t))d[i>>2]=4,a=0;else{if(o=0|$a(),s=0|d[o>>2],d[o>>2]=0,a=+Oo(e,r,0|Sn()),(e=0|d[o>>2])||(d[o>>2]=s),(0|d[r>>2])!=(0|t)){d[i>>2]=4,a=0;break}34==(0|e)&&(d[i>>2]=4)}}while(0);return b=n,+a},function(e,t,i){e|=0,t|=0,i|=0;var r,n,a=0,o=0,s=0;n=b,b=b+16|0,r=n;do{if((0|e)!=(0|t)){if(o=0|$a(),s=0|d[o>>2],d[o>>2]=0,a=+Oo(e,r,0|Sn()),(e=0|d[o>>2])||(d[o>>2]=s),(0|d[r>>2])!=(0|t)){d[i>>2]=4,a=0;break}34==(0|e)&&(d[i>>2]=4)}else d[i>>2]=4,a=0}while(0);return b=n,+a},function(e,t,i){e|=0,t|=0,i|=0;var r,n,a=0,o=0,s=0;n=b,b=b+16|0,r=n;do{if((0|e)!=(0|t)){if(o=0|$a(),s=0|d[o>>2],d[o>>2]=0,a=+Oo(e,r,0|Sn()),(e=0|d[o>>2])||(d[o>>2]=s),(0|d[r>>2])!=(0|t)){d[i>>2]=4,a=0;break}34==(0|e)&&(d[i>>2]=4)}else d[i>>2]=4,a=0}while(0);return b=n,+a}],fs=[pa,function(){return 0|f[8]||!(0|te(8))||(Ie(72,35648,0|T),oe(8)),35648},Ua,Sn,function(){return function(e,t){t|=0;var i,r=0,n=0,a=0,o=0;if(d[4+(e|=0)>>2]=t+-1,d[e>>2]=44196,y=0,L(94,0|(i=e+8|0),28),a=y,y=0,1&a)t=0|ae();else{if(y=0,W(5,0|(a=e+144|0),58885,1),n=y,y=0,1&n)t=0|ae();else{if(r=0|d[i>>2],(0|(t=0|d[(n=e+12|0)>>2]))!=(0|r)){do{t=t+-4|0}while((0|t)!=(0|r));d[n>>2]=t}d[495]=0,d[494]=43124,y=0,L(95,0|e,1976),n=y,y=0;do{if(!(1&n||(d[497]=0,d[496]=43164,y=0,L(96,0|e,1984),n=y,y=0,1&n)||(d[499]=0,d[498]=44236,d[500]=0,f[2004]=0,n=0|Ar(),d[500]=n,y=0,L(97,0|e,1992),n=y,y=0,1&n)||(d[503]=0,d[502]=44484,y=0,L(98,0|e,2008),n=y,y=0,1&n)||(d[505]=0,d[504]=44552,y=0,L(99,0|e,2016),n=y,y=0,1&n)||(y=0,L(100,2024,1),n=y,y=0,1&n)||(y=0,L(101,0|e,2024),n=y,y=0,1&n)||(d[511]=0,d[510]=44600,y=0,L(102,0|e,2040),n=y,y=0,1&n)||(d[513]=0,d[512]=44648,y=0,L(103,0|e,2048),n=y,y=0,1&n)||(Mn(2056,1),y=0,L(104,0|e,2056),n=y,y=0,1&n)||(kn(2080,1),y=0,L(105,0|e,2080),n=y,y=0,1&n)||(d[529]=0,d[528]=43204,y=0,L(106,0|e,2112),n=y,y=0,1&n)||(d[531]=0,d[530]=43276,y=0,L(107,0|e,2120),n=y,y=0,1&n)||(d[533]=0,d[532]=43348,y=0,L(108,0|e,2128),n=y,y=0,1&n))){if(d[535]=0,d[534]=43408,y=0,L(109,0|e,2136),n=y,y=0,1&n){o=42;break}if(d[537]=0,d[536]=43716,y=0,L(110,0|e,2144),n=y,y=0,1&n){o=42;break}if(d[539]=0,d[538]=43780,y=0,L(111,0|e,2152),n=y,y=0,1&n){o=42;break}if(d[541]=0,d[540]=43844,y=0,L(112,0|e,2160),n=y,y=0,1&n){o=42;break}if(d[543]=0,d[542]=43908,y=0,L(113,0|e,2168),n=y,y=0,1&n){o=42;break}if(d[545]=0,d[544]=43972,y=0,L(114,0|e,2176),n=y,y=0,1&n){o=42;break}if(d[547]=0,d[546]=44008,y=0,L(115,0|e,2184),n=y,y=0,1&n){o=42;break}if(d[549]=0,d[548]=44044,y=0,L(116,0|e,2192),n=y,y=0,1&n){o=42;break}if(d[551]=0,d[550]=44080,y=0,L(117,0|e,2200),n=y,y=0,1&n){o=42;break}if(d[553]=0,d[552]=43468,d[554]=43516,y=0,L(118,0|e,2208),n=y,y=0,1&n){o=42;break}if(d[557]=0,d[556]=43560,d[558]=43608,y=0,L(119,0|e,2224),n=y,y=0,1&n){o=42;break}if(d[561]=0,d[560]=44464,y=0,t=0|H(3),n=y,y=0,1&n){t=0|ae();break}if(d[562]=t,d[560]=43652,y=0,L(120,0|e,2240),n=y,y=0,1&n){o=42;break}if(d[565]=0,d[564]=44464,y=0,t=0|H(3),n=y,y=0,1&n){t=0|ae();break}if(d[566]=t,d[564]=43684,y=0,L(121,0|e,2256),o=y,y=0,1&o){o=42;break}if(d[569]=0,d[568]=44116,y=0,L(122,0|e,2272),o=y,y=0,1&o){o=42;break}if(d[571]=0,d[570]=44156,y=0,L(123,0|e,2280),o=y,y=0,1&o){o=42;break}return}o=42}while(0);42==(0|o)&&(t=0|ae()),qr(a)}qn(i)}de(0|t)}(2296,1),d[11245]=2296,44980},function(){var e=0;return e=0|function(){var e=0;do{if(!(0|f[2288])&&0|te(2288)){if(y=0,H(4),e=y,y=0,!(1&e)){d[11246]=44980,oe(2288);break}e=0|ae(),Pe(2288),de(0|e)}}while(0);return 0|d[11246]}(),e=0|d[e>>2],d[11247]=e,_r(e),44988},function(){var e=0;do{if(!(0|f[2456])&&0|te(2456)){if(y=0,H(5),e=y,y=0,!(1&e)){d[11248]=44988,oe(2456);break}e=0|ae(),Pe(2456),de(0|e)}}while(0);return 0|d[11248]},function(){return 37296},function(){return 37304},function(){return 37300},pa,pa,pa,pa,pa,pa],hs=[Aa,function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4624))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35660,d[t+128>>2]=d[e+136>>2],d[t+132>>2]=d[e+140>>2],d[t+136>>2]=d[e+144>>2],d[t+140>>2]=d[e+148>>2],d[t+144>>2]=d[e+152>>2],d[t+148>>2]=d[e+156>>2],d[t+152>>2]=d[e+160>>2],d[(a=t+156|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+172>>2]=d[r>>2],d[t+176>>2]=0,d[t+180>>2]=0,d[t+184>>2]=0,a=t+4568|0,r=t+188|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4580|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4592|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,jt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],jt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4600))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35688,d[(a=t+132|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+148>>2]=d[r>>2],d[t+152>>2]=0,d[t+156>>2]=0,d[t+160>>2]=0,a=t+4544|0,r=t+164|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4556|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4568|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,Yt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],Yt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4600))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35716,d[(a=t+132|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+148>>2]=d[r>>2],d[t+152>>2]=0,d[t+156>>2]=0,d[t+160>>2]=0,a=t+4544|0,r=t+164|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4556|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4568|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,Gt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],Gt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4600))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35744,d[(a=t+132|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+148>>2]=d[r>>2],d[t+152>>2]=0,d[t+156>>2]=0,d[t+160>>2]=0,a=t+4544|0,r=t+164|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4556|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4568|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,Ot(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],Ot(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4600))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35772,d[(a=t+132|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+148>>2]=d[r>>2],d[t+152>>2]=0,d[t+156>>2]=0,d[t+160>>2]=0,a=t+4544|0,r=t+164|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4556|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4568|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,Lt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],Lt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4624))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35800,d[t+128>>2]=d[e+136>>2],d[t+132>>2]=d[e+140>>2],d[t+136>>2]=d[e+144>>2],d[t+140>>2]=d[e+148>>2],d[t+144>>2]=d[e+152>>2],d[t+148>>2]=d[e+156>>2],d[t+152>>2]=d[e+160>>2],d[(a=t+156|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+172>>2]=d[r>>2],d[t+176>>2]=0,d[t+180>>2]=0,d[t+184>>2]=0,a=t+4568|0,r=t+188|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4580|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4592|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,Mt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],Mt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4624))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35828,d[t+128>>2]=d[e+136>>2],d[t+132>>2]=d[e+140>>2],d[t+136>>2]=d[e+144>>2],d[t+140>>2]=d[e+148>>2],d[t+144>>2]=d[e+152>>2],d[t+148>>2]=d[e+156>>2],d[t+152>>2]=d[e+160>>2],d[(a=t+156|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+172>>2]=d[r>>2],d[t+176>>2]=0,d[t+180>>2]=0,d[t+184>>2]=0,a=t+4568|0,r=t+188|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4580|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4592|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,pt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],pt(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0;if(n=b,b=b+16|0,c=n,l=(e|=0)+92|0,s=0|d[(t|=0)>>2],d[t>>2]=0,t=0|d[l>>2],d[l>>2]=s,t&&Jo[255&d[4+(0|d[t>>2])>>2]](t),d[c>>2]=0,d[c+4>>2]=r,l=i+8|0,d[c+8>>2]=d[l>>2],r){o=r=e+8|0,s=(a=(t=0|Oa(4624))+4|0)+84|0;do{d[a>>2]=d[o>>2],a=a+4|0,o=o+4|0}while((0|a)<(0|s));s=(a=t+88|0)+40|0;do{d[a>>2]=0,a=a+4|0}while((0|a)<(0|s));d[t>>2]=35856,d[t+128>>2]=d[e+136>>2],d[t+132>>2]=d[e+140>>2],d[t+136>>2]=d[e+144>>2],d[t+140>>2]=d[e+148>>2],d[t+144>>2]=d[e+152>>2],d[t+148>>2]=d[e+156>>2],d[t+152>>2]=d[e+160>>2],d[(a=t+156|0)>>2]=0,d[a+4>>2]=0,d[a+8>>2]=0,d[a+12>>2]=0,d[t+172>>2]=d[r>>2],d[t+176>>2]=0,d[t+180>>2]=0,d[t+184>>2]=0,a=t+4568|0,r=t+188|0;do{d[r>>2]=0,d[r+4>>2]=0,h[r+8>>1]=0,h[r+10>>1]=1,r=r+12|0}while((0|r)!=(0|a));o=e+4|0,d[a>>2]=0,d[a+4>>2]=0,h[a+8>>1]=0,f[a+10|0]=0,d[(s=t+4580|0)>>2]=0,d[s+4>>2]=0,h[s+8>>1]=0,f[s+10|0]=0,d[(s=t+4592|0)>>2]=0,d[s+4>>2]=0,d[s+8>>2]=0,d[s+12>>2]=0,d[s+16>>2]=0,d[s+20>>2]=0,d[s+24>>2]=0,f[s+28|0]=0,0|d[t+28>>2]||(d[t+20>>2]=1),r=0|d[o>>2],d[o>>2]=t,r&&(Jo[255&d[4+(0|d[r>>2])>>2]](r),t=0|d[o>>2]),at(t,c)}return d[(c=e+100|0)>>2]=32,d[e+96>>2]=0,(t=0|d[i>>2])?(d[e+132>>2]=t,a=e+120|0,(s=(r=0|d[(l=e+124|0)>>2])-(o=t=0|d[a>>2])|0)>>>0>=4e3?s>>>0>4e3&&(0|r)!=(0|(u=t+4e3|0))&&(d[l>>2]=u,r=u):(ot(a,4e3-s|0),o=t=0|d[a>>2],r=0|d[l>>2]),d[e+108>>2]=o,d[e+104>>2]=r-t,st(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0)):(d[e+108>>2]=d[i+4>>2],d[e+104>>2]=d[l>>2],st(e),u=0|d[(u=e+116|0)>>2],e=0|d[c>>2],b=n,0|(e=u-(e=(0|(e=e+-32|0))/8|0)|0))},function(e,t,i,r){if(r|=0,(0|(t|=0))!=(0|(i|=0)))for(;f[r|0]=0|f[t|0],(0|(t=t+1|0))!=(0|i);)r=r+1|0;return 0|i},function(e,t,i,r){e|=0,r|=0;var n,a=0;if(n=((i|=0)-(t|=0)|0)>>>2,(0|t)!=(0|i))for(a=t;(e=0|d[a>>2])>>>0<128?(e=(0|Ar())+(e<<1)|0,e=0|g[e>>1]):e=0,h[r>>1]=e,(0|(a=a+4|0))!=(0|i);)r=r+2|0;return t+(n<<2)|0},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;e:do{if((0|i)==(0|r))i=r;else for(;;){if((e=0|d[i>>2])>>>0<128&&(e=(0|Ar())+(e<<1)|0,(h[e>>1]&t)<<16>>16))break e;if((0|(i=i+4|0))==(0|r)){i=r;break}}}while(0);return 0|i},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;e:do{if((0|i)==(0|r))i=r;else for(;;){if((e=0|d[i>>2])>>>0>=128||(e=(0|Ar())+(e<<1)|0,!((h[e>>1]&t)<<16>>16)))break e;if((0|(i=i+4|0))==(0|r)){i=r;break}}}while(0);return 0|i},function(e,t,i,r){if(r|=0,(0|(t|=0))!=(0|(i|=0)))for(;d[r>>2]=f[t|0],(0|(t=t+1|0))!=(0|i);)r=r+4|0;return 0|i},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0;a=b,b=b+16|0,d[(o=a)>>2]=0,d[(s=o+4|0)>>2]=0,d[o+8>>2]=0,n=o+8|0,y=0,l=0|N(67,1),A=y,y=0;e:do{if(1&A||(A=l+1|0,f[l|0]=i,d[o>>2]=l,d[s>>2]=A,d[n>>2]=A,y=0,L(84,0|o,65535&t),A=y,y=0,1&A)||(y=0,L(84,0|o,65535&e),A=y,y=0,1&A))S=52;else{if(g=255&r,(l=0|d[s>>2])>>>0>=(i=0|d[n>>2])>>>0){if((0|(u=l-(e=t=0|d[o>>2])+1|0))<0){if(y=0,P(178,0|o),A=y,y=0,1&A){S=52;break}e=0|d[o>>2],i=0|d[n>>2],t=e}if((l=i-(m=t)|0)>>>0<1073741823?(l=(l<<=1)>>>0>>0?u:l,h=(i=0|d[s>>2])-m|0,l?S=12:(l=0,u=0)):(l=2147483647,i=h=0|d[s>>2],h=h-m|0,S=12),12==(0|S)&&(y=0,u=0|N(67,0|l),A=y,y=0,1&A)){S=52;break}f[u+h|0]=g,Wn(0|(A=u+(h-(p=i-m|0))|0),0|t,0|p),d[o>>2]=A,d[s>>2]=u+(h+1),d[n>>2]=u+l,e&&Ba(e)}else f[l|0]=g,d[s>>2]=1+(0|d[s>>2]);t:do{if((0|r)>0){for(A=0;;){if(p=255&(A=A+1|0),(l=0|d[s>>2])>>>0>=(t=0|d[n>>2])>>>0){if((0|(u=l-(i=e=0|d[o>>2])+1|0))<0){if(y=0,P(178,0|o),g=y,y=0,1&g)break;i=e=0|d[o>>2],t=0|d[n>>2]}if((l=t-(g=e)|0)>>>0<1073741823?(l=(l<<=1)>>>0>>0?u:l,h=(t=0|d[s>>2])-g|0,l?S=25:(m=0,u=0)):(l=2147483647,t=h=0|d[s>>2],h=h-g|0,S=25),25==(0|S)){if(S=0,y=0,u=0|N(67,0|l),m=y,y=0,1&m)break;m=l}f[u+h|0]=p,l=u+(h+1)|0,Wn(0|(p=u+(h-(g=t-g|0))|0),0|e,0|g),d[o>>2]=p,d[s>>2]=l,d[n>>2]=u+m,i&&(Ba(i),l=0|d[s>>2])}else f[l|0]=p,l=1+(0|d[s>>2])|0,d[s>>2]=l;if(l>>>0>=(i=0|d[n>>2])>>>0){if((0|(u=l-(e=t=0|d[o>>2])+1|0))<0){if(y=0,P(178,0|o),p=y,y=0,1&p)break;e=0|d[o>>2],i=0|d[n>>2],t=e}if((l=i-(g=t)|0)>>>0<1073741823?(l=(l<<=1)>>>0>>0?u:l,h=(u=0|d[s>>2])-g|0,l?S=36:(m=0,i=0)):(l=2147483647,u=h=0|d[s>>2],h=h-g|0,S=36),36==(0|S)){if(S=0,y=0,i=0|N(67,0|l),p=y,y=0,1&p)break;m=l}f[i+h|0]=17,l=i+(h+1)|0,Wn(0|(p=i+(h-(g=u-g|0))|0),0|t,0|g),d[o>>2]=p,d[s>>2]=l,d[n>>2]=i+m,e&&(Ba(e),l=0|d[s>>2])}else f[l|0]=17,l=1+(0|d[s>>2])|0,d[s>>2]=l;if(l>>>0>=(i=0|d[n>>2])>>>0){if((0|(u=l-(e=t=0|d[o>>2])+1|0))<0){if(y=0,P(178,0|o),p=y,y=0,1&p)break;e=0|d[o>>2],i=0|d[n>>2],t=e}if((l=i-(m=t)|0)>>>0<1073741823?(l=(l<<=1)>>>0>>0?u:l,h=(i=0|d[s>>2])-m|0,l?S=48:(l=0,u=0)):(l=2147483647,i=h=0|d[s>>2],h=h-m|0,S=48),48==(0|S)&&(S=0,y=0,u=0|N(67,0|l),p=y,y=0,1&p))break;f[u+h|0]=0,Wn(0|(p=u+(h-(g=i-m|0))|0),0|t,0|g),d[o>>2]=p,d[s>>2]=u+(h+1),d[n>>2]=u+l,e&&Ba(e)}else f[l|0]=0,d[s>>2]=1+(0|d[s>>2]);if((0|A)>=(0|r))break t}c=0|ae();break e}}while(0);if(y=0,h=0|N(67,20),r=y,y=0,!(1&r)){d[h>>2]=36800,f[h+4|0]=-9,d[(e=h+8|0)>>2]=0,d[(u=h+12|0)>>2]=0,d[(i=h+16|0)>>2]=0,t=(l=0|d[s>>2])-(r=0|d[o>>2])|0;do{if((0|l)!=(0|r)){if((0|t)<0&&(y=0,P(178,0|e),r=y,y=0,1&r)||(S=62),62==(0|S)&&(y=0,c=0|N(67,0|t),r=y,y=0,!(1&r))){if(d[u>>2]=c,d[e>>2]=c,d[i>>2]=c+t,(0|(l=0|d[o>>2]))==(0|(i=0|d[s>>2])))break;do{f[c|0]=0|f[l|0],c=1+(0|d[u>>2])|0,d[u>>2]=c,l=l+1|0}while((0|l)!=(0|i));l=0|d[o>>2];break}c=0|ae(),(l=0|d[e>>2])&&((0|d[u>>2])!=(0|l)&&(d[u>>2]=l),Ba(l)),Ba(h);break e}}while(0);return l?((0|d[s>>2])!=(0|l)&&(d[s>>2]=l),Ba(l),b=a,0|h):(b=a,0|h)}S=52}}while(0);return 52==(0|S)&&(c=0|ae()),(l=0|d[o>>2])||de(0|c),(0|d[s>>2])!=(0|l)&&(d[s>>2]=l),Ba(l),de(0|c),0},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0;if(l=0|d[(e|=0)>>2],p=s=0|d[t>>2],m=l,(0|(g=r-(a=i)|0))<=0)return 0|(A=s);if((0|g)<=((t=0|d[(o=e+8|0)>>2])-(c=n=0|d[(A=e+4|0)>>2])|0)){if((0|g)>(0|(h=c-p|0))){if((0|(u=i+h|0))==(0|r))t=n;else{c=u,t=n;do{f[t|0]=0|f[c|0],t=1+(0|d[A>>2])|0,d[A>>2]=t,c=c+1|0}while((0|c)!=(0|r))}if(!((0|h)>0))return 0|(A=s);h=t}else h=n,u=r;if((t=s+(l=h-(l+(g-m+p))|0)|0)>>>0>>0){c=h;do{f[c|0]=0|f[t|0],t=t+1|0,c=1+(0|d[A>>2])|0,d[A>>2]=c}while((0|t)!=(0|n))}return Kn(h+(0-l)|0,0|s,0|l),Kn(0|s,0|i,u-a|0),0|(A=s)}if((0|(c=c-m+g|0))<0&&(Na(e),t=0|d[o>>2],l=0|d[e>>2]),(t=t-(u=l)|0)>>>0<1073741823?(t=(t<<=1)>>>0>>0?c:t,c=p-u|0,t?h=15:(u=0,g=0)):(t=2147483647,c=p-u|0,h=15),15==(0|h)&&(u=t,g=0|Oa(t)),t=m=g+c|0,h=g+u|0,(0|i)!=(0|r)){l=i,u=m;do{f[u|0]=0|f[l|0],t=u=t+1|0,l=l+1|0}while((0|l)!=(0|r));l=0|d[e>>2]}return Wn(0|(r=g+(c-(i=p-l|0))|0),0|l,0|i),Wn(0|(i=t),0|s,0|(p=(0|d[A>>2])-p|0)),t=0|d[e>>2],d[e>>2]=r,d[A>>2]=i+p,d[o>>2]=h,t?(Ba(t),0|(A=m)):0|(A=m)},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a=0;return n=b,b=b+16|0,d[(a=n)>>2]=r,r=0|so(t),t=0|Uo(e,i,a),0|r&&(y=0,N(75,0|r),a=y,y=0,1&a)&&Ue(a=0|ae(0)),b=n,0|t},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a=0;return n=b,b=b+16|0,d[(a=n)>>2]=r,r=0|so(t),y=0,t=0|O(37,0|e,0|i,0|a),e=y,y=0,1&e?(t=0|ae(),0|r&&(y=0,N(75,0|r),a=y,y=0,1&a)&&Ue(a=0|ae(0)),de(0|t),0):(0|r&&(y=0,N(75,0|r),a=y,y=0,1&a)&&Ue(a=0|ae(0)),b=n,0|t)},Ao,function(e,t,i,r){return 0|(r|=0)},go,function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0;a=b,b=b+16|0,n=a;e:do{if((0|e)==(0|t))d[i>>2]=4,e=0;else{if(s=0|$a(),l=0|d[s>>2],d[s>>2]=0,e=0|Za(e,n,r,0|Sn()),r=D,(o=0|d[s>>2])||(d[s>>2]=l),(0|d[n>>2])!=(0|t)){d[i>>2]=4,e=0;break}do{if(34!=(0|o)){if((0|r)<-1|-1==(0|r)&e>>>0<2147483648){d[i>>2]=4;break}if((0|r)>0|!(0|r)&e>>>0>2147483647){d[i>>2]=4,e=2147483647;break e}break e}if(d[i>>2]=4,(0|r)>0|!(0|r)&e>>>0>0){e=2147483647;break e}}while(0);e=-2147483648}}while(0);return b=a,0|e},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a=0,o=0,s=0,l=0;n=b,b=b+16|0,l=n;do{if((0|e)!=(0|t)){if(o=0|$a(),s=0|d[o>>2],d[o>>2]=0,e=0|Za(e,l,r,0|Sn()),r=D,(a=0|d[o>>2])||(d[o>>2]=s),(0|d[l>>2])!=(0|t)){d[i>>2]=4,r=0,e=0;break}if(34==(0|a))return d[i>>2]=4,D=(l=(0|r)>0|!(0|r)&e>>>0>0)?2147483647:-2147483648,b=n,0|(l?-1:0)}else d[i>>2]=4,r=0,e=0}while(0);return D=r,b=n,0|e},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0;a=b,b=b+16|0,n=a;do{if((0|e)!=(0|t)){if(45==(0|f[e|0])){d[i>>2]=4,e=0;break}if(s=0|$a(),l=0|d[s>>2],d[s>>2]=0,e=0|ja(e,n,r,0|Sn()),r=D,(o=0|d[s>>2])||(d[s>>2]=l),(0|d[n>>2])!=(0|t)){d[i>>2]=4,e=0;break}if(r>>>0>0|!(0|r)&e>>>0>65535|34==(0|o)){d[i>>2]=4,e=-1;break}e&=65535;break}d[i>>2]=4,e=0}while(0);return b=a,0|e},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0;a=b,b=b+16|0,n=a;do{if((0|e)!=(0|t)){if(45==(0|f[e|0])){d[i>>2]=4,e=0;break}if(s=0|$a(),l=0|d[s>>2],d[s>>2]=0,e=0|ja(e,n,r,0|Sn()),r=D,(o=0|d[s>>2])||(d[s>>2]=l),(0|d[n>>2])!=(0|t)){d[i>>2]=4,e=0;break}if(r>>>0>0|!(0|r)&e>>>0>4294967295|34==(0|o)){d[i>>2]=4,e=-1;break}break}d[i>>2]=4,e=0}while(0);return b=a,0|e},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0;a=b,b=b+16|0,n=a;do{if((0|e)!=(0|t)){if(45==(0|f[e|0])){d[i>>2]=4,e=0;break}if(s=0|$a(),l=0|d[s>>2],d[s>>2]=0,e=0|ja(e,n,r,0|Sn()),r=D,(o=0|d[s>>2])||(d[s>>2]=l),(0|d[n>>2])!=(0|t)){d[i>>2]=4,e=0;break}if(r>>>0>0|!(0|r)&e>>>0>4294967295|34==(0|o)){d[i>>2]=4,e=-1;break}break}d[i>>2]=4,e=0}while(0);return b=a,0|e},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o=0,s=0;a=b,b=b+16|0,n=a;do{if((0|e)!=(0|t)){if(45==(0|f[e|0])){d[i>>2]=4,r=0,e=0;break}if(o=0|$a(),s=0|d[o>>2],d[o>>2]=0,e=0|ja(e,n,r,0|Sn()),(r=0|d[o>>2])||(d[o>>2]=s),(0|d[n>>2])!=(0|t)){d[i>>2]=4,r=0,e=0;break}34==(0|r)?(d[i>>2]=4,r=-1,e=-1):r=D}else d[i>>2]=4,r=0,e=0}while(0);return D=r,b=a,0|e},Aa,Aa,Aa,Aa,Aa],ds=[function(e,t,i){k(18)},function(e,t,i){t|=0,i|=0,d[(e|=0)>>2]=i,d[e+4>>2]=t},function(e,t,i){Br(e|=0,50754,12)},function(e,t,i){e|=0,t|=0,1!=(0|(i|=0))&(0|i)<257?function(e,t,i){t|=0,Br(e|=0,t=0|eo(i|=0),0|Go(t))}(e,t,i):Br(e,57462,35)},function(e,t,i){e|=0,t|=0;var r,n,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0;n=b,b=b+48|0,c=n+32|0,o=n+12|0,u=n+8|0,r=n+4|0,m=n,a=(i|=0)+36|0;do{if(0|d[a>>2]||0|d[i+40>>2]||0|d[i+44>>2]||0|d[i+48>>2]||0|d[i+52>>2])h=6;else{if((0|(a=0|d[i+8>>2]))<=12){s=e+28|0,l=e+32|0;break}if(Ea(o,(1<>2]),a=0|Da(o),d[u>>2]=a,(o=0|d[(s=e+28|0)>>2])>>>0<(0|d[(l=e+32|0)>>2])>>>0){d[o>>2]=a,d[s>>2]=o+4,d[u>>2]=0;break}if(y=0,L(57,e+24|0,0|u),c=y,y=0,!(1&c)){if(a=0|d[u>>2],d[u>>2]=0,!a)break;Jo[255&d[4+(0|d[a>>2])>>2]](a);break}i=0|ae(),a=0|d[u>>2],d[u>>2]=0,a||de(0|(m=i)),Jo[255&d[4+(0|d[a>>2])>>2]](a),de(0|(m=i))}}while(0);do{if(6==(0|h)){if(a=0|Da(a),d[c>>2]=a,(o=0|d[(s=e+28|0)>>2])>>>0<(0|d[(l=e+32|0)>>2])>>>0){d[o>>2]=a,d[s>>2]=o+4,d[c>>2]=0;break}if(y=0,L(57,e+24|0,0|c),h=y,y=0,!(1&h)){if(a=0|d[c>>2],d[c>>2]=0,!a)break;Jo[255&d[4+(0|d[a>>2])>>2]](a);break}i=0|ae(),a=0|d[c>>2],d[c>>2]=0,a||de(0|(m=i)),Jo[255&d[4+(0|d[a>>2])>>2]](a),de(0|(m=i))}}while(0);o=1+(0|d[(a=e+20|0)>>2])|0,d[a>>2]=o,a=0|function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0,S=0,v=0,w=0,T=0;n=b,b=b+16|0,d[(a=n)>>2]=0,d[(o=a+4|0)>>2]=0,d[a+8>>2]=0,w=a+8|0,y=0,s=0|N(67,1),v=y,y=0;e:do{if(1&v)T=29;else{if(v=u=s+1|0,f[0|s]=t,d[a>>2]=s,d[o>>2]=v,d[w>>2]=v,(0|t)>0){c=u,v=0;do{if(S=v+e&255,c>>>0>=u>>>0){if((0|(c=c-(h=s=0|d[a>>2])+1|0))<0){if(y=0,P(178,0|a),A=y,y=0,1&A){T=28;break}h=0|d[a>>2],u=0|d[w>>2],A=h}else A=s;if((s=u-(p=A)|0)>>>0<1073741823?(s=(s<<=1)>>>0>>0?c:s,m=(u=0|d[o>>2])-p|0,s?T=13:(g=0,c=0)):(s=2147483647,u=m=0|d[o>>2],m=m-p|0,T=13),13==(0|T)){if(T=0,y=0,c=0|N(67,0|s),g=y,y=0,1&g){T=28;break}g=s}f[c+m|0]=S,s=c+(m+1)|0,Wn(0|(S=c+(m-(p=u-p|0))|0),0|A,0|p),d[a>>2]=S,d[o>>2]=s,d[w>>2]=c+g,h&&(Ba(h),s=0|d[o>>2])}else f[0|c]=S,s=1+(0|d[o>>2])|0,d[o>>2]=s;if(s>>>0>=(u=0|d[w>>2])>>>0){if((0|(m=s-(c=h=0|d[a>>2])+1|0))<0){if(y=0,P(178,0|a),S=y,y=0,1&S){T=28;break}c=h=0|d[a>>2],u=0|d[w>>2]}if((s=u-(p=h)|0)>>>0<1073741823?(s=(s<<=1)>>>0>>0?m:s,u=(m=0|d[o>>2])-p|0,s?T=24:(s=0,g=0)):(s=2147483647,m=u=0|d[o>>2],u=u-p|0,T=24),24==(0|T)&&(T=0,y=0,g=0|N(67,0|s),S=y,y=0,1&S)){T=28;break}f[g+u|0]=0,Wn(0|(S=g+(u-(A=m-p|0))|0),0|h,0|A),d[a>>2]=S,d[o>>2]=g+(u+1),d[w>>2]=g+s,c&&Ba(c)}else f[0|s]=0,d[o>>2]=1+(0|d[o>>2]);v=v+1|0,c=0|d[o>>2],u=0|d[w>>2]}while((0|v)<(0|t));if(28==(0|T)){l=0|ae();break}s=255&i,c>>>0>>0?(f[0|c]=s,c=1+(0|d[o>>2])|0,d[o>>2]=c):T=37}else c=u,s=255&i,T=37;if(37==(0|T)){if((0|(g=c-(m=h=0|d[a>>2])+1|0))<0){if(y=0,P(178,0|a),i=y,y=0,1&i){T=29;break}m=0|d[a>>2],u=0|d[w>>2],h=m}if((c=u-(S=h)|0)>>>0<1073741823?(c=(c<<=1)>>>0>>0?g:c,p=(g=0|d[o>>2])-S|0,c?T=43:(A=0,u=0)):(c=2147483647,g=p=0|d[o>>2],p=p-S|0,T=43),43==(0|T)){if(y=0,u=0|N(67,0|c),i=y,y=0,1&i){T=29;break}A=c}f[u+p|0]=s,c=u+(p+1)|0,Wn(0|(i=u+(p-(e=g-S|0))|0),0|h,0|e),d[a>>2]=i,d[o>>2]=c,d[w>>2]=u+A,m&&(Ba(m),c=0|d[o>>2])}if(S=255&r,c>>>0>=(s=0|d[w>>2])>>>0){if((0|(c=c-(h=u=0|d[a>>2])+1|0))<0){if(y=0,P(178,0|a),r=y,y=0,1&r){T=29;break}h=0|d[a>>2],s=0|d[w>>2],u=h}if((s=s-(A=u)|0)>>>0<1073741823?(s=(s<<=1)>>>0>>0?c:s,g=(m=0|d[o>>2])-A|0,s?T=54:(p=0,c=0)):(s=2147483647,m=g=0|d[o>>2],g=g-A|0,T=54),54==(0|T)){if(y=0,c=0|N(67,0|s),r=y,y=0,1&r){T=29;break}p=s}f[c+g|0]=S,s=c+(g+1)|0,Wn(0|(r=c+(g-(i=m-A|0))|0),0|u,0|i),d[a>>2]=r,d[o>>2]=s,d[w>>2]=c+p,h&&(Ba(h),s=0|d[o>>2])}else f[0|c]=S,s=1+(0|d[o>>2])|0,d[o>>2]=s;if(s>>>0>=(c=0|d[w>>2])>>>0){if((0|(m=s-(h=u=0|d[a>>2])+1|0))<0){if(y=0,P(178,0|a),r=y,y=0,1&r){T=29;break}h=0|d[a>>2],c=0|d[w>>2],u=h}if((s=c-(p=u)|0)>>>0<1073741823?(s=(s<<=1)>>>0>>0?m:s,g=(c=0|d[o>>2])-p|0,s?T=65:(s=0,m=0)):(s=2147483647,c=g=0|d[o>>2],g=g-p|0,T=65),65==(0|T)&&(y=0,m=0|N(67,0|s),r=y,y=0,1&r)){T=29;break}f[m+g|0]=0,Wn(0|(r=m+(g-(i=c-p|0))|0),0|u,0|i),d[a>>2]=r,d[o>>2]=m+(g+1),d[w>>2]=m+s,h&&Ba(h)}else f[0|s]=0,d[o>>2]=1+(0|d[o>>2]);if(y=0,g=0|N(67,20),w=y,y=0,!(1&w)){d[g>>2]=36800,f[g+4|0]=-38,d[(h=g+8|0)>>2]=0,d[(m=g+12|0)>>2]=0,d[(c=g+16|0)>>2]=0,u=(s=0|d[o>>2])-(w=0|d[a>>2])|0;do{if((0|s)!=(0|w)){if((0|u)<0&&(y=0,P(178,0|h),w=y,y=0,1&w)||(T=72),72==(0|T)&&(y=0,l=0|N(67,0|u),w=y,y=0,!(1&w))){if(d[m>>2]=l,d[h>>2]=l,d[c>>2]=l+u,(0|(s=0|d[a>>2]))==(0|(c=0|d[o>>2])))break;do{f[0|l]=0|f[0|s],l=1+(0|d[m>>2])|0,d[m>>2]=l,s=s+1|0}while((0|s)!=(0|c));s=0|d[a>>2];break}l=0|ae(),(s=0|d[h>>2])&&((0|d[m>>2])!=(0|s)&&(d[m>>2]=s),Ba(s)),Ba(g);break e}}while(0);return s?((0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),b=n,0|g):(b=n,0|g)}T=29}}while(0);return 29==(0|T)&&(l=0|ae()),(s=0|d[a>>2])||de(0|l),(0|d[o>>2])!=(0|s)&&(d[o>>2]=s),Ba(s),de(0|l),0}(o,c=0|(a=0|d[i+24>>2])?0|d[i+16>>2]:1,0|d[i+20>>2],a),d[r>>2]=a,o=0|d[s>>2];do{if(o>>>0<(0|d[l>>2])>>>0)d[o>>2]=a,d[s>>2]=o+4,d[r>>2]=0;else{if(y=0,L(57,e+24|0,0|r),h=y,y=0,!(1&h)){if(a=0|d[r>>2],d[r>>2]=0,!a)break;Jo[255&d[4+(0|d[a>>2])>>2]](a);break}i=0|ae(),a=0|d[r>>2],d[r>>2]=0,a||de(0|(m=i)),Jo[255&d[4+(0|d[a>>2])>>2]](a),de(0|(m=i))}}while(0);u=0|Oa(104),d[u>>2]=36820,d[u+4>>2]=c,d[(o=u+8|0)>>2]=d[t>>2],d[o+4>>2]=d[t+4>>2],d[o+8>>2]=d[t+8>>2],a=(o=u+20|0)+84|0;do{d[o>>2]=d[i>>2],o=o+4|0,i=i+4|0}while((0|o)<(0|a));return d[m>>2]=u,(i=0|d[s>>2])>>>0<(0|d[l>>2])>>>0?(d[i>>2]=u,d[s>>2]=i+4,d[m>>2]=0,void(b=n)):(y=0,L(57,e+24|0,0|m),e=y,y=0,1&e?(i=0|ae(),a=0|d[m>>2],d[m>>2]=0,a||de(0|(m=i)),Jo[255&d[4+(0|d[a>>2])>>2]](a),void de(0|(m=i))):(i=0|d[m>>2],d[m>>2]=0,i?(Jo[255&d[4+(0|d[i>>2])>>2]](i),void(b=n)):void(b=n)))},Br,function(e,t,i){De(0|(e|=0),0|(t|=0),0|(i|=0))},function(e,t,i){e|=0,t|=0,i|=0;var r,n,a=0,o=0;r=b,b=b+48|0,a=r+24|0,n=r,d[(o=r+16|0)>>2]=t,d[o+4>>2]=i,Br(n,58898,0),y=0,W(10,0|a,0|o,0|n),o=y,y=0;do{if(!(1&o)){if(y=0,L(87,0|e,0|a),o=y,y=0,1&o){o=0|ae(),qr(a),a=o;break}return qr(a),qr(n),d[e>>2]=42664,d[e+8>>2]=t,d[e+12>>2]=i,void(b=r)}a=0|ae()}while(0);qr(n),de(0|a)},Qr,function(e,t,i){e|=0,t|=0;var r=0,n=0,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0,A=0;if(!((0|(i|=0))<=0)){h=t+4|0,m=t+8|0,p=0;do{g=0|Ra(e),(r=0|d[h>>2])>>>0>=(n=0|d[m>>2])>>>0?((0|(s=r-(o=a=0|d[t>>2])+1|0))<0&&(Na(t),o=0|d[t>>2],n=0|d[m>>2],a=o),(r=n-(u=a)|0)>>>0<1073741823?(r=(r<<=1)>>>0>>0?s:r,n=(s=0|d[h>>2])-u|0,r?A=10:(c=0,l=0,r=s)):(r=2147483647,s=n=0|d[h>>2],n=n-u|0,A=10),10==(0|A)&&(A=0,c=r,l=0|Oa(r),r=s),f[l+n|0]=g,Wn(0|(g=l+(n-(u=r-u|0))|0),0|a,0|u),d[t>>2]=g,d[h>>2]=l+(n+1),d[m>>2]=l+c,o&&Ba(o)):(f[r|0]=g,d[h>>2]=1+(0|d[h>>2])),p=p+1|0}while((0|p)!=(0|i))}},function(e,t,i){e|=0,i|=0;var r,n=0,a=0,o=0;o=b,b=b+16|0,r=o,n=0|d[(t|=0)>>2];do{if(n){if((a=1&(a=0|f[i|0])?0|d[i+4>>2]:(255&a)>>>1)&&(Hr(i,56990),n=0|d[t>>2]),t=0|d[t+4>>2],ds[15&d[24+(0|d[t>>2])>>2]](r,t,n),t=0|f[r|0],y=0,O(30,0|i,0|((a=!(1&t))?r+1:d[r+8>>2]),0|(a?(255&t)>>>1:d[r+4>>2])),t=y,y=0,!(1&t)){qr(r);break}o=0|ae(),qr(r),de(0|o)}}while(0);d[e>>2]=d[i>>2],d[e+4>>2]=d[i+4>>2],d[e+8>>2]=d[i+8>>2],d[i>>2]=0,d[i+4>>2]=0,d[i+8>>2]=0,b=o},function(e,t,i){var r,n,a,o,s;e|=0,t|=0,r=b,b=b+16|0,n=r+8|0,a=r,o=0|d[(s=i|=0)+4>>2],d[(i=a)>>2]=d[s>>2],d[i+4>>2]=o,d[n>>2]=d[a>>2],d[n+4>>2]=d[a+4>>2],function(e,t,i){e|=0,t|=0;var r=0,n=0,a=0;n=b,b=b+32|0,r=n+12|0,Br(a=n,i|=0,0|Go(i)),y=0,W(10,0|r,0|t,0|a),i=y,y=0;do{if(!(1&i)){if(y=0,L(87,0|e,0|r),i=y,y=0,1&i){n=0|ae(),qr(r),r=n;break}return qr(r),qr(a),d[e>>2]=42664,i=0|d[t+4>>2],d[(a=e+8|0)>>2]=d[t>>2],d[a+4>>2]=i,void(b=n)}r=0|ae()}while(0);qr(a),de(0|r)}(e,n,t),d[e>>2]=43048,b=r},function(e,t,i){t|=0,i|=0;var r,n=0,a=0,o=0,s=0,l=0;n=189!=(0|d[(r=(e|=0)+4|0)>>2]),o=s=0|d[e>>2],a=(a=(0|d[i>>2])-o|0)>>>0<2147483647?a<<1:-1,o=(0|d[t>>2])-o|0,(s=0|Er(n?s:0,a))||Ka();do{if(n)d[e>>2]=s,l=s;else if(n=0|d[e>>2],d[e>>2]=s,n){if(y=0,P(0|d[r>>2],0|n),s=y,y=0,!(1&s)){l=0|d[e>>2];break}Ue(s=0|ae(0))}else l=s}while(0);d[r>>2]=201,d[t>>2]=l+o,d[i>>2]=(0|d[e>>2])+a},function(e,t,i){t|=0,i|=0;var r,n=0,a=0,o=0,s=0,l=0;n=189!=(0|d[(r=(e|=0)+4|0)>>2]),o=s=0|d[e>>2],a=(a=(0|d[i>>2])-o|0)>>>0<2147483647?a<<1:-1,o=(0|d[t>>2])-o>>2,(s=0|Er(n?s:0,a))||Ka();do{if(n)d[e>>2]=s,l=s;else if(n=0|d[e>>2],d[e>>2]=s,n){if(y=0,P(0|d[r>>2],0|n),s=y,y=0,!(1&s)){l=0|d[e>>2];break}Ue(s=0|ae(0))}else l=s}while(0);d[r>>2]=201,d[t>>2]=l+(o<<2),d[i>>2]=(0|d[e>>2])+(a>>>2<<2)},function(e,t,i){t|=0,i|=0;var r,n=0,a=0,o=0,s=0,l=0;n=189!=(0|d[(r=(e|=0)+4|0)>>2]),o=s=0|d[e>>2],a=(a=(0|d[i>>2])-o|0)>>>0<2147483647?a<<1:-1,o=(0|d[t>>2])-o>>2,(s=0|Er(n?s:0,a))||Ka();do{if(n)d[e>>2]=s,l=s;else if(n=0|d[e>>2],d[e>>2]=s,n){if(y=0,P(0|d[r>>2],0|n),s=y,y=0,!(1&s)){l=0|d[e>>2];break}Ue(s=0|ae(0))}else l=s}while(0);d[r>>2]=201,d[t>>2]=l+(o<<2),d[i>>2]=(0|d[e>>2])+(a>>>2<<2)},Kr],ms=[Sa,function(){ke()},function(){var e,t,i,r=0,n=0,a=0,o=0,s=0;o=b,b=b+48|0,i=o+32|0,e=o+24|0,s=o+16|0,t=o,o=o+36|0,0|(r=0|Ua())&&!!(0|(a=0|d[r>>2]))&&(1126902528==(-256&(n=0|d[(r=a+48|0)>>2]))&1129074247==(0|(r=0|d[r+4>>2]))||(d[e>>2]=d[9257],La(51919,e)),r=1126902529==(0|n)&1129074247==(0|r)?0|d[a+44>>2]:a+80|0,d[o>>2]=r,a=0|d[a>>2],r=0|d[a+4>>2],0|rs[63&d[16+(0|d[152])>>2]](608,a,o)?(s=0|d[o>>2],o=0|d[9257],s=0|ts[127&d[8+(0|d[s>>2])>>2]](s),d[t>>2]=o,d[t+4>>2]=r,d[t+8>>2]=s,La(51833,t)):(d[s>>2]=d[9257],d[s+4>>2]=r,La(51878,s))),La(51957,i)},function(){he()},function(){var e;e=b,b=b+16|0,0|$(37020,184)?La(51730,e):b=e},function(){xe()},Ka,Sa],gs=[ba,function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,a|=0,o|=0,s|=0;var l,c,u,h,m,g,p,A,S,v,w,T,C,I,D,x,E,M,k,R,F,P,L,_,N,U,O,B,V,q,Q,z,H,Y,W=0,X=0,K=0;switch(Y=b,b=b+144|0,l=Y+132|0,s=Y+116|0,W=Y+128|0,T=Y+124|0,L=Y+120|0,B=Y+112|0,V=Y+108|0,q=Y+104|0,Q=Y+100|0,z=Y+96|0,H=Y+92|0,c=Y+88|0,u=Y+84|0,h=Y+80|0,m=Y+76|0,g=Y+72|0,p=Y+68|0,A=Y+64|0,S=Y+60|0,v=Y+56|0,w=Y+52|0,C=Y+48|0,I=Y+44|0,D=Y+40|0,x=Y+36|0,E=Y+32|0,M=Y+28|0,k=Y+24|0,R=Y+20|0,F=Y+16|0,P=Y+12|0,_=Y+8|0,N=Y+4|0,U=Y,d[(n|=0)>>2]=0,O=0|rn(r),d[W>>2]=O,y=0,W=0|G(37,0|W,44220),K=y,y=0,1&K&&(K=0|ae(),Nr(O),de(0|K)),Nr(O),o<<24>>24){case 65:case 97:d[T>>2]=d[i>>2],d[l>>2]=d[T>>2],Ei(e,a+24|0,t,l,n,W),X=28;break;case 104:case 66:case 98:d[L>>2]=d[i>>2],d[l>>2]=d[L>>2],Mi(e,a+16|0,t,l,n,W),X=28;break;case 99:X=0|ts[127&d[12+(0|d[(X=e+8|0)>>2])>>2]](X),d[B>>2]=d[t>>2],d[V>>2]=d[i>>2],X=(K=(i=!(1&(o=0|f[X|0])))?X+1|0:0|d[X+8>>2])+(i?(255&o)>>>1:0|d[X+4>>2])|0,d[s>>2]=d[B>>2],d[l>>2]=d[V>>2],X=0|xi(e,s,l,r,n,a,K,X),d[t>>2]=X,X=28;break;case 101:case 100:d[q>>2]=d[i>>2],d[l>>2]=d[q>>2],Ri(e,a+12|0,t,l,n,W),X=28;break;case 68:d[Q>>2]=d[t>>2],d[z>>2]=d[i>>2],d[s>>2]=d[Q>>2],d[l>>2]=d[z>>2],X=0|xi(e,s,l,r,n,a,58915,58923),d[t>>2]=X,X=28;break;case 70:d[H>>2]=d[t>>2],d[c>>2]=d[i>>2],d[s>>2]=d[H>>2],d[l>>2]=d[c>>2],X=0|xi(e,s,l,r,n,a,58923,58931),d[t>>2]=X,X=28;break;case 72:d[u>>2]=d[i>>2],d[l>>2]=d[u>>2],Fi(e,a+8|0,t,l,n,W),X=28;break;case 73:d[h>>2]=d[i>>2],d[l>>2]=d[h>>2],Pi(e,a+8|0,t,l,n,W),X=28;break;case 106:d[m>>2]=d[i>>2],d[l>>2]=d[m>>2],Li(e,a+28|0,t,l,n,W),X=28;break;case 109:d[g>>2]=d[i>>2],d[l>>2]=d[g>>2],_i(e,a+16|0,t,l,n,W),X=28;break;case 77:d[p>>2]=d[i>>2],d[l>>2]=d[p>>2],Ni(e,a+4|0,t,l,n,W),X=28;break;case 116:case 110:d[A>>2]=d[i>>2],d[l>>2]=d[A>>2],Ui(e,t,l,n,W),X=28;break;case 112:d[S>>2]=d[i>>2],d[l>>2]=d[S>>2],Oi(e,a+8|0,t,l,n,W),X=28;break;case 114:d[v>>2]=d[t>>2],d[w>>2]=d[i>>2],d[s>>2]=d[v>>2],d[l>>2]=d[w>>2],X=0|xi(e,s,l,r,n,a,58931,58942),d[t>>2]=X,X=28;break;case 82:d[C>>2]=d[t>>2],d[I>>2]=d[i>>2],d[s>>2]=d[C>>2],d[l>>2]=d[I>>2],X=0|xi(e,s,l,r,n,a,58942,58947),d[t>>2]=X,X=28;break;case 83:d[D>>2]=d[i>>2],d[l>>2]=d[D>>2],Bi(e,a,t,l,n,W),X=28;break;case 84:d[x>>2]=d[t>>2],d[E>>2]=d[i>>2],d[s>>2]=d[x>>2],d[l>>2]=d[E>>2],X=0|xi(e,s,l,r,n,a,58947,58955),d[t>>2]=X,X=28;break;case 119:d[M>>2]=d[i>>2],d[l>>2]=d[M>>2],Vi(e,a+24|0,t,l,n,W),X=28;break;case 120:K=0|d[20+(0|d[e>>2])>>2],d[k>>2]=d[t>>2],d[R>>2]=d[i>>2],d[s>>2]=d[k>>2],d[l>>2]=d[R>>2],s=0|es[63&K](e,s,l,r,n,a);break;case 88:X=0|ts[127&d[24+(0|d[(X=e+8|0)>>2])>>2]](X),d[F>>2]=d[t>>2],d[P>>2]=d[i>>2],X=(K=(i=!(1&(o=0|f[X|0])))?X+1|0:0|d[X+8>>2])+(i?(255&o)>>>1:0|d[X+4>>2])|0,d[s>>2]=d[F>>2],d[l>>2]=d[P>>2],X=0|xi(e,s,l,r,n,a,K,X),d[t>>2]=X,X=28;break;case 121:d[_>>2]=d[i>>2],d[l>>2]=d[_>>2],ki(e,a+20|0,t,l,n,W),X=28;break;case 89:d[N>>2]=d[i>>2],d[l>>2]=d[N>>2],qi(e,a+20|0,t,l,n,W),X=28;break;case 37:d[U>>2]=d[i>>2],d[l>>2]=d[U>>2],Gi(e,t,l,n,W),X=28;break;default:d[n>>2]=4|d[n>>2],X=28}return 28==(0|X)&&(s=0|d[t>>2]),b=Y,0|s},function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,a|=0,o|=0,s|=0;var l,c,u,h,m,g,p,A,S,v,w,T,C,I,D,x,E,M,k,R,F,P,L,_,N,U,O,B,V,q,Q,z,H,Y,W=0,X=0,K=0;switch(Y=b,b=b+144|0,l=Y+132|0,s=Y+116|0,W=Y+128|0,T=Y+124|0,L=Y+120|0,B=Y+112|0,V=Y+108|0,q=Y+104|0,Q=Y+100|0,z=Y+96|0,H=Y+92|0,c=Y+88|0,u=Y+84|0,h=Y+80|0,m=Y+76|0,g=Y+72|0,p=Y+68|0,A=Y+64|0,S=Y+60|0,v=Y+56|0,w=Y+52|0,C=Y+48|0,I=Y+44|0,D=Y+40|0,x=Y+36|0,E=Y+32|0,M=Y+28|0,k=Y+24|0,R=Y+20|0,F=Y+16|0,P=Y+12|0,_=Y+8|0,N=Y+4|0,U=Y,d[(n|=0)>>2]=0,O=0|rn(r),d[W>>2]=O,y=0,W=0|G(37,0|W,44212),K=y,y=0,1&K&&(K=0|ae(),Nr(O),de(0|K)),Nr(O),o<<24>>24){case 65:case 97:d[T>>2]=d[i>>2],d[l>>2]=d[T>>2],zi(e,a+24|0,t,l,n,W),X=28;break;case 104:case 66:case 98:d[L>>2]=d[i>>2],d[l>>2]=d[L>>2],Hi(e,a+16|0,t,l,n,W),X=28;break;case 99:K=0|ts[127&d[12+(0|d[(K=e+8|0)>>2])>>2]](K),d[B>>2]=d[t>>2],d[V>>2]=d[i>>2],X=K+4|0,X=(K=(i=!(1&(o=0|f[K|0])))?X:0|d[K+8>>2])+((i?(255&o)>>>1:d[X>>2])<<2)|0,d[s>>2]=d[B>>2],d[l>>2]=d[V>>2],X=0|Qi(e,s,l,r,n,a,K,X),d[t>>2]=X,X=28;break;case 101:case 100:d[q>>2]=d[i>>2],d[l>>2]=d[q>>2],Wi(e,a+12|0,t,l,n,W),X=28;break;case 68:d[Q>>2]=d[t>>2],d[z>>2]=d[i>>2],d[s>>2]=d[Q>>2],d[l>>2]=d[z>>2],X=0|Qi(e,s,l,r,n,a,44820,44852),d[t>>2]=X,X=28;break;case 70:d[H>>2]=d[t>>2],d[c>>2]=d[i>>2],d[s>>2]=d[H>>2],d[l>>2]=d[c>>2],X=0|Qi(e,s,l,r,n,a,44852,44884),d[t>>2]=X,X=28;break;case 72:d[u>>2]=d[i>>2],d[l>>2]=d[u>>2],Xi(e,a+8|0,t,l,n,W),X=28;break;case 73:d[h>>2]=d[i>>2],d[l>>2]=d[h>>2],Ki(e,a+8|0,t,l,n,W),X=28;break;case 106:d[m>>2]=d[i>>2],d[l>>2]=d[m>>2],ji(e,a+28|0,t,l,n,W),X=28;break;case 109:d[g>>2]=d[i>>2],d[l>>2]=d[g>>2],Zi(e,a+16|0,t,l,n,W),X=28;break;case 77:d[p>>2]=d[i>>2],d[l>>2]=d[p>>2],Ji(e,a+4|0,t,l,n,W),X=28;break;case 116:case 110:d[A>>2]=d[i>>2],d[l>>2]=d[A>>2],$i(e,t,l,n,W),X=28;break;case 112:d[S>>2]=d[i>>2],d[l>>2]=d[S>>2],er(e,a+8|0,t,l,n,W),X=28;break;case 114:d[v>>2]=d[t>>2],d[w>>2]=d[i>>2],d[s>>2]=d[v>>2],d[l>>2]=d[w>>2],X=0|Qi(e,s,l,r,n,a,44884,44928),d[t>>2]=X,X=28;break;case 82:d[C>>2]=d[t>>2],d[I>>2]=d[i>>2],d[s>>2]=d[C>>2],d[l>>2]=d[I>>2],X=0|Qi(e,s,l,r,n,a,44928,44948),d[t>>2]=X,X=28;break;case 83:d[D>>2]=d[i>>2],d[l>>2]=d[D>>2],tr(e,a,t,l,n,W),X=28;break;case 84:d[x>>2]=d[t>>2],d[E>>2]=d[i>>2],d[s>>2]=d[x>>2],d[l>>2]=d[E>>2],X=0|Qi(e,s,l,r,n,a,44948,44980),d[t>>2]=X,X=28;break;case 119:d[M>>2]=d[i>>2],d[l>>2]=d[M>>2],ir(e,a+24|0,t,l,n,W),X=28;break;case 120:K=0|d[20+(0|d[e>>2])>>2],d[k>>2]=d[t>>2],d[R>>2]=d[i>>2],d[s>>2]=d[k>>2],d[l>>2]=d[R>>2],s=0|es[63&K](e,s,l,r,n,a);break;case 88:K=0|ts[127&d[24+(0|d[(K=e+8|0)>>2])>>2]](K),d[F>>2]=d[t>>2],d[P>>2]=d[i>>2],X=K+4|0,X=(K=(i=!(1&(o=0|f[K|0])))?X:0|d[K+8>>2])+((i?(255&o)>>>1:d[X>>2])<<2)|0,d[s>>2]=d[F>>2],d[l>>2]=d[P>>2],X=0|Qi(e,s,l,r,n,a,K,X),d[t>>2]=X,X=28;break;case 121:d[_>>2]=d[i>>2],d[l>>2]=d[_>>2],Yi(e,a+20|0,t,l,n,W),X=28;break;case 89:d[N>>2]=d[i>>2],d[l>>2]=d[N>>2],rr(e,a+20|0,t,l,n,W),X=28;break;case 37:d[U>>2]=d[i>>2],d[l>>2]=d[U>>2],nr(e,t,l,n,W),X=28;break;default:d[n>>2]=4|d[n>>2],X=28}return 28==(0|X)&&(s=0|d[t>>2]),b=Y,0|s},function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l,c,u,h,m,g=0,p=0,A=0,S=0,v=0,w=0;m=b,b=b+16|0,h=m,c=m+8|0;e:do{if((0|i)==(0|r))g=r;else for(g=i;;){if(!(0|d[g>>2]))break e;if((0|(g=g+4|0))==(0|r)){g=r;break}}}while(0);d[s>>2]=a,d[n>>2]=i,l=o,u=e+8|0;e:do{if((0|a)==(0|o)|(0|i)==(0|r))v=47;else{e=a,p=g;t:for(;;){if(a=0|d[(w=t)+4>>2],d[(g=h)>>2]=d[w>>2],d[g+4>>2]=a,g=0|so(0|d[u>>2]),y=0,a=0|Q(21,0|e,0|n,p-i>>2,l-e|0,0|t),w=y,y=0,1&w){v=9;break}if(0|g&&(y=0,N(75,0|g),w=y,y=0,1&w)){v=8;break}switch(0|a){case 0:A=1;break e;case-1:g=e,v=14;break t}if(g=(0|d[s>>2])+a|0,d[s>>2]=g,(0|g)==(0|o)){v=27;break}if((0|p)==(0|r))i=0|d[n>>2],e=g,g=r;else{if(g=0|so(0|d[u>>2]),y=0,i=0|O(34,0|c,0,0|t),w=y,y=0,1&w){v=35;break}if(0|g&&(y=0,N(75,0|g),w=y,y=0,1&w)){v=34;break}if(-1==(0|i)){A=2;break e}if(i>>>0>(l-(0|d[s>>2])|0)>>>0){A=1;break e}if(i)for(g=c;p=0|f[g|0],w=0|d[s>>2],d[s>>2]=w+1,f[w|0]=p,i=i+-1|0;)g=g+1|0;i=4+(0|d[n>>2])|0,d[n>>2]=i;i:do{if((0|i)==(0|r))g=r;else for(g=i;;){if(!(0|d[g>>2]))break i;if((0|(g=g+4|0))==(0|r)){g=r;break}}}while(0);e=0|d[s>>2]}if((0|e)==(0|o)|(0|i)==(0|r)){v=47;break e}p=g}if(8==(0|v))Ue(w=0|ae(0));else if(9==(0|v))i=0|ae(),0|g&&(y=0,N(75,0|g),w=y,y=0,1&w)&&Ue(w=0|ae(0)),de(0|i);else{if(14==(0|v)){d[s>>2]=g;t:do{if((0|i)!=(0|d[n>>2])){for(;;){if(w=0|d[i>>2],e=0|so(0|d[u>>2]),y=0,g=0|O(34,0|g,0|w,0|h),w=y,y=0,1&w){S=e;break}if(0|e&&(y=0,N(75,0|e),w=y,y=0,1&w)){v=18;break}if(-1==(0|g)||(g=(0|d[s>>2])+g|0,d[s>>2]=g,(0|(i=i+4|0))==(0|d[n>>2])))break t}18==(0|v)&&Ue(w=0|ae(0)),i=0|ae(),0|S&&(y=0,N(75,0|S),w=y,y=0,1&w)&&Ue(w=0|ae(0)),de(0|i)}}while(0);d[n>>2]=i,A=2;break}if(27==(0|v)){i=0|d[n>>2],v=47;break}34==(0|v)?Ue(w=0|ae(0)):35==(0|v)&&(i=0|ae(),0|g&&(y=0,N(75,0|g),w=y,y=0,1&w)&&Ue(w=0|ae(0)),de(0|i))}}}while(0);return 47==(0|v)&&(A=(0|i)!=(0|r)&1),b=m,0|A},function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l,c,u,h,m=0,g=0,p=0,A=0,S=0,v=0,w=0;h=b,b=b+16|0,u=h;e:do{if((0|i)==(0|r))m=r;else for(m=i;;){if(!(0|f[m|0]))break e;if((0|(m=m+1|0))==(0|r)){m=r;break}}}while(0);d[s>>2]=a,d[n>>2]=i,l=o,c=e+8|0;e:do{if((0|a)==(0|o)|(0|i)==(0|r))v=47;else{e=a,p=m;t:for(;;){if(m=0|d[(g=t)+4>>2],d[(a=u)>>2]=d[g>>2],d[a+4>>2]=m,a=p,m=0|so(0|d[c>>2]),y=0,g=0|Q(22,0|e,0|n,a-i|0,l-e>>2,0|t),w=y,y=0,1&w){v=9;break}if(0|m&&(y=0,N(75,0|m),w=y,y=0,1&w)){v=8;break}switch(0|g){case 0:A=2;break e;case-1:m=e,v=14;break t}if(e=(0|d[s>>2])+(g<<2)|0,d[s>>2]=e,(0|e)==(0|o)){v=31;break}if(i=0|d[n>>2],(0|p)==(0|r))m=r;else{if(m=0|so(0|d[c>>2]),y=0,i=0|Y(20,0|e,0|i,1,0|t),w=y,y=0,1&w){v=38;break}if(0|m&&(y=0,N(75,0|m),w=y,y=0,1&w)){v=37;break}if(i){A=2;break e}d[s>>2]=4+(0|d[s>>2]),i=1+(0|d[n>>2])|0,d[n>>2]=i;i:do{if((0|i)==(0|r))m=r;else for(m=i;;){if(!(0|f[m|0]))break i;if((0|(m=m+1|0))==(0|r)){m=r;break}}}while(0);e=0|d[s>>2]}if((0|e)==(0|o)|(0|i)==(0|r)){v=47;break e}p=m}if(8==(0|v))Ue(w=0|ae(0));else if(9==(0|v))i=0|ae(),0|m&&(y=0,N(75,0|m),w=y,y=0,1&w)&&Ue(w=0|ae(0)),de(0|i);else{if(14==(0|v)){d[s>>2]=m;t:do{if((0|i)!=(0|d[n>>2])){e=m;i:for(;;){if(m=0|so(0|d[c>>2]),y=0,e=0|Y(20,0|e,0|i,a-i|0,0|u),w=y,y=0,1&w){v=19;break}if(0|m&&(y=0,N(75,0|m),w=y,y=0,1&w)){v=18;break}switch(0|e){case-1:v=25;break i;case-2:v=26;break i;case 0:i=i+1|0;break;default:i=i+e|0}if(e=4+(0|d[s>>2])|0,d[s>>2]=e,(0|i)==(0|d[n>>2])){S=i;break t}}if(18==(0|v))Ue(w=0|ae(0));else if(19==(0|v))i=0|ae(),0|m&&(y=0,N(75,0|m),w=y,y=0,1&w)&&Ue(w=0|ae(0)),de(0|i);else{if(25==(0|v)){d[n>>2]=i,A=2;break e}if(26==(0|v)){d[n>>2]=i,A=1;break e}}}else S=i}while(0);d[n>>2]=S,A=(0|S)!=(0|r)&1;break}if(31==(0|v)){i=0|d[n>>2],v=47;break}37==(0|v)?Ue(w=0|ae(0)):38==(0|v)&&(i=0|ae(),0|m&&(y=0,N(75,0|m),w=y,y=0,1&w)&&Ue(w=0|ae(0)),de(0|i))}}}while(0);return 47==(0|v)&&(A=(0|i)!=(0|r)&1),b=h,0|A},function(e,t,i,r,n,a,o,s){return i|=0,a|=0,s|=0,d[(n|=0)>>2]=i,d[s>>2]=a,3},function(e,t,i,r,n,a,o,s){return i|=0,a|=0,s|=0,d[(n|=0)>>2]=i,d[s>>2]=a,3},function(e,t,i,r,n,a,o,s){var l;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,e=b,b=b+16|0,t=e,d[(l=e+4|0)>>2]=i,d[t>>2]=a,o=0|function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l=0,c=0;d[i>>2]=e,d[a>>2]=r,2&s?(n-r|0)<3?e=1:(d[a>>2]=r+1,f[r|0]=-17,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=-69,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=-65,l=4):l=4;e:do{if(4==(0|l))if(c=t,e=0|d[i>>2],e>>>0>>0)for(;;){if((l=65535&(s=0|h[e>>1]))>>>0>o>>>0){e=2;break e}do{if((65535&s)<128){if((n-(e=0|d[a>>2])|0)<1){e=1;break e}d[a>>2]=e+1,f[e|0]=s}else{if((65535&s)<2048){if((n-(e=0|d[a>>2])|0)<2){e=1;break e}d[a>>2]=e+1,f[e|0]=l>>>6|192,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=63&l|128;break}if((65535&s)<55296){if((n-(e=0|d[a>>2])|0)<3){e=1;break e}d[a>>2]=e+1,f[e|0]=l>>>12|224,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=l>>>6&63|128,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=63&l|128;break}if((65535&s)>=56320){if((65535&s)<57344){e=2;break e}if((n-(e=0|d[a>>2])|0)<3){e=1;break e}d[a>>2]=e+1,f[e|0]=l>>>12|224,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=l>>>6&63|128,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=63&l|128;break}if((c-e|0)<4){e=1;break e}if(56320!=(64512&(s=0|g[(e=e+2|0)>>1]))){e=2;break e}if((n-(0|d[a>>2])|0)<4){e=1;break e}if((65536+((r=960&l)<<10)|l<<10&64512|1023&s)>>>0>o>>>0){e=2;break e}d[i>>2]=e,e=1+(r>>>6)|0,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=e>>>2|240,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=l>>>2&15|e<<4&48|128,r=0|d[a>>2],d[a>>2]=r+1,f[r|0]=l<<4&48|s>>>6&15|128,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=63&s|128}}while(0);if(e=2+(0|d[i>>2])|0,d[i>>2]=e,e>>>0>=t>>>0){e=0;break}}else e=0}while(0);return 0|e}(i,r,l,a,o,t,1114111,0),d[n>>2]=d[l>>2],d[s>>2]=d[t>>2],b=e,0|o},function(e,t,i,r,n,a,o,s){var l;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,e=b,b=b+16|0,t=e,d[(l=e+4|0)>>2]=i,d[t>>2]=a,o=0|function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l=0,c=0,u=0,g=0,p=0,A=0;d[i>>2]=e,d[a>>2]=r,4&s?(e=0|d[i>>2],s=t,(s-e|0)>2&&-17==(0|f[e|0])&&-69==(0|f[e+1|0])&&-65==(0|f[e+2|0])?(d[i>>2]=e+3,l=0|d[a>>2]):l=r):(l=r,s=t),p=n,r=0|d[i>>2],e=r>>>0>>0;e:do{if(e&l>>>0>>0)for(;;){if((u=255&(e=0|f[r|0]))>>>0>o>>>0){e=2;break e}do{if(e<<24>>24>-1)h[l>>1]=255&e,d[i>>2]=r+1;else{if((255&e)<194){e=2;break e}if((255&e)<224){if((s-r|0)<2){e=1;break e}if(128!=(192&(e=0|m[r+1|0]))){e=2;break e}if((e=63&e|u<<6&1984)>>>0>o>>>0){e=2;break e}h[l>>1]=e,d[i>>2]=r+2;break}if((255&e)<240){if((s-r|0)<3){e=1;break e}switch(c=0|f[r+1|0],e=0|f[r+2|0],0|u){case 224:if((-32&c)<<24>>24!=-96){e=2;break e}break;case 237:if((-32&c)<<24>>24!=-128){e=2;break e}break;default:if((-64&c)<<24>>24!=-128){e=2;break e}}if(128!=(192&(e&=255))){e=2;break e}if((65535&(e=(255&c)<<6&4032|u<<12|63&e))>>>0>o>>>0){e=2;break e}h[l>>1]=e,d[i>>2]=r+3;break}if((255&e)>=245){e=2;break e}if((s-r|0)<4){e=1;break e}switch(c=0|f[r+1|0],e=0|f[r+2|0],r=0|f[r+3|0],0|u){case 240:if((c+112&255)>=48){e=2;break e}break;case 244:if((-16&c)<<24>>24!=-128){e=2;break e}break;default:if((-64&c)<<24>>24!=-128){e=2;break e}}if(128!=(192&(g=255&e))){e=2;break e}if(128!=(192&(e=255&r))){e=2;break e}if((p-l|0)<4){e=1;break e}if(((r=255&c)<<12&258048|(u&=7)<<18|4032&(c=g<<6)|(e&=63))>>>0>o>>>0){e=2;break e}h[l>>1]=r<<2&60|g>>>4&3|16320+((r>>>4&3|u<<2)<<6)|55296,g=l+2|0,d[a>>2]=g,h[g>>1]=e|960&c|56320,d[i>>2]=4+(0|d[i>>2])}}while(0);if(l=2+(0|d[a>>2])|0,d[a>>2]=l,!((e=(r=0|d[i>>2])>>>0>>0)&l>>>0>>0)){A=39;break}}else A=39}while(0);return 39==(0|A)&&(e&=1),0|e}(i,r,l,a,o,t,1114111,0),d[n>>2]=d[l>>2],d[s>>2]=d[t>>2],b=e,0|o},function(e,t,i,r,n,a,o,s){var l;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,e=b,b=b+16|0,t=e,d[(l=e+4|0)>>2]=i,d[t>>2]=a,o=0|function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l=0,c=0;d[i>>2]=e,d[a>>2]=r,c=n,2&s?(c-r|0)<3?e=1:(d[a>>2]=r+1,f[r|0]=-17,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=-69,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=-65,l=4):l=4;e:do{if(4==(0|l))if(e=0|d[i>>2],e>>>0>>0)for(;;){if((s=0|d[e>>2])>>>0>o>>>0|55296==(-2048&s)){e=2;break e}do{if(s>>>0>=128){if(s>>>0<2048){if((c-(e=0|d[a>>2])|0)<2){e=1;break e}d[a>>2]=e+1,f[e|0]=s>>>6|192,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=63&s|128;break}if(n=c-(e=0|d[a>>2])|0,s>>>0<65536){if((0|n)<3){e=1;break e}d[a>>2]=e+1,f[e|0]=s>>>12|224,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=s>>>6&63|128,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=63&s|128;break}if((0|n)<4){e=1;break e}d[a>>2]=e+1,f[e|0]=s>>>18|240,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=s>>>12&63|128,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=s>>>6&63|128,l=0|d[a>>2],d[a>>2]=l+1,f[l|0]=63&s|128;break}if((c-(e=0|d[a>>2])|0)<1){e=1;break e}d[a>>2]=e+1,f[e|0]=s}while(0);if(e=4+(0|d[i>>2])|0,d[i>>2]=e,e>>>0>=t>>>0){e=0;break}}else e=0}while(0);return 0|e}(i,r,l,a,o,t,1114111,0),d[n>>2]=d[l>>2],d[s>>2]=d[t>>2],b=e,0|o},function(e,t,i,r,n,a,o,s){var l;return e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,e=b,b=b+16|0,t=e,d[(l=e+4|0)>>2]=i,d[t>>2]=a,o=0|function(e,t,i,r,n,a,o,s){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0;var l=0,c=0,u=0,h=0,g=0,p=0;d[i>>2]=e,d[a>>2]=r,4&s?(e=0|d[i>>2],s=t,(s-e|0)>2&&-17==(0|f[e|0])&&-69==(0|f[e+1|0])&&-65==(0|f[e+2|0])&&(d[i>>2]=e+3,r=0|d[a>>2]),g=s):g=t,s=0|d[i>>2],e=s>>>0>>0;e:do{if(e&r>>>0>>0)for(;;){h=255&(e=0|f[s|0]);do{if(e<<24>>24>-1){if(h>>>0>o>>>0){e=2;break e}d[r>>2]=h,d[i>>2]=s+1}else{if((255&e)<194){e=2;break e}if((255&e)<224){if((g-s|0)<2){e=1;break e}if(128!=(192&(e=0|m[s+1|0]))){e=2;break e}if((e=63&e|h<<6&1984)>>>0>o>>>0){e=2;break e}d[r>>2]=e,d[i>>2]=s+2;break}if((255&e)<240){if((g-s|0)<3){e=1;break e}switch(l=0|f[s+1|0],e=0|f[s+2|0],0|h){case 224:if((-32&l)<<24>>24!=-96){e=2;break e}break;case 237:if((-32&l)<<24>>24!=-128){e=2;break e}break;default:if((-64&l)<<24>>24!=-128){e=2;break e}}if(128!=(192&(e&=255))){e=2;break e}if((e=(255&l)<<6&4032|h<<12&61440|63&e)>>>0>o>>>0){e=2;break e}d[r>>2]=e,d[i>>2]=s+3;break}if((255&e)>=245){e=2;break e}if((g-s|0)<4){e=1;break e}switch(u=0|f[s+1|0],e=0|f[s+2|0],l=0|f[s+3|0],0|h){case 240:if((u+112&255)>=48){e=2;break e}break;case 244:if((-16&u)<<24>>24!=-128){e=2;break e}break;default:if((-64&u)<<24>>24!=-128){e=2;break e}}if(128!=(192&(c=255&e))){e=2;break e}if(128!=(192&(e=255&l))){e=2;break e}if((e=(255&u)<<12&258048|h<<18&1835008|c<<6&4032|63&e)>>>0>o>>>0){e=2;break e}d[r>>2]=e,d[i>>2]=s+4}}while(0);if(r=4+(0|d[a>>2])|0,d[a>>2]=r,!((e=(s=0|d[i>>2])>>>0>>0)&r>>>0>>0)){p=38;break}}else p=38}while(0);return 38==(0|p)&&(e&=1),0|e}(i,r,l,a,o,t,1114111,0),d[n>>2]=d[l>>2],d[s>>2]=d[t>>2],b=e,0|o},ba,ba,ba,ba,ba],ps=[va,function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n=+n;var a,o,s,l,c,u,f,h=0,m=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;f=b,b=b+176|0,s=f+84|0,w=f+48|0,a=f+32|0,p=f+24|0,h=f+8|0,o=f+88|0,C=f+80|0,g=f+118|0,u=f+76|0,c=f+72|0,I=f+68|0,l=f+64|0,d[(S=v=f)>>2]=37,d[S+4>>2]=0,S=0|En(v+1|0,58898,0|d[i+4>>2]),d[C>>2]=o,e=0|Sn(),S?(d[h>>2]=d[i+8>>2],A[h+8>>3]=n,h=0|Un(o,30,e,v,h)):(A[p>>3]=n,h=0|Un(o,30,e,v,p));e:do{if((0|h)>29){y=0,e=0|H(3),h=y,y=0,h&=1,S?!h&&(y=0,d[a>>2]=d[i+8>>2],A[a+8>>3]=n,m=0|Y(17,0|C,0|e,0|v,0|a),T=y,y=0,!(1&T))&&(D=12):!h&&(y=0,d[w>>2]=d[i+8>>2],A[w+8>>3]=n,T=0|Y(17,0|C,0|e,0|v,0|w),w=y,y=0,!(1&w))&&(m=T,D=12);do{if(12==(0|D)){if(e=0|d[C>>2])h=e;else{if(y=0,X(6),T=y,y=0,1&T)break;h=0|d[C>>2]}e=h,v=h,D=16;break e}}while(0);e=0|ae()}else e=0|d[C>>2],v=0,m=h,D=16}while(0);if(16==(0|D)){S=0|xn(e,p=e+m|0,i);do{if((0|e)==(0|o))e=o,h=0,D=22;else{if(!(m=0|Dr(m<<1))){if(y=0,X(6),D=y,y=0,1&D){h=0,D=20;break}e=0|d[C>>2]}h=m,g=m,D=22}}while(0);do{if(22==(0|D))if(y=0,m=0|N(68,0|i),C=y,y=0,1&C)D=20;else{if(d[I>>2]=m,y=0,V(2,0|e,0|S,0|p,0|g,0|u,0|c,0|I),I=y,y=0,1&I){e=0|ae(),Nr(m);break}if(Nr(m),d[l>>2]=d[t>>2],D=0|d[u>>2],e=0|d[c>>2],y=0,d[s>>2]=d[l>>2],e=0|_(39,0|s,0|g,0|D,0|e,0|i,0|r),D=y,y=0,!(1&D))return d[t>>2]=e,h&&xr(h),v&&xr(v),b=f,0|e;D=20}}while(0);20==(0|D)&&(e=0|ae()),h&&xr(h),v&&xr(v)}return de(0|e),0},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n=+n;var a,o,s,l,c,u,f,h=0,m=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;f=b,b=b+176|0,s=f+76|0,w=f+48|0,a=f+32|0,p=f+24|0,h=f+8|0,o=f+80|0,C=f+72|0,g=f+110|0,u=f+68|0,c=f+64|0,I=f+60|0,l=f+56|0,d[(S=v=f)>>2]=37,d[S+4>>2]=0,S=0|En(v+1|0,58899,0|d[i+4>>2]),d[C>>2]=o,e=0|Sn(),S?(d[h>>2]=d[i+8>>2],A[h+8>>3]=n,h=0|Un(o,30,e,v,h)):(A[p>>3]=n,h=0|Un(o,30,e,v,p));e:do{if((0|h)>29){y=0,e=0|H(3),h=y,y=0,h&=1,S?!h&&(y=0,d[a>>2]=d[i+8>>2],A[a+8>>3]=n,m=0|Y(17,0|C,0|e,0|v,0|a),T=y,y=0,!(1&T))&&(D=12):!h&&(y=0,A[w>>3]=n,T=0|Y(17,0|C,0|e,0|v,0|w),w=y,y=0,!(1&w))&&(m=T,D=12);do{if(12==(0|D)){if(e=0|d[C>>2])h=e;else{if(y=0,X(6),T=y,y=0,1&T)break;h=0|d[C>>2]}e=h,v=h,D=16;break e}}while(0);e=0|ae()}else e=0|d[C>>2],v=0,m=h,D=16}while(0);if(16==(0|D)){S=0|xn(e,p=e+m|0,i);do{if((0|e)==(0|o))e=o,h=0,D=22;else{if(!(m=0|Dr(m<<1))){if(y=0,X(6),D=y,y=0,1&D){h=0,D=20;break}e=0|d[C>>2]}h=m,g=m,D=22}}while(0);do{if(22==(0|D))if(y=0,m=0|N(68,0|i),C=y,y=0,1&C)D=20;else{if(d[I>>2]=m,y=0,V(2,0|e,0|S,0|p,0|g,0|u,0|c,0|I),I=y,y=0,1&I){e=0|ae(),Nr(m);break}if(Nr(m),d[l>>2]=d[t>>2],D=0|d[u>>2],e=0|d[c>>2],y=0,d[s>>2]=d[l>>2],e=0|_(39,0|s,0|g,0|D,0|e,0|i,0|r),D=y,y=0,!(1&D))return d[t>>2]=e,h&&xr(h),v&&xr(v),b=f,0|e;D=20}}while(0);20==(0|D)&&(e=0|ae()),h&&xr(h),v&&xr(v)}return de(0|e),0},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n=+n;var a,o,s,l,c,u,f,h=0,m=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;f=b,b=b+352|0,s=f+312|0,w=f+48|0,a=f+32|0,p=f+24|0,h=f+8|0,o=f+316|0,C=f+80|0,g=f+84|0,u=f+76|0,c=f+72|0,I=f+68|0,l=f+64|0,d[(S=v=f)>>2]=37,d[S+4>>2]=0,S=0|En(v+1|0,58898,0|d[i+4>>2]),d[C>>2]=o,e=0|Sn(),S?(d[h>>2]=d[i+8>>2],A[h+8>>3]=n,h=0|Un(o,30,e,v,h)):(A[p>>3]=n,h=0|Un(o,30,e,v,p));e:do{if((0|h)>29){y=0,e=0|H(3),h=y,y=0,h&=1,S?!h&&(y=0,d[a>>2]=d[i+8>>2],A[a+8>>3]=n,m=0|Y(17,0|C,0|e,0|v,0|a),T=y,y=0,!(1&T))&&(D=12):!h&&(y=0,d[w>>2]=d[i+8>>2],A[w+8>>3]=n,T=0|Y(17,0|C,0|e,0|v,0|w),w=y,y=0,!(1&w))&&(m=T,D=12);do{if(12==(0|D)){if(e=0|d[C>>2])h=e;else{if(y=0,X(6),T=y,y=0,1&T)break;h=0|d[C>>2]}e=h,v=h,D=16;break e}}while(0);e=0|ae()}else e=0|d[C>>2],v=0,m=h,D=16}while(0);if(16==(0|D)){S=0|xn(e,p=e+m|0,i);do{if((0|e)==(0|o))e=o,h=0,D=22;else{if(!(m=0|Dr(m<<3))){if(y=0,X(6),D=y,y=0,1&D){h=0,D=20;break}e=0|d[C>>2]}h=m,g=m,D=22}}while(0);do{if(22==(0|D))if(y=0,m=0|N(68,0|i),C=y,y=0,1&C)D=20;else{if(d[I>>2]=m,y=0,V(4,0|e,0|S,0|p,0|g,0|u,0|c,0|I),I=y,y=0,1&I){e=0|ae(),Nr(m);break}if(Nr(m),d[l>>2]=d[t>>2],D=0|d[u>>2],e=0|d[c>>2],y=0,d[s>>2]=d[l>>2],e=0|_(40,0|s,0|g,0|D,0|e,0|i,0|r),D=y,y=0,!(1&D))return d[t>>2]=e,h&&xr(h),v&&xr(v),b=f,0|e;D=20}}while(0);20==(0|D)&&(e=0|ae()),h&&xr(h),v&&xr(v)}return de(0|e),0},function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n=+n;var a,o,s,l,c,u,f,h=0,m=0,g=0,p=0,S=0,v=0,w=0,T=0,C=0,I=0,D=0;f=b,b=b+352|0,s=f+304|0,w=f+48|0,a=f+32|0,p=f+24|0,h=f+8|0,o=f+308|0,C=f+72|0,g=f+76|0,u=f+68|0,c=f+64|0,I=f+60|0,l=f+56|0,d[(S=v=f)>>2]=37,d[S+4>>2]=0,S=0|En(v+1|0,58899,0|d[i+4>>2]),d[C>>2]=o,e=0|Sn(),S?(d[h>>2]=d[i+8>>2],A[h+8>>3]=n,h=0|Un(o,30,e,v,h)):(A[p>>3]=n,h=0|Un(o,30,e,v,p));e:do{if((0|h)>29){y=0,e=0|H(3),h=y,y=0,h&=1,S?!h&&(y=0,d[a>>2]=d[i+8>>2],A[a+8>>3]=n,m=0|Y(17,0|C,0|e,0|v,0|a),T=y,y=0,!(1&T))&&(D=12):!h&&(y=0,A[w>>3]=n,T=0|Y(17,0|C,0|e,0|v,0|w),w=y,y=0,!(1&w))&&(m=T,D=12);do{if(12==(0|D)){if(e=0|d[C>>2])h=e;else{if(y=0,X(6),T=y,y=0,1&T)break;h=0|d[C>>2]}e=h,v=h,D=16;break e}}while(0);e=0|ae()}else e=0|d[C>>2],v=0,m=h,D=16}while(0);if(16==(0|D)){S=0|xn(e,p=e+m|0,i);do{if((0|e)==(0|o))e=o,h=0,D=22;else{if(!(m=0|Dr(m<<3))){if(y=0,X(6),D=y,y=0,1&D){h=0,D=20;break}e=0|d[C>>2]}h=m,g=m,D=22}}while(0);do{if(22==(0|D))if(y=0,m=0|N(68,0|i),C=y,y=0,1&C)D=20;else{if(d[I>>2]=m,y=0,V(4,0|e,0|S,0|p,0|g,0|u,0|c,0|I),I=y,y=0,1&I){e=0|ae(),Nr(m);break}if(Nr(m),d[l>>2]=d[t>>2],D=0|d[u>>2],e=0|d[c>>2],y=0,d[s>>2]=d[l>>2],e=0|_(40,0|s,0|g,0|D,0|e,0|i,0|r),D=y,y=0,!(1&D))return d[t>>2]=e,h&&xr(h),v&&xr(v),b=f,0|e;D=20}}while(0);20==(0|D)&&(e=0|ae()),h&&xr(h),v&&xr(v)}return de(0|e),0},va,va,va],As=[wa,function(e,t,i,r){t|=0,i|=0,r|=0,Wn(0|d[(r=(e|=0)+4|0)>>2],0|t,0|E(0|d[e+8>>2],i)),d[r>>2]=(0|d[r>>2])+(0|d[e+12>>2])},function(e,t,i,r){i|=0,r|=0,Wn(0|(t|=0),0|d[(r=(e|=0)+4|0)>>2],0|E(0|d[e+8>>2],i)),d[r>>2]=(0|d[r>>2])+(0|d[e+12>>2])},function(e,t,i,r){t|=0,i|=0,r|=0,i=0|E(0|d[(e|=0)+8>>2],i),e=0|d[e+4>>2],(0|rs[63&d[48+(0|d[e>>2])>>2]](e,t,i))!=(0|i)&&(r=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|r,3,35648),e=y,y=0,1&e?(e=0|ae(),re(0|r),de(0|e)):De(0|r,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0,c=0,u=0;o=b,b=b+16|0,a=o,s=0|d[(n=(e|=0)+8|0)>>2],r=0|E(s,i);do{if(r){for(c=e+4|0,l=r;s=0|d[c>>2],s=0|rs[63&d[32+(0|d[s>>2])>>2]](s,t,l);){if(r=l-s|0,(0|l)==(0|s)){u=11;break}l=r}if(11==(0|u)){s=0|d[n>>2],l=r;break}r=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|r,3,35648),e=y,y=0,1&e?(e=0|ae(),re(0|r),de(0|e)):De(0|r,824,96)}else l=0}while(0);2==(0|s)&&(ze(t,i<<1),s=0|d[n>>2]),(0|(r=0|d[e+12>>2]))<=(0|E(s,i))||(e=0|d[e+4>>2],as[15&d[16+(0|d[e>>2])>>2]](a,e,r-l|0,0,1,24)),b=o},function(e,t,i,r){e|=0,r|=0,i=(i|=0)+8|0,as[15&d[16+(0|d[(t|=0)>>2])>>2]](e,t,0|d[i>>2],0|d[i+4>>2],0,r)},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0;if(!(0|d[(n=(e|=0)+48|0)>>2]))return He(e,t,0|d[(s=e+52|0)>>2],i,r),void(d[s>>2]=(0|d[s>>2])+(0|d[12+(0|d[e+4>>2])>>2]));o=0|E(a=i<<1,0|d[16+(0|d[(l=e+4|0)>>2])>>2]),He(e,t,0|d[(s=e+20|0)>>2],i,r),t=0|d[l>>2],536870912==(0|d[t+28>>2])&&ze(0|d[s>>2],0|E(a,0|d[t+16>>2])),l=0|d[n>>2],(0|rs[63&d[48+(0|d[l>>2])>>2]](l,0|d[s>>2],o))!=(0|o)&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,3,35648),l=y,y=0,1&l?(l=0|ae(),re(0|t),de(0|l)):De(0|t,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+48>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;h=b,b=b+176|0,m=h+152|0,p=h+16|0,g=h,l=e+4|0,a=0|d[l>>2],u=r<<1,o=0|E(u,0|d[a+16>>2]);do{if(o){for(s=e+20|0;a=0|rs[63&d[32+(0|d[t>>2])>>2]](t,0|d[s>>2],o);){if((0|o)==(0|a)){c=26;break}o=o-a|0}if(26==(0|c)){a=0|d[l>>2];break}c=p+56|0,l=p+4|0,d[p>>2]=36160,d[c>>2]=36180,y=0,L(62,p+56|0,0|l),h=y,y=0,1&h&&(p=0|ae(),tn(c),de(0|p)),d[p+128>>2]=0,d[p+132>>2]=-1,d[p>>2]=36200,d[p+56>>2]=36220,y=0,P(180,0|l),h=y,y=0;do{if(1&h)a=0|ae();else{if(d[l>>2]=36236,d[(t=p+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[p+52>>2]=16,d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,y=0,L(63,0|l,0|m),h=y,y=0,1&h){a=0|ae(),qr(m),qr(t),an(l);break}qr(m),y=0,a=0|O(28,0|p,49029,57),m=y,y=0,!(1&m)&&(y=0,G(36,0|a,0),m=y,y=0,!(1&m))&&(s=0|ne(16),y=0,L(64,0|g,0|l),m=y,y=0,1&m?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|g),m=y,y=0,1&m?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(g),o||(g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g))),re(0|s),g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)),g=0|ae(),d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)}}while(0);p=a,tn(c),de(0|p)}}while(0);if(o=e+20|0,536870912!=(0|d[a+28>>2]))return Qe(e,p=0|d[o>>2],i,r,n),void(b=h);ze(0|d[o>>2],0|E(u,0|d[a+16>>2])),p=0|d[o>>2],Qe(e,p,i,r,n),b=h}(e,n,t,i,r):(Qe(e,0|d[(n=e+52|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0;if(!(0|d[(n=(e|=0)+48|0)>>2]))return We(e,t,0|d[(s=e+52|0)>>2],i,r),void(d[s>>2]=(0|d[s>>2])+(0|d[12+(0|d[e+4>>2])>>2]));o=0|E(a=i<<1,0|d[16+(0|d[(l=e+4|0)>>2])>>2]),We(e,t,0|d[(s=e+20|0)>>2],i,r),t=0|d[l>>2],536870912==(0|d[t+28>>2])&&ze(0|d[s>>2],0|E(a,0|d[t+16>>2])),l=0|d[n>>2],(0|rs[63&d[48+(0|d[l>>2])>>2]](l,0|d[s>>2],o))!=(0|o)&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,3,35648),l=y,y=0,1&l?(l=0|ae(),re(0|t),de(0|l)):De(0|t,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+48>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;h=b,b=b+176|0,m=h+152|0,p=h+16|0,g=h,l=e+4|0,a=0|d[l>>2],u=r<<1,o=0|E(u,0|d[a+16>>2]);do{if(o){for(s=e+20|0;a=0|rs[63&d[32+(0|d[t>>2])>>2]](t,0|d[s>>2],o);){if((0|o)==(0|a)){c=26;break}o=o-a|0}if(26==(0|c)){a=0|d[l>>2];break}c=p+56|0,l=p+4|0,d[p>>2]=36160,d[c>>2]=36180,y=0,L(62,p+56|0,0|l),h=y,y=0,1&h&&(p=0|ae(),tn(c),de(0|p)),d[p+128>>2]=0,d[p+132>>2]=-1,d[p>>2]=36200,d[p+56>>2]=36220,y=0,P(180,0|l),h=y,y=0;do{if(1&h)a=0|ae();else{if(d[l>>2]=36236,d[(t=p+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[p+52>>2]=16,d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,y=0,L(63,0|l,0|m),h=y,y=0,1&h){a=0|ae(),qr(m),qr(t),an(l);break}qr(m),y=0,a=0|O(28,0|p,49029,57),m=y,y=0,!(1&m)&&(y=0,G(36,0|a,0),m=y,y=0,!(1&m))&&(s=0|ne(16),y=0,L(64,0|g,0|l),m=y,y=0,1&m?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|g),m=y,y=0,1&m?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(g),o||(g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g))),re(0|s),g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)),g=0|ae(),d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)}}while(0);p=a,tn(c),de(0|p)}}while(0);if(o=e+20|0,536870912!=(0|d[a+28>>2]))return Ye(e,p=0|d[o>>2],i,r,n),void(b=h);ze(0|d[o>>2],0|E(u,0|d[a+16>>2])),p=0|d[o>>2],Ye(e,p,i,r,n),b=h}(e,n,t,i,r):(Ye(e,0|d[(n=e+52|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0;if(!(0|d[(n=(e|=0)+48|0)>>2]))return Ke(e,t,0|d[(s=e+52|0)>>2],i,r),void(d[s>>2]=(0|d[s>>2])+(0|d[12+(0|d[e+4>>2])>>2]));o=0|E(a=i<<1,0|d[16+(0|d[(l=e+4|0)>>2])>>2]),Ke(e,t,0|d[(s=e+20|0)>>2],i,r),t=0|d[l>>2],536870912==(0|d[t+28>>2])&&ze(0|d[s>>2],0|E(a,0|d[t+16>>2])),l=0|d[n>>2],(0|rs[63&d[48+(0|d[l>>2])>>2]](l,0|d[s>>2],o))!=(0|o)&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,3,35648),l=y,y=0,1&l?(l=0|ae(),re(0|t),de(0|l)):De(0|t,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+48>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;h=b,b=b+176|0,m=h+152|0,p=h+16|0,g=h,l=e+4|0,a=0|d[l>>2],u=r<<1,o=0|E(u,0|d[a+16>>2]);do{if(o){for(s=e+20|0;a=0|rs[63&d[32+(0|d[t>>2])>>2]](t,0|d[s>>2],o);){if((0|o)==(0|a)){c=26;break}o=o-a|0}if(26==(0|c)){a=0|d[l>>2];break}c=p+56|0,l=p+4|0,d[p>>2]=36160,d[c>>2]=36180,y=0,L(62,p+56|0,0|l),h=y,y=0,1&h&&(p=0|ae(),tn(c),de(0|p)),d[p+128>>2]=0,d[p+132>>2]=-1,d[p>>2]=36200,d[p+56>>2]=36220,y=0,P(180,0|l),h=y,y=0;do{if(1&h)a=0|ae();else{if(d[l>>2]=36236,d[(t=p+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[p+52>>2]=16,d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,y=0,L(63,0|l,0|m),h=y,y=0,1&h){a=0|ae(),qr(m),qr(t),an(l);break}qr(m),y=0,a=0|O(28,0|p,49029,57),m=y,y=0,!(1&m)&&(y=0,G(36,0|a,0),m=y,y=0,!(1&m))&&(s=0|ne(16),y=0,L(64,0|g,0|l),m=y,y=0,1&m?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|g),m=y,y=0,1&m?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(g),o||(g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g))),re(0|s),g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)),g=0|ae(),d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)}}while(0);p=a,tn(c),de(0|p)}}while(0);if(o=e+20|0,536870912!=(0|d[a+28>>2]))return Xe(e,p=0|d[o>>2],i,r,n),void(b=h);ze(0|d[o>>2],0|E(u,0|d[a+16>>2])),p=0|d[o>>2],Xe(e,p,i,r,n),b=h}(e,n,t,i,r):(Xe(e,0|d[(n=e+52|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0;if(!(0|d[(n=(e|=0)+36|0)>>2]))return Je(e,t,0|d[(s=e+40|0)>>2],i,r),void(d[s>>2]=(0|d[s>>2])+(0|d[12+(0|d[e+4>>2])>>2]));o=0|E(a=i<<1,0|d[16+(0|d[(l=e+4|0)>>2])>>2]),Je(e,t,0|d[(s=e+20|0)>>2],i,r),t=0|d[l>>2],536870912==(0|d[t+28>>2])&&ze(0|d[s>>2],0|E(a,0|d[t+16>>2])),l=0|d[n>>2],(0|rs[63&d[48+(0|d[l>>2])>>2]](l,0|d[s>>2],o))!=(0|o)&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,3,35648),l=y,y=0,1&l?(l=0|ae(),re(0|t),de(0|l)):De(0|t,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;h=b,b=b+176|0,m=h+152|0,p=h+16|0,g=h,l=e+4|0,a=0|d[l>>2],u=r<<1,o=0|E(u,0|d[a+16>>2]);do{if(o){for(s=e+20|0;a=0|rs[63&d[32+(0|d[t>>2])>>2]](t,0|d[s>>2],o);){if((0|o)==(0|a)){c=26;break}o=o-a|0}if(26==(0|c)){a=0|d[l>>2];break}c=p+56|0,l=p+4|0,d[p>>2]=36160,d[c>>2]=36180,y=0,L(62,p+56|0,0|l),h=y,y=0,1&h&&(p=0|ae(),tn(c),de(0|p)),d[p+128>>2]=0,d[p+132>>2]=-1,d[p>>2]=36200,d[p+56>>2]=36220,y=0,P(180,0|l),h=y,y=0;do{if(1&h)a=0|ae();else{if(d[l>>2]=36236,d[(t=p+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[p+52>>2]=16,d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,y=0,L(63,0|l,0|m),h=y,y=0,1&h){a=0|ae(),qr(m),qr(t),an(l);break}qr(m),y=0,a=0|O(28,0|p,49029,57),m=y,y=0,!(1&m)&&(y=0,G(36,0|a,0),m=y,y=0,!(1&m))&&(s=0|ne(16),y=0,L(64,0|g,0|l),m=y,y=0,1&m?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|g),m=y,y=0,1&m?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(g),o||(g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g))),re(0|s),g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)),g=0|ae(),d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)}}while(0);p=a,tn(c),de(0|p)}}while(0);if(o=e+20|0,536870912!=(0|d[a+28>>2]))return Ze(e,p=0|d[o>>2],i,r,n),void(b=h);ze(0|d[o>>2],0|E(u,0|d[a+16>>2])),p=0|d[o>>2],Ze(e,p,i,r,n),b=h}(e,n,t,i,r):(Ze(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0;if(!(0|d[(n=(e|=0)+36|0)>>2]))return et(e,t,0|d[(s=e+40|0)>>2],i,r),void(d[s>>2]=(0|d[s>>2])+(0|d[12+(0|d[e+4>>2])>>2]));o=0|E(a=i<<1,0|d[16+(0|d[(l=e+4|0)>>2])>>2]),et(e,t,0|d[(s=e+20|0)>>2],i,r),t=0|d[l>>2],536870912==(0|d[t+28>>2])&&ze(0|d[s>>2],0|E(a,0|d[t+16>>2])),l=0|d[n>>2],(0|rs[63&d[48+(0|d[l>>2])>>2]](l,0|d[s>>2],o))!=(0|o)&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,3,35648),l=y,y=0,1&l?(l=0|ae(),re(0|t),de(0|l)):De(0|t,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;h=b,b=b+176|0,m=h+152|0,p=h+16|0,g=h,l=e+4|0,a=0|d[l>>2],u=r<<1,o=0|E(u,0|d[a+16>>2]);do{if(o){for(s=e+20|0;a=0|rs[63&d[32+(0|d[t>>2])>>2]](t,0|d[s>>2],o);){if((0|o)==(0|a)){c=26;break}o=o-a|0}if(26==(0|c)){a=0|d[l>>2];break}c=p+56|0,l=p+4|0,d[p>>2]=36160,d[c>>2]=36180,y=0,L(62,p+56|0,0|l),h=y,y=0,1&h&&(p=0|ae(),tn(c),de(0|p)),d[p+128>>2]=0,d[p+132>>2]=-1,d[p>>2]=36200,d[p+56>>2]=36220,y=0,P(180,0|l),h=y,y=0;do{if(1&h)a=0|ae();else{if(d[l>>2]=36236,d[(t=p+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[p+52>>2]=16,d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,y=0,L(63,0|l,0|m),h=y,y=0,1&h){a=0|ae(),qr(m),qr(t),an(l);break}qr(m),y=0,a=0|O(28,0|p,49029,57),m=y,y=0,!(1&m)&&(y=0,G(36,0|a,0),m=y,y=0,!(1&m))&&(s=0|ne(16),y=0,L(64,0|g,0|l),m=y,y=0,1&m?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|g),m=y,y=0,1&m?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(g),o||(g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g))),re(0|s),g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)),g=0|ae(),d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)}}while(0);p=a,tn(c),de(0|p)}}while(0);if(o=e+20|0,536870912!=(0|d[a+28>>2]))return $e(e,p=0|d[o>>2],i,r,n),void(b=h);ze(0|d[o>>2],0|E(u,0|d[a+16>>2])),p=0|d[o>>2],$e(e,p,i,r,n),b=h}(e,n,t,i,r):($e(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0;if(!(0|d[(n=(e|=0)+36|0)>>2]))return it(e,t,0|d[(s=e+40|0)>>2],i,r),void(d[s>>2]=(0|d[s>>2])+(0|d[12+(0|d[e+4>>2])>>2]));o=0|E(a=i<<1,0|d[16+(0|d[(l=e+4|0)>>2])>>2]),it(e,t,0|d[(s=e+20|0)>>2],i,r),t=0|d[l>>2],536870912==(0|d[t+28>>2])&&ze(0|d[s>>2],0|E(a,0|d[t+16>>2])),l=0|d[n>>2],(0|rs[63&d[48+(0|d[l>>2])>>2]](l,0|d[s>>2],o))!=(0|o)&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,3,35648),l=y,y=0,1&l?(l=0|ae(),re(0|t),de(0|l)):De(0|t,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;h=b,b=b+176|0,m=h+152|0,p=h+16|0,g=h,l=e+4|0,a=0|d[l>>2],u=r<<1,o=0|E(u,0|d[a+16>>2]);do{if(o){for(s=e+20|0;a=0|rs[63&d[32+(0|d[t>>2])>>2]](t,0|d[s>>2],o);){if((0|o)==(0|a)){c=26;break}o=o-a|0}if(26==(0|c)){a=0|d[l>>2];break}c=p+56|0,l=p+4|0,d[p>>2]=36160,d[c>>2]=36180,y=0,L(62,p+56|0,0|l),h=y,y=0,1&h&&(p=0|ae(),tn(c),de(0|p)),d[p+128>>2]=0,d[p+132>>2]=-1,d[p>>2]=36200,d[p+56>>2]=36220,y=0,P(180,0|l),h=y,y=0;do{if(1&h)a=0|ae();else{if(d[l>>2]=36236,d[(t=p+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[p+52>>2]=16,d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,y=0,L(63,0|l,0|m),h=y,y=0,1&h){a=0|ae(),qr(m),qr(t),an(l);break}qr(m),y=0,a=0|O(28,0|p,49029,57),m=y,y=0,!(1&m)&&(y=0,G(36,0|a,0),m=y,y=0,!(1&m))&&(s=0|ne(16),y=0,L(64,0|g,0|l),m=y,y=0,1&m?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|g),m=y,y=0,1&m?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(g),o||(g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g))),re(0|s),g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)),g=0|ae(),d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)}}while(0);p=a,tn(c),de(0|p)}}while(0);if(o=e+20|0,536870912!=(0|d[a+28>>2]))return tt(e,p=0|d[o>>2],i,r,n),void(b=h);ze(0|d[o>>2],0|E(u,0|d[a+16>>2])),p=0|d[o>>2],tt(e,p,i,r,n),b=h}(e,n,t,i,r):(tt(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o,s=0,l=0;if(!(0|d[(n=(e|=0)+36|0)>>2]))return nt(e,t,0|d[(s=e+40|0)>>2],i,r),void(d[s>>2]=(0|d[s>>2])+(0|d[12+(0|d[e+4>>2])>>2]));o=0|E(a=i<<1,0|d[16+(0|d[(l=e+4|0)>>2])>>2]),nt(e,t,0|d[(s=e+20|0)>>2],i,r),t=0|d[l>>2],536870912==(0|d[t+28>>2])&&ze(0|d[s>>2],0|E(a,0|d[t+16>>2])),l=0|d[n>>2],(0|rs[63&d[48+(0|d[l>>2])>>2]](l,0|d[s>>2],o))!=(0|o)&&(t=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|t,3,35648),l=y,y=0,1&l?(l=0|ae(),re(0|t),de(0|l)):De(0|t,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0,p=0;h=b,b=b+176|0,m=h+152|0,p=h+16|0,g=h,l=e+4|0,a=0|d[l>>2],u=r<<1,o=0|E(u,0|d[a+16>>2]);do{if(o){for(s=e+20|0;a=0|rs[63&d[32+(0|d[t>>2])>>2]](t,0|d[s>>2],o);){if((0|o)==(0|a)){c=26;break}o=o-a|0}if(26==(0|c)){a=0|d[l>>2];break}c=p+56|0,l=p+4|0,d[p>>2]=36160,d[c>>2]=36180,y=0,L(62,p+56|0,0|l),h=y,y=0,1&h&&(p=0|ae(),tn(c),de(0|p)),d[p+128>>2]=0,d[p+132>>2]=-1,d[p>>2]=36200,d[p+56>>2]=36220,y=0,P(180,0|l),h=y,y=0;do{if(1&h)a=0|ae();else{if(d[l>>2]=36236,d[(t=p+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[p+52>>2]=16,d[m>>2]=0,d[m+4>>2]=0,d[m+8>>2]=0,y=0,L(63,0|l,0|m),h=y,y=0,1&h){a=0|ae(),qr(m),qr(t),an(l);break}qr(m),y=0,a=0|O(28,0|p,49029,57),m=y,y=0,!(1&m)&&(y=0,G(36,0|a,0),m=y,y=0,!(1&m))&&(s=0|ne(16),y=0,L(64,0|g,0|l),m=y,y=0,1&m?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|g),m=y,y=0,1&m?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(g),o||(g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g))),re(0|s),g=a,d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)),g=0|ae(),d[p>>2]=36200,d[c>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(c),de(0|g)}}while(0);p=a,tn(c),de(0|p)}}while(0);if(o=e+20|0,536870912!=(0|d[a+28>>2]))return rt(e,p=0|d[o>>2],i,r,n),void(b=h);ze(0|d[o>>2],0|E(u,0|d[a+16>>2])),p=0|d[o>>2],rt(e,p,i,r,n),b=h}(e,n,t,i,r):(rt(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0,o=0;if(!(0|d[(a=(e|=0)+36|0)>>2]))return Tt(e,t,0|d[(a=e+40|0)>>2],i,r),void(d[a>>2]=(0|d[a>>2])+(0|d[12+(0|d[e+4>>2])>>2]));n=0|E(0|d[16+(0|d[e+4>>2])>>2],i),Tt(e,t,0|d[(o=e+20|0)>>2],i,r),e=0|d[a>>2],(0|rs[63&d[48+(0|d[e>>2])>>2]](e,0|d[o>>2],n))!=(0|n)&&(a=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|a,3,35648),o=y,y=0,1&o?(o=0|ae(),re(0|a),de(0|o)):De(0|a,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;if(u=b,b=b+176|0,h=u+152|0,g=u+16|0,m=u,o=0|E(0|d[16+(0|d[e+4>>2])>>2],r),l=e+20|0,a=0|d[l>>2],!o)return wt(e,g=a,i,r,n),void(b=u);for(;s=0|rs[63&d[32+(0|d[t>>2])>>2]](t,a,o);){if(a=0|d[l>>2],(0|o)==(0|s)){c=26;break}o=o-s|0}if(26==(0|c))return wt(e,a,i,r,n),void(b=u);i=g+56|0,l=g+4|0,d[g>>2]=36160,d[i>>2]=36180,y=0,L(62,g+56|0,0|l),u=y,y=0,1&u&&(g=0|ae(),tn(i),de(0|g)),d[g+128>>2]=0,d[g+132>>2]=-1,d[g>>2]=36200,d[g+56>>2]=36220,y=0,P(180,0|l),u=y,y=0;do{if(1&u)a=0|ae();else{if(d[l>>2]=36236,d[(t=g+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[g+52>>2]=16,d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,y=0,L(63,0|l,0|h),u=y,y=0,1&u){a=0|ae(),qr(h),qr(t),an(l);break}qr(h),y=0,a=0|O(28,0|g,49029,57),h=y,y=0,!(1&h)&&(y=0,G(36,0|a,0),h=y,y=0,!(1&h))&&(s=0|ne(16),y=0,L(64,0|m,0|l),h=y,y=0,1&h?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|m),h=y,y=0,1&h?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(m),o||(m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m))),re(0|s),m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)),m=0|ae(),d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)}}while(0);g=a,tn(i),de(0|g)}(e,n,t,i,r):(wt(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0,o=0;if(!(0|d[(a=(e|=0)+36|0)>>2]))return Ct(e,t,0|d[(a=e+40|0)>>2],i,r),void(d[a>>2]=(0|d[a>>2])+(0|d[12+(0|d[e+4>>2])>>2]));n=0|E(0|d[16+(0|d[e+4>>2])>>2],i),Ct(e,t,0|d[(o=e+20|0)>>2],i,r),e=0|d[a>>2],(0|rs[63&d[48+(0|d[e>>2])>>2]](e,0|d[o>>2],n))!=(0|n)&&(a=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|a,3,35648),o=y,y=0,1&o?(o=0|ae(),re(0|a),de(0|o)):De(0|a,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;if(u=b,b=b+176|0,h=u+152|0,g=u+16|0,m=u,o=0|E(0|d[16+(0|d[e+4>>2])>>2],r),l=e+20|0,a=0|d[l>>2],!o)return yt(e,g=a,i,r,n),void(b=u);for(;s=0|rs[63&d[32+(0|d[t>>2])>>2]](t,a,o);){if(a=0|d[l>>2],(0|o)==(0|s)){c=26;break}o=o-s|0}if(26==(0|c))return yt(e,a,i,r,n),void(b=u);i=g+56|0,l=g+4|0,d[g>>2]=36160,d[i>>2]=36180,y=0,L(62,g+56|0,0|l),u=y,y=0,1&u&&(g=0|ae(),tn(i),de(0|g)),d[g+128>>2]=0,d[g+132>>2]=-1,d[g>>2]=36200,d[g+56>>2]=36220,y=0,P(180,0|l),u=y,y=0;do{if(1&u)a=0|ae();else{if(d[l>>2]=36236,d[(t=g+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[g+52>>2]=16,d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,y=0,L(63,0|l,0|h),u=y,y=0,1&u){a=0|ae(),qr(h),qr(t),an(l);break}qr(h),y=0,a=0|O(28,0|g,49029,57),h=y,y=0,!(1&h)&&(y=0,G(36,0|a,0),h=y,y=0,!(1&h))&&(s=0|ne(16),y=0,L(64,0|m,0|l),h=y,y=0,1&h?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|m),h=y,y=0,1&h?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(m),o||(m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m))),re(0|s),m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)),m=0|ae(),d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)}}while(0);g=a,tn(i),de(0|g)}(e,n,t,i,r):(yt(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0,o=0;if(!(0|d[(a=(e|=0)+36|0)>>2]))return Dt(e,t,0|d[(a=e+40|0)>>2],i,r),void(d[a>>2]=(0|d[a>>2])+(0|d[12+(0|d[e+4>>2])>>2]));n=0|E(0|d[16+(0|d[e+4>>2])>>2],i),Dt(e,t,0|d[(o=e+20|0)>>2],i,r),e=0|d[a>>2],(0|rs[63&d[48+(0|d[e>>2])>>2]](e,0|d[o>>2],n))!=(0|n)&&(a=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|a,3,35648),o=y,y=0,1&o?(o=0|ae(),re(0|a),de(0|o)):De(0|a,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;if(u=b,b=b+176|0,h=u+152|0,g=u+16|0,m=u,o=0|E(0|d[16+(0|d[e+4>>2])>>2],r),l=e+20|0,a=0|d[l>>2],!o)return It(e,g=a,i,r,n),void(b=u);for(;s=0|rs[63&d[32+(0|d[t>>2])>>2]](t,a,o);){if(a=0|d[l>>2],(0|o)==(0|s)){c=26;break}o=o-s|0}if(26==(0|c))return It(e,a,i,r,n),void(b=u);i=g+56|0,l=g+4|0,d[g>>2]=36160,d[i>>2]=36180,y=0,L(62,g+56|0,0|l),u=y,y=0,1&u&&(g=0|ae(),tn(i),de(0|g)),d[g+128>>2]=0,d[g+132>>2]=-1,d[g>>2]=36200,d[g+56>>2]=36220,y=0,P(180,0|l),u=y,y=0;do{if(1&u)a=0|ae();else{if(d[l>>2]=36236,d[(t=g+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[g+52>>2]=16,d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,y=0,L(63,0|l,0|h),u=y,y=0,1&u){a=0|ae(),qr(h),qr(t),an(l);break}qr(h),y=0,a=0|O(28,0|g,49029,57),h=y,y=0,!(1&h)&&(y=0,G(36,0|a,0),h=y,y=0,!(1&h))&&(s=0|ne(16),y=0,L(64,0|m,0|l),h=y,y=0,1&h?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|m),h=y,y=0,1&h?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(m),o||(m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m))),re(0|s),m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)),m=0|ae(),d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)}}while(0);g=a,tn(i),de(0|g)}(e,n,t,i,r):(It(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0,o=0;if(!(0|d[(a=(e|=0)+36|0)>>2]))return Et(e,t,0|d[(a=e+40|0)>>2],i,r),void(d[a>>2]=(0|d[a>>2])+(0|d[12+(0|d[e+4>>2])>>2]));n=0|E(0|d[16+(0|d[e+4>>2])>>2],i),Et(e,t,0|d[(o=e+20|0)>>2],i,r),e=0|d[a>>2],(0|rs[63&d[48+(0|d[e>>2])>>2]](e,0|d[o>>2],n))!=(0|n)&&(a=0|ne(16),!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,W(7,0|a,3,35648),o=y,y=0,1&o?(o=0|ae(),re(0|a),de(0|o)):De(0|a,824,96))},function(e,t,i,r){t|=0,i|=0,r|=0;var n=0;return(n=0|d[(e|=0)+36>>2])?void function(e,t,i,r,n){e|=0,t|=0,i|=0,r|=0,n|=0;var a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;if(u=b,b=b+176|0,h=u+152|0,g=u+16|0,m=u,o=0|E(0|d[16+(0|d[e+4>>2])>>2],r),l=e+20|0,a=0|d[l>>2],!o)return xt(e,g=a,i,r,n),void(b=u);for(;s=0|rs[63&d[32+(0|d[t>>2])>>2]](t,a,o);){if(a=0|d[l>>2],(0|o)==(0|s)){c=26;break}o=o-s|0}if(26==(0|c))return xt(e,a,i,r,n),void(b=u);i=g+56|0,l=g+4|0,d[g>>2]=36160,d[i>>2]=36180,y=0,L(62,g+56|0,0|l),u=y,y=0,1&u&&(g=0|ae(),tn(i),de(0|g)),d[g+128>>2]=0,d[g+132>>2]=-1,d[g>>2]=36200,d[g+56>>2]=36220,y=0,P(180,0|l),u=y,y=0;do{if(1&u)a=0|ae();else{if(d[l>>2]=36236,d[(t=g+36|0)>>2]=0,d[t+4>>2]=0,d[t+8>>2]=0,d[t+12>>2]=0,d[g+52>>2]=16,d[h>>2]=0,d[h+4>>2]=0,d[h+8>>2]=0,y=0,L(63,0|l,0|h),u=y,y=0,1&u){a=0|ae(),qr(h),qr(t),an(l);break}qr(h),y=0,a=0|O(28,0|g,49029,57),h=y,y=0,!(1&h)&&(y=0,G(36,0|a,0),h=y,y=0,!(1&h))&&(s=0|ne(16),y=0,L(64,0|m,0|l),h=y,y=0,1&h?a=0|ae():(!(0|f[8])&&0|te(8)&&(Ie(72,35648,0|T),oe(8)),y=0,j(36,0|s,3,35648,0|m),h=y,y=0,1&h?o=1:(y=0,W(6,0|s,824,96),y=0,o=0),a=0|ae(),qr(m),o||(m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m))),re(0|s),m=a,d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)),m=0|ae(),d[g>>2]=36200,d[i>>2]=36220,d[l>>2]=36236,qr(t),an(l),tn(i),de(0|m)}}while(0);g=a,tn(i),de(0|g)}(e,n,t,i,r):(xt(e,0|d[(n=e+40|0)>>2],t,i,r),void(d[n>>2]=(0|d[n>>2])+(0|d[12+(0|d[e+4>>2])>>2])))},function(e,t,i,r){i|=0,r|=0,(0|(e|=0))==(0|d[(t|=0)+8>>2])&&Qa(0,t,i,r)},function(e,t,i,r){i|=0,r|=0,(0|(e|=0))==(0|d[(t|=0)+8>>2])?Qa(0,t,i,r):(e=0|d[e+8>>2],As[63&d[28+(0|d[e>>2])>>2]](e,t,i,r))},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n=0,a=0;e:do{if((0|e)!=(0|d[t+8>>2])){if(n=e+16+((a=0|d[e+12>>2])<<3)|0,za(e+16|0,t,i,r),(0|a)>1){a=t+54|0,e=e+24|0;do{if(za(e,t,i,r),0|f[a|0])break e;e=e+8|0}while(e>>>0>>0)}}else Qa(0,t,i,r)}while(0)},function(e,t,i,r){t|=0,d[(t=e|=0)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,d[t+4>>2]=-1},function(e,t,i,r){t|=0,d[(t=e|=0)>>2]=0,d[t+4>>2]=0,d[(t=e+8|0)>>2]=-1,d[t+4>>2]=-1},function(e,t,i,r){(function(e,t,i){e|=0;var r,n=0,a=0,o=0;if((n=(i|=0)-(r=t|=0)|0)>>>0>4294967279&&_a(e),n>>>0<11?(f[0|e]=n<<1,a=e+1|0):(a=0|Oa(o=n+16&-16),d[e+8>>2]=a,d[e>>2]=1|o,d[e+4>>2]=n),e=i-r|0,(0|t)!=(0|i))for(n=a;f[0|n]=0|f[0|t],(0|(t=t+1|0))!=(0|i);)n=n+1|0;f[a+e|0]=0})(e|=0,i|=0,r|=0)},function(e,t,i,r){(function(e,t,i){e|=0;var r,n=0,a=0,o=0;if((a=(n=(i|=0)-(r=t|=0)|0)>>2)>>>0>1073741807&&_a(e),a>>>0<2?(f[0|e]=n>>>1,e=e+4|0):(n=0|Oa((o=a+4&-4)<<2),d[e+8>>2]=n,d[e>>2]=1|o,d[e+4>>2]=a,e=n),a=(i-r|0)>>>2,(0|t)!=(0|i))for(n=e;d[n>>2]=d[t>>2],(0|(t=t+4|0))!=(0|i);)n=n+4|0;d[e+(a<<2)>>2]=0})(e|=0,i|=0,r|=0)},function(e,t,i,r){i|=0,r|=0;var n,a,o,s,l,c,u,f,h=0,m=0,g=0,p=0,A=0;switch(s=b,b=b+112|0,m=s+96|0,o=s+84|0,l=s+72|0,c=s+60|0,u=s+48|0,g=s+36|0,f=s+24|0,p=s+12|0,A=s,!(0|(e|=0))&(a=!(0|(t|=0)))&&(h=0|ne(16),y=0,W(5,0|m,48504,52),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|m),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(m),e||de(0|(A=t))),re(0|h),de(0|(A=t))),((n=0|d[r>>2])+-1|0)>>>0>65534&&(h=0|ne(16),y=0,W(5,0|o,48557,41),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|o),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(o),e||de(0|(A=t))),re(0|h),de(0|(A=t))),((m=0|d[r+4>>2])+-1|0)>>>0>65534&&(h=0|ne(16),y=0,W(5,0|l,48599,42),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|l),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(l),e||de(0|(A=t))),re(0|h),de(0|(A=t))),((h=0|d[r+8>>2])+-2|0)>>>0>14&&(h=0|ne(16),y=0,W(5,0|c,48642,46),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|c),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(c),e||de(0|(A=t))),re(0|h),de(0|(A=t))),(e=0|d[r+24>>2])>>>0>=3&&(h=0|ne(16),y=0,W(5,0|u,48689,65),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|u),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(u),e||de(0|(A=t))),re(0|h),de(0|(A=t))),((t=0|d[r+16>>2])+-1|0)>>>0>254&&(h=0|ne(16),y=0,W(5,0|g,48755,44),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|g),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(g),e||de(0|(A=t))),re(0|h),de(0|(A=t))),!a&&(g=0|E(m,n),(0|E(0|E(g,(0|h)>8?2:1),t))>>>0>i>>>0)&&(h=0|ne(16),y=0,W(5,0|f,48800,58),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|f),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(f),e||de(0|(A=t))),re(0|h),de(0|(A=t))),0|t){case 4:if(2!=(0|e))return void(b=s);h=0|ne(16),y=0,W(5,0|p,48859,73),A=y,y=0,1&A?t=0|ae():(y=0,t=0|H(1),A=y,y=0,1&A||(y=0,j(36,0|h,1,0|t,0|p),A=y,y=0,1&A)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(p),e||de(0|(A=t))),re(0|h),de(0|(A=t));case 3:return void(b=s);default:if(!e)return void(b=s);h=0|ne(16),y=0,W(5,0|A,48933,73),p=y,y=0,1&p?t=0|ae():(y=0,t=0|H(1),p=y,y=0,1&p||(y=0,j(36,0|h,1,0|t,0|A),p=y,y=0,1&p)?e=1:(y=0,W(6,0|h,824,96),y=0,e=0),t=0|ae(),qr(A),e||de(0|(A=t))),re(0|h),de(0|(A=t))}},function(e,t,i,r){e|=0,t|=0,i|=0,r|=0;var n,a,o=0,s=0;n=b,b=b+48|0,o=n+24|0,a=n,d[(s=n+16|0)>>2]=t,d[s+4>>2]=i,Or(a,r),y=0,W(10,0|o,0|s,0|a),r=y,y=0;do{if(!(1&r)){if(y=0,L(87,0|e,0|o),s=y,y=0,1&s){s=0|ae(),qr(o),o=s;break}return qr(o),qr(a),d[e>>2]=42664,d[e+8>>2]=t,d[e+12>>2]=i,void(b=n)}o=0|ae()}while(0);qr(a),de(0|o)},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0;d[(e|=0)>>2]=36460,d[e+4>>2]=i,a=e+8|0,s=0|d[i>>2],r=0|d[(n=i+16|0)>>2],l=0|E(r,s),d[a>>2]=0,d[(m=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(l){if((0|l)<0&&(y=0,P(178,0|a),s=y,y=0,1&s)||(h=4),4==(0|h)&&(y=0,u=0|N(67,0|(c=l<<1)),s=y,y=0,!(1&s))){d[a>>2]=u,s=u+(l<<1)|0,d[e+16>>2]=s,zn(0|u,0,0|c),d[m>>2]=s,s=0|d[i>>2],r=0|d[n>>2];break}l=0|ae(),r=o=0|d[a>>2],o&&((0|(s=0|d[m>>2]))!=(0|o)&&(d[m>>2]=s+(~((s+-2-r|0)>>>1)<<1)),Ba(o)),de(0|(m=l))}}while(0);if(l=e+20|0,r=0|E(s<<1,r),d[l>>2]=0,d[(c=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(h=13),13==(0|h)&&(y=0,o=0|N(67,0|r),h=y,y=0,!(1&h))){d[c>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[c>>2])|0,d[c>>2]=o,r=r+-1|0}while(0|r);return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2])}s=0|ae(),(o=0|d[l>>2])&&((0|d[c>>2])!=(0|o)&&(d[c>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(m=s)),(0|(r=0|d[m>>2]))!=(0|o)&&(d[m>>2]=r+(~((r+-2-o|0)>>>1)<<1)),Ba(o),de(0|(m=s))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0;d[(e|=0)>>2]=36436,d[e+4>>2]=i,a=e+8|0,s=0|d[i>>2],r=0|d[(n=i+16|0)>>2],l=0|E(r,s),d[a>>2]=0,d[(m=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(l){if((0|l)<0&&(y=0,P(178,0|a),s=y,y=0,1&s)||(h=4),4==(0|h)&&(y=0,u=0|N(67,0|(c=l<<1)),s=y,y=0,!(1&s))){d[a>>2]=u,s=u+(l<<1)|0,d[e+16>>2]=s,zn(0|u,0,0|c),d[m>>2]=s,s=0|d[i>>2],r=0|d[n>>2];break}l=0|ae(),r=o=0|d[a>>2],o&&((0|(s=0|d[m>>2]))!=(0|o)&&(d[m>>2]=s+(~((s+-2-r|0)>>>1)<<1)),Ba(o)),de(0|(m=l))}}while(0);if(l=e+20|0,r=0|E(s<<1,r),d[l>>2]=0,d[(c=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(h=13),13==(0|h)&&(y=0,o=0|N(67,0|r),h=y,y=0,!(1&h))){d[c>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[c>>2])|0,d[c>>2]=o,r=r+-1|0}while(0|r);return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2])}s=0|ae(),(o=0|d[l>>2])&&((0|d[c>>2])!=(0|o)&&(d[c>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(m=s)),(0|(r=0|d[m>>2]))!=(0|o)&&(d[m>>2]=r+(~((r+-2-o|0)>>>1)<<1)),Ba(o),de(0|(m=s))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0;d[(e|=0)>>2]=36412,d[e+4>>2]=i,a=e+8|0,s=0|d[i>>2],r=0|d[(n=i+16|0)>>2],l=0|E(r,s),d[a>>2]=0,d[(m=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(l){if((0|l)<0&&(y=0,P(178,0|a),s=y,y=0,1&s)||(h=4),4==(0|h)&&(y=0,u=0|N(67,0|(c=l<<1)),s=y,y=0,!(1&s))){d[a>>2]=u,s=u+(l<<1)|0,d[e+16>>2]=s,zn(0|u,0,0|c),d[m>>2]=s,s=0|d[i>>2],r=0|d[n>>2];break}l=0|ae(),r=o=0|d[a>>2],o&&((0|(s=0|d[m>>2]))!=(0|o)&&(d[m>>2]=s+(~((s+-2-r|0)>>>1)<<1)),Ba(o)),de(0|(m=l))}}while(0);if(l=e+20|0,r=0|E(s<<1,r),d[l>>2]=0,d[(c=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(h=13),13==(0|h)&&(y=0,o=0|N(67,0|r),h=y,y=0,!(1&h))){d[c>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[c>>2])|0,d[c>>2]=o,r=r+-1|0}while(0|r);return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2])}s=0|ae(),(o=0|d[l>>2])&&((0|d[c>>2])!=(0|o)&&(d[c>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(m=s)),(0|(r=0|d[m>>2]))!=(0|o)&&(d[m>>2]=r+(~((r+-2-o|0)>>>1)<<1)),Ba(o),de(0|(m=s))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0,m=0;d[(e|=0)>>2]=36388,d[e+4>>2]=i,a=e+8|0,s=0|d[i>>2],r=0|d[(n=i+16|0)>>2],l=0|E(r,s),d[a>>2]=0,d[(m=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(l){if((0|l)<0&&(y=0,P(178,0|a),s=y,y=0,1&s)||(h=4),4==(0|h)&&(y=0,u=0|N(67,0|(c=l<<1)),s=y,y=0,!(1&s))){d[a>>2]=u,s=u+(l<<1)|0,d[e+16>>2]=s,zn(0|u,0,0|c),d[m>>2]=s,s=0|d[i>>2],r=0|d[n>>2];break}l=0|ae(),r=o=0|d[a>>2],o&&((0|(s=0|d[m>>2]))!=(0|o)&&(d[m>>2]=s+(~((s+-2-r|0)>>>1)<<1)),Ba(o)),de(0|(m=l))}}while(0);if(l=e+20|0,r=0|E(s<<1,r),d[l>>2]=0,d[(c=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(h=13),13==(0|h)&&(y=0,o=0|N(67,0|r),h=y,y=0,!(1&h))){d[c>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[c>>2])|0,d[c>>2]=o,r=r+-1|0}while(0|r);return d[(m=e+36|0)>>2]=d[t>>2],d[m+4>>2]=d[t+4>>2],void(d[m+8>>2]=d[t+8>>2])}s=0|ae(),(o=0|d[l>>2])&&((0|d[c>>2])!=(0|o)&&(d[c>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(m=s)),(0|(r=0|d[m>>2]))!=(0|o)&&(d[m>>2]=r+(~((r+-2-o|0)>>>1)<<1)),Ba(o),de(0|(m=s))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;d[(e|=0)>>2]=36364,d[e+4>>2]=i,m=e+8|0,s=0|d[i>>2],o=0|d[(u=i+16|0)>>2],n=0|E(o,s),d[m>>2]=0,d[(g=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(n){if((0|n)<0&&(y=0,P(178,0|m),s=y,y=0,1&s)||(h=4),4==(0|h)&&(y=0,c=0|N(67,0|(l=n<<1)),s=y,y=0,!(1&s))){d[m>>2]=c,s=c+(n<<1)|0,d[e+16>>2]=s,zn(0|c,0,0|l),d[g>>2]=s,s=0|d[i>>2],o=0|d[u>>2];break}l=0|ae(),o=a=0|d[m>>2],a&&((0|(s=0|d[g>>2]))!=(0|a)&&(d[g>>2]=s+(~((s+-2-o|0)>>>1)<<1)),Ba(a)),de(0|(g=l))}}while(0);if(l=e+20|0,o=0|E(s<<1,o),d[l>>2]=0,d[(c=e+24|0)>>2]=0,d[e+28>>2]=0,!o)return g=e+32|0,m=0|d[(m=r)>>2],r=0|d[(r=r+4|0)>>2],d[(h=g)>>2]=m,d[(g=g+4|0)>>2]=r,d[(g=e+40|0)>>2]=m,d[(g=e+48|0)>>2]=d[t>>2],d[g+4>>2]=d[t+4>>2],void(d[g+8>>2]=d[t+8>>2]);if((0|o)<0&&(y=0,P(178,0|l),u=y,y=0,1&u)||(h=13),13==(0|h)&&(y=0,a=0|N(67,0|o),h=y,y=0,!(1&h))){d[c>>2]=a,d[l>>2]=a,d[e+28>>2]=a+o;do{f[a|0]=0,a=1+(0|d[c>>2])|0,d[c>>2]=a,o=o+-1|0}while(0|o);return g=e+32|0,m=0|d[(m=r)>>2],r=0|d[(r=r+4|0)>>2],d[(h=g)>>2]=m,d[(g=g+4|0)>>2]=r,d[(g=e+40|0)>>2]=m,d[(g=e+48|0)>>2]=d[t>>2],d[g+4>>2]=d[t+4>>2],void(d[g+8>>2]=d[t+8>>2])}s=0|ae(),(a=0|d[l>>2])&&((0|d[c>>2])!=(0|a)&&(d[c>>2]=a),Ba(a)),(a=0|d[m>>2])||de(0|(g=s)),(0|(o=0|d[g>>2]))!=(0|a)&&(d[g>>2]=o+(~((o+-2-a|0)>>>1)<<1)),Ba(a),de(0|(g=s))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;d[(e|=0)>>2]=36340,d[e+4>>2]=i,m=e+8|0,s=0|d[i>>2],o=0|d[(u=i+16|0)>>2],n=0|E(o,s),d[m>>2]=0,d[(g=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(n){if((0|n)<0&&(y=0,P(178,0|m),s=y,y=0,1&s)||(h=4),4==(0|h)&&(y=0,c=0|N(67,0|(l=n<<1)),s=y,y=0,!(1&s))){d[m>>2]=c,s=c+(n<<1)|0,d[e+16>>2]=s,zn(0|c,0,0|l),d[g>>2]=s,s=0|d[i>>2],o=0|d[u>>2];break}l=0|ae(),o=a=0|d[m>>2],a&&((0|(s=0|d[g>>2]))!=(0|a)&&(d[g>>2]=s+(~((s+-2-o|0)>>>1)<<1)),Ba(a)),de(0|(g=l))}}while(0);if(l=e+20|0,o=0|E(s<<1,o),d[l>>2]=0,d[(c=e+24|0)>>2]=0,d[e+28>>2]=0,!o)return g=e+32|0,m=0|d[(m=r)>>2],r=0|d[(r=r+4|0)>>2],d[(h=g)>>2]=m,d[(g=g+4|0)>>2]=r,d[(g=e+40|0)>>2]=m,d[(g=e+48|0)>>2]=d[t>>2],d[g+4>>2]=d[t+4>>2],void(d[g+8>>2]=d[t+8>>2]);if((0|o)<0&&(y=0,P(178,0|l),u=y,y=0,1&u)||(h=13),13==(0|h)&&(y=0,a=0|N(67,0|o),h=y,y=0,!(1&h))){d[c>>2]=a,d[l>>2]=a,d[e+28>>2]=a+o;do{f[a|0]=0,a=1+(0|d[c>>2])|0,d[c>>2]=a,o=o+-1|0}while(0|o);return g=e+32|0,m=0|d[(m=r)>>2],r=0|d[(r=r+4|0)>>2],d[(h=g)>>2]=m,d[(g=g+4|0)>>2]=r,d[(g=e+40|0)>>2]=m,d[(g=e+48|0)>>2]=d[t>>2],d[g+4>>2]=d[t+4>>2],void(d[g+8>>2]=d[t+8>>2])}s=0|ae(),(a=0|d[l>>2])&&((0|d[c>>2])!=(0|a)&&(d[c>>2]=a),Ba(a)),(a=0|d[m>>2])||de(0|(g=s)),(0|(o=0|d[g>>2]))!=(0|a)&&(d[g>>2]=o+(~((o+-2-a|0)>>>1)<<1)),Ba(a),de(0|(g=s))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a=0,o=0,s=0,l=0,c=0,u=0,h=0,m=0,g=0;d[(e|=0)>>2]=36316,d[e+4>>2]=i,m=e+8|0,s=0|d[i>>2],o=0|d[(u=i+16|0)>>2],n=0|E(o,s),d[m>>2]=0,d[(g=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(n){if((0|n)<0&&(y=0,P(178,0|m),s=y,y=0,1&s)||(h=4),4==(0|h)&&(y=0,c=0|N(67,0|(l=n<<1)),s=y,y=0,!(1&s))){d[m>>2]=c,s=c+(n<<1)|0,d[e+16>>2]=s,zn(0|c,0,0|l),d[g>>2]=s,s=0|d[i>>2],o=0|d[u>>2];break}l=0|ae(),o=a=0|d[m>>2],a&&((0|(s=0|d[g>>2]))!=(0|a)&&(d[g>>2]=s+(~((s+-2-o|0)>>>1)<<1)),Ba(a)),de(0|(g=l))}}while(0);if(l=e+20|0,o=0|E(s<<1,o),d[l>>2]=0,d[(c=e+24|0)>>2]=0,d[e+28>>2]=0,!o)return g=e+32|0,m=0|d[(m=r)>>2],r=0|d[(r=r+4|0)>>2],d[(h=g)>>2]=m,d[(g=g+4|0)>>2]=r,d[(g=e+40|0)>>2]=m,d[(g=e+48|0)>>2]=d[t>>2],d[g+4>>2]=d[t+4>>2],void(d[g+8>>2]=d[t+8>>2]);if((0|o)<0&&(y=0,P(178,0|l),u=y,y=0,1&u)||(h=13),13==(0|h)&&(y=0,a=0|N(67,0|o),h=y,y=0,!(1&h))){d[c>>2]=a,d[l>>2]=a,d[e+28>>2]=a+o;do{f[a|0]=0,a=1+(0|d[c>>2])|0,d[c>>2]=a,o=o+-1|0}while(0|o);return g=e+32|0,m=0|d[(m=r)>>2],r=0|d[(r=r+4|0)>>2],d[(h=g)>>2]=m,d[(g=g+4|0)>>2]=r,d[(g=e+40|0)>>2]=m,d[(g=e+48|0)>>2]=d[t>>2],d[g+4>>2]=d[t+4>>2],void(d[g+8>>2]=d[t+8>>2])}s=0|ae(),(a=0|d[l>>2])&&((0|d[c>>2])!=(0|a)&&(d[c>>2]=a),Ba(a)),(a=0|d[m>>2])||de(0|(g=s)),(0|(o=0|d[g>>2]))!=(0|a)&&(d[g>>2]=o+(~((o+-2-a|0)>>>1)<<1)),Ba(a),de(0|(g=s))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0;d[(e|=0)>>2]=36712,d[e+4>>2]=i,a=e+8|0,r=0|d[i>>2],l=0|d[(n=i+16|0)>>2],s=0|E(l,r),d[a>>2]=0,d[(h=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(s){if((0|s)<0&&(y=0,P(178,0|a),l=y,y=0,1&l)||(u=4),4==(0|u)&&(y=0,c=0|N(67,0|s),l=y,y=0,!(1&l))){d[h>>2]=c,d[a>>2]=c,d[e+16>>2]=c+s,r=c;do{f[r|0]=0,r=1+(0|d[h>>2])|0,d[h>>2]=r,s=s+-1|0}while(0|s);s=0|d[n>>2],r=0|d[i>>2];break}r=0|ae(),(o=0|d[a>>2])&&((0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o)),de(0|(h=r))}else s=l}while(0);if(l=e+20|0,r=0|E(s,r),d[l>>2]=0,d[(s=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(u=15),15==(0|u)&&(y=0,o=0|N(67,0|r),u=y,y=0,!(1&u))){d[s>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[s>>2])|0,d[s>>2]=o,r=r+-1|0}while(0|r);return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2])}r=0|ae(),(o=0|d[l>>2])&&((0|d[s>>2])!=(0|o)&&(d[s>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(h=r)),(0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o),de(0|(h=r))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0;d[(e|=0)>>2]=36688,d[e+4>>2]=i,a=e+8|0,r=0|d[i>>2],l=0|d[(n=i+16|0)>>2],s=0|E(l,r),d[a>>2]=0,d[(h=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(s){if((0|s)<0&&(y=0,P(178,0|a),l=y,y=0,1&l)||(u=4),4==(0|u)&&(y=0,c=0|N(67,0|s),l=y,y=0,!(1&l))){d[h>>2]=c,d[a>>2]=c,d[e+16>>2]=c+s,r=c;do{f[r|0]=0,r=1+(0|d[h>>2])|0,d[h>>2]=r,s=s+-1|0}while(0|s);s=0|d[n>>2],r=0|d[i>>2];break}r=0|ae(),(o=0|d[a>>2])&&((0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o)),de(0|(h=r))}else s=l}while(0);if(l=e+20|0,r=0|E(s,r),d[l>>2]=0,d[(s=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(u=15),15==(0|u)&&(y=0,o=0|N(67,0|r),u=y,y=0,!(1&u))){d[s>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[s>>2])|0,d[s>>2]=o,r=r+-1|0}while(0|r);return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2])}r=0|ae(),(o=0|d[l>>2])&&((0|d[s>>2])!=(0|o)&&(d[s>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(h=r)),(0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o),de(0|(h=r))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0;d[(e|=0)>>2]=36664,d[e+4>>2]=i,a=e+8|0,r=0|d[i>>2],l=0|d[(n=i+16|0)>>2],s=0|E(l,r),d[a>>2]=0,d[(h=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(s){if((0|s)<0&&(y=0,P(178,0|a),l=y,y=0,1&l)||(u=4),4==(0|u)&&(y=0,c=0|N(67,0|s),l=y,y=0,!(1&l))){d[h>>2]=c,d[a>>2]=c,d[e+16>>2]=c+s,r=c;do{f[r|0]=0,r=1+(0|d[h>>2])|0,d[h>>2]=r,s=s+-1|0}while(0|s);s=0|d[n>>2],r=0|d[i>>2];break}r=0|ae(),(o=0|d[a>>2])&&((0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o)),de(0|(h=r))}else s=l}while(0);if(l=e+20|0,r=0|E(s,r),d[l>>2]=0,d[(s=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(u=15),15==(0|u)&&(y=0,o=0|N(67,0|r),u=y,y=0,!(1&u))){d[s>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[s>>2])|0,d[s>>2]=o,r=r+-1|0}while(0|r);return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2])}r=0|ae(),(o=0|d[l>>2])&&((0|d[s>>2])!=(0|o)&&(d[s>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(h=r)),(0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o),de(0|(h=r))},function(e,t,i,r){t|=0,i|=0,r|=0;var n,a,o=0,s=0,l=0,c=0,u=0,h=0;d[(e|=0)>>2]=36640,d[e+4>>2]=i,a=e+8|0,r=0|d[i>>2],l=0|d[(n=i+16|0)>>2],s=0|E(l,r),d[a>>2]=0,d[(h=e+12|0)>>2]=0,d[e+16>>2]=0;do{if(s){if((0|s)<0&&(y=0,P(178,0|a),l=y,y=0,1&l)||(u=4),4==(0|u)&&(y=0,c=0|N(67,0|s),l=y,y=0,!(1&l))){d[h>>2]=c,d[a>>2]=c,d[e+16>>2]=c+s,r=c;do{f[r|0]=0,r=1+(0|d[h>>2])|0,d[h>>2]=r,s=s+-1|0}while(0|s);s=0|d[n>>2],r=0|d[i>>2];break}r=0|ae(),(o=0|d[a>>2])&&((0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o)),de(0|(h=r))}else s=l}while(0);if(l=e+20|0,r=0|E(s,r),d[l>>2]=0,d[(s=e+24|0)>>2]=0,d[e+28>>2]=0,!r)return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2]);if((0|r)<0&&(y=0,P(178,0|l),i=y,y=0,1&i)||(u=15),15==(0|u)&&(y=0,o=0|N(67,0|r),u=y,y=0,!(1&u))){d[s>>2]=o,d[l>>2]=o,d[e+28>>2]=o+r;do{f[o|0]=0,o=1+(0|d[s>>2])|0,d[s>>2]=o,r=r+-1|0}while(0|r);return d[(h=e+36|0)>>2]=d[t>>2],d[h+4>>2]=d[t+4>>2],void(d[h+8>>2]=d[t+8>>2])}r=0|ae(),(o=0|d[l>>2])&&((0|d[s>>2])!=(0|o)&&(d[s>>2]=o),Ba(o)),(o=0|d[a>>2])||de(0|(h=r)),(0|d[h>>2])!=(0|o)&&(d[h>>2]=o),Ba(o),de(0|(h=r))},wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa,wa];return{_jpegls_encode:function(e,t,i,r,n,a,o,s,l){e|=0,t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0;var c,u,f,h=0;u=b,b=b+96|0,o=u,f=(h=c=u+4|0)+84|0;do{d[h>>2]=0,h=h+4|0}while((0|h)<(0|f));return d[c+16>>2]=a,d[c+8>>2]=n,d[c>>2]=i,d[c+4>>2]=r,i=0|Dr(t),d[s>>2]=i,d[o>>2]=0,i=0|Oe(s,t,o,e,t,c,0),d[l>>2]=d[o>>2],b=u,0|i},___cxa_can_catch:function(e,t,i){var r,n;return e|=0,t|=0,i|=0,n=b,b=b+16|0,d[(r=n)>>2]=d[i>>2],(e=0|rs[63&d[16+(0|d[e>>2])>>2]](e,t,r))&&(d[i>>2]=d[r>>2]),b=n,1&e},_free:xr,_jpegls_decode:function(e,t,i,r,n,a,o,s,l,c,u){i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0;var h,m,g=0,p=0,A=0,S=0,v=0;return m=b,b=b+96|0,(g=0|Be(e|=0,t|=0,h=m,0))?(b=m,0|(n=g)):(f[h+32|0]=0,A=0|d[h+8>>2],v=0|d[h>>2],S=0|d[h+4>>2],g=0|E(S,v),p=0|d[h+16>>2],g=0|E(0|E(g,(0|A)<9?1:2),p),d[r>>2]=g,g=0|Dr(g),d[i>>2]=g,d[n>>2]=v,d[a>>2]=S,d[o>>2]=A,d[s>>2]=d[h+12>>2],d[l>>2]=p,d[c>>2]=d[h+20>>2],d[u>>2]=d[h+24>>2],n=0|Ve(g,0|d[r>>2],e,t,0,0),b=m,0|n)},___cxa_is_pointer_type:function(e){return 1&(e=(e|=0)?!!(0|Ha(e,656,704,0)):0)},_i64Add:Hn,_memmove:Kn,_i64Subtract:Qn,_memset:zn,_malloc:Dr,_memcpy:Wn,_bitshift64Lshr:Yn,_bitshift64Shl:Xn,__GLOBAL__I_000101:function(){kr(0),Ie(187,56757,0|T)},__GLOBAL__sub_I_jpegls_cpp:function(){var e=0,t=0,i=0,r=0,n=0,a=0,o=0;e=2832;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(4880!=(0|e));zn(2832,0,2048),e=0;do{d[(o=2832+(e+128<<3)|0)>>2]=0,d[o+4>>2]=1,e=e+1|0}while(128!=(0|e));d[(e=3088)>>2]=1,d[e+4>>2]=3,d[(e=3096)>>2]=1,d[e+4>>2]=3,d[(e=3104)>>2]=1,d[e+4>>2]=3,d[(e=3112)>>2]=1,d[e+4>>2]=3,d[(e=3120)>>2]=1,d[e+4>>2]=3,d[(e=3128)>>2]=1,d[e+4>>2]=3,d[(e=3136)>>2]=1,d[e+4>>2]=3,d[(e=3144)>>2]=1,d[e+4>>2]=3,d[(e=3152)>>2]=1,d[e+4>>2]=3,d[(e=3160)>>2]=1,d[e+4>>2]=3,d[(e=3168)>>2]=1,d[e+4>>2]=3,d[(e=3176)>>2]=1,d[e+4>>2]=3,d[(e=3184)>>2]=1,d[e+4>>2]=3,d[(e=3192)>>2]=1,d[e+4>>2]=3,d[(e=3200)>>2]=1,d[e+4>>2]=3,d[(e=3208)>>2]=1,d[e+4>>2]=3,d[(e=3216)>>2]=1,d[e+4>>2]=3,d[(e=3224)>>2]=1,d[e+4>>2]=3,d[(e=3232)>>2]=1,d[e+4>>2]=3,d[(e=3240)>>2]=1,d[e+4>>2]=3,d[(e=3248)>>2]=1,d[e+4>>2]=3,d[(e=3256)>>2]=1,d[e+4>>2]=3,d[(e=3264)>>2]=1,d[e+4>>2]=3,d[(e=3272)>>2]=1,d[e+4>>2]=3,d[(e=3280)>>2]=1,d[e+4>>2]=3,d[(e=3288)>>2]=1,d[e+4>>2]=3,d[(e=3296)>>2]=1,d[e+4>>2]=3,d[(e=3304)>>2]=1,d[e+4>>2]=3,d[(e=3312)>>2]=1,d[e+4>>2]=3,d[(e=3320)>>2]=1,d[e+4>>2]=3,d[(e=3328)>>2]=1,d[e+4>>2]=3,d[(e=3336)>>2]=1,d[e+4>>2]=3,d[(e=2896)>>2]=2,d[e+4>>2]=5,d[(e=2904)>>2]=2,d[e+4>>2]=5,d[(e=2912)>>2]=2,d[e+4>>2]=5,d[(e=2920)>>2]=2,d[e+4>>2]=5,d[(e=2928)>>2]=2,d[e+4>>2]=5,d[(e=2936)>>2]=2,d[e+4>>2]=5,d[(e=2944)>>2]=2,d[e+4>>2]=5,d[(e=2952)>>2]=2,d[e+4>>2]=5,d[(e=2848)>>2]=3,d[e+4>>2]=7,d[(e=2856)>>2]=3,d[e+4>>2]=7,e=0;do{d[(o=2832+(e+64<<3)|0)>>2]=-1,d[o+4>>2]=2,e=e+1|0}while(64!=(0|e));d[(e=2960)>>2]=-2,d[e+4>>2]=4,d[(e=2968)>>2]=-2,d[e+4>>2]=4,d[(e=2976)>>2]=-2,d[e+4>>2]=4,d[(e=2984)>>2]=-2,d[e+4>>2]=4,d[(e=2992)>>2]=-2,d[e+4>>2]=4,d[(e=3e3)>>2]=-2,d[e+4>>2]=4,d[(e=3008)>>2]=-2,d[e+4>>2]=4,d[(e=3016)>>2]=-2,d[e+4>>2]=4,d[(e=3024)>>2]=-2,d[e+4>>2]=4,d[(e=3032)>>2]=-2,d[e+4>>2]=4,d[(e=3040)>>2]=-2,d[e+4>>2]=4,d[(e=3048)>>2]=-2,d[e+4>>2]=4,d[(e=3056)>>2]=-2,d[e+4>>2]=4,d[(e=3064)>>2]=-2,d[e+4>>2]=4,d[(e=3072)>>2]=-2,d[e+4>>2]=4,d[(e=3080)>>2]=-2,d[e+4>>2]=4,d[(e=2864)>>2]=-3,d[e+4>>2]=6,d[(e=2872)>>2]=-3,d[e+4>>2]=6,d[(e=2880)>>2]=-3,d[e+4>>2]=6,d[(e=2888)>>2]=-3,d[e+4>>2]=6,d[(e=2840)>>2]=-4,d[e+4>>2]=8,e=4880;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(6928!=(0|e));for(zn(4880,0,2048),i=2,e=0,n=0,a=0;;){if(r=1<<(t=8-(i=i<<16>>16)|0),31!=(0|t)){e=(1&e|2)<>2]=n,d[o+4>>2]=i,t=t+1|0}while((0|t)<(0|r))}if(e=(t=65536+(a<<16)|0)>>31^t>>15,7==(0|(a=a+1|0))){t=2,n=1,a=-1,o=-1;break}i=2+(e>>1)|0,n=t>>16}for(;;){if(r=1<<(e=8-(i=t<<16>>16)|0),31!=(0|e)){e=(1&n|2)<>2]=a,d[n+4>>2]=i,t=t+1|0}while((0|t)<(0|r))}if((0|(t=2+((n=(e=(o<<16)-65536|0)>>31^e>>15)>>1)|0))>8){e=6928;break}a=e>>16,o=o+-1|0}do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(8976!=(0|e));for(zn(6928,0,2048),n=3,e=0,r=0,a=0;;){if(i=1<<(t=8-n|0),31!=(0|t)){e=(3&e|4)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if(e=(t=65536+(a<<16)|0)>>31^t>>15,12==(0|(a=a+1|0))){n=3,t=1,r=-1,a=-1;break}n=3+(e>>2)|0,r=t>>16}for(;;){if(i=1<<(e=8-n|0),31!=(0|e)){e=(3&t|4)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if((0|(n=3+((t=(e=(a<<16)-65536|0)>>31^e>>15)>>2)|0))>8){e=8976;break}r=e>>16,a=a+-1|0}do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(11024!=(0|e));for(zn(8976,0,2048),n=4,e=0,r=0,a=0;;){if(i=1<<(t=8-n|0),31!=(0|t)){e=(7&e|8)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if(e=(t=65536+(a<<16)|0)>>31^t>>15,20==(0|(a=a+1|0))){n=4,t=1,r=-1,a=-1;break}n=4+(e>>3)|0,r=t>>16}for(;;){if(i=1<<(e=8-n|0),31!=(0|e)){e=(7&t|8)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if((0|(n=4+((t=(e=(a<<16)-65536|0)>>31^e>>15)>>3)|0))>8){e=11024;break}r=e>>16,a=a+-1|0}do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(13072!=(0|e));for(zn(11024,0,2048),n=5,e=0,r=0,a=0;;){if(i=1<<(t=8-n|0),31!=(0|t)){e=(15&e|16)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if(e=(t=65536+(a<<16)|0)>>31^t>>15,32==(0|(a=a+1|0))){n=5,t=1,r=-1,a=-1;break}n=5+(e>>4)|0,r=t>>16}for(;;){if(i=1<<(e=8-n|0),31!=(0|e)){e=(15&t|16)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if((0|(n=5+((t=(e=(a<<16)-65536|0)>>31^e>>15)>>4)|0))>8){e=13072;break}r=e>>16,a=a+-1|0}do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(15120!=(0|e));for(zn(13072,0,2048),n=6,e=0,r=0,a=0;;){if(i=1<<(t=8-n|0),31!=(0|t)){e=(31&e|32)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if(e=(t=65536+(a<<16)|0)>>31^t>>15,48==(0|(a=a+1|0))){n=6,t=1,r=-1,a=-1;break}n=6+(e>>5)|0,r=t>>16}for(;;){if(i=1<<(e=8-n|0),31!=(0|e)){e=(31&t|32)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if((0|(n=6+((t=(e=(a<<16)-65536|0)>>31^e>>15)>>5)|0))>8){e=15120;break}r=e>>16,a=a+-1|0}do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(17168!=(0|e));for(zn(15120,0,2048),n=7,e=0,r=0,a=0;;){if(i=1<<(t=8-n|0),31!=(0|t)){e=(63&e|64)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if(e=(t=65536+(a<<16)|0)>>31^t>>15,64==(0|(a=a+1|0))){n=7,t=1,r=-1,a=-1;break}n=7+(e>>6)|0,r=t>>16}for(;;){if(i=1<<(e=8-n|0),31!=(0|e)){e=(63&t|64)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if((0|(n=7+((t=(e=(a<<16)-65536|0)>>31^e>>15)>>6)|0))>8){e=17168;break}r=e>>16,a=a+-1|0}do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(19216!=(0|e));for(zn(17168,0,2048),n=8,e=0,r=0,a=0;;){if(i=1<<(t=8-n|0),31!=(0|t)){e=(127&e|128)<>2]=r,d[o+4>>2]=n,t=t+1|0}while((0|t)<(0|i))}if(e=(t=65536+(a<<16)|0)>>31^t>>15,64==(0|(a=a+1|0))){a=8,r=1,n=-1,o=-1;break}n=8+(e>>7)|0,r=t>>16}for(;;){if(i=1<<(e=8-a|0),31!=(0|e)){e=(127&r|128)<>2]=n,d[r+4>>2]=a,t=t+1|0}while((0|t)<(0|i))}if((0|(e=(r=(t=(o<<16)-65536|0)>>31^t>>15)>>7))>0){e=19216;break}a=e+8|0,n=t>>16,o=o+-1|0}do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(21264!=(0|e));zn(19216,0,2048),e=21264;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(23312!=(0|e));zn(21264,0,2048),e=23312;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(25360!=(0|e));zn(23312,0,2048),e=25360;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(27408!=(0|e));zn(25360,0,2048),e=27408;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(29456!=(0|e));zn(27408,0,2048),e=29456;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(31504!=(0|e));zn(29456,0,2048),e=31504;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(33552!=(0|e));zn(31504,0,2048),e=33552;do{d[e>>2]=0,d[e+4>>2]=0,e=e+8|0}while(35600!=(0|e));zn(33552,0,2048),qe(35600,8),Ie(179,35600,0|T),qe(35612,10),Ie(179,35612,0|T),qe(35624,12),Ie(179,35624,0|T),qe(35636,16),Ie(179,35636,0|T)},__GLOBAL__sub_I_iostream_cpp:function(){},runPostSets:function(){},_emscripten_replace_memory:function(e){return!(16777215&S(e)||S(e)<=16777215||S(e)>2147483648)&&(f=new r(e),h=new n(e),d=new a(e),m=new o(e),g=new s(e),new l(e),p=new c(e),A=new u(e),i=e,!0)},stackAlloc:function(e){var t;return t=b,b=(b=b+(e|=0)|0)+15&-16,0|t},stackSave:function(){return 0|b},stackRestore:function(e){b=e|=0},establishStackSpace:function(e,t){b=e|=0,t|=0},setThrew:function(e,t){e|=0,t|=0,y||(y=e,t)},setTempRet0:function(e){D=e|=0},getTempRet0:function(){return 0|D},dynCall_iiiiiiii:function(e,t,i,r,n,a,o,s){return t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,0|Ko[15&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o,0|s)},dynCall_viiiii:function(e,t,i,r,n,a){t|=0,i|=0,r|=0,n|=0,a|=0,jo[15&(e|=0)](0|t,0|i,0|r,0|n,0|a)},dynCall_iiiiiid:function(e,t,i,r,n,a,o){return t|=0,i|=0,r|=0,n|=0,a|=0,o=+o,0|Zo[3&(e|=0)](0|t,0|i,0|r,0|n,0|a,+o)},dynCall_vi:function(e,t){t|=0,Jo[255&(e|=0)](0|t)},dynCall_vii:function(e,t,i){t|=0,i|=0,$o[127&(e|=0)](0|t,0|i)},dynCall_iiiiiii:function(e,t,i,r,n,a,o){return t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,0|es[63&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o)},dynCall_ii:function(e,t){return t|=0,0|ts[127&(e|=0)](0|t)},dynCall_iiiiiiiiiiii:function(e,t,i,r,n,a,o,s,l,c,u,f){return t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0,f|=0,0|is[3&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o,0|s,0|l,0|c,0|u,0|f)},dynCall_iiii:function(e,t,i,r){return t|=0,i|=0,r|=0,0|rs[63&(e|=0)](0|t,0|i,0|r)},dynCall_viiiiiiiiiiiiiii:function(e,t,i,r,n,a,o,s,l,c,u,f,h,d,m,g){t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0,f|=0,h|=0,d|=0,m|=0,g|=0,ns[3&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o,0|s,0|l,0|c,0|u,0|f,0|h,0|d,0|m,0|g)},dynCall_viiiiii:function(e,t,i,r,n,a,o){t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,as[15&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o)},dynCall_viiiiiii:function(e,t,i,r,n,a,o,s){t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,os[7&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o,0|s)},dynCall_viiiiiiiiii:function(e,t,i,r,n,a,o,s,l,c,u){t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,c|=0,u|=0,ss[7&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o,0|s,0|l,0|c,0|u)},dynCall_iii:function(e,t,i){return t|=0,i|=0,0|ls[63&(e|=0)](0|t,0|i)},dynCall_iiiiii:function(e,t,i,r,n,a){return t|=0,i|=0,r|=0,n|=0,a|=0,0|cs[31&(e|=0)](0|t,0|i,0|r,0|n,0|a)},dynCall_diii:function(e,t,i,r){return t|=0,i|=0,r|=0,+us[3&(e|=0)](0|t,0|i,0|r)},dynCall_i:function(e){return 0|fs[15&(e|=0)]()},dynCall_iiiii:function(e,t,i,r,n){return t|=0,i|=0,r|=0,n|=0,0|hs[31&(e|=0)](0|t,0|i,0|r,0|n)},dynCall_viii:function(e,t,i,r){t|=0,i|=0,r|=0,ds[15&(e|=0)](0|t,0|i,0|r)},dynCall_v:function(e){ms[7&(e|=0)]()},dynCall_iiiiiiiii:function(e,t,i,r,n,a,o,s,l){return t|=0,i|=0,r|=0,n|=0,a|=0,o|=0,s|=0,l|=0,0|gs[15&(e|=0)](0|t,0|i,0|r,0|n,0|a,0|o,0|s,0|l)},dynCall_iiiiid:function(e,t,i,r,n,a){return t|=0,i|=0,r|=0,n|=0,a=+a,0|ps[7&(e|=0)](0|t,0|i,0|r,0|n,+a)},dynCall_viiii:function(e,t,i,r,n){t|=0,i|=0,r|=0,n|=0,As[63&(e|=0)](0|t,0|i,0|r,0|n)}}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module._jpegls_encode=asm._jpegls_encode,Module.___cxa_can_catch=asm.___cxa_can_catch;var _free=Module._free=asm._free;Module._jpegls_decode=asm._jpegls_decode,Module.___cxa_is_pointer_type=asm.___cxa_is_pointer_type;var _i64Add=Module._i64Add=asm._i64Add,_memmove=Module._memmove=asm._memmove,_i64Subtract=Module._i64Subtract=asm._i64Subtract,_memset=Module._memset=asm._memset,_malloc=Module._malloc=asm._malloc,_memcpy=Module._memcpy=asm._memcpy,_emscripten_replace_memory=Module._emscripten_replace_memory=asm._emscripten_replace_memory;Module.runPostSets=asm.runPostSets,Module.__GLOBAL__sub_I_iostream_cpp=asm.__GLOBAL__sub_I_iostream_cpp;var _bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,__GLOBAL__sub_I_jpegls_cpp=Module.__GLOBAL__sub_I_jpegls_cpp=asm.__GLOBAL__sub_I_jpegls_cpp,__GLOBAL__I_000101=Module.__GLOBAL__I_000101=asm.__GLOBAL__I_000101,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,initialStackTop;function ExitStatus(e){this.name="ExitStatus",this.message="Program terminated with exit("+e+")",this.status=e}function run(e){function t(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(e),postRun()))}e=e||Module.arguments,runDependencies>0||(preRun(),runDependencies>0)||Module.calledRun||(Module.setStatus?(Module.setStatus("Running..."),setTimeout((function(){setTimeout((function(){Module.setStatus("")}),1),t()}),1)):t())}function exit(e,t){if(!t||!Module.noExitRuntime)throw Module.noExitRuntime||(ABORT=!0,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(e)),ENVIRONMENT_IS_NODE?(process.stdout.once("drain",(function(){process.exit(e)})),console.log(" "),setTimeout((function(){process.exit(e)}),500)):ENVIRONMENT_IS_SHELL&&"function"==typeof quit&&quit(e),new ExitStatus(e)}Module.dynCall_iiiiiiii=asm.dynCall_iiiiiiii,Module.dynCall_viiiii=asm.dynCall_viiiii,Module.dynCall_iiiiiid=asm.dynCall_iiiiiid,Module.dynCall_vi=asm.dynCall_vi,Module.dynCall_vii=asm.dynCall_vii,Module.dynCall_iiiiiii=asm.dynCall_iiiiiii,Module.dynCall_ii=asm.dynCall_ii,Module.dynCall_iiiiiiiiiiii=asm.dynCall_iiiiiiiiiiii,Module.dynCall_iiii=asm.dynCall_iiii,Module.dynCall_viiiiiiiiiiiiiii=asm.dynCall_viiiiiiiiiiiiiii,Module.dynCall_viiiiii=asm.dynCall_viiiiii,Module.dynCall_viiiiiii=asm.dynCall_viiiiiii,Module.dynCall_viiiiiiiiii=asm.dynCall_viiiiiiiiii,Module.dynCall_iii=asm.dynCall_iii,Module.dynCall_iiiiii=asm.dynCall_iiiiii,Module.dynCall_diii=asm.dynCall_diii,Module.dynCall_i=asm.dynCall_i,Module.dynCall_iiiii=asm.dynCall_iiiii,Module.dynCall_viii=asm.dynCall_viii,Module.dynCall_v=asm.dynCall_v,Module.dynCall_iiiiiiiii=asm.dynCall_iiiiiiiii,Module.dynCall_iiiiid=asm.dynCall_iiiiid,Module.dynCall_viiii=asm.dynCall_viiii,Runtime.stackAlloc=asm.stackAlloc,Runtime.stackSave=asm.stackSave,Runtime.stackRestore=asm.stackRestore,Runtime.establishStackSpace=asm.establishStackSpace,Runtime.setTempRet0=asm.setTempRet0,Runtime.getTempRet0=asm.getTempRet0,ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus,dependenciesFulfilled=function e(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=e)},Module.callMain=Module.callMain=function(e){assert(0==runDependencies,"cannot call main when async dependencies remain! (listen on __ATMAIN__)"),assert(0==__ATPRERUN__.length,"cannot call main when preRun functions remain to be called"),e=e||[],ensureInitRuntime();var t=e.length+1;function i(){for(var e=0;e<3;e++)r.push(0)}var r=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];i();for(var n=0;n0;)Module.preInit.pop()();var shouldRunNow=!0;return Module.noInitialRun&&(shouldRunNow=!1),run(),Module};module.exports&&(module.exports=CharLS)}(charLSDynamicMemoryBrowser)),charLSDynamicMemoryBrowser.exports}function requireJpegLs(){return hasRequiredJpegLs||(hasRequiredJpegLs=1,function(e){var t=t||(typeof commonjsRequire<"u"?requireCharLSDynamicMemoryBrowser():null),i=function(){var e;function i(){}return i.prototype={decodeJPEGLS:function(i,r){return function(i,r){!function(){if(typeof t>"u")throw"No JPEG-LS decoder loaded";if(!(e||(e=t())&&e._jpegls_decode))throw"JPEG-LS failed to initialize"}();var n=function(t,i){var r=e._malloc(t.length);e.writeArrayToMemory(t,r);var n=e._malloc(4),a=e._malloc(4),o=e._malloc(4),s=e._malloc(4),l=e._malloc(4),c=e._malloc(4),u=e._malloc(4),f=e._malloc(4),h=e._malloc(4),d=e.ccall("jpegls_decode","number",["number","number","number","number","number","number","number","number","number","number","number"],[r,t.length,n,a,o,s,l,c,f,u,h]),m={result:d,width:e.getValue(o,"i32"),height:e.getValue(s,"i32"),bitsPerSample:e.getValue(l,"i32"),stride:e.getValue(c,"i32"),components:e.getValue(f,"i32"),allowedLossyError:e.getValue(u,"i32"),interleaveMode:e.getValue(h,"i32"),pixelData:void 0},g=e.getValue(n,"*");return m.bitsPerSample<=8?(m.pixelData=new Uint8Array(m.width*m.height*m.components),m.pixelData.set(new Uint8Array(e.HEAP8.buffer,g,m.pixelData.length))):i?(m.pixelData=new Int16Array(m.width*m.height*m.components),m.pixelData.set(new Int16Array(e.HEAP16.buffer,g,m.pixelData.length))):(m.pixelData=new Uint16Array(m.width*m.height*m.components),m.pixelData.set(new Uint16Array(e.HEAP16.buffer,g,m.pixelData.length))),e._free(r),e._free(g),e._free(n),e._free(a),e._free(o),e._free(s),e._free(l),e._free(c),e._free(f),e._free(h),m}(i,r);if(0!==n.result&&6!==n.result)throw"JPEG-LS decoder failed to decode frame (error code "+n.result+")";var a={};return a.columns=n.width,a.rows=n.height,a.pixelData=n.pixelData,a}(i,r)}},i}();e.exports&&(e.exports=i)}(jpegLs)),jpegLs.exports}var parser={exports:{}},pako={},deflate$1={},deflate={},trees={},hasRequiredTrees,adler32_1,hasRequiredAdler32,crc32_1,hasRequiredCrc32,messages,hasRequiredMessages,constants,hasRequiredConstants,hasRequiredDeflate$1;function requireTrees(){if(hasRequiredTrees)return trees;hasRequiredTrees=1;function e(e){let t=e.length;for(;--t>=0;)e[t]=0}const t=256,i=286,r=30,n=15,a=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),o=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),s=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),l=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),c=new Array(576);e(c);const u=new Array(60);e(u);const f=new Array(512);e(f);const h=new Array(256);e(h);const d=new Array(29);e(d);const m=new Array(r);function g(e,t,i,r,n){this.static_tree=e,this.extra_bits=t,this.extra_base=i,this.elems=r,this.max_length=n,this.has_stree=e&&e.length}let p,A,S;function b(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}e(m);const v=e=>e<256?f[e]:f[256+(e>>>7)],w=(e,t)=>{e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255},T=(e,t,i)=>{e.bi_valid>16-i?(e.bi_buf|=t<>16-e.bi_valid,e.bi_valid+=i-16):(e.bi_buf|=t<{T(e,i[2*t],i[2*t+1])},C=(e,t)=>{let i=0;do{i|=1&e,e>>>=1,i<<=1}while(--t>0);return i>>>1},I=(e,t,i)=>{const r=new Array(16);let a,o,s=0;for(a=1;a<=n;a++)s=s+i[a-1]<<1,r[a]=s;for(o=0;o<=t;o++){let t=e[2*o+1];0!==t&&(e[2*o]=C(r[t]++,t))}},D=e=>{let t;for(t=0;t{e.bi_valid>8?w(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0},E=(e,t,i,r)=>{const n=2*t,a=2*i;return e[n]{const r=e.heap[i];let n=i<<1;for(;n<=e.heap_len&&(n{let n,s,l,c,u=0;if(0!==e.sym_next)do{n=255&e.pending_buf[e.sym_buf+u++],n+=(255&e.pending_buf[e.sym_buf+u++])<<8,s=e.pending_buf[e.sym_buf+u++],0===n?y(e,s,i):(l=h[s],y(e,l+t+1,i),c=a[l],0!==c&&(s-=d[l],T(e,s,c)),n--,l=v(n),y(e,l,r),c=o[l],0!==c&&(n-=m[l],T(e,n,c)))}while(u{const i=t.dyn_tree,r=t.stat_desc.static_tree,a=t.stat_desc.has_stree,o=t.stat_desc.elems;let s,l,c,u=-1;for(e.heap_len=0,e.heap_max=573,s=0;s>1;s>=1;s--)M(e,i,s);c=o;do{s=e.heap[1],e.heap[1]=e.heap[e.heap_len--],M(e,i,1),l=e.heap[1],e.heap[--e.heap_max]=s,e.heap[--e.heap_max]=l,i[2*c]=i[2*s]+i[2*l],e.depth[c]=(e.depth[s]>=e.depth[l]?e.depth[s]:e.depth[l])+1,i[2*s+1]=i[2*l+1]=c,e.heap[1]=c++,M(e,i,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],((e,t)=>{const i=t.dyn_tree,r=t.max_code,a=t.stat_desc.static_tree,o=t.stat_desc.has_stree,s=t.stat_desc.extra_bits,l=t.stat_desc.extra_base,c=t.stat_desc.max_length;let u,f,h,d,m,g,p=0;for(d=0;d<=n;d++)e.bl_count[d]=0;for(i[2*e.heap[e.heap_max]+1]=0,u=e.heap_max+1;u<573;u++)f=e.heap[u],d=i[2*i[2*f+1]+1]+1,d>c&&(d=c,p++),i[2*f+1]=d,!(f>r)&&(e.bl_count[d]++,m=0,f>=l&&(m=s[f-l]),g=i[2*f],e.opt_len+=g*(d+m),o&&(e.static_len+=g*(a[2*f+1]+m)));if(0!==p){do{for(d=c-1;0===e.bl_count[d];)d--;e.bl_count[d]--,e.bl_count[d+1]+=2,e.bl_count[c]--,p-=2}while(p>0);for(d=c;0!==d;d--)for(f=e.bl_count[d];0!==f;)h=e.heap[--u],!(h>r)&&(i[2*h+1]!==d&&(e.opt_len+=(d-i[2*h+1])*i[2*h],i[2*h+1]=d),f--)}})(e,t),I(i,u,e.bl_count)},F=(e,t,i)=>{let r,n,a=-1,o=t[1],s=0,l=7,c=4;for(0===o&&(l=138,c=3),t[2*(i+1)+1]=65535,r=0;r<=i;r++)n=o,o=t[2*(r+1)+1],!(++s{let r,n,a=-1,o=t[1],s=0,l=7,c=4;for(0===o&&(l=138,c=3),r=0;r<=i;r++)if(n=o,o=t[2*(r+1)+1],!(++s{T(e,0+(r?1:0),3),x(e),w(e,i),w(e,~i),i&&e.pending_buf.set(e.window.subarray(t,t+i),e.pending),e.pending+=i};return trees._tr_init=e=>{L||((()=>{let e,t,l,b,v;const w=new Array(16);for(l=0,b=0;b<28;b++)for(d[b]=l,e=0;e<1<>=7;b{let a,o,s=0;e.level>0?(2===e.strm.data_type&&(e.strm.data_type=(e=>{let i,r=4093624447;for(i=0;i<=31;i++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*i])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(i=32;i{let t;for(F(e,e.dyn_ltree,e.l_desc.max_code),F(e,e.dyn_dtree,e.d_desc.max_code),R(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*l[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t})(e),a=e.opt_len+3+7>>>3,o=e.static_len+3+7>>>3,o<=a&&(a=o)):a=o=r+5,r+4<=a&&-1!==i?_(e,i,r,n):4===e.strategy||o===a?(T(e,2+(n?1:0),3),k(e,c,u)):(T(e,4+(n?1:0),3),((e,t,i,r)=>{let n;for(T(e,t-257,5),T(e,i-1,5),T(e,r-4,4),n=0;n(e.pending_buf[e.sym_buf+e.sym_next++]=i,e.pending_buf[e.sym_buf+e.sym_next++]=i>>8,e.pending_buf[e.sym_buf+e.sym_next++]=r,0===i?e.dyn_ltree[2*r]++:(e.matches++,i--,e.dyn_ltree[2*(h[r]+t+1)]++,e.dyn_dtree[2*v(i)]++),e.sym_next===e.sym_end),trees._tr_align=e=>{T(e,2,3),y(e,256,c),(e=>{16===e.bi_valid?(w(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)})(e)},trees}function requireAdler32(){return hasRequiredAdler32||(hasRequiredAdler32=1,adler32_1=(e,t,i,r)=>{let n=65535&e,a=e>>>16&65535,o=0;for(;0!==i;){o=i>2e3?2e3:i,i-=o;do{n=n+t[r++]|0,a=a+n|0}while(--o);n%=65521,a%=65521}return n|a<<16}),adler32_1}function requireCrc32(){if(hasRequiredCrc32)return crc32_1;hasRequiredCrc32=1;const e=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var r=0;r<8;r++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());return crc32_1=(t,i,r,n)=>{const a=e,o=n+r;t^=-1;for(let e=n;e>>8^a[255&(t^i[e])];return~t}}function requireMessages(){return hasRequiredMessages||(hasRequiredMessages=1,messages={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}),messages}function requireConstants(){return hasRequiredConstants||(hasRequiredConstants=1,constants={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}),constants}function requireDeflate$1(){if(hasRequiredDeflate$1)return deflate;hasRequiredDeflate$1=1;const{_tr_init:e,_tr_stored_block:t,_tr_flush_block:i,_tr_tally:r,_tr_align:n}=requireTrees(),a=requireAdler32(),o=requireCrc32(),s=requireMessages(),{Z_NO_FLUSH:l,Z_PARTIAL_FLUSH:c,Z_FULL_FLUSH:u,Z_FINISH:f,Z_BLOCK:h,Z_OK:d,Z_STREAM_END:m,Z_STREAM_ERROR:g,Z_DATA_ERROR:p,Z_BUF_ERROR:A,Z_DEFAULT_COMPRESSION:S,Z_FILTERED:b,Z_HUFFMAN_ONLY:v,Z_RLE:w,Z_FIXED:T,Z_DEFAULT_STRATEGY:y,Z_UNKNOWN:C,Z_DEFLATED:I}=requireConstants(),D=258,x=262,E=42,M=113,k=666,R=(e,t)=>(e.msg=s[t],t),F=e=>2*e-(e>4?9:0),P=e=>{let t=e.length;for(;--t>=0;)e[t]=0},L=e=>{let t,i,r,n=e.w_size;t=e.hash_size,r=t;do{i=e.head[--r],e.head[r]=i>=n?i-n:0}while(--t);t=n,r=t;do{i=e.prev[--r],e.prev[r]=i>=n?i-n:0}while(--t)};let _=(e,t,i)=>(t<{const t=e.state;let i=t.pending;i>e.avail_out&&(i=e.avail_out),0!==i&&(e.output.set(t.pending_buf.subarray(t.pending_out,t.pending_out+i),e.next_out),e.next_out+=i,t.pending_out+=i,e.total_out+=i,e.avail_out-=i,t.pending-=i,0===t.pending&&(t.pending_out=0))},U=(e,t)=>{i(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,N(e.strm)},O=(e,t)=>{e.pending_buf[e.pending++]=t},B=(e,t)=>{e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t},V=(e,t,i,r)=>{let n=e.avail_in;return n>r&&(n=r),0===n?0:(e.avail_in-=n,t.set(e.input.subarray(e.next_in,e.next_in+n),i),1===e.state.wrap?e.adler=a(e.adler,t,n,i):2===e.state.wrap&&(e.adler=o(e.adler,t,n,i)),e.next_in+=n,e.total_in+=n,n)},q=(e,t)=>{let i,r,n=e.max_chain_length,a=e.strstart,o=e.prev_length,s=e.nice_match;const l=e.strstart>e.w_size-x?e.strstart-(e.w_size-x):0,c=e.window,u=e.w_mask,f=e.prev,h=e.strstart+D;let d=c[a+o-1],m=c[a+o];e.prev_length>=e.good_match&&(n>>=2),s>e.lookahead&&(s=e.lookahead);do{if(i=t,c[i+o]===m&&c[i+o-1]===d&&c[i]===c[a]&&c[++i]===c[a+1]){a+=2,i++;do{}while(c[++a]===c[++i]&&c[++a]===c[++i]&&c[++a]===c[++i]&&c[++a]===c[++i]&&c[++a]===c[++i]&&c[++a]===c[++i]&&c[++a]===c[++i]&&c[++a]===c[++i]&&ao){if(e.match_start=t,o=r,r>=s)break;d=c[a+o-1],m=c[a+o]}}}while((t=f[t&u])>l&&0!=--n);return o<=e.lookahead?o:e.lookahead},G=e=>{const t=e.w_size;let i,r,n;do{if(r=e.window_size-e.lookahead-e.strstart,e.strstart>=t+(t-x)&&(e.window.set(e.window.subarray(t,t+t-r),0),e.match_start-=t,e.strstart-=t,e.block_start-=t,e.insert>e.strstart&&(e.insert=e.strstart),L(e),r+=t),0===e.strm.avail_in)break;if(i=V(e.strm,e.window,e.strstart+e.lookahead,r),e.lookahead+=i,e.lookahead+e.insert>=3)for(n=e.strstart-e.insert,e.ins_h=e.window[n],e.ins_h=_(e,e.ins_h,e.window[n+1]);e.insert&&(e.ins_h=_(e,e.ins_h,e.window[n+3-1]),e.prev[n&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=n,n++,e.insert--,!(e.lookahead+e.insert<3)););}while(e.lookahead{let r,n,a,o=e.pending_buf_size-5>e.w_size?e.w_size:e.pending_buf_size-5,s=0,c=e.strm.avail_in;do{if(r=65535,a=e.bi_valid+42>>3,e.strm.avail_outn+e.strm.avail_in&&(r=n+e.strm.avail_in),r>a&&(r=a),r>8,e.pending_buf[e.pending-2]=~r,e.pending_buf[e.pending-1]=~r>>8,N(e.strm),n&&(n>r&&(n=r),e.strm.output.set(e.window.subarray(e.block_start,e.block_start+n),e.strm.next_out),e.strm.next_out+=n,e.strm.avail_out-=n,e.strm.total_out+=n,e.block_start+=n,r-=n),r&&(V(e.strm,e.strm.output,e.strm.next_out,r),e.strm.next_out+=r,e.strm.avail_out-=r,e.strm.total_out+=r)}while(0===s);return c-=e.strm.avail_in,c&&(c>=e.w_size?(e.matches=2,e.window.set(e.strm.input.subarray(e.strm.next_in-e.w_size,e.strm.next_in),0),e.strstart=e.w_size,e.insert=e.strstart):(e.window_size-e.strstart<=c&&(e.strstart-=e.w_size,e.window.set(e.window.subarray(e.w_size,e.w_size+e.strstart),0),e.matches<2&&e.matches++,e.insert>e.strstart&&(e.insert=e.strstart)),e.window.set(e.strm.input.subarray(e.strm.next_in-c,e.strm.next_in),e.strstart),e.strstart+=c,e.insert+=c>e.w_size-e.insert?e.w_size-e.insert:c),e.block_start=e.strstart),e.high_watera&&e.block_start>=e.w_size&&(e.block_start-=e.w_size,e.strstart-=e.w_size,e.window.set(e.window.subarray(e.w_size,e.w_size+e.strstart),0),e.matches<2&&e.matches++,a+=e.w_size,e.insert>e.strstart&&(e.insert=e.strstart)),a>e.strm.avail_in&&(a=e.strm.avail_in),a&&(V(e.strm,e.window,e.strstart,a),e.strstart+=a,e.insert+=a>e.w_size-e.insert?e.w_size-e.insert:a),e.high_water>3,a=e.pending_buf_size-a>65535?65535:e.pending_buf_size-a,o=a>e.w_size?e.w_size:a,n=e.strstart-e.block_start,(n>=o||(n||i===f)&&i!==l&&0===e.strm.avail_in&&n<=a)&&(r=n>a?a:n,s=i===f&&0===e.strm.avail_in&&r===n?1:0,t(e,e.block_start,r,s),e.block_start+=r,N(e.strm)),s?3:1)},z=(e,t)=>{let i,n;for(;;){if(e.lookahead=3&&(e.ins_h=_(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==i&&e.strstart-i<=e.w_size-x&&(e.match_length=q(e,i)),e.match_length>=3)if(n=r(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=_(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart}while(0!=--e.match_length);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=_(e,e.ins_h,e.window[e.strstart+1]);else n=r(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(U(e,!1),0===e.strm.avail_out))return 1}return e.insert=e.strstart<2?e.strstart:2,t===f?(U(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(U(e,!1),0===e.strm.avail_out)?1:2},H=(e,t)=>{let i,n,a;for(;;){if(e.lookahead=3&&(e.ins_h=_(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=2,0!==i&&e.prev_length4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){a=e.strstart+e.lookahead-3,n=r(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=a&&(e.ins_h=_(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart)}while(0!=--e.prev_length);if(e.match_available=0,e.match_length=2,e.strstart++,n&&(U(e,!1),0===e.strm.avail_out))return 1}else if(e.match_available){if(n=r(e,0,e.window[e.strstart-1]),n&&U(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return 1}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=r(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<2?e.strstart:2,t===f?(U(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(U(e,!1),0===e.strm.avail_out)?1:2};function Y(e,t,i,r,n){this.good_length=e,this.max_lazy=t,this.nice_length=i,this.max_chain=r,this.func=n}const W=[new Y(0,0,0,0,Q),new Y(4,4,8,4,z),new Y(4,5,16,8,z),new Y(4,6,32,32,z),new Y(4,4,16,16,H),new Y(8,16,32,32,H),new Y(8,16,128,128,H),new Y(8,32,128,256,H),new Y(32,128,258,1024,H),new Y(32,258,258,4096,H)];function X(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=I,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),P(this.dyn_ltree),P(this.dyn_dtree),P(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),P(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),P(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const K=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.status!==E&&57!==t.status&&69!==t.status&&73!==t.status&&91!==t.status&&103!==t.status&&t.status!==M&&t.status!==k?1:0},j=t=>{if(K(t))return R(t,g);t.total_in=t.total_out=0,t.data_type=C;const i=t.state;return i.pending=0,i.pending_out=0,i.wrap<0&&(i.wrap=-i.wrap),i.status=2===i.wrap?57:i.wrap?E:M,t.adler=2===i.wrap?0:1,i.last_flush=-2,e(i),d},Z=e=>{const t=j(e);return t===d&&(e=>{e.window_size=2*e.w_size,P(e.head),e.max_lazy_match=W[e.level].max_lazy,e.good_match=W[e.level].good_length,e.nice_match=W[e.level].nice_length,e.max_chain_length=W[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=2,e.match_available=0,e.ins_h=0})(e.state),t},J=(e,t,i,r,n,a)=>{if(!e)return g;let o=1;if(t===S&&(t=6),r<0?(o=0,r=-r):r>15&&(o=2,r-=16),n<1||n>9||i!==I||r<8||r>15||t<0||t>9||a<0||a>T||8===r&&1!==o)return R(e,g);8===r&&(r=9);const s=new X;return e.state=s,s.strm=e,s.status=E,s.wrap=o,s.gzhead=null,s.w_bits=r,s.w_size=1<J(e,t,I,15,8,y),deflate.deflateInit2=J,deflate.deflateReset=Z,deflate.deflateResetKeep=j,deflate.deflateSetHeader=(e,t)=>K(e)||2!==e.state.wrap?g:(e.state.gzhead=t,d),deflate.deflate=(e,i)=>{if(K(e)||i>h||i<0)return e?R(e,g):g;const a=e.state;if(!e.output||0!==e.avail_in&&!e.input||a.status===k&&i!==f)return R(e,0===e.avail_out?A:g);const s=a.last_flush;if(a.last_flush=i,0!==a.pending){if(N(e),0===e.avail_out)return a.last_flush=-1,d}else if(0===e.avail_in&&F(i)<=F(s)&&i!==f)return R(e,A);if(a.status===k&&0!==e.avail_in)return R(e,A);if(a.status===E&&0===a.wrap&&(a.status=M),a.status===E){let t=I+(a.w_bits-8<<4)<<8,i=-1;if(i=a.strategy>=v||a.level<2?0:a.level<6?1:6===a.level?2:3,t|=i<<6,0!==a.strstart&&(t|=32),t+=31-t%31,B(a,t),0!==a.strstart&&(B(a,e.adler>>>16),B(a,65535&e.adler)),e.adler=1,a.status=M,N(e),0!==a.pending)return a.last_flush=-1,d}if(57===a.status)if(e.adler=0,O(a,31),O(a,139),O(a,8),a.gzhead)O(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),O(a,255&a.gzhead.time),O(a,a.gzhead.time>>8&255),O(a,a.gzhead.time>>16&255),O(a,a.gzhead.time>>24&255),O(a,9===a.level?2:a.strategy>=v||a.level<2?4:0),O(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(O(a,255&a.gzhead.extra.length),O(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(e.adler=o(e.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=69;else if(O(a,0),O(a,0),O(a,0),O(a,0),O(a,0),O(a,9===a.level?2:a.strategy>=v||a.level<2?4:0),O(a,3),a.status=M,N(e),0!==a.pending)return a.last_flush=-1,d;if(69===a.status){if(a.gzhead.extra){let t=a.pending,i=(65535&a.gzhead.extra.length)-a.gzindex;for(;a.pending+i>a.pending_buf_size;){let r=a.pending_buf_size-a.pending;if(a.pending_buf.set(a.gzhead.extra.subarray(a.gzindex,a.gzindex+r),a.pending),a.pending=a.pending_buf_size,a.gzhead.hcrc&&a.pending>t&&(e.adler=o(e.adler,a.pending_buf,a.pending-t,t)),a.gzindex+=r,N(e),0!==a.pending)return a.last_flush=-1,d;t=0,i-=r}let r=new Uint8Array(a.gzhead.extra);a.pending_buf.set(r.subarray(a.gzindex,a.gzindex+i),a.pending),a.pending+=i,a.gzhead.hcrc&&a.pending>t&&(e.adler=o(e.adler,a.pending_buf,a.pending-t,t)),a.gzindex=0}a.status=73}if(73===a.status){if(a.gzhead.name){let t,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(e.adler=o(e.adler,a.pending_buf,a.pending-i,i)),N(e),0!==a.pending)return a.last_flush=-1,d;i=0}t=a.gzindexi&&(e.adler=o(e.adler,a.pending_buf,a.pending-i,i)),a.gzindex=0}a.status=91}if(91===a.status){if(a.gzhead.comment){let t,i=a.pending;do{if(a.pending===a.pending_buf_size){if(a.gzhead.hcrc&&a.pending>i&&(e.adler=o(e.adler,a.pending_buf,a.pending-i,i)),N(e),0!==a.pending)return a.last_flush=-1,d;i=0}t=a.gzindexi&&(e.adler=o(e.adler,a.pending_buf,a.pending-i,i))}a.status=103}if(103===a.status){if(a.gzhead.hcrc){if(a.pending+2>a.pending_buf_size&&(N(e),0!==a.pending))return a.last_flush=-1,d;O(a,255&e.adler),O(a,e.adler>>8&255),e.adler=0}if(a.status=M,N(e),0!==a.pending)return a.last_flush=-1,d}if(0!==e.avail_in||0!==a.lookahead||i!==l&&a.status!==k){let o=0===a.level?Q(a,i):a.strategy===v?((e,t)=>{let i;for(;;){if(0===e.lookahead&&(G(e),0===e.lookahead)){if(t===l)return 1;break}if(e.match_length=0,i=r(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,i&&(U(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===f?(U(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(U(e,!1),0===e.strm.avail_out)?1:2})(a,i):a.strategy===w?((e,t)=>{let i,n,a,o;const s=e.window;for(;;){if(e.lookahead<=D){if(G(e),e.lookahead<=D&&t===l)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(a=e.strstart-1,n=s[a],n===s[++a]&&n===s[++a]&&n===s[++a])){o=e.strstart+D;do{}while(n===s[++a]&&n===s[++a]&&n===s[++a]&&n===s[++a]&&n===s[++a]&&n===s[++a]&&n===s[++a]&&n===s[++a]&&ae.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(i=r(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(i=r(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),i&&(U(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===f?(U(e,!0),0===e.strm.avail_out?3:4):e.sym_next&&(U(e,!1),0===e.strm.avail_out)?1:2})(a,i):W[a.level].func(a,i);if((3===o||4===o)&&(a.status=k),1===o||3===o)return 0===e.avail_out&&(a.last_flush=-1),d;if(2===o&&(i===c?n(a):i!==h&&(t(a,0,0,!1),i===u&&(P(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),N(e),0===e.avail_out))return a.last_flush=-1,d}return i!==f?d:a.wrap<=0?m:(2===a.wrap?(O(a,255&e.adler),O(a,e.adler>>8&255),O(a,e.adler>>16&255),O(a,e.adler>>24&255),O(a,255&e.total_in),O(a,e.total_in>>8&255),O(a,e.total_in>>16&255),O(a,e.total_in>>24&255)):(B(a,e.adler>>>16),B(a,65535&e.adler)),N(e),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?d:m)},deflate.deflateEnd=e=>{if(K(e))return g;const t=e.state.status;return e.state=null,t===M?R(e,p):d},deflate.deflateSetDictionary=(e,t)=>{let i=t.length;if(K(e))return g;const r=e.state,n=r.wrap;if(2===n||1===n&&r.status!==E||r.lookahead)return g;if(1===n&&(e.adler=a(e.adler,t,i,0)),r.wrap=0,i>=r.w_size){0===n&&(P(r.head),r.strstart=0,r.block_start=0,r.insert=0);let e=new Uint8Array(r.w_size);e.set(t.subarray(i-r.w_size,i),0),t=e,i=r.w_size}const o=e.avail_in,s=e.next_in,l=e.input;for(e.avail_in=i,e.next_in=0,e.input=t,G(r);r.lookahead>=3;){let e=r.strstart,t=r.lookahead-2;do{r.ins_h=_(r,r.ins_h,r.window[e+3-1]),r.prev[e&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=e,e++}while(--t);r.strstart=e,r.lookahead=2,G(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=2,r.match_available=0,e.next_in=s,e.input=l,e.avail_in=o,r.wrap=n,d},deflate.deflateInfo="pako deflate (from Nodeca project)",deflate}var common={},hasRequiredCommon;function requireCommon(){if(hasRequiredCommon)return common;hasRequiredCommon=1;const e=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);return common.assign=function(t){const i=Array.prototype.slice.call(arguments,1);for(;i.length;){const r=i.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(const i in r)e(r,i)&&(t[i]=r[i])}}return t},common.flattenChunks=e=>{let t=0;for(let i=0,r=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;t[254]=t[254]=1,strings.string2buf=e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,r,n,a,o=e.length,s=0;for(n=0;n>>6,t[a++]=128|63&i):i<65536?(t[a++]=224|i>>>12,t[a++]=128|i>>>6&63,t[a++]=128|63&i):(t[a++]=240|i>>>18,t[a++]=128|i>>>12&63,t[a++]=128|i>>>6&63,t[a++]=128|63&i);return t};return strings.buf2string=(i,r)=>{const n=r||i.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(i.subarray(0,r));let a,o;const s=new Array(2*n);for(o=0,a=0;a4)s[o++]=65533,a+=r-1;else{for(e&=2===r?31:3===r?15:7;r>1&&a1?s[o++]=65533:e<65536?s[o++]=e:(e-=65536,s[o++]=55296|e>>10&1023,s[o++]=56320|1023&e)}}return((t,i)=>{if(i<65534&&t.subarray&&e)return String.fromCharCode.apply(null,t.length===i?t:t.subarray(0,i));let r="";for(let e=0;e{(i=i||e.length)>e.length&&(i=e.length);let r=i-1;for(;r>=0&&128==(192&e[r]);)r--;return r<0||0===r?i:r+t[e[r]]>i?r:i},strings}function requireZstream(){if(hasRequiredZstream)return zstream;return hasRequiredZstream=1,zstream=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}}function requireDeflate(){if(hasRequiredDeflate)return deflate$1;hasRequiredDeflate=1;const e=requireDeflate$1(),t=requireCommon(),i=requireStrings(),r=requireMessages(),n=requireZstream(),a=Object.prototype.toString,{Z_NO_FLUSH:o,Z_SYNC_FLUSH:s,Z_FULL_FLUSH:l,Z_FINISH:c,Z_OK:u,Z_STREAM_END:f,Z_DEFAULT_COMPRESSION:h,Z_DEFAULT_STRATEGY:d,Z_DEFLATED:m}=requireConstants();function g(o){this.options=t.assign({level:h,method:m,chunkSize:16384,windowBits:15,memLevel:8,strategy:d},o||{});let s=this.options;s.raw&&s.windowBits>0?s.windowBits=-s.windowBits:s.gzip&&s.windowBits>0&&s.windowBits<16&&(s.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new n,this.strm.avail_out=0;let l=e.deflateInit2(this.strm,s.level,s.method,s.windowBits,s.memLevel,s.strategy);if(l!==u)throw new Error(r[l]);if(s.header&&e.deflateSetHeader(this.strm,s.header),s.dictionary){let t;if(t="string"==typeof s.dictionary?i.string2buf(s.dictionary):"[object ArrayBuffer]"===a.call(s.dictionary)?new Uint8Array(s.dictionary):s.dictionary,l=e.deflateSetDictionary(this.strm,t),l!==u)throw new Error(r[l]);this._dict_set=!0}}function p(e,t){const i=new g(t);if(i.push(e,!0),i.err)throw i.msg||r[i.err];return i.result}return g.prototype.push=function(t,r){const n=this.strm,h=this.options.chunkSize;let d,m;if(this.ended)return!1;for(m=r===~~r?r:!0===r?c:o,"string"==typeof t?n.input=i.string2buf(t):"[object ArrayBuffer]"===a.call(t)?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;;)if(0===n.avail_out&&(n.output=new Uint8Array(h),n.next_out=0,n.avail_out=h),(m===s||m===l)&&n.avail_out<=6)this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;else{if(d=e.deflate(n,m),d===f)return n.next_out>0&&this.onData(n.output.subarray(0,n.next_out)),d=e.deflateEnd(this.strm),this.onEnd(d),this.ended=!0,d===u;if(0!==n.avail_out){if(m>0&&n.next_out>0)this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;else if(0===n.avail_in)break}else this.onData(n.output)}return!0},g.prototype.onData=function(e){this.chunks.push(e)},g.prototype.onEnd=function(e){e===u&&(this.result=t.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},deflate$1.Deflate=g,deflate$1.deflate=p,deflate$1.deflateRaw=function(e,t){return(t=t||{}).raw=!0,p(e,t)},deflate$1.gzip=function(e,t){return(t=t||{}).gzip=!0,p(e,t)},deflate$1.constants=requireConstants(),deflate$1}var inflate$1={},inflate={},inffast,hasRequiredInffast,inftrees,hasRequiredInftrees,hasRequiredInflate$1,gzheader,hasRequiredGzheader,hasRequiredInflate,hasRequiredPako,hasRequiredParser,hasRequiredImage;function requireInffast(){if(hasRequiredInffast)return inffast;hasRequiredInffast=1;const e=16209;return inffast=function(t,i){let r,n,a,o,s,l,c,u,f,h,d,m,g,p,A,S,b,v,w,T,y,C,I,D;const x=t.state;r=t.next_in,I=t.input,n=r+(t.avail_in-5),a=t.next_out,D=t.output,o=a-(i-t.avail_out),s=a+(t.avail_out-257),l=x.dmax,c=x.wsize,u=x.whave,f=x.wnext,h=x.window,d=x.hold,m=x.bits,g=x.lencode,p=x.distcode,A=(1<>>24,d>>>=v,m-=v,v=b>>>16&255,0===v)D[a++]=65535&b;else{if(!(16&v)){if(64&v){if(32&v){x.mode=16191;break e}t.msg="invalid literal/length code",x.mode=e;break e}b=g[(65535&b)+(d&(1<>>=v,m-=v),m<15&&(d+=I[r++]<>>24,d>>>=v,m-=v,v=b>>>16&255,16&v){if(T=65535&b,v&=15,ml){t.msg="invalid distance too far back",x.mode=e;break e}if(d>>>=v,m-=v,v=a-o,T>v){if(v=T-v,v>u&&x.sane){t.msg="invalid distance too far back",x.mode=e;break e}if(y=0,C=h,0===f){if(y+=c-v,v2;)D[a++]=C[y++],D[a++]=C[y++],D[a++]=C[y++],w-=3;w&&(D[a++]=C[y++],w>1&&(D[a++]=C[y++]))}else{y=a-T;do{D[a++]=D[y++],D[a++]=D[y++],D[a++]=D[y++],w-=3}while(w>2);w&&(D[a++]=D[y++],w>1&&(D[a++]=D[y++]))}break}if(64&v){t.msg="invalid distance code",x.mode=e;break e}b=p[(65535&b)+(d&(1<>3,r-=w,m-=w<<3,d&=(1<{const d=h.bits;let m,g,p,A,S,b,v=0,w=0,T=0,y=0,C=0,I=0,D=0,x=0,E=0,M=0,k=null;const R=new Uint16Array(16),F=new Uint16Array(16);let P,L,_,N=null;for(v=0;v<=e;v++)R[v]=0;for(w=0;w=1&&0===R[y];y--);if(C>y&&(C=y),0===y)return c[u++]=20971520,c[u++]=20971520,h.bits=1,0;for(T=1;T0&&(0===a||1!==y))return-1;for(F[1]=0,v=1;v852||2===a&&E>592)return 1;for(;;){P=v-D,f[w]+1=b?(L=N[f[w]-b],_=k[f[w]-b]):(L=96,_=0),m=1<>D)+g]=P<<24|L<<16|_}while(0!==g);for(m=1<>=1;if(0!==m?(M&=m-1,M+=m):M=0,w++,0==--R[v]){if(v===y)break;v=o[s+f[w]]}if(v>C&&(M&A)!==p){for(0===D&&(D=C),S+=T,I=v-D,x=1<852||2===a&&E>592)return 1;p=M&A,c[p]=C<<24|I<<16|S-u}}return 0!==M&&(c[S+M]=v-D<<24|64<<16),h.bits=C,0}}function requireInflate$1(){if(hasRequiredInflate$1)return inflate;hasRequiredInflate$1=1;const e=requireAdler32(),t=requireCrc32(),i=requireInffast(),r=requireInftrees(),{Z_FINISH:n,Z_BLOCK:a,Z_TREES:o,Z_OK:s,Z_STREAM_END:l,Z_NEED_DICT:c,Z_STREAM_ERROR:u,Z_DATA_ERROR:f,Z_MEM_ERROR:h,Z_BUF_ERROR:d,Z_DEFLATED:m}=requireConstants(),g=16180,p=16190,A=16191,S=16192,b=16194,v=16199,w=16200,T=16206,y=16209,C=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function I(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const D=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.mode16211?1:0},x=e=>{if(D(e))return u;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=g,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,s},E=e=>{if(D(e))return u;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,x(e)},M=(e,t)=>{let i;if(D(e))return u;const r=e.state;return t<0?(i=0,t=-t):(i=5+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?u:(null!==r.window&&r.wbits!==t&&(r.window=null),r.wrap=i,r.wbits=t,E(e))},k=(e,t)=>{if(!e)return u;const i=new I;e.state=i,i.strm=e,i.window=null,i.mode=g;const r=M(e,t);return r!==s&&(e.state=null),r};let R,F,P=!0;const L=e=>{if(P){R=new Int32Array(512),F=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(r(1,e.lens,0,288,R,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;r(2,e.lens,0,32,F,0,e.work,{bits:5}),P=!1}e.lencode=R,e.lenbits=9,e.distcode=F,e.distbits=5},_=(e,t,i,r)=>{let n;const a=e.state;return null===a.window&&(a.wsize=1<=a.wsize?(a.window.set(t.subarray(i-a.wsize,i),0),a.wnext=0,a.whave=a.wsize):(n=a.wsize-a.wnext,n>r&&(n=r),a.window.set(t.subarray(i-r,i-r+n),a.wnext),(r-=n)?(a.window.set(t.subarray(i-r,i),0),a.wnext=r,a.whave=a.wsize):(a.wnext+=n,a.wnext===a.wsize&&(a.wnext=0),a.whavek(e,15),inflate.inflateInit2=k,inflate.inflate=(I,x)=>{let E,M,k,R,F,P,N,U,O,B,V,q,G,Q,z,H,Y,W,X,K,j,Z,J=0;const $=new Uint8Array(4);let ee,te;const ie=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(D(I)||!I.output||!I.input&&0!==I.avail_in)return u;E=I.state,E.mode===A&&(E.mode=S),F=I.next_out,k=I.output,N=I.avail_out,R=I.next_in,M=I.input,P=I.avail_in,U=E.hold,O=E.bits,B=P,V=N,Z=s;e:for(;;)switch(E.mode){case g:if(0===E.wrap){E.mode=S;break}for(;O<16;){if(0===P)break e;P--,U+=M[R++]<>>8&255,E.check=t(E.check,$,2,0),U=0,O=0,E.mode=16181;break}if(E.head&&(E.head.done=!1),!(1&E.wrap)||(((255&U)<<8)+(U>>8))%31){I.msg="incorrect header check",E.mode=y;break}if((15&U)!==m){I.msg="unknown compression method",E.mode=y;break}if(U>>>=4,O-=4,j=8+(15&U),0===E.wbits&&(E.wbits=j),j>15||j>E.wbits){I.msg="invalid window size",E.mode=y;break}E.dmax=1<>8&1),512&E.flags&&4&E.wrap&&($[0]=255&U,$[1]=U>>>8&255,E.check=t(E.check,$,2,0)),U=0,O=0,E.mode=16182;case 16182:for(;O<32;){if(0===P)break e;P--,U+=M[R++]<>>8&255,$[2]=U>>>16&255,$[3]=U>>>24&255,E.check=t(E.check,$,4,0)),U=0,O=0,E.mode=16183;case 16183:for(;O<16;){if(0===P)break e;P--,U+=M[R++]<>8),512&E.flags&&4&E.wrap&&($[0]=255&U,$[1]=U>>>8&255,E.check=t(E.check,$,2,0)),U=0,O=0,E.mode=16184;case 16184:if(1024&E.flags){for(;O<16;){if(0===P)break e;P--,U+=M[R++]<>>8&255,E.check=t(E.check,$,2,0)),U=0,O=0}else E.head&&(E.head.extra=null);E.mode=16185;case 16185:if(1024&E.flags&&(q=E.length,q>P&&(q=P),q&&(E.head&&(j=E.head.extra_len-E.length,E.head.extra||(E.head.extra=new Uint8Array(E.head.extra_len)),E.head.extra.set(M.subarray(R,R+q),j)),512&E.flags&&4&E.wrap&&(E.check=t(E.check,M,q,R)),P-=q,R+=q,E.length-=q),E.length))break e;E.length=0,E.mode=16186;case 16186:if(2048&E.flags){if(0===P)break e;q=0;do{j=M[R+q++],E.head&&j&&E.length<65536&&(E.head.name+=String.fromCharCode(j))}while(j&&q>9&1,E.head.done=!0),I.adler=E.check=0,E.mode=A;break;case 16189:for(;O<32;){if(0===P)break e;P--,U+=M[R++]<>>=7&O,O-=7&O,E.mode=T;break}for(;O<3;){if(0===P)break e;P--,U+=M[R++]<>>=1,O-=1,3&U){case 0:E.mode=16193;break;case 1:if(L(E),E.mode=v,x===o){U>>>=2,O-=2;break e}break;case 2:E.mode=16196;break;case 3:I.msg="invalid block type",E.mode=y}U>>>=2,O-=2;break;case 16193:for(U>>>=7&O,O-=7&O;O<32;){if(0===P)break e;P--,U+=M[R++]<>>16^65535)){I.msg="invalid stored block lengths",E.mode=y;break}if(E.length=65535&U,U=0,O=0,E.mode=b,x===o)break e;case b:E.mode=16195;case 16195:if(q=E.length,q){if(q>P&&(q=P),q>N&&(q=N),0===q)break e;k.set(M.subarray(R,R+q),F),P-=q,R+=q,N-=q,F+=q,E.length-=q;break}E.mode=A;break;case 16196:for(;O<14;){if(0===P)break e;P--,U+=M[R++]<>>=5,O-=5,E.ndist=1+(31&U),U>>>=5,O-=5,E.ncode=4+(15&U),U>>>=4,O-=4,E.nlen>286||E.ndist>30){I.msg="too many length or distance symbols",E.mode=y;break}E.have=0,E.mode=16197;case 16197:for(;E.have>>=3,O-=3}for(;E.have<19;)E.lens[ie[E.have++]]=0;if(E.lencode=E.lendyn,E.lenbits=7,ee={bits:E.lenbits},Z=r(0,E.lens,0,19,E.lencode,0,E.work,ee),E.lenbits=ee.bits,Z){I.msg="invalid code lengths set",E.mode=y;break}E.have=0,E.mode=16198;case 16198:for(;E.have>>24,H=J>>>16&255,Y=65535&J,!(z<=O);){if(0===P)break e;P--,U+=M[R++]<>>=z,O-=z,E.lens[E.have++]=Y;else{if(16===Y){for(te=z+2;O>>=z,O-=z,0===E.have){I.msg="invalid bit length repeat",E.mode=y;break}j=E.lens[E.have-1],q=3+(3&U),U>>>=2,O-=2}else if(17===Y){for(te=z+3;O>>=z,O-=z,j=0,q=3+(7&U),U>>>=3,O-=3}else{for(te=z+7;O>>=z,O-=z,j=0,q=11+(127&U),U>>>=7,O-=7}if(E.have+q>E.nlen+E.ndist){I.msg="invalid bit length repeat",E.mode=y;break}for(;q--;)E.lens[E.have++]=j}}if(E.mode===y)break;if(0===E.lens[256]){I.msg="invalid code -- missing end-of-block",E.mode=y;break}if(E.lenbits=9,ee={bits:E.lenbits},Z=r(1,E.lens,0,E.nlen,E.lencode,0,E.work,ee),E.lenbits=ee.bits,Z){I.msg="invalid literal/lengths set",E.mode=y;break}if(E.distbits=6,E.distcode=E.distdyn,ee={bits:E.distbits},Z=r(2,E.lens,E.nlen,E.ndist,E.distcode,0,E.work,ee),E.distbits=ee.bits,Z){I.msg="invalid distances set",E.mode=y;break}if(E.mode=v,x===o)break e;case v:E.mode=w;case w:if(P>=6&&N>=258){I.next_out=F,I.avail_out=N,I.next_in=R,I.avail_in=P,E.hold=U,E.bits=O,i(I,V),F=I.next_out,k=I.output,N=I.avail_out,R=I.next_in,M=I.input,P=I.avail_in,U=E.hold,O=E.bits,E.mode===A&&(E.back=-1);break}for(E.back=0;J=E.lencode[U&(1<>>24,H=J>>>16&255,Y=65535&J,!(z<=O);){if(0===P)break e;P--,U+=M[R++]<>W)],z=J>>>24,H=J>>>16&255,Y=65535&J,!(W+z<=O);){if(0===P)break e;P--,U+=M[R++]<>>=W,O-=W,E.back+=W}if(U>>>=z,O-=z,E.back+=z,E.length=Y,0===H){E.mode=16205;break}if(32&H){E.back=-1,E.mode=A;break}if(64&H){I.msg="invalid literal/length code",E.mode=y;break}E.extra=15&H,E.mode=16201;case 16201:if(E.extra){for(te=E.extra;O>>=E.extra,O-=E.extra,E.back+=E.extra}E.was=E.length,E.mode=16202;case 16202:for(;J=E.distcode[U&(1<>>24,H=J>>>16&255,Y=65535&J,!(z<=O);){if(0===P)break e;P--,U+=M[R++]<>W)],z=J>>>24,H=J>>>16&255,Y=65535&J,!(W+z<=O);){if(0===P)break e;P--,U+=M[R++]<>>=W,O-=W,E.back+=W}if(U>>>=z,O-=z,E.back+=z,64&H){I.msg="invalid distance code",E.mode=y;break}E.offset=Y,E.extra=15&H,E.mode=16203;case 16203:if(E.extra){for(te=E.extra;O>>=E.extra,O-=E.extra,E.back+=E.extra}if(E.offset>E.dmax){I.msg="invalid distance too far back",E.mode=y;break}E.mode=16204;case 16204:if(0===N)break e;if(q=V-N,E.offset>q){if(q=E.offset-q,q>E.whave&&E.sane){I.msg="invalid distance too far back",E.mode=y;break}q>E.wnext?(q-=E.wnext,G=E.wsize-q):G=E.wnext-q,q>E.length&&(q=E.length),Q=E.window}else Q=k,G=F-E.offset,q=E.length;q>N&&(q=N),N-=q,E.length-=q;do{k[F++]=Q[G++]}while(--q);0===E.length&&(E.mode=w);break;case 16205:if(0===N)break e;k[F++]=E.length,N--,E.mode=w;break;case T:if(E.wrap){for(;O<32;){if(0===P)break e;P--,U|=M[R++]<{if(D(e))return u;let t=e.state;return t.window&&(t.window=null),e.state=null,s},inflate.inflateGetHeader=(e,t)=>{if(D(e))return u;const i=e.state;return 2&i.wrap?(i.head=t,t.done=!1,s):u},inflate.inflateSetDictionary=(t,i)=>{const r=i.length;let n,a,o;return D(t)||(n=t.state,0!==n.wrap&&n.mode!==p)?u:n.mode===p&&(a=1,a=e(a,i,r,0),a!==n.check)?f:(o=_(t,i,r,r),o?(n.mode=16210,h):(n.havedict=1,s))},inflate.inflateInfo="pako inflate (from Nodeca project)",inflate}function requireGzheader(){if(hasRequiredGzheader)return gzheader;return hasRequiredGzheader=1,gzheader=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}}function requireInflate(){if(hasRequiredInflate)return inflate$1;hasRequiredInflate=1;const e=requireInflate$1(),t=requireCommon(),i=requireStrings(),r=requireMessages(),n=requireZstream(),a=requireGzheader(),o=Object.prototype.toString,{Z_NO_FLUSH:s,Z_FINISH:l,Z_OK:c,Z_STREAM_END:u,Z_NEED_DICT:f,Z_STREAM_ERROR:h,Z_DATA_ERROR:d,Z_MEM_ERROR:m}=requireConstants();function g(s){this.options=t.assign({chunkSize:65536,windowBits:15,to:""},s||{});const l=this.options;l.raw&&l.windowBits>=0&&l.windowBits<16&&(l.windowBits=-l.windowBits,0===l.windowBits&&(l.windowBits=-15)),l.windowBits>=0&&l.windowBits<16&&!(s&&s.windowBits)&&(l.windowBits+=32),l.windowBits>15&&l.windowBits<48&&(15&l.windowBits||(l.windowBits|=15)),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new n,this.strm.avail_out=0;let u=e.inflateInit2(this.strm,l.windowBits);if(u!==c)throw new Error(r[u]);if(this.header=new a,e.inflateGetHeader(this.strm,this.header),l.dictionary&&("string"==typeof l.dictionary?l.dictionary=i.string2buf(l.dictionary):"[object ArrayBuffer]"===o.call(l.dictionary)&&(l.dictionary=new Uint8Array(l.dictionary)),l.raw&&(u=e.inflateSetDictionary(this.strm,l.dictionary),u!==c)))throw new Error(r[u])}function p(e,t){const i=new g(t);if(i.push(e),i.err)throw i.msg||r[i.err];return i.result}return g.prototype.push=function(t,r){const n=this.strm,a=this.options.chunkSize,g=this.options.dictionary;let p,A,S;if(this.ended)return!1;for(A=r===~~r?r:!0===r?l:s,"[object ArrayBuffer]"===o.call(t)?n.input=new Uint8Array(t):n.input=t,n.next_in=0,n.avail_in=n.input.length;;){for(0===n.avail_out&&(n.output=new Uint8Array(a),n.next_out=0,n.avail_out=a),p=e.inflate(n,A),p===f&&g&&(p=e.inflateSetDictionary(n,g),p===c?p=e.inflate(n,A):p===d&&(p=f));n.avail_in>0&&p===u&&n.state.wrap>0&&0!==t[n.next_in];)e.inflateReset(n),p=e.inflate(n,A);switch(p){case h:case d:case f:case m:return this.onEnd(p),this.ended=!0,!1}if(S=n.avail_out,n.next_out&&(0===n.avail_out||p===u))if("string"===this.options.to){let e=i.utf8border(n.output,n.next_out),t=n.next_out-e,r=i.buf2string(n.output,e);n.next_out=t,n.avail_out=a-t,t&&n.output.set(n.output.subarray(e,e+t),0),this.onData(r)}else this.onData(n.output.length===n.next_out?n.output:n.output.subarray(0,n.next_out));if(p!==c||0!==S){if(p===u)return p=e.inflateEnd(this.strm),this.onEnd(p),this.ended=!0,!0;if(0===n.avail_in)break}}return!0},g.prototype.onData=function(e){this.chunks.push(e)},g.prototype.onEnd=function(e){e===c&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=t.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},inflate$1.Inflate=g,inflate$1.inflate=p,inflate$1.inflateRaw=function(e,t){return(t=t||{}).raw=!0,p(e,t)},inflate$1.ungzip=p,inflate$1.constants=requireConstants(),inflate$1}function requirePako(){if(hasRequiredPako)return pako;hasRequiredPako=1;const{Deflate:e,deflate:t,deflateRaw:i,gzip:r}=requireDeflate(),{Inflate:n,inflate:a,inflateRaw:o,ungzip:s}=requireInflate(),l=requireConstants();return pako.Deflate=e,pako.deflate=t,pako.deflateRaw=i,pako.gzip=r,pako.Inflate=n,pako.inflate=a,pako.inflateRaw=o,pako.ungzip=s,pako.constants=l,pako}function requireParser(){return hasRequiredParser||(hasRequiredParser=1,function(e){var t=t||{};t.Tag=t.Tag||(typeof commonjsRequire<"u"?requireTag():null),t.Utils=t.Utils||(typeof commonjsRequire<"u"?requireUtilities():null),t.Dictionary=t.Dictionary||(typeof commonjsRequire<"u"?requireDictionary():null),t.Image=t.Image||(typeof commonjsRequire<"u"?requireImage():null);var i=i||(typeof commonjsRequire<"u"?requirePako():null);t.Parser=t.Parser||function(){this.littleEndian=!0,this.explicit=!0,this.metaFound=!1,this.metaFinished=!1,this.metaFinishedOffset=-1,this.needsDeflate=!1,this.inflated=null,this.encapsulation=!1,this.level=0,this.error=null},t.Parser.verbose=!1,t.Parser.MAGIC_COOKIE_OFFSET=128,t.Parser.MAGIC_COOKIE=[68,73,67,77],t.Parser.VRS=["AE","AS","AT","CS","DA","DS","DT","FL","FD","IS","LO","LT","OB","OD","OF","OW","PN","SH","SL","SS","ST","TM","UI","UL","UN","US","UT","UC"],t.Parser.DATA_VRS=["OB","OW","OF","SQ","UT","UN","UC"],t.Parser.RAW_DATA_VRS=["OB","OD","OF","OW","UN"],t.Parser.TRANSFER_SYNTAX_IMPLICIT_LITTLE="1.2.840.10008.1.2",t.Parser.TRANSFER_SYNTAX_EXPLICIT_LITTLE="1.2.840.10008.1.2.1",t.Parser.TRANSFER_SYNTAX_EXPLICIT_BIG="1.2.840.10008.1.2.2",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG="1.2.840.10008.1.2.4",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS="1.2.840.10008.1.2.4.57",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_LOSSLESS_SEL1="1.2.840.10008.1.2.4.70",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_8BIT="1.2.840.10008.1.2.4.50",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_BASELINE_12BIT="1.2.840.10008.1.2.4.51",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_LS_LOSSLESS="1.2.840.10008.1.2.4.80",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_LS="1.2.840.10008.1.2.4.81",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_2000_LOSSLESS="1.2.840.10008.1.2.4.90",t.Parser.TRANSFER_SYNTAX_COMPRESSION_JPEG_2000="1.2.840.10008.1.2.4.91",t.Parser.TRANSFER_SYNTAX_COMPRESSION_RLE="1.2.840.10008.1.2.5",t.Parser.TRANSFER_SYNTAX_COMPRESSION_DEFLATE="1.2.840.10008.1.2.1.99",t.Parser.UNDEFINED_LENGTH=4294967295,t.Parser.isMagicCookieFound=function(e){var i,r=t.Parser.MAGIC_COOKIE_OFFSET,n=t.Parser.MAGIC_COOKIE.length;for(i=0;i=this.metaFinishedOffset&&(this.needsDeflate=!1,a=e.buffer.slice(0,n.offsetEnd),o=e.buffer.slice(n.offsetEnd),this.inflated=t.Utils.concatArrayBuffers(a,i.inflateRaw(o)),e=new DataView(this.inflated)),n=this.getNextTag(e,n.offsetEnd)}catch(e){this.error=e}return null!==s&&(s.littleEndian=this.littleEndian),s},t.Parser.prototype.parseEncapsulated=function(e){var i,r=[];this.encapsulation=!0;try{for(i=this.getNextTag(e,0);null!==i;)i.isSublistItem()&&r.push(i),t.Parser.verbose&&console.log(i.toString()),i=this.getNextTag(e,i.offsetEnd)}catch(e){this.error=e}return r},t.Parser.prototype.testForValidTag=function(e){var t,i=null;try{t=this.findFirstTagOffset(e),i=this.getNextTag(e,t,!1)}catch(e){this.error=e}return i},t.Parser.prototype.getNextTag=function(e,i,r){var n,a,o,s=0,l=null,c=i,u=0,f=!0,h=null;if(i>=e.byteLength)return null;this.metaFinished?(f=this.littleEndian,s=e.getUint16(i,f)):(s=e.getUint16(i,!0),-1!==this.metaFinishedOffset&&i>=this.metaFinishedOffset||2!==s?(this.metaFinished=!0,f=this.littleEndian,s=e.getUint16(i,f)):f=!0),!this.metaFound&&2===s&&(this.metaFound=!0),i+=2,n=e.getUint16(i,f),i+=2,this.explicit||!this.metaFinished?(h=t.Utils.getStringAt(e,i,2),!this.metaFound&&this.metaFinished&&-1===t.Parser.VRS.indexOf(h)?(h=t.Dictionary.getVR(s,n),u=e.getUint32(i,f),i+=4,this.explicit=!1):(i+=2,-1!==t.Parser.DATA_VRS.indexOf(h)?(i+=2,u=e.getUint32(i,f),i+=4):(u=e.getUint16(i,f),i+=2))):(h=t.Dictionary.getVR(s,n),(u=e.getUint32(i,f))===t.Parser.UNDEFINED_LENGTH&&(h="SQ"),i+=4),a=i;var d=s===t.Tag.TAG_PIXEL_DATA[0]&&n===t.Tag.TAG_PIXEL_DATA[1];if("SQ"!==h&&(40===s&&n>=4609&&n<4864||d||this.encapsulation||-1===t.Parser.DATA_VRS.indexOf(h)||"UC"===h)?u>0&&!r&&(u===t.Parser.UNDEFINED_LENGTH&&d&&(u=e.byteLength-i),l=e.buffer.slice(i,i+u)):(l=this.parseSublist(e,i,u,"SQ"!==h),u===t.Parser.UNDEFINED_LENGTH&&(u=l[l.length-1].offsetEnd-i)),i+=u,(o=new t.Tag(s,n,h,l,c,a,i,this.littleEndian,this.charset)).value)if(o.isTransformSyntax())this.transformSyntaxAlreadyExist=!0,o.value[0]===t.Parser.TRANSFER_SYNTAX_IMPLICIT_LITTLE?(this.explicit=!1,this.littleEndian=!0):o.value[0]===t.Parser.TRANSFER_SYNTAX_EXPLICIT_BIG?(this.explicit=!0,this.littleEndian=!1):o.value[0]===t.Parser.TRANSFER_SYNTAX_COMPRESSION_DEFLATE?(this.needsDeflate=!0,this.explicit=!0,this.littleEndian=!0):(this.explicit=!0,this.littleEndian=!0);else if(o.isMetaLength())this.metaFinishedOffset=o.value[0]+i;else if(o.isCharset()){var m=o.value;2==m.length?m=(m[0]||"ISO 2022 IR 6")+"\\"+m[1]:1==m.length&&(m=m[0]),this.charset=m}return o},t.Parser.prototype.parseSublist=function(e,i,r,n){var a,o=i+r,s=[];if(this.level++,r===t.Parser.UNDEFINED_LENGTH){for(a=this.parseSublistItem(e,i,n);!a.isSequenceDelim();)s.push(a),i=a.offsetEnd,a=this.parseSublistItem(e,i,n);s.push(a)}else for(;it.Image.OBLIQUITY_THRESHOLD_COSINE_VALUE&&s>l&&s>c?n:l>t.Image.OBLIQUITY_THRESHOLD_COSINE_VALUE&&l>s&&l>c?a:c>t.Image.OBLIQUITY_THRESHOLD_COSINE_VALUE&&c>s&&c>l?o:null},t.Image.prototype.getCols=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_COLS[0],t.Tag.TAG_COLS[1]),0)},t.Image.prototype.getRows=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_ROWS[0],t.Tag.TAG_ROWS[1]),0)},t.Image.prototype.getSeriesDescription=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_SERIES_DESCRIPTION[0],t.Tag.TAG_SERIES_DESCRIPTION[1]),0)},t.Image.prototype.getSeriesInstanceUID=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_SERIES_INSTANCE_UID[0],t.Tag.TAG_SERIES_INSTANCE_UID[1]),0)},t.Image.prototype.getSeriesNumber=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_SERIES_NUMBER[0],t.Tag.TAG_SERIES_NUMBER[1]),0)},t.Image.prototype.getEchoNumber=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_ECHO_NUMBER[0],t.Tag.TAG_ECHO_NUMBER[1]),0)},t.Image.prototype.getImagePosition=function(){return t.Image.getValueSafely(this.getTag(t.Tag.TAG_IMAGE_POSITION[0],t.Tag.TAG_IMAGE_POSITION[1]))},t.Image.prototype.getImageDirections=function(){return t.Image.getValueSafely(this.getTag(t.Tag.TAG_IMAGE_ORIENTATION[0],t.Tag.TAG_IMAGE_ORIENTATION[1]))},t.Image.prototype.getImagePositionSliceDir=function(e){var i=t.Image.getValueSafely(this.getTag(t.Tag.TAG_IMAGE_POSITION[0],t.Tag.TAG_IMAGE_POSITION[1]));return i&&e>=0?i[e]:0},t.Image.prototype.getModality=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_MODALITY[0],t.Tag.TAG_MODALITY[1]),0)},t.Image.prototype.getSliceLocation=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_SLICE_LOCATION[0],t.Tag.TAG_SLICE_LOCATION[1]),0)},t.Image.prototype.getSliceLocationVector=function(){return t.Image.getValueSafely(this.getTag(t.Tag.TAG_SLICE_LOCATION_VECTOR[0],t.Tag.TAG_SLICE_LOCATION_VECTOR[1]))},t.Image.prototype.getImageNumber=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_IMAGE_NUM[0],t.Tag.TAG_IMAGE_NUM[1]),0)},t.Image.prototype.getTemporalPosition=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_TEMPORAL_POSITION[0],t.Tag.TAG_TEMPORAL_POSITION[1]),0)},t.Image.prototype.getTemporalNumber=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_NUMBER_TEMPORAL_POSITIONS[0],t.Tag.TAG_NUMBER_TEMPORAL_POSITIONS[1]),0)},t.Image.prototype.getSliceGap=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_SLICE_GAP[0],t.Tag.TAG_SLICE_GAP[1]),0)},t.Image.prototype.getSliceThickness=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_SLICE_THICKNESS[0],t.Tag.TAG_SLICE_THICKNESS[1]),0)},t.Image.prototype.getImageMax=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_IMAGE_MAX[0],t.Tag.TAG_IMAGE_MAX[1]),0)},t.Image.prototype.getImageMin=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_IMAGE_MIN[0],t.Tag.TAG_IMAGE_MIN[1]),0)},t.Image.prototype.getDataScaleSlope=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_DATA_SCALE_SLOPE[0],t.Tag.TAG_DATA_SCALE_SLOPE[1]),0)},t.Image.prototype.getDataScaleIntercept=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_DATA_SCALE_INTERCEPT[0],t.Tag.TAG_DATA_SCALE_INTERCEPT[1]),0)},t.Image.prototype.getDataScaleElscint=function(){var e=t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_DATA_SCALE_ELSCINT[0],t.Tag.TAG_DATA_SCALE_ELSCINT[1]),0);e||(e=1);var i=this.getPixelBandwidth();return(e=Math.sqrt(i)/(10*e))<=0&&(e=1),e},t.Image.prototype.getWindowWidth=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_WINDOW_WIDTH[0],t.Tag.TAG_WINDOW_WIDTH[1]),0)},t.Image.prototype.getWindowCenter=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_WINDOW_CENTER[0],t.Tag.TAG_WINDOW_CENTER[1]),0)},t.Image.prototype.getPixelBandwidth=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_PIXEL_BANDWIDTH[0],t.Tag.TAG_PIXEL_BANDWIDTH[1]),0)},t.Image.prototype.getSeriesId=function(){var e=this.getSeriesDescription(),t=this.getSeriesInstanceUID(),i=this.getSeriesNumber(),r=this.getEchoNumber(),n=this.getOrientation(),a="";return null!==e&&(a+=" "+e),null!==t&&(a+=" "+t),null!==i&&(a+=" "+i),null!==r&&(a+=" "+r),null!==n&&(a+=" "+n),a+=" ("+this.getCols()+" x "+this.getRows()+")"},t.Image.prototype.getPixelSpacing=function(){return t.Image.getValueSafely(this.getTag(t.Tag.TAG_PIXEL_SPACING[0],t.Tag.TAG_PIXEL_SPACING[1]))},t.Image.prototype.getImageType=function(){return t.Image.getValueSafely(this.getTag(t.Tag.TAG_IMAGE_TYPE[0],t.Tag.TAG_IMAGE_TYPE[1]))},t.Image.prototype.getBitsStored=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_BITS_STORED[0],t.Tag.TAG_BITS_STORED[1]),0)},t.Image.prototype.getBitsAllocated=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_BITS_ALLOCATED[0],t.Tag.TAG_BITS_ALLOCATED[1]),0)},t.Image.prototype.getFrameTime=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_FRAME_TIME[0],t.Tag.TAG_FRAME_TIME[1]),0)},t.Image.prototype.getAcquisitionMatrix=function(){var e,i,r,n;return(e=[0,0])[0]=t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_ACQUISITION_MATRIX[0],t.Tag.TAG_ACQUISITION_MATRIX[1]),0),null===this.privateDataAll&&(this.privateDataAll=this.getAllInterpretedPrivateData()),null!==this.privateDataAll&&this.privateDataAll.length>0&&(-1!==(r=this.privateDataAll.indexOf("AcquisitionMatrixText"))&&(-1!==(n=this.privateDataAll.indexOf("\n",r))&&(null!==(i=this.privateDataAll.substring(r,n).match(/\d+/g))&&2===i.length?(e[0]=i[0],e[1]=i[1]):null!==i&&1===i.length&&(e[0]=i[0])))),0===e[1]&&(e[1]=e[0]),e},t.Image.prototype.getTR=function(){return t.Image.getSingleValueSafely(this.getTag(t.Tag.TAG_TR,t.Tag.TAG_TR[1]),0)},t.Image.prototype.putTag=function(e){this.tags[e.id]&&this.tags[e.id].value[0]!==e.value[0]||(this.tags[e.id]=e,this.putFlattenedTag(this.tagsFlat,e))},t.Image.prototype.putFlattenedTag=function(e,t){var i;if(t.sublist)for(i=0;im&&(m=g,A=C);return i?{data:l,min:d,minIndex:p,max:m,maxIndex:A,numCols:this.getCols(),numRows:this.getRows()}:l},t.Image.prototype.convertPalette=function(){var e,i,r,n,a,o,s,l,c,u,f,h;if(e=this.tags[t.Tag.createId(t.Tag.TAG_PIXEL_DATA[0],t.Tag.TAG_PIXEL_DATA[1])].value,i=this.getPalleteValues(t.Tag.TAG_PALETTE_RED),r=this.getPalleteValues(t.Tag.TAG_PALETTE_GREEN),n=this.getPalleteValues(t.Tag.TAG_PALETTE_BLUE),null!==i&&i.length>0&&null!==r&&r.length>0&&null!==n&&n.length>0&&!this.convertedPalette){if(a=new DataView(new ArrayBuffer(this.getRows()*this.getCols()*this.getNumberOfFrames()*3)),o=parseInt(Math.ceil(this.getBitsAllocated()/8)),s=e.byteLength/o,1===o)for(l=0;ll&&(l=Math.abs(a[e]),o=e);for(l=0;e<6;e+=1)Math.abs(a[e])>l&&(l=Math.abs(a[e]),s=e);switch(o){case 0:c+="X",c+=4===s?"YZ":"ZY";break;case 1:c+="Y",c+=3===s?"XZ":"ZX";break;case 2:c+="Z",c+=3===s?"XY":"YX"}switch(o){case 0:a[o]>0?c+="-":c+="+",4===s?a[s]>0?c+="-":c+="+":a[s]>0?c+="+":c+="-";break;case 1:a[o]>0?c+="-":c+="+",3===s?a[s]>0?c+="-":c+="+":a[s]>0?c+="+":c+="-";break;case 2:a[o]>0?c+="+":c+="-",a[s]>0?c+="-":c+="+"}if(0===r)n=c+="+";else{switch(c.charAt(2)){case"X":c+=r>0?"-":"+";break;case"Y":case"Z":c+=r>0?"+":"-"}n=c}return n},t.Image.prototype.isMosaic=function(){var e,t,i,r,n=!1;if(null!==(e=this.getImageType()))for(i=0;i0&&(r[0]1?o[r]=t.Utils.concatArrayBuffers2(a[r]):o[r]=a[r][0],a[r]=null;return o},t.Image.prototype.getRLE=function(){var e,t,i,r=[];if(e=this.getEncapsulatedData())for(t=e.length,i=1;i");return i=(i=i.replace(/\n\s*\n/g,"\n")).replace(/(?:\r\n|\r|\n)/g,"
")},t.Image.prototype.getPalleteValues=function(e){var i,r,n,a,o,s,l,c,u;if(i=null,r=null,null!==(n=t.Image.getValueSafely(this.getTag(e[0],e[1])))){for(a=n.buffer.byteLength/2,i=[],r=[],o=0;o255||t<0)for(n=255/(i-t),a=t,r=0;r1&&null!==e[0].getTemporalPosition(),l=i>1&&null!==e[0].getTemporalNumber()&&e[0].getTemporalNumber()===i,s&&l)for(c=0;c1||this.isMosaic&&this.images[0].length>1,this.isMultiFrameVolume=!1,this.isMultiFrameTimeseries=!1,this.isImplicitTimeseries=!1,this.isMultiFrame&&(e=this.images[0].getFrameTime()>0,this.isMosaic||e?this.isMultiFrameTimeseries=!0:this.numberOfFramesInFile>1?(this.isMultiFrameTimeseries=!0,this.numberOfFrames=this.images.length):this.isMultiFrameVolume=!0),!this.isMosaic&&this.numberOfFrames<=1){for(r=(this.images[0].getImagePosition()||[]).toString(),this.numberOfFrames=0,i=0;i1&&(this.isImplicitTimeseries=!0)}this.sliceDir=this.images[0].getAcquiredSliceDirection(),a=(n=t.Series.useExplicitOrdering?this.images.slice():t.Series.orderDicoms(this.images,this.numberOfFrames,this.sliceDir))[0].getImagePositionSliceDir(this.sliceDir),o=n[n.length-1].getImagePositionSliceDir(this.sliceDir)-a,t.Series.useExplicitOrdering?this.sliceSense=!1:this.isMosaic?this.sliceSense=!0:this.isMultiFrame?null!==(s=n[0].getSliceLocationVector())?"Z"===n[0].getOrientation().charAt(2)?this.sliceSense=s[0]-s[s.length-1]<0:this.sliceSense=s[0]-s[s.length-1]>0:this.sliceSense=!(a<0):this.sliceDir===t.Image.SLICE_DIRECTION_SAGITTAL||this.sliceDir===t.Image.SLICE_DIRECTION_CORONAL?this.sliceSense=!(o>0):this.sliceSense=o>0,this.imagesOriginalOrder=this.images,this.images=n},t.Series.prototype.concatenateImageData=function(e,i){var r,n,a;n=this.isMosaic?this.getMosaicData(this.images[0],this.images[0].getPixelDataBytes()):this.images[0].getPixelDataBytes(),a=this.validatePixelDataLength(this.images[0]),this.images[0].clearPixelData(),(r=new Uint8Array(new ArrayBuffer(a*this.images.length))).set(new Uint8Array(n,0,a),0),setTimeout(t.Utils.bind(this,(function(){this.concatenateNextImageData(r,a,e,1,i)})),0)},t.Series.prototype.concatenateNextImageData=function(e,i,r,n,a){var o,s;n>=this.images.length?(r&&r.drawProgress(1,"Reading DICOM Images"),a(e.buffer)):(r&&r.drawProgress(n/this.images.length,"Reading DICOM Images"),o=this.isMosaic?this.getMosaicData(this.images[n],this.images[n].getPixelDataBytes()):this.images[n].getPixelDataBytes(),s=this.validatePixelDataLength(this.images[n]),this.images[n].clearPixelData(),e.set(new Uint8Array(o,0,s),i*n),setTimeout(t.Utils.bind(this,(function(){this.concatenateNextImageData(e,i,r,n+1,a)})),0))},t.Series.prototype.validatePixelDataLength=function(e){var t=e.getPixelDataBytes().byteLength,i=e.getCols()*e.getRows();return t%i==0?t:i*e.getNumberOfFrames()*e.getNumberOfSamplesPerPixel()*(e.getBitsAllocated()/8)},t.Series.prototype.getMosaicData=function(e,i){var r,n,a,o,s,l,c,u,f,h,d,m,g,p,A,S,b,v=0;for(c=parseInt(this.images[0].getBitsAllocated()/8),d=this.images[0].getMosaicCols()*this.images[0].getMosaicRows(),m=parseInt(this.images[0].getRows()/this.images[0].getMosaicRows()),g=parseInt(this.images[0].getCols()/this.images[0].getMosaicCols()),r=this.images[0].getCols(),n=this.images[0].getRows(),a=this.images[0].getMosaicRows(),o=this.images[0].getMosaicCols(),s=parseInt(n/a),l=parseInt(r/o),p=new Uint8Array(new ArrayBuffer(d*m*g*c)),A=new Uint8Array(i),u=0;u{const e=new ArrayBuffer(2);return new DataView(e).setInt16(0,256,!0),256===new Int16Array(e)[0]};var NiiDataType=(e=>(e[e.DT_NONE=0]="DT_NONE",e[e.DT_BINARY=1]="DT_BINARY",e[e.DT_UINT8=2]="DT_UINT8",e[e.DT_INT16=4]="DT_INT16",e[e.DT_INT32=8]="DT_INT32",e[e.DT_FLOAT32=16]="DT_FLOAT32",e[e.DT_COMPLEX64=32]="DT_COMPLEX64",e[e.DT_FLOAT64=64]="DT_FLOAT64",e[e.DT_RGB24=128]="DT_RGB24",e[e.DT_INT8=256]="DT_INT8",e[e.DT_UINT16=512]="DT_UINT16",e[e.DT_UINT32=768]="DT_UINT32",e[e.DT_INT64=1024]="DT_INT64",e[e.DT_UINT64=1280]="DT_UINT64",e[e.DT_FLOAT128=1536]="DT_FLOAT128",e[e.DT_COMPLEX128=1792]="DT_COMPLEX128",e[e.DT_COMPLEX256=2048]="DT_COMPLEX256",e[e.DT_RGBA32=2304]="DT_RGBA32",e))(NiiDataType||{}),NiiIntentCode=(e=>(e[e.NIFTI_INTENT_LABEL=1002]="NIFTI_INTENT_LABEL",e[e.NIFTI_INTENT_VECTOR=1007]="NIFTI_INTENT_VECTOR",e[e.NIFTI_INTENT_RGB_VECTOR=2003]="NIFTI_INTENT_RGB_VECTOR",e))(NiiIntentCode||{}),ImageType=(e=>(e[e.UNKNOWN=0]="UNKNOWN",e[e.NII=1]="NII",e[e.DCM=2]="DCM",e[e.DCM_MANIFEST=3]="DCM_MANIFEST",e[e.MIH=4]="MIH",e[e.MIF=5]="MIF",e[e.NHDR=6]="NHDR",e[e.NRRD=7]="NRRD",e[e.MHD=8]="MHD",e[e.MHA=9]="MHA",e[e.MGH=10]="MGH",e[e.MGZ=11]="MGZ",e[e.V=12]="V",e[e.V16=13]="V16",e[e.VMR=14]="VMR",e[e.HEAD=15]="HEAD",e[e.DCM_FOLDER=16]="DCM_FOLDER",e[e.SRC=17]="SRC",e[e.FIB=18]="FIB",e))(ImageType||{});const NVIMAGE_TYPE=Object.freeze({...ImageType,parse:e=>{let t=0;switch(e.toUpperCase()){case"":case"DCM":t=2;break;case"TXT":t=3;break;case"FIB":t=18;break;case"NII":t=1;break;case"MIH":t=4;break;case"MIF":t=5;break;case"NHDR":t=6;break;case"NRRD":t=7;break;case"MHD":t=8;break;case"MHA":t=9;break;case"MGH":t=10;break;case"MGZ":t=11;break;case"SRC":t=17;break;case"V":t=12;break;case"V16":t=13;break;case"VMR":t=14;break;case"HEAD":t=15}return t}}),NVImageFromUrlOptions=(e,t="",i="",r="gray",n=1,a=NaN,o=NaN,s=!0,l=.02,c=!1,u=!1,f="",h=0,d=NVIMAGE_TYPE.UNKNOWN,m=NaN,g=NaN,p=!0,A=!1,S=null)=>({url:e,urlImageData:t,name:i,colormap:r,colorMap:r,opacity:n,cal_min:a,cal_max:o,trustCalMinMax:s,percentileFrac:l,ignoreZeroVoxels:c,useQFormNotSForm:u,colormapNegative:f,imageType:d,cal_minNeg:m,cal_maxNeg:g,colorbarVisible:p,frame4D:h,alphaThreshold:A,colormapLabel:S});function getBestTransform(e,t,i){const r=e;let n=null;if(r){const e={colSize:t[0],rowSize:t[1],sliceSize:t[2]},a=i,o=[r[0],r[1],r[2]],s=[r[3],r[4],r[5]],l=[o[1]*s[2]-o[2]*s[1],o[2]*s[0]-o[0]*s[2],o[0]*s[1]-o[1]*s[0]];n=[[o[0]*e.colSize*-1,s[0]*e.rowSize*-1,l[0]*e.sliceSize*-1,-1*a[0]],[o[1]*e.colSize*-1,s[1]*e.rowSize*-1,l[1]*e.sliceSize*-1,-1*a[1]],[o[2]*e.colSize,s[2]*e.rowSize,l[2]*e.sliceSize,a[2]],[0,0,0,1]]}return n}function str2Buffer(e,t=80){e=e.replace(/[`$]/g,"");const i=[],r=Math.min(t,e.length);for(let t=0;t=s)break;let l=!0;for(let e=0;e<3;++e)n[e]>r[e]&&(l=!1),a[e]{})),g0(this,"onOpacityChange",(()=>{})),g0(this,"mm000"),g0(this,"mm100"),g0(this,"mm010"),g0(this,"mm001"),g0(this,"cal_min"),g0(this,"cal_max"),g0(this,"robust_min"),g0(this,"robust_max"),g0(this,"global_min"),g0(this,"global_max"),g0(this,"urlImgData"),g0(this,"isManifest"),g0(this,"limitFrames4D"),this.name=t,this.id=v4(),this._colormap=i,this._opacity=r>1?1:r,this.percentileFrac=l,this.ignoreZeroVoxels=c,this.trustCalMinMax=s,this.colormapNegative=f,this.colormapLabel=A,this.frame4D=h,this.cal_minNeg=m,this.cal_maxNeg=g,this.colorbarVisible=p,this.useQFormNotSForm=u,!e)return;const S=/(?:\.([^.]+))?$/;let b=S.exec(t)[1]||"";b=b.toUpperCase(),"GZ"===b&&(b=S.exec(t.slice(0,-3))[1],b=b.toUpperCase());let v=null;switch(d===NVIMAGE_TYPE.UNKNOWN&&(d=NVIMAGE_TYPE.parse(b)),this.imageType=d,d){case NVIMAGE_TYPE.DCM_FOLDER:case NVIMAGE_TYPE.DCM_MANIFEST:case NVIMAGE_TYPE.DCM:v=this.readDICOM(e);break;case NVIMAGE_TYPE.FIB:[v,this.v1]=this.readFIB(e);break;case NVIMAGE_TYPE.MIH:case NVIMAGE_TYPE.MIF:v=this.readMIF(e,n);break;case NVIMAGE_TYPE.NHDR:case NVIMAGE_TYPE.NRRD:v=this.readNRRD(e,n);break;case NVIMAGE_TYPE.MHD:case NVIMAGE_TYPE.MHA:v=this.readMHA(e,n);break;case NVIMAGE_TYPE.MGH:case NVIMAGE_TYPE.MGZ:v=this.readMGH(e);break;case NVIMAGE_TYPE.SRC:v=this.readSRC(e);break;case NVIMAGE_TYPE.V:v=this.readECAT(e);break;case NVIMAGE_TYPE.V16:v=this.readV16(e);break;case NVIMAGE_TYPE.VMR:v=this.readVMR(e);break;case NVIMAGE_TYPE.HEAD:v=this.readHEAD(e,n);break;case NVIMAGE_TYPE.NII:this.hdr=nifti.readHeader(e),null!==this.hdr&&(0===this.hdr.cal_min&&255===this.hdr.cal_max&&(this.hdr.cal_max=0),v=nifti.isCompressed(e)?nifti.readImage(this.hdr,nifti.decompress(e)):nifti.readImage(this.hdr,e));break;default:throw new Error("Image type not supported")}if(this.hdr&&"number"==typeof this.hdr.magic&&(this.hdr.magic="n+1"),this.nFrame4D=1,this.hdr)for(let e=4;e<7;e++)this.hdr.dims[e]>1&&(this.nFrame4D*=this.hdr.dims[e]);if(this.frame4D=Math.min(this.frame4D,this.nFrame4D-1),this.nTotalFrame4D=this.nFrame4D,!this.hdr||!v)return;this.nVox3D=this.hdr.dims[1]*this.hdr.dims[2]*this.hdr.dims[3];const w=this.nVox3D*(this.hdr.numBitsPerVoxel/8),T=v.byteLength/w;T!==this.nFrame4D&&(T>0&&T*w===v.byteLength?log.debug("Loading the first "+T+" of "+this.nFrame4D+" volumes"):log.warn("This header does not match voxel data",this.hdr,v.byteLength),this.nFrame4D=T),(this.hdr.intent_code===NiiIntentCode.NIFTI_INTENT_VECTOR||this.hdr.intent_code===NiiIntentCode.NIFTI_INTENT_RGB_VECTOR)&&3===this.nFrame4D&&this.hdr.datatypeCode===NiiDataType.DT_FLOAT32&&(v=this.float32V1asRGBA(new Float32Array(v))),(0===this.hdr.pixDims[1]||0===this.hdr.pixDims[2]||0===this.hdr.pixDims[3])&&log.error("pixDims not plausible",this.hdr),(isNaN(this.hdr.scl_slope)||0===this.hdr.scl_slope)&&(this.hdr.scl_slope=1),isNaN(this.hdr.scl_inter)&&(this.hdr.scl_inter=0);let y=isAffineOK(this.hdr.affine);if(u||!y||this.hdr.qform_code>this.hdr.sform_code){log.debug("spatial transform based on QForm");const e=this.hdr.quatern_b,t=this.hdr.quatern_c,i=this.hdr.quatern_d,r=Math.sqrt(1-(Math.pow(e,2)+Math.pow(t,2)+Math.pow(i,2))),n=0===this.hdr.pixDims[0]?1:this.hdr.pixDims[0],a=[[r*r+e*e-t*t-i*i,2*e*t-2*r*i,2*e*i+2*r*t],[2*e*t+2*r*i,r*r+t*t-e*e-i*i,2*t*i-2*r*e],[2*e*i-2*r*t,2*t*i+2*r*e,r*r+i*i-t*t-e*e]],o=this.hdr.affine;for(let e=0;e<3;e+=1)for(let t=0;t<3;t+=1)o[e][t]=a[e][t]*this.hdr.pixDims[t+1],2===t&&(o[e][t]*=n);o[0][3]=this.hdr.qoffset_x,o[1][3]=this.hdr.qoffset_y,o[2][3]=this.hdr.qoffset_z,this.hdr.affine=o}if(y=isAffineOK(this.hdr.affine),!y){log.debug("Defective NIfTI: spatial transform does not make sense");let e=this.hdr.pixDims[1],t=this.hdr.pixDims[2],i=this.hdr.pixDims[3];(isNaN(e)||0===e)&&(e=1),(isNaN(t)||0===t)&&(t=1),(isNaN(i)||0===i)&&(i=1),this.hdr.pixDims[1]=e,this.hdr.pixDims[2]=t,this.hdr.pixDims[3]=i;const r=[[e,0,0,0],[0,t,0,0],[0,0,i,0],[0,0,0,1]];this.hdr.affine=r}if(this.hdr.datatypeCode!==NiiDataType.DT_RGB24&&this.hdr.datatypeCode!==NiiDataType.DT_RGBA32&&this.hdr.littleEndian!==isPlatformLittleEndian()&&this.hdr.numBitsPerVoxel>8)if(16===this.hdr.numBitsPerVoxel){const e=new Uint16Array(v);for(let t=0;t>8&255)<<16>>16}}else if(32===this.hdr.numBitsPerVoxel){const e=new Uint32Array(v);for(let t=0;t>8&65280|i>>24&255}}else if(64===this.hdr.numBitsPerVoxel){const e=this.hdr.numBitsPerVoxel/8,t=new Uint8Array(v);for(let i=0;i.01?log.warn("Warning voxels not aligned with world space: "+c+" degrees from plumb.\n"):c=0,c}float32V1asRGBA(e){e.length!==3*this.nVox3D&&log.warn("float32V1asRGBA() expects "+3*this.nVox3D+"voxels, got ",+e.length);const t=e.slice();this.hdr.datatypeCode=NiiDataType.DT_RGBA32,this.nFrame4D=1;for(let e=4;e<7;e++)this.hdr.dims[e]=1;this.hdr.dims[0]=3;const i=new Uint8Array(4*this.nVox3D);let r=1;for(let e=0;e<3*this.nVox3D;e++)isNaN(t[e])||(r=Math.max(r,Math.abs(t[e])));const n=255/r,a=2*this.nVox3D;let o=0;for(let e=0;e0)+2*+(s>0)+4*+(l>0);Math.abs(r)+Math.abs(s)+Math.abs(l)<.1&&(c=0),i[o+3]=c,o+=4}return i}loadImgV1(e=!1,t=!1,i=!1){let r=this.v1;if(!r&&3===this.nFrame4D&&this.img.constructor===Float32Array&&(r=this.img.slice()),!r)return log.warn("Image does not have V1 data"),!1;if(e)for(let e=0;e.1&&log.warn("Warning: voxels are rhomboidal, maximum shear is %f degrees.",this.maxShearDeg);const l=fromValues$1(this.dimsRAS[1],this.dimsRAS[2],this.dimsRAS[3],1),c=clone$2(this.matRAS);transpose(c,c);const u=fromValues$1(-.5,-.5,-.5,0);translate(c,c,fromValues$2(u[0],u[1],u[2])),c[0]*=l[0],c[1]*=l[0],c[2]*=l[0],c[4]*=l[1],c[5]*=l[1],c[6]*=l[1],c[8]*=l[2],c[9]*=l[2],c[10]*=l[2],this.frac2mm=clone$2(c);const f=this.pixDimsRAS[1],h=this.pixDimsRAS[2],d=this.pixDimsRAS[3],m=clone$2(c);m[0]=f*l[0],m[1]=0,m[2]=0,m[4]=0,m[5]=h*l[1],m[6]=0,m[8]=0,m[9]=0,m[10]=d*l[2];const g=this.mm2vox([0,0,0],!0);m[12]=(-g[0]-.5)*f,m[13]=(-g[1]-.5)*h,m[14]=(-g[2]-.5)*d,this.frac2mmOrtho=clone$2(m),this.extentsMinOrtho=[m[12],m[13],m[14]],this.extentsMaxOrtho=[m[0]+m[12],m[5]+m[13],m[10]+m[14]],this.mm2ortho=create$3(),invert(this.mm2ortho,n)}THD_daxes_to_NIFTI(e,t,i){const r=this.hdr;if(null===r)throw new Error("HDR is not set");r.sform_code=2;const n="xxyyzzg";let a=-1,o=-1,s=-1;const l=["x","y","z"];l[0]=n[i[0]],l[1]=n[i[1]],l[2]=n[i[2]];const c=e.slice(0,3),u=t.slice(0,3);for(let e=0;e<3;e++)"x"===l[e]?a=e:"y"===l[e]?o=e:s=e;a<0||o<0||s<0||a===o||a===s||o===s||(r.pixDims[1]=Math.abs(c[0]),r.pixDims[2]=Math.abs(c[1]),r.pixDims[3]=Math.abs(c[2]),r.affine=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],r.affine[0][a]=-c[a],r.affine[1][o]=-c[o],r.affine[2][s]=c[s],r.affine[0][3]=-u[a],r.affine[1][3]=-u[o],r.affine[2][3]=u[s])}SetPixDimFromSForm(){if(!this.hdr)throw new Error("hdr not defined");const e=this.hdr.affine,t=fromValues$3(e[0][0],e[0][1],e[0][2],e[0][3],e[1][0],e[1][1],e[1][2],e[1][3],e[2][0],e[2][1],e[2][2],e[2][3],e[3][0],e[3][1],e[3][2],e[3][3]),i=this.vox2mm([0,0,0],t),r=this.vox2mm([1,0,0],t);subtract$1(r,r,i);const n=this.vox2mm([0,1,0],t);subtract$1(n,n,i);const a=this.vox2mm([0,0,1],t);subtract$1(a,a,i),this.hdr.pixDims[1]=length$1(r),this.hdr.pixDims[2]=length$1(n),this.hdr.pixDims[3]=length$1(a)}readDICOM(e){if(this.series=new daikon.Series,Array.isArray(e))for(let t=0;t1&&(t.dims[3]>1&&log.debug("To Do: multiple slices per file and multiple files (XA30 DWI)"),t.dims[3]=this.series.images.length);const i=this.series.images[0].getPixelSpacing();if(t.pixDims[1]=i[0],t.pixDims[2]=i[1],this.series.images.length>1){const e=fromValues$2(...this.series.images[0].getImagePosition()),i=fromValues$2(...this.series.images[1].getImagePosition()),r=fromValues$2(0,0,0);subtract$1(r,e,i),t.pixDims[3]=length$1(r)}else t.pixDims[3]=this.series.images[0].getSliceThickness();t.pixDims[4]=this.series.images[0].getTR()/1e3;const r=this.series.images[0].getDataType(),n=this.series.images[0].getBitsAllocated();t.numBitsPerVoxel=n,this.hdr.littleEndian=this.series.images[0].littleEndian,8===n&&2===r?t.datatypeCode=NiiDataType.DT_INT8:8===n&&3===r?t.datatypeCode=NiiDataType.DT_UINT8:16===n&&2===r?t.datatypeCode=NiiDataType.DT_INT16:16===n&&3===r?t.datatypeCode=NiiDataType.DT_UINT16:32===n&&2===r?t.datatypeCode=NiiDataType.DT_INT32:32===n&&3===r?t.datatypeCode=NiiDataType.DT_UINT32:32===n&&4===r?t.datatypeCode=NiiDataType.DT_FLOAT32:64===n&&4===r?t.datatypeCode=NiiDataType.DT_FLOAT64:1===n?t.datatypeCode=NiiDataType.DT_BINARY:log.warn("Unsupported DICOM format: "+r+" "+n);const a=t.pixDims.slice(1,4),o=getBestTransform(this.series.images[0].getImageDirections(),a,this.series.images[0].getImagePosition());o&&(t.sform_code=1,t.affine=[[o[0][0],o[0][1],o[0][2],o[0][3]],[o[1][0],o[1][1],o[1][2],o[1][3]],[o[2][0],o[2][1],o[2][2],o[2][3]],[0,0,0,1]]);let s,l=this.series.validatePixelDataLength(this.series.images[0]);const c=new Uint8Array(new ArrayBuffer(l*this.series.images.length));for(let e=0;e14)throw new Error("Not a valid ECAT file");let a=512,o=0;const s=[];let l=new Float32Array;for(;;){if(i.getInt32(a,!1)+i.getInt32(a+12,!1)!==31)break;let e=a+20,r=0,n=0;for(;r<31&&(n=i.getInt32(e,!1),e+=16,0!==n);){r++;let e=512*n;const a=e-512,c=i.getUint16(a,!1);t.dims[1]=i.getUint16(a+4,!1),t.dims[2]=i.getUint16(a+6,!1),t.dims[3]=i.getUint16(a+8,!1);const u=i.getFloat32(a+26,!1);t.pixDims[1]=10*i.getFloat32(a+34,!1),t.pixDims[2]=10*i.getFloat32(a+38,!1),t.pixDims[3]=10*i.getFloat32(a+42,!1),t.pixDims[4]=i.getUint32(a+46,!1)/1e3,s.push(t.pixDims[4]);const f=t.dims[1]*t.dims[2]*t.dims[3],h=new Float32Array(f);if(1===c)for(let t=0;t1){t.dims[0]=4;let e=!1;for(let t=0;t=4){let r=8+n;const a=i.getUint32(r+88,!0);if(r+=92,a>0){const t=e.byteLength;for(let e=0;e4)&&log.warn("Not a valid MGH file"),0===c?(t.numBitsPerVoxel=8,t.datatypeCode=NiiDataType.DT_UINT8):4===c?(t.numBitsPerVoxel=16,t.datatypeCode=NiiDataType.DT_INT16):1===c?(t.numBitsPerVoxel=32,t.datatypeCode=NiiDataType.DT_INT32):3===c&&(t.numBitsPerVoxel=32,t.datatypeCode=NiiDataType.DT_FLOAT32),t.dims[1]=a,t.dims[2]=o,t.dims[3]=s,t.dims[4]=l,l>1&&(t.dims[0]=4),t.pixDims[1]=u,t.pixDims[2]=f,t.pixDims[3]=h,t.vox_offset=284,t.sform_code=1;const I=fromValues$3(d*t.pixDims[1],p*t.pixDims[2],b*t.pixDims[3],0,m*t.pixDims[1],A*t.pixDims[2],v*t.pixDims[3],0,g*t.pixDims[1],S*t.pixDims[2],w*t.pixDims[3],0,0,0,0,1),D=[t.dims[1]/2,t.dims[2]/2,t.dims[3]/2,1],x=[0,0,0,0];for(let e=0;e<3;e++){x[e]=0;for(let t=0;t<3;t++)x[e]=x[e]+I[t+4*e]*D[t]}t.affine=[[I[0],I[1],I[2],T-x[0]],[I[4],I[5],I[6],y-x[1]],[I[8],I[9],I[10],C-x[2]],[0,0,0,1]];const E=t.dims[1]*t.dims[2]*t.dims[3]*t.dims[4]*(t.numBitsPerVoxel/8);return i.slice(t.vox_offset,t.vox_offset+E)}readFIB(e){this.hdr=new nifti.NIFTI1;const t=this.hdr;t.littleEndian=!1,t.dims=[3,1,1,1,0,0,0,0],t.pixDims=[1,1,1,1,1,0,0,0];const i=NVUtilities.readMatV4(e);if(!("dimension"in i)||!("dti_fa"in i))throw new Error("Not a valid DSIstudio FIB file");const r="index0"in i&&"index1"in i&&"index2"in i;t.numBitsPerVoxel=32,t.datatypeCode=NiiDataType.DT_FLOAT32,t.dims[1]=i.dimension[0],t.dims[2]=i.dimension[1],t.dims[3]=i.dimension[2],t.dims[4]=1,t.pixDims[1]=i.voxel_size[0],t.pixDims[2]=i.voxel_size[1],t.pixDims[3]=i.voxel_size[2],t.sform_code=1;const n=.5*(t.dims[1]-1)*t.pixDims[1],a=.5*(t.dims[2]-1)*t.pixDims[2],o=.5*(t.dims[3]-1)*t.pixDims[3];t.affine=[[t.pixDims[1],0,0,-n],[0,-t.pixDims[2],0,a],[0,0,t.pixDims[2],-o],[0,0,0,1]],t.littleEndian=!0;const s=t.dims[1]*t.dims[2]*t.dims[3],l=s*Math.ceil(t.numBitsPerVoxel/8),c=l*t.dims[4],u=new Uint8Array(new ArrayBuffer(4*s*3));if(r){const e=t.dims[1]*t.dims[2]*t.dims[3],r=new Float32Array(e),n=new Float32Array(e),a=new Float32Array(e),o=i.index0,s=i.odf_vertices;for(let t=0;t1&&(t.dims[0]=4),t.pixDims[1]=i.voxel_size[0],t.pixDims[2]=i.voxel_size[1],t.pixDims[3]=i.voxel_size[2],t.sform_code=1;const a=.5*(t.dims[1]-1)*t.pixDims[1],o=.5*(t.dims[2]-1)*t.pixDims[2],s=.5*(t.dims[3]-1)*t.pixDims[3];t.affine=[[t.pixDims[1],0,0,-a],[0,-t.pixDims[2],0,o],[0,0,t.pixDims[2],-s],[0,0,0,1]],t.littleEndian=!0;const l=t.dims[1]*t.dims[2]*t.dims[3]*(t.numBitsPerVoxel/8),c=l*t.dims[4],u=new Uint8Array(new ArrayBuffer(c));let f=0;for(let e=0;e2&&(e=e.slice(2)),s.startsWith("BinaryDataByteOrderMSB")&&e[0].includes("False")&&(l.littleEndian=!0),s.startsWith("BinaryDataByteOrderMSB")&&e[0].includes("True")&&(l.littleEndian=!1),s.startsWith("CompressedData")&&e[0].includes("True")&&(c=!0),s.startsWith("TransformMatrix"))for(let t=0;t<9;t++)f[t]=parseFloat(e[t]);if(s.startsWith("Offset"))for(let t=0;t2||4!==e.length)break;i.affine[u][0]=parseFloat(e[0]),i.affine[u][1]=parseFloat(e[1]),i.affine[u][2]=parseFloat(e[2]),i.affine[u][3]=parseFloat(e[3]),u++;break;case"comments":i.description=e[0].substring(0,Math.min(79,e[0].length));break;case"RepetitionTime":f=parseFloat(e[0]);break;case"file":h=!e[0].startsWith(". "),h||(e=e[0].split(" "),i.vox_offset=parseInt(e[1]))}}const d=i.dims[0];d>5&&log.warn("reader only designed for a maximum of 5 dimensions (XYZTD)");let m,g=1;for(let e=0;e0&&(i.pixDims[4]=f),h&&!t&&log.warn("MIH header provided without paired image data"),t&&h)m=t.slice(0);else if(c){i.numBitsPerVoxel=8;const t=new Uint8Array(g),r=e.slice(i.vox_offset,i.vox_offset+Math.ceil(g/8)),n=new Uint8Array(r);let a=0;for(let e=0;e>7-i&1,7===i&&a++}m=t.buffer}else m=e.slice(i.vox_offset,i.vox_offset+g*(i.numBitsPerVoxel/8));l.length!==i.dims[0]&&log.warn("dims does not match layout");let p=1;const A=[1,1,1,1,1],S=[!1,!1,!1,!1,!1];for(let e=0;ei[0]&&(r[0]=2),i[6]>i[0]&&i[6]>i[3]&&(r[0]=3),r[1]=1,1===r[0]?i[4]>i[7]?r[1]=2:r[1]=3:2===r[0]?i[1]>i[7]?r[1]=1:r[1]=3:i[1]>i[4]?r[1]=1:r[1]=2,r[2]=6-r[1]-r[0];let n=[1,2,3];n[r[0]-1]=1,n[r[1]-1]=2,n[r[2]-1]=3;let a=fromValues$3(e[0][0],e[0][1],e[0][2],e[0][3],e[1][0],e[1][1],e[1][2],e[1][3],e[2][0],e[2][1],e[2][2],e[2][3],0,0,0,1);this.mm000=this.vox2mm([-.5,-.5,-.5],a),this.mm100=this.vox2mm([t.dims[1]-.5,-.5,-.5],a),this.mm010=this.vox2mm([-.5,t.dims[2]-.5,-.5],a),this.mm001=this.vox2mm([-.5,-.5,t.dims[3]-.5],a);const o=create$3();copy$1(o,a);for(let e=0;e<3;e++)for(let t=0;t<3;t++)o[4*e+t]=a[4*e+n[t]-1];const s=[0,0,0];o[0]<0&&(s[0]=1),o[5]<0&&(s[1]=1),o[10]<0&&(s[2]=1),this.dimsRAS=[t.dims[0],t.dims[n[0]],t.dims[n[1]],t.dims[n[2]]],this.pixDimsRAS=[t.pixDims[0],t.pixDims[n[0]],t.pixDims[n[1]],t.pixDims[n[2]]],this.permRAS=n.slice();for(let e=0;e<3;e++)1===s[e]&&(this.permRAS[e]=-this.permRAS[e]);if(this.arrayEquals(n,[1,2,3])&&this.arrayEquals(s,[0,0,0]))return this.toRAS=create$3(),this.matRAS=clone$2(a),this.calculateOblique(),this.img2RASstep=[1,this.dimsRAS[1],this.dimsRAS[1]*this.dimsRAS[2]],void(this.img2RASstart=[0,0,0]);identity$1(a),a[0]=1-2*s[0],a[5]=1-2*s[1],a[10]=1-2*s[2],a[3]=(t.dims[n[0]]-1)*s[0],a[7]=(t.dims[n[1]]-1)*s[1],a[11]=(t.dims[n[2]]-1)*s[2];const l=create$3();invert(l,a),multiply(l,l,o),this.matRAS=clone$2(l),a=fromValues$3(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),a[n[0]-1+0]=2*-s[0]+1,a[n[1]-1+4]=2*-s[1]+1,a[n[2]-1+8]=2*-s[2]+1,a[3]=s[0],a[7]=s[1],a[11]=s[2],this.toRAS=clone$2(a),a[3]=0,a[7]=0,a[11]=0,a[12]=0,(-1===this.permRAS[0]||-1===this.permRAS[1]||-1===this.permRAS[2])&&(a[12]=t.dims[1]-1),a[13]=0,(-2===this.permRAS[0]||-2===this.permRAS[1]||-2===this.permRAS[2])&&(a[13]=t.dims[2]-1),a[14]=0,(-3===this.permRAS[0]||-3===this.permRAS[1]||-3===this.permRAS[2])&&(a[14]=t.dims[3]-1),this.toRASvox=clone$2(a),log.debug(this.hdr.dims),log.debug(this.dimsRAS);const c=this.hdr;n=this.permRAS;const u=[Math.abs(n[0]),Math.abs(n[1]),Math.abs(n[2])],f=[c.dims[u[0]],c.dims[u[1]],c.dims[u[2]]],h=[1,c.dims[1],c.dims[1]*c.dims[2]],d=[h[u[0]-1],h[u[1]-1],h[u[2]-1]],m=[0,0,0];for(let e=0;e<3;e++)n[e]<0&&(m[e]=d[e]*(f[e]-1),d[e]=-d[e]);this.img2RASstep=d,this.img2RASstart=m,this.calculateOblique()}img2RAS(){if(!this.permRAS)throw new Error("permRAS undefined");if(!this.img)throw new Error("img undefined");if(!this.hdr)throw new Error("hdr undefined");const e=this.permRAS.slice();if(1===e[0]&&2===e[1]&&3===e[2])return this.img;const t=this.hdr,i=this.img.slice(0,t.dims[1]*t.dims[1]*t.dims[2]*t.dims[3]),r=[Math.abs(e[0]),Math.abs(e[1]),Math.abs(e[2])],n=[t.dims[r[0]],t.dims[r[1]],t.dims[r[2]]],a=[1,t.dims[1],t.dims[1]*t.dims[2]],o=[a[r[0]-1],a[r[1]-1],a[r[2]-1]],s=[0,0,0];for(let t=0;t<3;t++)e[t]<0&&(s[t]=o[t]*(n[t]-1),o[t]=-o[t]);let l=0;for(let e=0;ee===t[i]))}setColormap(e){this._colormap=e,this.calMinMax(),this.onColormapChange&&this.onColormapChange(this)}setColormapLabel(e){this.colormapLabel=cmapper.makeLabelLut(e)}async setColormapLabelFromUrl(e){this.colormapLabel=await cmapper.makeLabelLutFromUrl(e)}get colormap(){return this._colormap}get colorMap(){return this._colormap}set colormap(e){this.setColormap(e)}set colorMap(e){this.setColormap(e)}get opacity(){return this._opacity}set opacity(e){this._opacity=e,this.onOpacityChange&&this.onOpacityChange(this)}calMinMax(e=Number.POSITIVE_INFINITY){if(!this.hdr)throw new Error("hdr undefined");if(!this.img)throw new Error("img undefined");let t=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY,r=0,n=0,a=this.img.length,o=0;const s=this.hdr.dims[1]*this.hdr.dims[2]*this.hdr.dims[3],l=Math.floor(a/s);e>=l&&(e=this.frame4D),e>=0&&e0&&(t=0);const u=this.intensityRaw2Scaled(t),f=this.intensityRaw2Scaled(i),h=cmapper.colormapFromKey(this._colormap);let d=0,m=0;if(void 0!==h.min&&(d=h.min),void 0!==h.max&&(m=h.max),d===m&&this.trustCalMinMax&&isFinite(this.hdr.cal_min)&&isFinite(this.hdr.cal_max)&&this.hdr.cal_max>this.hdr.cal_min)return this.cal_min=this.hdr.cal_min,this.cal_max=this.hdr.cal_max,this.robust_min=this.cal_min,this.robust_max=this.cal_max,this.global_min=u,this.global_max=f,[this.hdr.cal_min,this.hdr.cal_max,this.hdr.cal_min,this.hdr.cal_max];if(d!==m)return this.cal_min=d,this.cal_max=m,this.robust_min=this.cal_min,this.robust_max=this.cal_max,[d,m,d,m];const g=100*r/(a-o);let p=!1;g>60&&!this.ignoreZeroVoxels&&(log.warn(`${Math.round(g)}% of voxels are zero: ignoring zeros for cal_max`),p=!0,this.ignoreZeroVoxels=!0),this.ignoreZeroVoxels||(r=0),r+=n;const A=Math.round((a-o-r)*this.percentileFrac);if(A<1||t===i)return log.debug("no variability in image intensity?"),this.cal_min=u,this.cal_max=f,this.robust_min=this.cal_min,this.robust_max=this.cal_max,this.global_min=u,this.global_max=f,[u,f,u,f];const S=1001,b=(S-1)/(i-t),v=new Array(S);for(let e=0;e0&&(T--,v[T]>0&&(e=0)),0!==e&&y0&&(e=0)),0===T&&y===S-1&&(e=0)}let C=this.intensityRaw2Scaled(T/b+t),I=this.intensityRaw2Scaled(y/b+t);return this.hdr.cal_min=u&&this.hdr.cal_max<=f&&(C=this.hdr.cal_min,I=this.hdr.cal_max),p&&(C=Math.min(C,0)),this.cal_min=C,this.cal_max=I,this.robust_min=this.cal_min,this.robust_max=this.cal_max,this.global_min=u,this.global_max=f,[C,I,u,f]}intensityRaw2Scaled(e){if(!this.hdr)throw new Error("hdr undefined");return 0===this.hdr.scl_slope&&(this.hdr.scl_slope=1),e*this.hdr.scl_slope+this.hdr.scl_inter}intensityScaled2Raw(e){if(!this.hdr)throw new Error("hdr undefined");return 0===this.hdr.scl_slope&&(this.hdr.scl_slope=1),(e-this.hdr.scl_inter)/this.hdr.scl_slope}saveToUint8Array(e,t=null){if(!this.hdr)throw new Error("hdr undefined");if(!this.img)throw new Error("img undefined");const i=null!==t,r=hdrToArrayBuffer(this.hdr,i),n=new Uint8Array(4);let a=new Uint8Array(this.img.buffer);i&&(a=new Uint8Array(t.buffer));const o=new Uint8Array(r.length+n.length+a.length);o.set(r),o.set(n,r.length),o.set(a,r.length+n.length);let s=null;return s=e.endsWith(".gz")?gzipSync$1(o,{filename:e,mtime:Date.now(),level:6}):o,s}saveToDisk(e="",t=null){const i=this.saveToUint8Array(e,t);if(""===e)return log.debug("saveToDisk: empty file name, returning data as Uint8Array rather than triggering download"),i;const r=new Blob([i.buffer],{type:"application/octet-stream"}),n=URL.createObjectURL(r),a=document.createElement("a");return a.setAttribute("href",n),a.setAttribute("download",e),a.style.visibility="hidden",document.body.appendChild(a),a.click(),document.body.removeChild(a),i}static async fetchDicomData(e,t={}){if(""===e)throw Error("url must not be empty");let i=/^(?:[a-z+]+:)?\/\//i.test(e)?e:new URL(e,window.location.href);/(?:.([^.]+))?$/.exec(i.pathname)||(i=new URL("niivue-manifest.txt",e));let r=await fetch(i,{headers:t});if(!r.ok)throw Error(r.statusText);const n=(await r.text()).split("\n"),a=/(.*\/).*/.exec(i)[0],o=[];for(const e of n){const i=new URL(e,a);if(r=await fetch(i,{headers:t}),!r.ok)throw Error(r.statusText);const n=await r.arrayBuffer();o.push(n)}return o}static async fetchPartial(e,t,i={}){try{return await fetch(e,{headers:{range:`bytes=0-'${t}`,stream:"true",...i}})}catch(t){return log.error(t),log.error("fetchPartial failed, trying again without range header"),await fetch(e,{headers:i})}}static async loadFromUrl({url:e="",urlImgData:t="",headers:i={},name:r="",colormap:n="gray",opacity:a=1,cal_min:o=NaN,cal_max:s=NaN,trustCalMinMax:l=!0,percentileFrac:c=.02,ignoreZeroVoxels:u=!1,useQFormNotSForm:f=!1,colormapNegative:h="",frame4D:d=0,isManifest:m=!1,limitFrames4D:g=NaN,imageType:p=NVIMAGE_TYPE.UNKNOWN,colorbarVisible:A=!0,buffer:S=new ArrayBuffer(0)}={}){if(""===e)throw Error("url must not be empty");let b=null,v=null;if(e instanceof Uint8Array&&(e=e.buffer),S.byteLength>0&&(e=S),e instanceof ArrayBuffer)if(v=e,""!==r)e=r;else{e="array.nii";const t=new Uint8Array(v);31===t[0]&&139===t[1]&&(e="array.nii.gz")}if(!isNaN(g)){let t=await this.fetchPartial(e,512,i);v=await t.arrayBuffer();let r=new Uint8Array(v),n=!1;31===r[0]&&139===r[1]&&(n=!0,new Decompress$1((e=>{r=e})).push(r),v=r.buffer);let a=92===r[0]&&1===r[1];if(a||(a=92===r[1]&&1===r[0]),a){const r=nifti.readHeader(v);if(null===r)throw new Error("could not read nifti header");const a=r.numBitsPerVoxel/8;let o=1;for(let e=1;e<4;e++)r.dims[e]>1&&(o*=r.dims[e]);let s=1;for(let e=4;e<7;e++)r.dims[e]>1&&(s*=r.dims[e]);const l=Math.max(Math.min(g,s),1),c=r.vox_offset+l*o*a;if(v.byteLength{e=t})).push(e),v=e.buffer}v=v.byteLength-1&&(r=r.slice(0,r.indexOf("?")))}let C=null;if(t.length>0){let e=await fetch(t,{headers:i});404===e.status&&-1!==t.lastIndexOf("BRIK")&&(e=await fetch(t+".gz",{headers:i})),C=await e.arrayBuffer()}if(!v)throw new Error("Unable to load buffer properly from volume");return b=new NVImage(v,r,n,a,C,o,s,l,c,u,f,h,d,p),b.url=e,b.colorbarVisible=A,b}static readFileAsync(e,t=NaN){return new Promise(((i,r)=>{const n=new FileReader;n.onload=()=>{-1!==e.name.lastIndexOf("gz")&&isNaN(t)?i(nifti.decompress(n.result)):i(n.result)},n.onerror=r,isNaN(t)?n.readAsArrayBuffer(e):n.readAsArrayBuffer(e.slice(0,t))}))}static async loadFromFile({file:e,name:t="",colormap:i="gray",opacity:r=1,urlImgData:n=null,cal_min:a=NaN,cal_max:o=NaN,trustCalMinMax:s=!0,percentileFrac:l=.02,ignoreZeroVoxels:c=!1,useQFormNotSForm:u=!1,colormapNegative:f="",frame4D:h=0,limitFrames4D:d=NaN,imageType:m=NVIMAGE_TYPE.UNKNOWN}){let g=null,p=[];try{if(Array.isArray(e))for(let t=0;t{t=e})).push(t),p=t.buffer);let r=92===t[0]&&1===t[1];if(r||(r=92===t[1]&&1===t[0]),r){const t=nifti.readHeader(p);if(!t)throw new Error("could not read nifti header");const r=t.numBitsPerVoxel/8;let n=1;for(let e=1;e<4;e++)t.dims[e]>1&&(n*=t.dims[e]);let a=1;for(let e=4;e<7;e++)t.dims[e]>1&&(a*=t.dims[e]);const o=Math.max(Math.min(d,a),1),s=t.vox_offset+o*n*r;if(p.byteLength{e=t})).push(e),p=e.buffer}if(p.byteLength"u")return n;if(!t){const e=clone$2(this.frac2mmOrtho);return invert(e,e),transformMat4(i,i,e),n[0]=i[0],n[1]=i[1],n[2]=i[2],n}if(r[1]<1||r[2]<1||r[3]<1)return n;const a=clone$2(this.matRAS);return invert(a,a),transpose(a,a),transformMat4(i,i,a),n[0]=(i[0]+.5)/r[1],n[1]=(i[1]+.5)/r[2],n[2]=(i[2]+.5)/r[3],n}}var SLICE_TYPE=(e=>(e[e.AXIAL=0]="AXIAL",e[e.CORONAL=1]="CORONAL",e[e.SAGITTAL=2]="SAGITTAL",e[e.MULTIPLANAR=3]="MULTIPLANAR",e[e.RENDER=4]="RENDER",e))(SLICE_TYPE||{}),SHOW_RENDER=(e=>(e[e.NEVER=0]="NEVER",e[e.ALWAYS=1]="ALWAYS",e[e.AUTO=2]="AUTO",e))(SHOW_RENDER||{}),MULTIPLANAR_TYPE=(e=>(e[e.AUTO=0]="AUTO",e[e.COLUMN=1]="COLUMN",e[e.GRID=2]="GRID",e[e.ROW=3]="ROW",e))(MULTIPLANAR_TYPE||{}),DRAG_MODE=(e=>(e[e.none=0]="none",e[e.contrast=1]="contrast",e[e.measurement=2]="measurement",e[e.pan=3]="pan",e[e.slicer3D=4]="slicer3D",e[e.callbackOnly=5]="callbackOnly",e[e.roiSelection=6]="roiSelection",e))(DRAG_MODE||{});const DEFAULT_OPTIONS={textHeight:.06,colorbarHeight:.05,crosshairWidth:1,crosshairGap:0,rulerWidth:4,show3Dcrosshair:!1,backColor:[0,0,0,1],crosshairColor:[1,0,0,1],fontColor:[.5,.5,.5,1],selectionBoxColor:[1,1,1,.5],clipPlaneColor:[.7,0,.7,.5],clipThick:2,clipVolumeLow:[0,0,0],clipVolumeHigh:[1,1,1],rulerColor:[1,0,0,.8],colorbarMargin:.05,trustCalMinMax:!0,clipPlaneHotKey:"KeyC",viewModeHotKey:"KeyV",doubleTouchTimeout:500,longTouchTimeout:1e3,keyDebounceTime:50,isNearestInterpolation:!1,isResizeCanvas:!0,atlasOutline:0,isRuler:!1,isColorbar:!1,isOrientCube:!1,multiplanarPadPixels:0,multiplanarForceRender:!1,multiplanarEqualSize:!1,multiplanarShowRender:2,isRadiologicalConvention:!1,meshThicknessOn2D:1/0,dragMode:1,yoke3Dto2DZoom:!1,isDepthPickMesh:!1,isCornerOrientationText:!1,sagittalNoseLeft:!1,isSliceMM:!1,isV1SliceShader:!1,isHighResolutionCapable:!0,logLevel:"info",loadingText:"waiting for images...",isForceMouseClickToVoxelCenters:!1,dragAndDropEnabled:!0,drawingEnabled:!1,penValue:1,floodFillNeighbors:6,isFilledPen:!1,thumbnail:"",maxDrawUndoBitmaps:8,sliceType:3,meshXRay:0,isAntiAlias:null,limitFrames4D:NaN,isAdditiveBlend:!1,showLegend:!0,legendBackgroundColor:[.3,.3,.3,.5],legendTextColor:[1,1,1,1],multiplanarLayout:0,renderOverlayBlend:1,sliceMosaicString:"",centerMosaic:!1,penSize:1,clickToSegment:!1,clickToSegmentRadius:3,clickToSegmentBright:!0,clickToSegmentAutoIntensity:!1,clickToSegmentIntensityMax:NaN,clickToSegmentIntensityMin:NaN,clickToSegmentPercent:0,clickToSegmentMaxDistanceMM:Number.POSITIVE_INFINITY,clickToSegmentIs2D:!1,selectionBoxLineThickness:4,selectionBoxIsOutline:!1,scrollRequiresFocus:!1},INITIAL_SCENE_DATA={gamma:1,azimuth:110,elevation:10,crosshairPos:fromValues$2(.5,.5,.5),clipPlane:[0,0,0,0],clipPlaneDepthAziElev:[2,0,0],volScaleMultiplier:1,pan2Dxyzmm:fromValues$1(0,0,0,1),clipThick:2,clipVolumeLow:[0,0,0],clipVolumeHigh:[1,1,1]};class NVDocument{constructor(){g0(this,"data",{title:"Untitled document",imageOptionsArray:[],meshOptionsArray:[],opts:{...DEFAULT_OPTIONS},previewImageDataURL:"",labels:[],encodedImageBlobs:[],encodedDrawingBlob:""}),g0(this,"scene"),g0(this,"volumes",[]),g0(this,"meshDataObjects"),g0(this,"meshes",[]),g0(this,"drawBitmap",null),g0(this,"imageOptionsMap",new Map),g0(this,"meshOptionsMap",new Map),this.scene={onAzimuthElevationChange:()=>{},onZoom3DChange:()=>{},sceneData:{...INITIAL_SCENE_DATA,pan2Dxyzmm:fromValues$1(0,0,0,1),crosshairPos:fromValues$2(.5,.5,.5)},get renderAzimuth(){return this.sceneData.azimuth},set renderAzimuth(e){this.sceneData.azimuth=e,this.onAzimuthElevationChange&&this.onAzimuthElevationChange(this.sceneData.azimuth,this.sceneData.elevation)},get renderElevation(){return this.sceneData.elevation},set renderElevation(e){this.sceneData.elevation=e,this.onAzimuthElevationChange&&this.onAzimuthElevationChange(this.sceneData.azimuth,this.sceneData.elevation)},get volScaleMultiplier(){return this.sceneData.volScaleMultiplier},set volScaleMultiplier(e){this.sceneData.volScaleMultiplier=e,this.onZoom3DChange(e)},get crosshairPos(){return this.sceneData.crosshairPos},set crosshairPos(e){this.sceneData.crosshairPos=e},get clipPlane(){return this.sceneData.clipPlane},set clipPlane(e){this.sceneData.clipPlane=e},get clipPlaneDepthAziElev(){return this.sceneData.clipPlaneDepthAziElev},set clipPlaneDepthAziElev(e){this.sceneData.clipPlaneDepthAziElev=e},get pan2Dxyzmm(){return this.sceneData.pan2Dxyzmm},set pan2Dxyzmm(e){this.sceneData.pan2Dxyzmm=e}}}get title(){return this.data.title}get previewImageDataURL(){return this.data.previewImageDataURL}set previewImageDataURL(e){this.data.previewImageDataURL=e}set title(e){this.data.title=e}get imageOptionsArray(){return this.data.imageOptionsArray}get encodedImageBlobs(){return this.data.encodedImageBlobs}get encodedDrawingBlob(){return this.data.encodedDrawingBlob}get opts(){return this.data.opts}set opts(e){this.data.opts={...e}}get labels(){return this.data.labels}set labels(e){this.data.labels=e}get customData(){return this.data.customData}set customData(e){this.data.customData=e}hasImage(e){return void 0!==this.volumes.find((t=>t.id===e.id))}hasImageFromUrl(e){return void 0!==this.data.imageOptionsArray.find((t=>t.url===e))}addImageOptions(e,t){if(!this.hasImage(e)&&!t.name)if(t.url){const e=/^(?:[a-z+]+:)?\/\//i.test(t.url)?new URL(t.url):new URL(t.url,window.location.href);t.name=e.pathname.split("/").pop(),t.name.toLowerCase().endsWith(".gz")&&(t.name=t.name.slice(0,-3)),t.name.toLowerCase().endsWith(".nii")||(t.name+=".nii")}else t.name="untitled.nii";t.imageType=NVIMAGE_TYPE.NII,this.data.imageOptionsArray.push(t),this.imageOptionsMap.set(e.id,this.data.imageOptionsArray.length-1)}removeImage(e){if(this.imageOptionsMap.has(e.id)){const t=this.imageOptionsMap.get(e.id);this.data.imageOptionsArray.length>t&&this.data.imageOptionsArray.splice(t,1),this.imageOptionsMap.delete(e.id)}this.volumes=this.volumes.filter((t=>t.id!==e.id))}getImageOptions(e){return this.imageOptionsMap.has(e.id)?this.data.imageOptionsArray[this.imageOptionsMap.get(e.id)]:null}json(){const e={encodedImageBlobs:[],previewImageDataURL:this.data.previewImageDataURL,imageOptionsMap:new Map},t=[];e.sceneData={...this.scene.sceneData},e.opts={...this.opts},this.opts.meshThicknessOn2D===1/0&&(e.opts.meshThicknessOn2D="infinity"),e.labels=[...this.data.labels];for(const t of e.labels)delete t.onClick;if(e.customData=this.customData,this.volumes.length){let i=this.imageOptionsArray[0];if(i||(log.debug("no image options for base image"),i={name:"",colormap:"gray",opacity:1,pairedImgData:null,cal_min:NaN,cal_max:NaN,trustCalMinMax:!0,percentileFrac:.02,ignoreZeroVoxels:!1,useQFormNotSForm:!1,colormapNegative:"",colormapLabel:null,imageType:NVIMAGE_TYPE.NII,frame4D:0,limitFrames4D:NaN,url:"",urlImageData:"",alphaThreshold:!1,cal_minNeg:NaN,cal_maxNeg:NaN,colorbarVisible:!0}),i.colormap=this.volumes[0].colormap,i.opacity=this.volumes[0].opacity,i.cal_max=this.volumes[0].cal_max||NaN,i.cal_min=this.volumes[0].cal_min||NaN,!i)throw new Error("image options for base layer not found");{t.push(i);const r=NVUtilities.uint8tob64(this.volumes[0].toUint8Array());e.encodedImageBlobs.push(r),this.drawBitmap&&(e.encodedDrawingBlob=NVUtilities.uint8tob64(this.volumes[0].toUint8Array(this.drawBitmap))),e.imageOptionsMap.set(this.volumes[0].id,0)}for(let i=1;i({values:e.values,nFrame4D:e.nFrame4D,frame4D:0,outlineBorder:e.outlineBorder,global_min:e.global_min,global_max:e.global_max,cal_min:e.cal_min,cal_max:e.cal_max,opacity:e.opacity,colormap:e.colormap,colormapNegative:e.colormapNegative,colormapLabel:e.colormapLabel,useNegativeCmap:e.useNegativeCmap}))),hasConnectome:t.hasConnectome,edgeColormap:t.edgeColormap,edgeColormapNegative:t.edgeColormapNegative,edgeMax:t.edgeMax,edgeMin:t.edgeMin,edges:t.edges&&Array.isArray(t.edges)?[...t.edges]:[],extentsMax:t.extentsMax,extentsMin:t.extentsMin,furthestVertexFromOrigin:t.furthestVertexFromOrigin,nodeColormap:t.nodeColormap,nodeColormapNegative:t.nodeColormapNegative,nodeMaxColor:t.nodeMaxColor,nodeMinColor:t.nodeMinColor,nodeScale:t.nodeScale,legendLineThickness:t.legendLineThickness,offsetPt0:t.offsetPt0,nodes:t.nodes};t.offsetPt0&&t.offsetPt0.length>0&&(r.offsetPt0=t.offsetPt0,r.fiberGroupColormap=t.fiberGroupColormap,r.fiberColor=t.fiberColor,r.fiberDither=t.fiberDither,r.fiberRadius=t.fiberRadius,r.colormap=t.colormap),i.push(r)}return e.meshesString=JSON.stringify(serialize(i)),e}async download(e,t){const i=this.json(),r=JSON.stringify(i),n=t?"application/gzip":"application/json";let a;a=t?await NVUtilities.compressStringToArrayBuffer(r):JSON.stringify(i),NVUtilities.download(a,e,n)}static deserializeMeshDataObjects(e){if(e.data.meshesString){e.meshDataObjects=deserialize(JSON.parse(e.data.meshesString));for(const t of e.meshDataObjects)for(const e of t.layers)"colorMap"in e&&(e.colormap=e.colorMap,delete e.colorMap),"colorMapNegative"in e&&(e.colormapNegative=e.colorMapNegative,delete e.colorMapNegative)}}static async loadFromUrl(e){const t=await(await fetch(e)).arrayBuffer();let i;if(NVUtilities.isArrayBufferCompressed(t)){const e=await NVUtilities.decompressArrayBuffer(t);i=JSON.parse(e)}else{const e=new TextDecoder;i=JSON.parse(e.decode(t))}return NVDocument.loadFromJSON(i)}static async loadFromFile(e){const t=await NVUtilities.readFileAsync(e);let i;const r=new NVDocument;return i=NVUtilities.isArrayBufferCompressed(t)?await NVUtilities.decompressArrayBuffer(t):(new TextDecoder).decode(t),r.data=JSON.parse(i),"infinity"===r.data.opts.meshThicknessOn2D&&(r.data.opts.meshThicknessOn2D=1/0),r.scene.sceneData={...INITIAL_SCENE_DATA,...r.data.sceneData},NVDocument.deserializeMeshDataObjects(r),r}static loadFromJSON(e){const t=new NVDocument;return t.data=e,"infinity"===t.data.opts.meshThicknessOn2D&&(t.data.opts.meshThicknessOn2D=1/0),t.scene.sceneData={...INITIAL_SCENE_DATA,...e.sceneData},NVDocument.deserializeMeshDataObjects(t),t}}var LabelTextAlignment=(e=>(e.LEFT="left",e.RIGHT="right",e.CENTER="center",e))(LabelTextAlignment||{}),LabelLineTerminator=(e=>(e.NONE="none",e.CIRCLE="circle",e.RING="ring",e))(LabelLineTerminator||{}),LabelAnchorFlag=(e=>(e[e.NONE=0]="NONE",e[e.LEFT=1]="LEFT",e[e.CENTER=2]="CENTER",e[e.RIGHT=4]="RIGHT",e[e.TOP=8]="TOP",e[e.MIDDLE=16]="MIDDLE",e[e.BOTTOM=32]="BOTTOM",e))(LabelAnchorFlag||{}),LabelAnchorPoint=(e=>(e[e.NONE=0]="NONE",e[e.TOPLEFT=9]="TOPLEFT",e[e.TOPCENTER=10]="TOPCENTER",e[e.TOPRIGHT=12]="TOPRIGHT",e[e.MIDDLELEFT=17]="MIDDLELEFT",e[e.MIDDLECENTER=18]="MIDDLECENTER",e[e.MIDDLERIGHT=20]="MIDDLERIGHT",e[e.BOTTOMLEFT=33]="BOTTOMLEFT",e[e.BOTTOMCENTER=34]="BOTTOMCENTER",e[e.BOTTOMRIGHT=36]="BOTTOMRIGHT",e))(LabelAnchorPoint||{});class NVLabel3DStyle{constructor(e=[1,1,1,1],t=1,i="left",r=0,n=[0,0,0],a="none",o,s,l){g0(this,"textColor"),g0(this,"textScale"),g0(this,"textAlignment"),g0(this,"lineWidth"),g0(this,"lineColor"),g0(this,"lineTerminator"),g0(this,"bulletScale"),g0(this,"bulletColor"),g0(this,"backgroundColor"),this.textColor=e,this.textScale=t,this.textAlignment=i,this.lineWidth=r,this.lineColor=n,this.lineTerminator=a,this.bulletScale=o,this.bulletColor=s,this.backgroundColor=l}}class NVLabel3D{constructor(e,t,i,r,n){g0(this,"text"),g0(this,"style"),g0(this,"points"),g0(this,"anchor"),g0(this,"onClick"),this.text=e,this.style=t,this.points=i,this.anchor=r||0,this.onClick=n}}const defaultOptions={name:"untitled connectome",nodeColormap:"warm",nodeColormapNegative:"winter",nodeMinColor:0,nodeMaxColor:4,nodeScale:3,edgeColormap:"warm",edgeColormapNegative:"winter",edgeMin:2,edgeMax:6,edgeScale:1,legendLineThickness:0};class NVConnectome extends NVMesh{constructor(e,t){super(new Float32Array([]),new Uint32Array([]),t.name,new Uint8Array([]),1,!0,e,t),g0(this,"gl"),g0(this,"nodesChanged"),this.gl=e,this.type=MeshType.CONNECTOME,this.nodes&&this.updateLabels(),this.nodesChanged=new EventTarget}static convertLegacyConnectome(e){const t={nodes:[],edges:[],...defaultOptions};for(const i in e)if(i in defaultOptions){const r=i;t[r]=e[r]}const i=e.nodes;for(let e=0;e({name:Array.isArray(e.comments)&&e.comments.length>0&&"text"in e.comments[0]?e.comments[0].text:"",x:e.coordinates.x,y:e.coordinates.y,z:e.coordinates.z,colorValue:1,sizeValue:1,metadata:e.comments})));return{...defaultOptions,nodeColormap:t,edgeColormap:t,nodes:r,edges:[]}}updateLabels(){const e=this.nodes;if(e&&e.length>0){const t=e.reduce(((e,t)=>e.sizeValue>t.sizeValue?e:t)).sizeValue,i=this.nodeMinColor?this.nodeMinColor:e.reduce(((e,t)=>e.colorValuee.colorValue>t.colorValue?e:t)).colorValue,n=cmapper.colormap(this.nodeColormap,this.colormapInvert),a=cmapper.colormap(this.nodeColormapNegative,this.colormapInvert),o="nodeColormapNegative"in this,s=this.legendLineThickness?this.legendLineThickness:0;for(let l=0;le/255)),log.debug("adding label for ",e[l]),e[l].label=new NVLabel3D(e[l].name,{textColor:f,bulletScale:e[l].sizeValue/t,bulletColor:f,lineWidth:s,lineColor:f,textScale:1,textAlignment:LabelTextAlignment.LEFT,lineTerminator:LabelLineTerminator.NONE},[e[l].x,e[l].y,e[l].z]),log.debug("label for node:",e[l].label)}}}addConnectomeNode(e){if(log.debug("adding node",e),!this.nodes)throw new Error("nodes not defined");this.nodes.push(e),this.updateLabels(),this.nodesChanged.dispatchEvent(new CustomEvent("nodeAdded",{detail:{node:e}}))}deleteConnectomeNode(e){const t=this.nodes.indexOf(e),i=this.edges;i&&(this.edges=i.filter((e=>e.first!==t&&e.second!==t))),this.nodes=this.nodes.filter((t=>t!==e)),this.updateLabels(),this.updateConnectome(this.gl),this.nodesChanged.dispatchEvent(new CustomEvent("nodeDeleted",{detail:{node:e}}))}updateConnectomeNodeByIndex(e,t){this.nodes[e]=t,this.updateLabels(),this.updateConnectome(this.gl),this.nodesChanged.dispatchEvent(new CustomEvent("nodeChanged",{detail:{node:t}}))}updateConnectomeNodeByPoint(e,t){const i=this.nodes;if(!i)throw new Error("Node to update does not exist");const r=i.find((t=>NVUtilities.arraysAreEqual([t.x,t.y,t.z],e)));if(!r)throw new Error(`Node with point ${e} to update does not exist`);const n=i.findIndex((e=>e===r));this.updateConnectomeNodeByIndex(n,t)}addConnectomeEdge(e,t,i){const r=this.edges;let n=r.find((i=>(i.first===e||i.second===e)&&i.first+i.second===e+t));return n||(n={first:e,second:t,colorValue:i},r.push(n),this.updateConnectome(this.gl),n)}deleteConnectomeEdge(e,t){const i=this.edges,r=i.find((i=>(i.first===e||i.first===t)&&i.first+i.second===e+t));if(!r)throw new Error(`edge between ${e} and ${t} not found`);return this.edges=i.filter((e=>e!==r)),this.updateConnectome(this.gl),r}findClosestConnectomeNode(e,t){const i=this.nodes;if(!i||0===i.length)return null;const r=i.map(((t,i)=>({node:t,distance:Math.sqrt(Math.pow(t.x-e[0],2)+Math.pow(t.y-e[1],2)+Math.pow(t.z-e[2],2)),index:i}))).filter((e=>e.distancee.distance-t.distance));return r.length>0?r[0].node:null}updateConnectome(e){const t=[],i=[],r=[];let n=cmapper.colormap(this.nodeColormap,this.colormapInvert),a=cmapper.colormap(this.nodeColormapNegative,this.colormapInvert),o="nodeColormapNegative"in this;if(void 0===this.nodeMinColor||void 0===this.nodeMaxColor)throw new Error("nodeMinColor or nodeMaxColor is undefined");if(void 0===this.edgeMin||void 0===this.edgeMax)throw new Error("edgeMin or edgeMax undefined");let s=this.nodeMinColor,l=this.nodeMaxColor;const c=this.nodes,u=c.length;for(let e=0;ea&&([n,a]=[a,n]),[n,a]}function swizzleVec3(e,t=[0,1,2]){const i=create$2();return i[0]=e[t[0]],i[1]=e[t[1]],i[2]=e[t[2]],i}function isRadiological(e){const t=fromValues$1(1,0,0,0),i=create$1();return transformMat4(i,t,e),i[0]}function unProject(e,t,i,r){const n=fromValues$1(e,t,i,1),a=clone$2(r);invert(a,a),n[0]=2*n[0]-1,n[1]=2*n[1]-1,n[2]=2*n[2]-1;const o=create$1();return transformMat4(o,n,a),0===o[3]||(o[0]/=o[3],o[1]/=o[3],o[2]/=o[3]),o}function unpackFloatFromVec4i(e){const t=[5.960464477539063e-8,152587890625e-16,.00390625,1];return(e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3])/255}function clamp(e,t,i){return Math.min(Math.max(e,t),i)}function encodeRLE(e){const t=e.length;let i=0;const r=new Uint8Array(t+Math.ceil(.01*t)),n=new Int8Array(r.buffer);let a=0;for(;i1)n[a]=1-s,a++,r[a]=o,a++;else{for(;i127||i+2 "+a+" bytes (x"+t/a+")"),r.slice(0,a)}function decodeRLE(e,t){const i=new Uint8Array(e.buffer),r=new Int8Array(i.buffer);let n=0;const a=new Uint8Array(t);let o=0;for(;n=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function __read(e,t){var i="function"==typeof Symbol&&e[Symbol.iterator];if(!i)return e;var r,n,a=i.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)o.push(r.value)}catch(e){n={error:e}}finally{try{r&&!r.done&&(i=a.return)&&i.call(a)}finally{if(n)throw n.error}}return o}function __spreadArray(e,t,i){if(i||2===arguments.length)for(var r,n=0,a=t.length;n0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,i=this,r=i.hasError,n=i.isStopped,a=i.observers;return r||n?EMPTY_SUBSCRIPTION:(this.currentObservers=null,a.push(e),new Subscription((function(){t.currentObservers=null,arrRemove(a,e)})))},t.prototype._checkFinalizedStatuses=function(e){var t=this,i=t.hasError,r=t.thrownError,n=t.isStopped;i?e.error(r):n&&e.complete()},t.prototype.asObservable=function(){var e=new Observable;return e.source=this,e},t.create=function(e,t){return new AnonymousSubject(e,t)},t}(Observable),AnonymousSubject=function(e){function t(t,i){var r=e.call(this)||this;return r.destination=t,r.source=i,r}return __extends(t,e),t.prototype.next=function(e){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===i||i.call(t,e)},t.prototype.error=function(e){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===i||i.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,i;return null!==(i=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==i?i:EMPTY_SUBSCRIPTION},t}(Subject),dateTimestampProvider={now:function(){return(dateTimestampProvider.delegate||Date).now()},delegate:void 0},ReplaySubject=function(e){function t(t,i,r){void 0===t&&(t=1/0),void 0===i&&(i=1/0),void 0===r&&(r=dateTimestampProvider);var n=e.call(this)||this;return n._bufferSize=t,n._windowTime=i,n._timestampProvider=r,n._buffer=[],n._infiniteTimeWindow=!0,n._infiniteTimeWindow=i===1/0,n._bufferSize=Math.max(1,t),n._windowTime=Math.max(1,i),n}return __extends(t,e),t.prototype.next=function(t){var i=this,r=i.isStopped,n=i._buffer,a=i._infiniteTimeWindow,o=i._timestampProvider,s=i._windowTime;r||(n.push(t),!a&&n.push(o.now()+s)),this._trimBuffer(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){this._throwIfClosed(),this._trimBuffer();for(var t=this._innerSubscribe(e),i=this._infiniteTimeWindow,r=this._buffer.slice(),n=0;n(e[e.ZOOM=1]="ZOOM",e[e.CLIP_PLANE=2]="CLIP_PLANE",e[e.AZIMUTH_ELEVATION=3]="AZIMUTH_ELEVATION",e[e.FRAME_CHANGED=4]="FRAME_CHANGED",e[e.VOLUME_ADDED_FROM_URL=5]="VOLUME_ADDED_FROM_URL",e[e.VOLUME_WITH_URL_REMOVED=6]="VOLUME_WITH_URL_REMOVED",e[e.COLORMAP_CHANGED=7]="COLORMAP_CHANGED",e[e.OPACITY_CHANGED=8]="OPACITY_CHANGED",e[e.MESH_FROM_URL_ADDED=9]="MESH_FROM_URL_ADDED",e[e.MESH_WITH_URL_REMOVED=10]="MESH_WITH_URL_REMOVED",e[e.CUSTOM_SHADER_ADDED=11]="CUSTOM_SHADER_ADDED",e[e.SHADER_CHANGED=12]="SHADER_CHANGED",e[e.MESH_PROPERTY_CHANGED=13]="MESH_PROPERTY_CHANGED",e.USER_JOINED="user joined",e.CREATE="create",e.VOLUME_LOADED_FROM_URL="volume with url added",e))(NVMESSAGE||{});class SessionUser{constructor(e,t,i,r){g0(this,"id"),g0(this,"displayName"),g0(this,"key"),g0(this,"properties"),this.id=t||v4(),this.displayName=e||`user-${this.id}`,this.key=i||v4(),this.properties=r||new Map}}function storageAvailable(e){const t=window[e],i="test";try{return t.setItem(i,i),t.removeItem(i),!0}catch{return!1}}class SessionBus{constructor(e,t,i,r="",n=""){if(g0(this,"userList"),g0(this,"user"),g0(this,"userQueueName"),g0(this,"userListName"),g0(this,"onMessageCallback"),g0(this,"isConnectedToServer",!1),g0(this,"isController",!1),g0(this,"sessionScene",{}),g0(this,"sessionKey"),g0(this,"sessionName"),g0(this,"sessionSceneName"),g0(this,"serverConnection$",null),this.userList=[],this.user=t||new SessionUser("anonymous"),this.onMessageCallback=i,this.sessionScene={},this.sessionKey=n||v4(),this.sessionName=e,this.sessionSceneName=`session-${e}-scene`,r)this.connectToServer(r,e),this.subscribeToServer(),this.isConnectedToServer=!0,null!==this.serverConnection$&&this.serverConnection$.next({op:NVMESSAGE.CREATE,key:this.sessionKey});else{if(!storageAvailable("localStorage"))throw new Error("Local storage unavailable");this.userQueueName=`user-${this.user.id}-q`,this.userListName=`${e}-user-list`,this.userList=JSON.parse(localStorage.getItem(this.userListName)||"[]"),this.userList.push(this.user),localStorage.setItem(this.userListName,JSON.stringify(this.userList)),localStorage.setItem(this.userQueueName,JSON.stringify([])),window.addEventListener("storage",this.localStorageEventListener.bind(this))}}sendSessionMessage(e){e.from=this.user.id,this.isConnectedToServer&&null!==this.serverConnection$?this.serverConnection$.next({...e,key:this.sessionKey,userKey:this.user.key}):this.sendLocalMessage(e)}connectToServer(e,t){const i=new URL(e);i.pathname="websockets",i.search="?session="+t,this.serverConnection$=webSocket(i.href),log.debug(i.href)}subscribeToServer(){null!==this.serverConnection$&&this.serverConnection$.subscribe({next:e=>{this.onMessageCallback(e)},error:e=>log.error(e),complete:()=>log.debug("complete")})}sendLocalMessage(e){for(const t of this.userList){if(t.id===this.user.id)continue;const i=`user-${t.id}-q`,r=localStorage.getItem(i),n=r?JSON.parse(r):[];n.push(e),localStorage.setItem(i,JSON.stringify(n))}}localStorageEventListener(e){if(e.newValue)switch(e.key){case this.userListName:{const t=JSON.parse(e.newValue),i=JSON.parse(e.oldValue??"[]");this.userList=t;const r=t.filter((e=>!i.map((e=>e.id)).includes(e.id)));for(const e of r)this.onMessageCallback({op:NVMESSAGE.USER_JOINED,user:e})}break;case this.userQueueName:{const t=JSON.parse(e.newValue);for(const e of t)this.onMessageCallback&&this.onMessageCallback(e);localStorage.setItem(this.userQueueName??"",JSON.stringify([]))}}}}class NVController{constructor(e){g0(this,"niivue"),g0(this,"mediaUrlMap"),g0(this,"isInSession",!1),g0(this,"user"),g0(this,"sessionBus"),g0(this,"onFrameChange",((e,t)=>{})),this.niivue=e,this.mediaUrlMap=new Map,this.niivue.onLocationChange=this.onLocationChangeHandler.bind(this),this.niivue.onZoom3DChange=this.onZoom3DChangeHandler.bind(this),this.niivue.scene.onAzimuthElevationChange=this.onAzimuthElevationChangeHandler.bind(this),this.niivue.onClipPlaneChange=this.onClipPlaneChangeHandler.bind(this),this.niivue.onVolumeAddedFromUrl=this.onVolumeAddedFromUrlHandler.bind(this),this.niivue.onVolumeWithUrlRemoved=this.onVolumeWithUrlRemovedHandler.bind(this),this.niivue.onMeshAddedFromUrl=this.onMeshAddedFromUrlHandler.bind(this),this.niivue.onMeshWithUrlRemoved=this.onMeshWithUrlRemovedHandler.bind(this),this.niivue.onCustomMeshShaderAdded=this.onCustomMeshShaderAddedHandler.bind(this),this.niivue.onMeshShaderChanged=this.onMeshShaderChanged.bind(this),this.niivue.onMeshPropertyChanged=this.onMeshPropertyChanged.bind(this),this.niivue.onFrameChange=this.onFrameChangeHandler.bind(this);for(const e of this.niivue.volumes)e.onColormapChange=this.onColormapChangeHandler.bind(this),e.onOpacityChange=this.onOpacityChangeHandler.bind(this)}onLocationChangeHandler(e){log.debug(e)}addVolume(e,t){this.niivue.volumes.push(e);const i=1===this.niivue.volumes.length?0:this.niivue.volumes.length-1;this.niivue.setVolume(e,i),this.niivue.mediaUrlMap.set(e,t)}addMesh(e,t){this.niivue.meshes.push(e);const i=1===this.niivue.meshes.length?0:this.niivue.meshes.length-1;this.niivue.setMesh(e,i),this.niivue.mediaUrlMap.set(e,t)}onNewMessage(e){switch(e.op){case NVMESSAGE.ZOOM:this.niivue.volScaleMultiplier=e.zoom;break;case NVMESSAGE.CLIP_PLANE:this.niivue.scene.clipPlane=e.clipPlane;break;case NVMESSAGE.AZIMUTH_ELEVATION:this.niivue.scene._elevation=e.elevation,this.niivue.scene._azimuth=e.azimuth;break;case NVMESSAGE.FRAME_CHANGED:{const t=this.niivue.getMediaByUrl(e.url);t&&(t.frame4D=e.index)}break;case NVMESSAGE.VOLUME_ADDED_FROM_URL:this.niivue.getMediaByUrl(e.imageOptions.url)||NVImage.loadFromUrl(e.imageOptions).then((t=>{t&&this.addVolume(t,e.imageOptions.url)})).catch((e=>{if(e)throw e}));break;case NVMESSAGE.VOLUME_WITH_URL_REMOVED:{const t=this.niivue.getMediaByUrl(e.url);t&&(this.niivue.setVolume(t,-1),this.niivue.mediaUrlMap.delete(t))}break;case NVMESSAGE.COLORMAP_CHANGED:this.niivue.getMediaByUrl(e.url)._colormap=e.colormap,this.niivue.updateGLVolume();break;case NVMESSAGE.OPACITY_CHANGED:this.niivue.getMediaByUrl(e.url)._opacity=e.opacity,this.niivue.updateGLVolume();break;case NVMESSAGE.MESH_FROM_URL_ADDED:this.niivue.getMediaByUrl(e.meshOptions.url)||(e.meshOptions.gl=this.niivue.gl,NVMesh.loadFromUrl(e.meshOptions).then((t=>{this.addMesh(t,e.meshOptions.url)})).catch((e=>{if(e)throw e})));break;case NVMESSAGE.MESH_WITH_URL_REMOVED:{const t=this.niivue.getMediaByUrl(e.url);t&&(this.niivue.setMesh(t,-1),this.niivue.mediaUrlMap.delete(t))}break;case NVMESSAGE.CUSTOM_SHADER_ADDED:{const t=this.niivue.createCustomMeshShader(e.fragmentShaderText,e.name);this.niivue.meshShaders.push(t)}break;case NVMESSAGE.SHADER_CHANGED:this.niivue.meshes[e.meshIndex].meshShaderIndex=e.shaderIndex,this.niivue.updateGLVolume();break;case NVMESSAGE.MESH_PROPERTY_CHANGED:this.niivue.meshes[e.meshIndex].setProperty(e.key,e.val,this.niivue.gl)}this.niivue.drawScene()}connectToSession(e,t,i,r){this.user=t||new SessionUser,this.sessionBus=new SessionBus(e,this.user,this.onNewMessage.bind(this),i,r),this.isInSession=!0}onZoom3DChangeHandler(e){this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.ZOOM,zoom:e})}onAzimuthElevationChangeHandler(e,t){this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.AZIMUTH_ELEVATION,azimuth:e,elevation:t})}onClipPlaneChangeHandler(e){this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.CLIP_PLANE,clipPlane:e})}onVolumeAddedFromUrlHandler(e,t){this.isInSession&&this.sessionBus&&(log.debug(e),this.sessionBus.sendSessionMessage({op:NVMESSAGE.VOLUME_ADDED_FROM_URL,imageOptions:e})),t.onColormapChange=this.onColormapChangeHandler.bind(this),t.onOpacityChange=this.onOpacityChangeHandler.bind(this)}onImageLoadedHandler(e){if(e.onColormapChange=this.onColormapChangeHandler.bind(this),e.onOpacityChange=this.onOpacityChangeHandler.bind(this),this.isInSession&&this.sessionBus&&this.niivue.mediaUrlMap.has(e)){const t=this.niivue.mediaUrlMap.get(e);this.sessionBus.sendSessionMessage({op:NVMESSAGE.VOLUME_LOADED_FROM_URL,url:t})}}onVolumeWithUrlRemovedHandler(e){this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.VOLUME_WITH_URL_REMOVED,url:e})}onMeshAddedFromUrlHandler(e){log.debug("mesh loaded from url"),log.debug(e),this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.MESH_FROM_URL_ADDED,meshOptions:e})}onMeshLoadedHandler(e){log.debug("mesh has been added"),log.debug(e)}onMeshWithUrlRemovedHandler(e){this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.MESH_WITH_URL_REMOVED,url:e})}onColormapChangeHandler(e){if(this.isInSession&&this.sessionBus&&this.niivue.mediaUrlMap.has(e)){const t=this.niivue.mediaUrlMap.get(e),i=e.colormap;this.sessionBus.sendSessionMessage({op:NVMESSAGE.COLORMAP_CHANGED,url:t,colormap:i})}}onOpacityChangeHandler(e){if(this.isInSession&&this.sessionBus&&this.niivue.mediaUrlMap.has(e)){const t=this.niivue.mediaUrlMap.get(e),i=e.opacity;this.sessionBus.sendSessionMessage({op:NVMESSAGE.OPACITY_CHANGED,url:t,opacity:i})}}onFrameChangeHandler(e,t){if(log.debug("frame has changed to "+t),log.debug(e),this.niivue.mediaUrlMap.has(e)&&this.isInSession&&this.sessionBus){const i=this.niivue.mediaUrlMap.get(e);this.sessionBus.sendSessionMessage({op:NVMESSAGE.FRAME_CHANGED,url:i,index:t})}this.onFrameChange(e,t)}onCustomMeshShaderAddedHandler(e,t){this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.CUSTOM_SHADER_ADDED,fragmentShaderText:e,name:t})}onMeshShaderChanged(e,t){this.isInSession&&this.sessionBus&&this.sessionBus.sendSessionMessage({op:NVMESSAGE.SHADER_CHANGED,meshIndex:e,shaderIndex:t})}onMeshPropertyChanged(e,t,i){this.isInSession&&this.sessionBus&&(log.debug(NVMESSAGE.MESH_PROPERTY_CHANGED),this.sessionBus.sendSessionMessage({op:NVMESSAGE.MESH_PROPERTY_CHANGED,meshIndex:e,key:t,val:i}))}}const MESH_EXTENSIONS=["ASC","BYU","DFS","FSM","PIAL","ORIG","INFLATED","SMOOTHWM","SPHERE","WHITE","G","GEO","GII","ICO","MZ3","NV","OBJ","OFF","PLY","SRF","STL","TCK","TRACT","TRI","TRK","TT","TRX","VTK","X3D","JCON","JSON"],LEFT_MOUSE_BUTTON=0,CENTER_MOUSE_BUTTON=1,RIGHT_MOUSE_BUTTON=2,TEXTURE0_BACK_VOL=33984,TEXTURE1_COLORMAPS=33985,TEXTURE2_OVERLAY_VOL=33986,TEXTURE3_FONT=33987,TEXTURE4_THUMBNAIL=33988,TEXTURE5_MATCAP=33989,TEXTURE6_GRADIENT=33990,TEXTURE7_DRAW=33991,TEXTURE8_GRADIENT_TEMP=33992,TEXTURE9_ORIENT=33993,TEXTURE10_BLEND=33994,TEXTURE11_GC_BACK=33995,TEXTURE12_GC_STRENGTH0=33996,TEXTURE13_GC_STRENGTH1=33997,TEXTURE14_GC_LABEL0=33998,TEXTURE15_GC_LABEL1=33999,defaultSaveImageOptions={filename:"",isSaveDrawing:!1,volumeByIndex:0};class Niivue{constructor(e=DEFAULT_OPTIONS){g0(this,"loaders",{}),g0(this,"canvas",null),g0(this,"_gl",null),g0(this,"isBusy",!1),g0(this,"needsRefresh",!1),g0(this,"colormapTexture",null),g0(this,"colormapLists",[]),g0(this,"volumeTexture",null),g0(this,"gradientTexture",null),g0(this,"gradientTextureAmount",0),g0(this,"drawTexture",null),g0(this,"drawUndoBitmaps",[]),g0(this,"drawLut",cmapper.makeDrawLut("$itksnap")),g0(this,"drawOpacity",.8),g0(this,"clickToSegmentIsGrowing",!1),g0(this,"clickToSegmentGrowingBitmap",null),g0(this,"clickToSegmentXY",[0,0]),g0(this,"renderDrawAmbientOcclusion",.4),g0(this,"colorbarHeight",0),g0(this,"drawPenLocation",[NaN,NaN,NaN]),g0(this,"drawPenAxCorSag",-1),g0(this,"drawFillOverwrites",!0),g0(this,"drawPenFillPts",[]),g0(this,"overlayTexture",null),g0(this,"overlayTextureID",null),g0(this,"sliceMMShader"),g0(this,"sliceV1Shader"),g0(this,"orientCubeShader"),g0(this,"orientCubeShaderVAO",null),g0(this,"rectShader"),g0(this,"rectOutlineShader"),g0(this,"renderShader"),g0(this,"lineShader"),g0(this,"line3DShader"),g0(this,"passThroughShader"),g0(this,"renderGradientShader"),g0(this,"renderSliceShader"),g0(this,"renderVolumeShader"),g0(this,"pickingMeshShader"),g0(this,"pickingImageShader"),g0(this,"colorbarShader"),g0(this,"fontShader",null),g0(this,"fiberShader"),g0(this,"fontTexture",null),g0(this,"circleShader"),g0(this,"matCapTexture",null),g0(this,"bmpShader",null),g0(this,"bmpTexture",null),g0(this,"thumbnailVisible",!1),g0(this,"bmpTextureWH",1),g0(this,"growCutShader"),g0(this,"orientShaderAtlasU",null),g0(this,"orientShaderAtlasI",null),g0(this,"orientShaderU",null),g0(this,"orientShaderI",null),g0(this,"orientShaderF",null),g0(this,"orientShaderRGBU",null),g0(this,"surfaceShader",null),g0(this,"blurShader",null),g0(this,"sobelShader",null),g0(this,"genericVAO",null),g0(this,"unusedVAO",null),g0(this,"crosshairs3D",null),g0(this,"DEFAULT_FONT_GLYPH_SHEET",defaultFontPNG),g0(this,"DEFAULT_FONT_METRICS",defaultFontMetrics),g0(this,"fontMetrics"),g0(this,"fontMets",null),g0(this,"backgroundMasksOverlays",0),g0(this,"overlayOutlineWidth",0),g0(this,"overlayAlphaShader",1),g0(this,"isAlphaClipDark",!1),g0(this,"position"),g0(this,"extentsMin"),g0(this,"extentsMax"),g0(this,"resizeObserver",null),g0(this,"syncOpts",{"3d":!1,"2d":!1,zoomPan:!1,cal_min:!1,cal_max:!1,clipPlane:!1,gamma:!1,sliceType:!1,crosshair:!1}),g0(this,"readyForSync",!1),g0(this,"uiData",{mousedown:!1,touchdown:!1,mouseButtonLeftDown:!1,mouseButtonCenterDown:!1,mouseButtonRightDown:!1,mouseDepthPicker:!1,clickedTile:-1,pan2DxyzmmAtMouseDown:[0,0,0,1],prevX:0,prevY:0,currX:0,currY:0,currentTouchTime:0,lastTouchTime:0,touchTimer:null,doubleTouch:!1,isDragging:!1,dragStart:[0,0],dragEnd:[0,0],dragClipPlaneStartDepthAziElev:[0,0,0],lastTwoTouchDistance:0,multiTouchGesture:!1}),g0(this,"back",null),g0(this,"overlays",[]),g0(this,"deferredVolumes",[]),g0(this,"deferredMeshes",[]),g0(this,"furthestVertexFromOrigin",100),g0(this,"volScale",[]),g0(this,"vox",[]),g0(this,"mousePos",[0,0]),g0(this,"screenSlices",[]),g0(this,"cuboidVertexBuffer"),g0(this,"otherNV",null),g0(this,"volumeObject3D",null),g0(this,"pivot3D",[0,0,0]),g0(this,"furthestFromPivot",10),g0(this,"currentClipPlaneIndex",0),g0(this,"lastCalled",(new Date).getTime()),g0(this,"selectedObjectId",-1),g0(this,"CLIP_PLANE_ID",1),g0(this,"VOLUME_ID",254),g0(this,"DISTANCE_FROM_CAMERA",-.54),g0(this,"graph",{LTWH:[0,0,640,480],opacity:0,vols:[0],autoSizeMultiplanar:!1,normalizeValues:!1,isRangeCalMinMax:!1}),g0(this,"meshShaders",[{Name:"Phong",Frag:fragMeshShader},{Name:"Matte",Frag:fragMeshMatteShader},{Name:"Harmonic",Frag:fragMeshShaderSHBlue},{Name:"Hemispheric",Frag:fragMeshHemiShader},{Name:"Crevice",Frag:fragMeshShaderCrevice},{Name:"Edge",Frag:fragMeshEdgeShader},{Name:"Diffuse",Frag:fragMeshDiffuseEdgeShader},{Name:"Outline",Frag:fragMeshOutlineShader},{Name:"Specular",Frag:fragMeshSpecularEdgeShader},{Name:"Toon",Frag:fragMeshToonShader},{Name:"Flat",Frag:fragFlatMeshShader},{Name:"Matcap",Frag:fragMeshMatcapShader}]),g0(this,"dragModes",{contrast:DRAG_MODE.contrast,measurement:DRAG_MODE.measurement,none:DRAG_MODE.none,pan:DRAG_MODE.pan,slicer3D:DRAG_MODE.slicer3D,callbackOnly:DRAG_MODE.callbackOnly}),g0(this,"sliceTypeAxial",SLICE_TYPE.AXIAL),g0(this,"sliceTypeCoronal",SLICE_TYPE.CORONAL),g0(this,"sliceTypeSagittal",SLICE_TYPE.SAGITTAL),g0(this,"sliceTypeMultiplanar",SLICE_TYPE.MULTIPLANAR),g0(this,"sliceTypeRender",SLICE_TYPE.RENDER),g0(this,"onDragRelease",(()=>{})),g0(this,"onMouseUp",(()=>{})),g0(this,"onLocationChange",(()=>{})),g0(this,"onIntensityChange",(()=>{})),g0(this,"onClickToSegment",(()=>{})),g0(this,"onImageLoaded",(()=>{})),g0(this,"onMeshLoaded",(()=>{})),g0(this,"onFrameChange",(()=>{})),g0(this,"onError",(()=>{})),g0(this,"onColormapChange",(()=>{})),g0(this,"onInfo",(()=>{})),g0(this,"onWarn",(()=>{})),g0(this,"onDebug",(()=>{})),g0(this,"onVolumeAddedFromUrl",(()=>{})),g0(this,"onVolumeWithUrlRemoved",(()=>{})),g0(this,"onVolumeUpdated",(()=>{})),g0(this,"onMeshAddedFromUrl",(()=>{})),g0(this,"onMeshAdded",(()=>{})),g0(this,"onMeshWithUrlRemoved",(()=>{})),g0(this,"onZoom3DChange",(()=>{})),g0(this,"onAzimuthElevationChange",(()=>{})),g0(this,"onClipPlaneChange",(()=>{})),g0(this,"onCustomMeshShaderAdded",(()=>{})),g0(this,"onMeshShaderChanged",(()=>{})),g0(this,"onMeshPropertyChanged",(()=>{})),g0(this,"onDocumentLoaded",(()=>{})),g0(this,"document",new NVDocument),g0(this,"mediaUrlMap",new Map),g0(this,"initialized",!1),g0(this,"currentDrawUndoBitmap"),g0(this,"loadingText");for(const t in e)"function"==typeof e[t]?this[t]=e[t]:this.opts[t]=void 0===DEFAULT_OPTIONS[t]?DEFAULT_OPTIONS[t]:e[t];this.opts.isHighResolutionCapable?this.uiData.dpr=window.devicePixelRatio||1:this.uiData.dpr=1,this.currentDrawUndoBitmap=this.opts.maxDrawUndoBitmaps,this.opts.drawingEnabled&&this.createEmptyDrawing(),this.opts.thumbnail.length>0&&(this.thumbnailVisible=!0),this.loadingText=this.opts.loadingText,log.setLogLevel(this.opts.logLevel)}get scene(){return this.document.scene}get opts(){return this.document.opts}get sliceMosaicString(){return this.document.opts.sliceMosaicString||""}set sliceMosaicString(e){this.document.opts.sliceMosaicString=e}get volumes(){return this.document.volumes}set volumes(e){this.document.volumes=e}get meshes(){return this.document.meshes}set meshes(e){this.document.meshes=e}get drawBitmap(){return this.document.drawBitmap}set drawBitmap(e){this.document.drawBitmap=e}get volScaleMultiplier(){return this.scene.volScaleMultiplier}set volScaleMultiplier(e){this.setScale(e)}async saveScene(e="niivue.png"){const t=this.canvas;if(!t)throw new Error("canvas not defined");this.drawScene(),t.toBlob((t=>{t&&(""===e&&(e=(e=`niivue-screenshot-${(new Date).toString()}.png`).replace(/\s/g,"_")),function(e,t){const i=document.createElement("a");document.body.appendChild(i),i.style.display="none";const r=window.URL.createObjectURL(e);i.href=r,i.download=t,i.click(),i.remove()}(t,e))}))}async attachTo(e,t=null){return await this.attachToCanvas(document.getElementById(e),t),log.debug("attached to element with id: ",e),this}async attachToCanvas(e,t=null){return this.canvas=e,null===t&&(t=navigator.hardwareConcurrency>6,log.debug("AntiAlias ",t," Threads ",navigator.hardwareConcurrency)),this.gl=this.canvas.getContext("webgl2",{alpha:!0,antialias:t}),log.info("NIIVUE VERSION ",version),this.canvas.parentElement.style.backgroundColor="black",this.opts.isResizeCanvas&&(this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.canvas.width=this.canvas.offsetWidth,this.canvas.height=this.canvas.offsetHeight,window.addEventListener("resize",(()=>{requestAnimationFrame((()=>{this.resizeListener()}))})),this.resizeObserver=new ResizeObserver((()=>{requestAnimationFrame((()=>{this.resizeListener()}))})),this.resizeObserver.observe(this.canvas.parentElement)),this.registerInteractions(),await this.init(),this.drawScene(),this}syncWith(e,t={"2d":!0,"3d":!0}){e instanceof Array||(e=[e]),this.otherNV=e,this.syncOpts={...t}}broadcastTo(e,t={"2d":!0,"3d":!0}){e instanceof Array||(e=[e]),this.otherNV=e,this.syncOpts=t}doSync3d(e){e.scene.renderAzimuth=this.scene.renderAzimuth,e.scene.renderElevation=this.scene.renderElevation,e.scene.volScaleMultiplier=this.scene.volScaleMultiplier}doSync2d(e){const t=this.frac2mm(this.scene.crosshairPos);e.scene.crosshairPos=e.mm2frac(t),e.scene.pan2Dxyzmm=clone(this.scene.pan2Dxyzmm)}doSyncGamma(e){const t=this.scene.gamma;t!==e.scene.gamma&&e.setGamma(t)}doSyncZoomPan(e){e.scene.pan2Dxyzmm=clone(this.scene.pan2Dxyzmm)}doSyncCrosshair(e){const t=this.frac2mm(this.scene.crosshairPos);e.scene.crosshairPos=e.mm2frac(t)}doSyncCalMin(e){this.volumes[0].cal_min!==e.volumes[0].cal_min&&(e.volumes[0].cal_min=this.volumes[0].cal_min,e.updateGLVolume())}doSyncCalMax(e){this.volumes[0].cal_max!==e.volumes[0].cal_max&&(e.volumes[0].cal_max=this.volumes[0].cal_max,e.updateGLVolume())}doSyncSliceType(e){e.setSliceType(this.opts.sliceType)}doSyncClipPlane(e){e.setClipPlane(this.scene.clipPlaneDepthAziElev)}sync(){if(this.gl&&this.otherNV&&!(typeof this.otherNV>"u")&&this.gl.canvas.matches(":focus"))for(let e=0;ee===t[i]))}resizeListener(){if(this.canvas&&this.gl){if(!this.opts.isResizeCanvas)return this.opts.isHighResolutionCapable&&(log.warn("isHighResolutionCapable requires isResizeCanvas"),this.opts.isHighResolutionCapable=!1),this.uiData.dpr=1,void this.drawScene();this.canvas.style.width="100%",this.canvas.style.height="100%",this.canvas.style.display="block",this.opts.isHighResolutionCapable?(this.uiData.dpr=window.devicePixelRatio||1,log.debug("devicePixelRatio: "+this.uiData.dpr)):this.uiData.dpr=1,"width"in this.canvas.parentElement?(this.canvas.width=this.canvas.parentElement.width*this.uiData.dpr,this.canvas.height=this.canvas.parentElement.height*this.uiData.dpr):(this.canvas.width=this.canvas.offsetWidth*this.uiData.dpr,this.canvas.height=this.canvas.offsetHeight*this.uiData.dpr),this.gl.viewport(0,0,this.gl.canvas.width,this.gl.canvas.height),this.drawScene()}}getRelativeMousePosition(e,t){if(!(t=t||e.target))return;const i=t.getBoundingClientRect();return{x:e.clientX-i.left,y:e.clientY-i.top}}getNoPaddingNoBorderCanvasRelativeMousePosition(e,t){return t=t||e.target,this.getRelativeMousePosition(e,t)}mouseContextMenuListener(e){e.preventDefault()}mouseDownListener(e){e.preventDefault(),this.drawPenLocation=[NaN,NaN,NaN],this.drawPenAxCorSag=-1,this.uiData.mousedown=!0,this.setDragStart(0,0),this.setDragEnd(0,0),log.debug("mouse down"),log.debug(e);const t=this.getNoPaddingNoBorderCanvasRelativeMousePosition(e,this.gl.canvas);if(!t)return;const[i,r]=[t.x*this.uiData.dpr,t.y*this.uiData.dpr];this.opts.clickToSegment&&(this.clickToSegmentXY=[i,r]);const n=this.getLabelAtPoint([i,r]);if(n){if(n.onClick)return void n.onClick(n);for(const e of this.meshes)if(e.type===MeshType.CONNECTOME)for(const t of e.nodes)t.label===n&&(this.scene.crosshairPos=this.mm2frac([t.x,t.y,t.z]),this.updateGLVolume(),this.drawScene())}this.uiData.clickedTile=this.tileIndex(i,r),e.button===LEFT_MOUSE_BUTTON&&e.shiftKey?(this.uiData.mouseButtonCenterDown=!0,this.mouseCenterButtonHandler(e)):e.button===LEFT_MOUSE_BUTTON?(this.uiData.mouseButtonLeftDown=!0,this.mouseLeftButtonHandler(e)):e.button===RIGHT_MOUSE_BUTTON?(this.uiData.mouseButtonRightDown=!0,this.mouseRightButtonHandler(e)):e.button===CENTER_MOUSE_BUTTON&&(this.uiData.mouseButtonCenterDown=!0,this.mouseCenterButtonHandler(e))}mouseLeftButtonHandler(e){const t=this.getNoPaddingNoBorderCanvasRelativeMousePosition(e,this.gl.canvas);this.mouseDown(t.x,t.y),this.mouseClick(t.x,t.y)}mouseCenterButtonHandler(e){const t=this.getNoPaddingNoBorderCanvasRelativeMousePosition(e,this.gl.canvas);this.mousePos=[t.x*this.uiData.dpr,t.y*this.uiData.dpr],this.opts.dragMode!==DRAG_MODE.none&&(this.setDragStart(t.x,t.y),this.uiData.isDragging||(this.uiData.pan2DxyzmmAtMouseDown=clone(this.scene.pan2Dxyzmm)),this.uiData.isDragging=!0,this.uiData.dragClipPlaneStartDepthAziElev=this.scene.clipPlaneDepthAziElev)}mouseRightButtonHandler(e){const t=this.getNoPaddingNoBorderCanvasRelativeMousePosition(e,this.gl.canvas);this.mousePos=[t.x*this.uiData.dpr,t.y*this.uiData.dpr],this.opts.dragMode!==DRAG_MODE.none&&(this.setDragStart(t.x,t.y),this.uiData.isDragging||(this.uiData.pan2DxyzmmAtMouseDown=clone(this.scene.pan2Dxyzmm)),this.uiData.isDragging=!0,this.uiData.dragClipPlaneStartDepthAziElev=this.scene.clipPlaneDepthAziElev)}calculateMinMaxVoxIdx(e){if(e.length>2)throw new Error("array must not contain more than two values");return[Math.floor(Math.min(e[0],e[1])),Math.floor(Math.max(e[0],e[1]))]}calculateNewRange({volIdx:e=0}={}){if(this.opts.sliceType===SLICE_TYPE.RENDER&&this.sliceMosaicString.length<1||this.uiData.dragStart[0]===this.uiData.dragEnd[0]&&this.uiData.dragStart[1]===this.uiData.dragEnd[1])return;let t=this.canvasPos2frac([this.uiData.dragStart[0],this.uiData.dragStart[1]]);if(t[0]<0)return;const i=this.frac2vox(t,e);if(t=this.canvasPos2frac([this.uiData.dragEnd[0],this.uiData.dragEnd[1]]),t[0]<0)return;const r=this.frac2vox(t,e);let n=-Number.MAX_VALUE,a=Number.MAX_VALUE;const o=this.calculateMinMaxVoxIdx([i[0],r[0]]),s=this.calculateMinMaxVoxIdx([i[1],r[1]]),l=this.calculateMinMaxVoxIdx([i[2],r[2]]);i[0]-r[0]==0?o[1]=i[0]+1:i[1]-r[1]==0?s[1]=i[1]+1:i[2]-r[2]==0&&(l[1]=i[2]+1);const c=this.volumes[e].hdr,u=this.volumes[e].img;if(!c||!u)return;const f=c.dims[1],h=c.dims[2];for(let e=l[0];eu[r]&&(a=u[r]),n=n)return;const d=intensityRaw2Scaled(c,a),m=intensityRaw2Scaled(c,n);this.volumes[e].cal_min=d,this.volumes[e].cal_max=m,this.onIntensityChange(this.volumes[e])}generateMouseUpCallback(e,t){const i=this.tileIndex(this.uiData.dragStart[0],this.uiData.dragStart[1]),r=this.tileIndex(this.uiData.dragEnd[0],this.uiData.dragEnd[1]);let n=-1;i===r&&(n=r);let a=-1;n>=0&&(a=this.screenSlices[n].axCorSag);const o=this.frac2mm(e),s=this.frac2mm(t),l=create$2();sub$1(l,fromValues$2(o[0],o[1],o[2]),fromValues$2(s[0],s[1],s[2]));const c=len(l),u=this.frac2vox(e),f=this.frac2vox(t);this.onDragRelease({fracStart:e,fracEnd:t,voxStart:u,voxEnd:f,mmStart:o,mmEnd:s,mmLength:c,tileIdx:n,axCorSag:a})}mouseUpListener(){const e={mouseButtonRightDown:this.uiData.mouseButtonRightDown,mouseButtonCenterDown:this.uiData.mouseButtonCenterDown,isDragging:this.uiData.isDragging,mousePos:this.mousePos,fracPos:this.canvasPos2frac(this.mousePos)};this.uiData.mousedown=!1,this.uiData.mouseButtonRightDown=!1;const t=this.uiData.mouseButtonCenterDown;if(this.uiData.mouseButtonCenterDown=!1,this.uiData.mouseButtonLeftDown=!1,this.drawPenFillPts.length>0)this.drawPenFilled();else if(this.drawPenAxCorSag>=0&&this.opts.clickToSegment){const e=this.sumBitmap(this.drawBitmap);this.sumBitmap(this.clickToSegmentGrowingBitmap)>e&&this.updateBitmapFromClickToSegment()}if(this.drawAddUndoBitmap(),this.drawPenLocation=[NaN,NaN,NaN],this.drawPenAxCorSag=-1,i=this.onMouseUp,Object.prototype.toString.call(i).indexOf("Function")>-1&&this.onMouseUp(e),this.uiData.isDragging){this.uiData.isDragging=!1,this.opts.dragMode===DRAG_MODE.callbackOnly&&this.drawScene();const e=this.canvasPos2frac([this.uiData.dragStart[0],this.uiData.dragStart[1]]),i=this.canvasPos2frac([this.uiData.dragEnd[0],this.uiData.dragEnd[1]]);if(this.generateMouseUpCallback(e,i),this.opts.dragMode===DRAG_MODE.roiSelection||this.opts.dragMode!==DRAG_MODE.contrast||t||this.uiData.dragStart[0]===this.uiData.dragEnd[0]&&this.uiData.dragStart[1]===this.uiData.dragEnd[1])return;this.calculateNewRange({volIdx:0}),this.refreshLayers(this.volumes[0],0)}var i;this.drawScene()}checkMultitouch(e){if(this.uiData.touchdown&&!this.uiData.multiTouchGesture){const t=this.canvas.getBoundingClientRect();this.mouseDown(e.touches[0].clientX-t.left,e.touches[0].clientY-t.top),this.mouseClick(e.touches[0].clientX-t.left,e.touches[0].clientY-t.top)}}touchStartListener(e){e.preventDefault(),this.uiData.touchTimer||(this.uiData.touchTimer=setTimeout((()=>{this.resetBriCon(e)}),this.opts.longTouchTimeout)),this.uiData.touchdown=!0,this.uiData.currentTouchTime=(new Date).getTime();const t=this.uiData.currentTouchTime-this.uiData.lastTouchTime;if(t0)return this.uiData.doubleTouch=!0,this.setDragStart(e.targetTouches[0].clientX-e.target.getBoundingClientRect().left,e.targetTouches[0].clientY-e.target.getBoundingClientRect().top),this.resetBriCon(e),void(this.uiData.lastTouchTime=this.uiData.currentTouchTime);this.uiData.doubleTouch=!1,this.setDragStart(0,0),this.setDragEnd(0,0),this.uiData.lastTouchTime=this.uiData.currentTouchTime,this.uiData.touchdown&&e.touches.length<2?this.uiData.multiTouchGesture=!1:this.uiData.multiTouchGesture=!0,setTimeout(this.checkMultitouch.bind(this),1,e)}touchEndListener(e){if(e.preventDefault(),this.uiData.touchdown=!1,this.uiData.lastTwoTouchDistance=0,this.uiData.multiTouchGesture=!1,this.uiData.touchTimer&&(clearTimeout(this.uiData.touchTimer),this.uiData.touchTimer=null),this.uiData.isDragging){this.uiData.isDragging=!1,this.opts.dragMode===DRAG_MODE.contrast&&(this.calculateNewRange(),this.refreshLayers(this.volumes[0],0));const e=this.canvasPos2frac([this.uiData.dragStart[0],this.uiData.dragStart[1]]),t=this.canvasPos2frac([this.uiData.dragEnd[0],this.uiData.dragEnd[1]]);this.generateMouseUpCallback(e,t)}this.mouseUpListener()}mouseMoveListener(e){if(this.uiData.mousedown){const t=this.getNoPaddingNoBorderCanvasRelativeMousePosition(e,this.gl.canvas);if(!t)return;const i=t.x*this.uiData.dpr,r=t.y*this.uiData.dpr;if(this.tileIndex(i,r)!==this.uiData.clickedTile)return;this.uiData.mouseButtonLeftDown?(this.mouseMove(t.x,t.y),this.mouseClick(t.x,t.y)):(this.uiData.mouseButtonRightDown||this.uiData.mouseButtonCenterDown)&&this.setDragEnd(t.x,t.y),this.drawScene(),this.uiData.prevX=this.uiData.currX,this.uiData.prevY=this.uiData.currY}else if(!this.uiData.mousedown&&this.opts.clickToSegment){const t=this.getNoPaddingNoBorderCanvasRelativeMousePosition(e,this.gl.canvas);if(!t)return;const i=t.x*this.uiData.dpr,r=t.y*this.uiData.dpr;this.mousePos=[i,r],this.drawScene()}}resetBriCon(e=null){if(this.uiData.isDragging)return;let t=!1;this.opts.sliceType===SLICE_TYPE.RENDER&&(t=!0);let i=0,r=0;if(null!==e&&("targetTouches"in e?(i=e.targetTouches[0].clientX-e.target.getBoundingClientRect().left,r=e.targetTouches[0].clientY-e.target.getBoundingClientRect().top):(i=e.offsetX,r=e.offsetY),i*=this.uiData.dpr,r*=this.uiData.dpr,this.inRenderTile(i,r)>=0&&(t=!0)),t)return this.uiData.mouseDepthPicker=!0,this.drawScene(),void this.drawScene();this.opts.dragMode!==DRAG_MODE.slicer3D&&(this.volumes.length<1||this.uiData.doubleTouch||(this.volumes[0].cal_min=this.volumes[0].robust_min,this.volumes[0].cal_max=this.volumes[0].robust_max,this.onIntensityChange(this.volumes[0]),this.refreshLayers(this.volumes[0],0),this.drawScene()))}setDragStart(e,t){e*=this.uiData.dpr,t*=this.uiData.dpr,this.uiData.dragStart[0]=e,this.uiData.dragStart[1]=t}setDragEnd(e,t){e*=this.uiData.dpr,t*=this.uiData.dpr,this.uiData.dragEnd[0]=e,this.uiData.dragEnd[1]=t}touchMoveListener(e){if(this.uiData.touchdown&&e.touches.length<2){const t=this.canvas.getBoundingClientRect();if(this.uiData.isDragging||(this.uiData.pan2DxyzmmAtMouseDown=clone(this.scene.pan2Dxyzmm)),this.uiData.isDragging=!0,this.uiData.doubleTouch&&this.uiData.isDragging)return this.setDragEnd(e.targetTouches[0].clientX-e.target.getBoundingClientRect().left,e.targetTouches[0].clientY-e.target.getBoundingClientRect().top),void this.drawScene();this.mouseClick(e.touches[0].clientX-t.left,e.touches[0].clientY-t.top),this.mouseMove(e.touches[0].clientX-t.left,e.touches[0].clientY-t.top)}else this.handlePinchZoom(e)}handlePinchZoom(e){if(2===e.targetTouches.length&&2===e.changedTouches.length){const t=Math.hypot(e.touches[0].pageX-e.touches[1].pageX,e.touches[0].pageY-e.touches[1].pageY),i=this.canvas.getBoundingClientRect();this.mousePos=[e.touches[0].clientX-i.left,e.touches[0].clientY-i.top],tthis.opts.keyDebounceTime){switch(this.currentClipPlaneIndex=(this.currentClipPlaneIndex+1)%7,this.currentClipPlaneIndex){case 0:this.scene.clipPlaneDepthAziElev=[2,0,0];break;case 1:this.scene.clipPlaneDepthAziElev=[0,270,0];break;case 2:this.scene.clipPlaneDepthAziElev=[0,90,0];break;case 3:this.scene.clipPlaneDepthAziElev=[0,0,0];break;case 4:this.scene.clipPlaneDepthAziElev=[0,180,0];break;case 5:this.scene.clipPlaneDepthAziElev=[0,0,-90];break;case 6:this.scene.clipPlaneDepthAziElev=[0,0,90]}this.setClipPlane(this.scene.clipPlaneDepthAziElev)}this.lastCalled=e}else if(e.code===this.opts.viewModeHotKey){const e=(new Date).getTime();e-this.lastCalled>this.opts.keyDebounceTime&&(this.setSliceType((this.opts.sliceType+1)%5),this.lastCalled=e)}}keyDownListener(e){"KeyH"===e.code&&this.opts.sliceType===SLICE_TYPE.RENDER?this.setRenderAzimuthElevation(this.scene.renderAzimuth-1,this.scene.renderElevation):"KeyL"===e.code&&this.opts.sliceType===SLICE_TYPE.RENDER?this.setRenderAzimuthElevation(this.scene.renderAzimuth+1,this.scene.renderElevation):"KeyJ"===e.code&&this.opts.sliceType===SLICE_TYPE.RENDER?this.setRenderAzimuthElevation(this.scene.renderAzimuth,this.scene.renderElevation+1):"KeyK"===e.code&&this.opts.sliceType===SLICE_TYPE.RENDER?this.setRenderAzimuthElevation(this.scene.renderAzimuth,this.scene.renderElevation-1):"KeyH"===e.code&&this.opts.sliceType!==SLICE_TYPE.RENDER?this.moveCrosshairInVox(-1,0,0):"KeyL"===e.code&&this.opts.sliceType!==SLICE_TYPE.RENDER?this.moveCrosshairInVox(1,0,0):"KeyU"===e.code&&this.opts.sliceType!==SLICE_TYPE.RENDER&&e.ctrlKey?this.moveCrosshairInVox(0,0,1):"KeyD"===e.code&&this.opts.sliceType!==SLICE_TYPE.RENDER&&e.ctrlKey?this.moveCrosshairInVox(0,0,-1):"KeyJ"===e.code&&this.opts.sliceType!==SLICE_TYPE.RENDER?this.moveCrosshairInVox(0,-1,0):"KeyK"===e.code&&this.opts.sliceType!==SLICE_TYPE.RENDER?this.moveCrosshairInVox(0,1,0):"KeyM"===e.code&&this.opts.sliceType!==SLICE_TYPE.RENDER?(this.opts.dragMode++,this.opts.dragMode>=DRAG_MODE.slicer3D&&(this.opts.dragMode=DRAG_MODE.none),log.info("drag mode changed to ",DRAG_MODE[this.opts.dragMode])):"ArrowLeft"===e.code?this.setFrame4D(this.volumes[0].id,this.volumes[0].frame4D-1):"ArrowRight"===e.code?this.setFrame4D(this.volumes[0].id,this.volumes[0].frame4D+1):"Slash"===e.code&&e.shiftKey&&alert(`NIIVUE VERSION: ${version}`)}wheelListener(e){if(e.preventDefault(),e.stopPropagation(),this.thumbnailVisible)return;const t=this.uiData.dragStart.reduce(((e,t)=>e+t),0),i=this.uiData.dragEnd.reduce(((e,t)=>e+t),0),r=t>0&&i>0;if(this.opts.dragMode===DRAG_MODE.roiSelection&&r){const t=e.deltaY>0?1:-1;this.uiData.dragStart[0]{const t=this.getFileExt(e.name||e.url);if(this.loaders[t]){let i=e.url;const r=this.loaders[t].toExt;let n=e.name||e.url;if(n=n.split("/").pop(),"string"==typeof e.url){const t=e.url;try{const e=await fetch(t);if(!e.ok)throw new Error(`Failed to load file: ${e.statusText}`);i=await e.arrayBuffer()}catch(e){throw new Error(`Failed to load url ${t}: ${e}`)}}const a=await this.loaders[t].loader(i);e.url=a,e.name=`${n}.${r}`}const i={url:e.url,headers:e.headers,name:e.name,colormap:e.colormap?e.colormap:e.colorMap,colormapNegative:e.colormapNegative?e.colormapNegative:e.colorMapNegative,opacity:e.opacity,urlImgData:e.urlImgData,cal_min:e.cal_min,cal_max:e.cal_max,trustCalMinMax:this.opts.trustCalMinMax,isManifest:e.isManifest,frame4D:e.frame4D,limitFrames4D:e.limitFrames4D||this.opts.limitFrames4D,colorbarVisible:e.colorbarVisible},r=await NVImage.loadFromUrl(i);return this.document.addImageOptions(r,i),r.onColormapChange=this.onColormapChange,this.mediaUrlMap.set(r,i.url),this.onVolumeAddedFromUrl&&this.onVolumeAddedFromUrl(i,r),r})),i=await Promise.all(t);for(let e=0;et[1]===e)).map((e=>e[0])).pop()}removeVolumeByUrl(e){const t=this.getMediaByUrl(e);if(!t)throw new Error("No volume with URL present");this.removeVolume(t)}readDirectory(e){const t=e.createReader();let i=[];const r=()=>{t.readEntries((t=>{t.length?(i=i.concat(t),r()):(async e=>{const t=[],i=async e=>new Promise(((t,i)=>e.file(t,i)));for(let r=0;r{NVImage.loadFromFile({file:t,name:e.name,urlImgData:null,imageType:NVIMAGE_TYPE.DCM_FOLDER}).then((e=>{this.addVolume(e),this.setDrawingEnabled(!0)})).catch((e=>{throw e}))})).catch((e=>{throw e}))}))};return r(),i}isMeshExt(e){const t=this.getFileExt(e);return log.debug("dropped ext"),log.debug(t),MESH_EXTENSIONS.includes(t)}async loadFromArrayBuffer(e,t){const i=this.getFileExt(t);if(MESH_EXTENSIONS.includes(i))return void await this.addMeshFromUrl({url:t,buffer:e});const r=NVImageFromUrlOptions(t);r.buffer=e,r.name=t,await this.addVolumeFromUrl(r)}async loadFromFile(e){const t=this.getFileExt(e.name);MESH_EXTENSIONS.includes(t)?await NVMesh.loadFromFile({file:e,gl:this.gl,name:e.name}).then((e=>{this.addMesh(e)})):await NVImage.loadFromFile({file:e,name:e.name}).then((e=>{this.addVolume(e)}))}useLoader(e,t,i){this.loaders={...this.loaders,[t.toUpperCase()]:{loader:e,toExt:i}}}dropListener(e){if(e.stopPropagation(),e.preventDefault(),!this.opts.dragAndDropEnabled)return;const t=e.dataTransfer;if(!t)return;const i=t.getData("text/uri-list");if(i){const e=NVImageFromUrlOptions(i),t=this.getFileExt(i);log.debug("dropped ext"),log.debug(t),MESH_EXTENSIONS.includes(t)?this.addMeshFromUrl({url:i}).catch((e=>{throw e})):"NVD"===t?this.loadDocumentFromUrl(i).catch((e=>{throw e})):this.addVolumeFromUrl(e).catch((e=>{throw e}))}else{const i=t.items;if(i.length>0){!e.shiftKey&&!e.altKey&&(this.volumes=[],this.overlays=[],this.meshes=[]),this.closeDrawing();for(const t of Array.from(i)){const r=t.webkitGetAsEntry();if(log.debug(r),!r)throw new Error("could not get entry from file");if(r.isFile){const t=this.getFileExt(r.name);if("PNG"===t){r.file((e=>{this.loadBmpTexture(e).catch((e=>{throw e}))}));continue}let n;if(-1!==r.name.lastIndexOf("HEAD"))for(const e of Array.from(i)){const t=e.webkitGetAsEntry();if(!t)throw new Error("could not get paired entry");r.name.substring(0,r.name.lastIndexOf("HEAD"))===t.name.substring(0,t.name.lastIndexOf("BRIK"))&&(n=t)}if(-1!==r.name.lastIndexOf("BRIK"))continue;if(MESH_EXTENSIONS.includes(t)){r.file((e=>{NVMesh.loadFromFile({file:e,gl:this.gl,name:e.name}).then((e=>{this.addMesh(e)})).catch((e=>{throw e}))}));continue}if("NVD"===t){r.file((e=>{NVDocument.loadFromFile(e).then((e=>{this.loadDocument(e),log.debug("loaded document")})).catch((e=>{throw e}))}));break}r.file((t=>{n?n.file((e=>{NVImage.loadFromFile({file:t,urlImgData:e,limitFrames4D:this.opts.limitFrames4D}).then((e=>{this.addVolume(e)})).catch((e=>{throw e}))})):NVImage.loadFromFile({file:t,urlImgData:n,limitFrames4D:this.opts.limitFrames4D}).then((t=>{e.altKey?(log.debug("alt key detected: assuming this is a drawing overlay"),this.drawClearAllUndoBitmaps(),this.loadDrawing(t)):this.addVolume(t)})).catch((e=>{throw e}))}))}else r.isDirectory&&this.readDirectory(r)}}}this.drawScene()}setMultiplanarPadPixels(e){this.opts.multiplanarPadPixels=e,this.drawScene()}setMultiplanarLayout(e){"string"==typeof e&&(e=parseInt(e)),this.opts.multiplanarLayout=e,this.drawScene()}setCornerOrientationText(e){this.opts.isCornerOrientationText=e,this.updateGLVolume()}setRadiologicalConvention(e){this.opts.isRadiologicalConvention=e,this.updateGLVolume()}setDefaults(e={},t=!1){this.document.opts={...DEFAULT_OPTIONS},this.scene.sceneData={...INITIAL_SCENE_DATA};for(const t in e)"function"==typeof e[t]?this[t]=e[t]:this.opts[t]=void 0===DEFAULT_OPTIONS[t]?DEFAULT_OPTIONS[t]:e[t];if(this.scene.pan2Dxyzmm=[0,0,0,1],t&&this.volumes&&this.volumes.length>0)for(let e=0;e=this.opts.maxDrawUndoBitmaps&&(this.currentDrawUndoBitmap=0),this.drawUndoBitmaps[this.currentDrawUndoBitmap]=encodeRLE(this.drawBitmap))}drawClearAllUndoBitmaps(){if(this.currentDrawUndoBitmap=this.opts.maxDrawUndoBitmaps,this.drawUndoBitmaps&&!(this.drawUndoBitmaps.length<1))for(let e=this.drawUndoBitmaps.length-1;e>=0;e--)this.drawUndoBitmaps[e]=new Uint8Array}drawUndo(){this.drawUndoBitmaps.length<1?log.debug("undo bitmaps not loaded"):(this.currentDrawUndoBitmap--,this.currentDrawUndoBitmap<0&&(this.currentDrawUndoBitmap=this.drawUndoBitmaps.length-1),this.currentDrawUndoBitmap>=this.drawUndoBitmaps.length&&(this.currentDrawUndoBitmap=0),this.drawUndoBitmaps[this.currentDrawUndoBitmap].length<2?log.debug("drawUndo is misbehaving"):(this.drawBitmap=decodeRLE(this.drawUndoBitmaps[this.currentDrawUndoBitmap],this.drawBitmap.length),this.refreshDrawing(!0)))}loadDrawing(e){if(this.drawBitmap&&log.debug("Overwriting open drawing!"),!this.back)throw new Error("back undefined");this.drawClearAllUndoBitmaps();const t=e.hdr.dims;if(t[1]!==this.back.hdr.dims[1]||t[2]!==this.back.hdr.dims[2]||t[3]!==this.back.hdr.dims[3])return log.debug("drawing dimensions do not match background image"),!1;e.img.constructor!==Uint8Array&&log.debug("Drawings should be UINT8");const i=e.permRAS,r=t[1]*t[2]*t[3];this.drawBitmap=new Uint8Array(r),this.drawTexture=this.r8Tex(this.drawTexture,TEXTURE7_DRAW,this.back.dims,!0);const n=[0,0,0];for(let e=0;e<3;e++)for(let t=0;t<3;t++)Math.abs(i[e])-1===t&&(n[t]=e*Math.sign(i[e]));let a=1;const o=[1,1,1],s=[!1,!1,!1];for(let e=0;eArray(r).fill(0))),d=Array(r).fill(0).map((()=>Array(r).fill(0)));for(let e=1;e3)for(let e=0;e<253;e++)for(let t=e+1;t<254;t++)for(let i=t+1;i<255;i++){const r=h[0][e]+h[e+1][t]+h[t+1][i]+h[i+1][255];r>m&&(g[0]=e,g[1]=t,g[2]=i,m=r)}else if(3===e)for(let e=0;e<254;e++)for(let t=e+1;t<255;t++){const i=h[0][e]+h[e+1][t]+h[t+1][255];i>m&&(g[0]=e,g[1]=t,m=i)}else for(let e=0;e<255;e++){const t=h[0][e]+h[e+1][255];t>m&&(g[0]=e,m=t)}return[l(g[0]),l(g[1]),l(g[2])]}drawOtsu(e=2){if(0===this.volumes.length)return;const t=this.volumes[0].img.length,i=this.findOtsu(e);if(i.length<3)return;this.drawBitmap||this.createEmptyDrawing();const r=this.drawBitmap,n=this.volumes[0].img;for(let e=0;ei[0]&&(r[e]=1),t>i[1]&&(r[e]=2),t>i[2]&&(r[e]=3)}this.drawAddUndoBitmap(),this.refreshDrawing(!0)}removeHaze(e=5,t=0){const i=this.volumes[t].img,r=this.volumes[t].hdr,n=i.length;let a=2;(5===e||1===e)&&(a=4),(4===e||2===e)&&(a=3);const o=this.findOtsu(a);if(o.length<3)return;let s=o[0];1===e&&(s=o[2]),2===e&&(s=o[1]);const l=r.scl_inter,c=r.scl_slope,u=this.volumes[t].global_min;for(let e=0;e=this.meshes.length?-1:e;const t=this.meshes.length;for(let i=0;ithis.volumes.length)return;const i=this.getVolumeIndexByID(e.id);0===t?(this.volumes.splice(i,1),this.volumes.unshift(e),this.back=this.volumes[0],this.overlays=this.volumes.slice(1)):t<0?(this.volumes.splice(this.getVolumeIndexByID(e.id),1),this.back=this.volumes[0],this.volumes.length>1?this.overlays=this.volumes.slice(1):this.overlays=[]):(this.volumes.splice(i,1),this.volumes.splice(t,0,e),this.overlays=this.volumes.slice(1),this.back=this.volumes[0]),this.updateGLVolume()}setMesh(e,t=0){this.meshes.forEach((e=>{log.debug("MESH: ",e.name)}));if(t>this.meshes.length)return;const i=this.getMeshIndexByID(e.id);0===t?(this.meshes.splice(i,1),this.meshes.unshift(e)):t<0?this.meshes.splice(this.getMeshIndexByID(e.id),1):(this.meshes.splice(i,1),this.meshes.splice(t,0,e)),this.updateGLVolume(),this.meshes.forEach((e=>{log.debug(e.name)}))}removeVolume(e){if(this.setVolume(e,-1),this.mediaUrlMap.has(e)){const t=this.mediaUrlMap.get(e);this.onVolumeWithUrlRemoved(t),this.mediaUrlMap.delete(e)}this.drawScene()}removeVolumeByIndex(e){if(e>=this.volumes.length)throw new Error("Index of volume out of bounds");this.removeVolume(this.volumes[e])}removeMesh(e){if(e.unloadMesh(this.gl),this.setMesh(e,-1),this.mediaUrlMap.has(e)){const t=this.mediaUrlMap.get(e);this.onMeshWithUrlRemoved(t),this.mediaUrlMap.delete(e)}}removeMeshByUrl(e){const t=this.getMediaByUrl(e);t&&(this.removeMesh(t),this.mediaUrlMap.delete(t),this.onMeshWithUrlRemoved(e))}moveVolumeToBottom(e){this.setVolume(e,0)}moveVolumeUp(e){const t=this.getVolumeIndexByID(e.id);this.setVolume(e,t+1)}moveVolumeDown(e){const t=this.getVolumeIndexByID(e.id);this.setVolume(e,t-1)}moveVolumeToTop(e){this.setVolume(e,this.volumes.length-1)}mouseDown(e,t){e*=this.uiData.dpr,t*=this.uiData.dpr,this.mousePos=[e,t]}mouseMove(e,t){e*=this.uiData.dpr,t*=this.uiData.dpr;const i=(e-this.mousePos[0])/this.uiData.dpr,r=(t-this.mousePos[1])/this.uiData.dpr;this.mousePos=[e,t],!(this.inRenderTile(e,t)<0)&&(Math.abs(i)<1&&Math.abs(r)<1||(this.scene.renderAzimuth+=i,this.scene.renderElevation+=r,this.drawScene()))}sph2cartDeg(e,t){const i=-t*(Math.PI/180),r=(e-90)%360*(Math.PI/180),n=[Math.cos(i)*Math.cos(r),Math.cos(i)*Math.sin(r),Math.sin(i)],a=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);return a<=0||(n[0]/=a,n[1]/=a,n[2]/=a),n}setClipPlane(e){const t=this.sph2cartDeg(e[1]+180,e[2]);this.scene.clipPlane=[t[0],t[1],t[2],e[0]],this.scene.clipPlaneDepthAziElev=e,this.onClipPlaneChange(this.scene.clipPlane),this.drawScene()}setCrosshairColor(e){this.opts.crosshairColor=e,this.drawScene()}setCrosshairWidth(e){this.opts.crosshairWidth=e,this.crosshairs3D&&(this.crosshairs3D.mm[0]=NaN),this.drawScene()}setDrawColormap(e){this.drawLut=cmapper.makeDrawLut(e),this.updateGLVolume()}setDrawingEnabled(e){this.opts.drawingEnabled=e,this.opts.drawingEnabled&&(this.drawBitmap||this.createEmptyDrawing()),this.drawScene()}setPenValue(e,t=!1){this.opts.penValue=e,this.opts.isFilledPen=t,this.drawScene()}setDrawOpacity(e){this.drawOpacity=e,this.drawScene()}setSelectionBoxColor(e){this.opts.selectionBoxColor=e}sliceScroll2D(e,t,i,r=!0){if(this.opts.scrollRequiresFocus&&this.canvas!==document.activeElement)log.warn("Canvas element does not have focus. Scroll events will not be processed.");else{if(this.inGraphTile(t,i)){let t=this.volumes[0].frame4D;return e>0&&t++,e<0&&t--,void this.setFrame4D(this.volumes[0].id,t)}if(0!==e&&this.opts.dragMode===DRAG_MODE.pan&&-1===this.inRenderTile(this.uiData.dpr*t,this.uiData.dpr*i)){let t=this.scene.pan2Dxyzmm[3]*(1+10*e);t=Math.round(10*t)/10;const i=this.scene.pan2Dxyzmm[3]-t;this.opts.yoke3Dto2DZoom&&(this.scene.volScaleMultiplier=t),this.scene.pan2Dxyzmm[3]=t;const r=this.frac2mm(this.scene.crosshairPos);return this.scene.pan2Dxyzmm[0]+=i*r[0],this.scene.pan2Dxyzmm[1]+=i*r[1],this.scene.pan2Dxyzmm[2]+=i*r[2],this.drawScene(),this.canvas.focus(),void this.sync()}this.mouseClick(t,i,e,r)}}setSliceType(e){return this.opts.sliceType=e,this.drawScene(),this}setOpacity(e,t){this.volumes[e].opacity=t,0!==e?this.updateGLVolume():this.drawScene()}setScale(e){this.scene.volScaleMultiplier=e,this.drawScene()}setClipPlaneColor(e){this.opts.clipPlaneColor=e,this.renderShader.use(this.gl),this.gl.uniform4fv(this.renderShader.uniforms.clipPlaneColor,this.opts.clipPlaneColor),this.drawScene()}setClipPlaneThick(e){this.opts.clipThick=e,this.renderShader.use(this.gl),this.gl.uniform1f(this.renderShader.uniforms.clipThick,this.opts.clipThick),this.drawScene()}setClipVolume(e,t){this.opts.clipVolumeLow=[Math.min(e[0],t[0]),Math.min(e[1],t[1]),Math.min(e[2],t[2])],this.opts.clipVolumeHigh=[Math.max(e[0],t[0]),Math.max(e[1],t[1]),Math.max(e[2],t[2])],this.renderShader.use(this.gl),this.gl.uniform3fv(this.renderShader.uniforms.clipLo,this.opts.clipVolumeLow),this.gl.uniform3fv(this.renderShader.uniforms.clipHi,this.opts.clipVolumeHigh),this.pickingImageShader.use(this.gl),this.gl.uniform3fv(this.pickingImageShader.uniforms.clipLo,this.opts.clipVolumeLow),this.gl.uniform3fv(this.pickingImageShader.uniforms.clipHi,this.opts.clipVolumeHigh),this.drawScene()}async setVolumeRenderIllumination(e=0){this.renderShader=this.renderVolumeShader,e>0&&(this.renderShader=this.renderGradientShader),e<0&&(this.renderShader=this.renderSliceShader),this.initRenderShader(this.renderShader,e),this.renderShader.use(this.gl),this.setClipPlaneColor(this.opts.clipPlaneColor),this.gradientTextureAmount=e,this.refreshLayers(this.volumes[0],0),this.drawScene()}overlayRGBA(e){const t=e.hdr,i=t.dims[1]*t.dims[2]*t.dims[3],r=new Uint8ClampedArray(4*i),n=.2*Math.min(Math.min(t.dims[1],t.dims[2]),t.dims[3]),a=.5*t.dims[1],o=.5*t.dims[2],s=.5*t.dims[3];let l=0;for(let e=0;e0&&(this.back=this.volumes[0]);const r=e.encodedDrawingBlob;if(r){const t=e.imageOptionsArray[0],i=NVImage.loadFromBase64({base64:r,...t});i&&this.loadDrawing(i)}for(const t of e.meshDataObjects??[]){const e={gl:this.gl,...t};t.offsetPt0&&(e.rgba255[3]=0,e.tris=new Uint32Array(t.offsetPt0)),log.debug(e);const i=new NVMesh(e.pts,e.tris,e.name,e.rgba255,e.opacity,e.visible,this.gl,e.connectome,e.dpg,e.dps,e.dpv);t.offsetPt0&&(i.fiberGroupColormap=t.fiberGroupColormap,i.fiberColor=t.fiberColor,i.fiberDither=t.fiberDither,i.fiberRadius=t.fiberRadius,i.colormap=t.colormap),i.meshShaderIndex=e.meshShaderIndex,i.layers=e.layers,i.updateMesh(this.gl),log.debug(i),this.addMesh(i)}if(e.data.connectomes)for(const t of e.data.connectomes){const e=JSON.parse(t),i=this.loadConnectomeAsMesh(e);i.updateMesh(this.gl),this.addMesh(i)}return this.updateGLVolume(),this.drawScene(),this.onDocumentLoaded(e),this}async generateLoadDocumentJavaScript(e,t){const i=this.json();return`\n ${t}\n\n async function saveNiivueAsHtml(pageName) {\n //get new docstring\n const docString = nv1.json();\n const html =\n document.getElementsByTagName("html")[0]\n .innerHTML.replace(base64, await NVUtilities.compressToBase64String(JSON.stringify(docString)));\n NVUtilities.download(html, pageName, "application/html");\n }\n\n var nv1 = new Niivue();\n nv1.attachTo("${e}");\n var base64 = "${await NVUtilities.compressToBase64String(JSON.stringify(i))}";\n NVUtilities.decompressBase64String(base64).then((jsonText) => {\n var json = JSON.parse(jsonText); // string -> JSON\n var doc = NVDocument.loadFromJSON(json);\n nv1.loadDocument(doc);\n nv1.updateGLVolume();\n });\n\n `}async generateHTML(e="gl1",t){return`\n \n \n \n \n \n Save as HTML\n \n \n \n \n

\n Save the current scene as HTML\n \n
\n
\n \n
\n + +""" + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + + +def main(): + parser = argparse.ArgumentParser( + description=( + "Plot vial vs intensity (mean ± std) for 3D or 4D contrasts, " + "with optional ROI overlay.\n\n" + "Plot mode (ADC / FA / generic) is detected automatically from " + "the csv_file filename — no flags required." + ) + ) + # ---- positional -------------------------------------------------------- + parser.add_argument( + "csv_file", + help="CSV file containing mean values (vial, mean[, vol1, vol2...]).", + ) + parser.add_argument( + "plot_type", + choices=["line", "bar", "scatter"], + help="Type of plot to generate.", + ) + # ---- standard options -------------------------------------------------- + parser.add_argument( + "--std_csv", + help="Optional CSV file containing standard deviations (same shape as mean CSV).", + ) + parser.add_argument( + "--roi_image", + help="Optional PNG image (e.g. mrview screenshot with ROI overlay). PNG mode only.", + ) + parser.add_argument( + "--annotate", + action="store_true", + help="Annotate points with mean ± std values.", + ) + parser.add_argument( + "--output", + default="vial_subplot.png", + help="Filename for saving the plot (default: vial_subplot.png).", + ) + # ---- phantom options (used when ADC mode is auto-detected) ------------- + parser.add_argument( + "--phantom", + default=None, + help=( + "Phantom name (e.g. SPIRIT). Used to locate ADC reference data " + "and to label plot titles. Required when the csv_file name " + "contains 'ADC'." + ), + ) + parser.add_argument( + "--template_dir", + default=None, + help=( + "Path to the TemplateData directory. " + "ADC reference is read from //adc_reference.json. " + "Required when the csv_file name contains 'ADC'." + ), + ) + + args = parser.parse_args() + plot_vial_intensity( + csv_file=args.csv_file, + plot_type=args.plot_type, + std_csv=args.std_csv, + roi_image=args.roi_image, + annotate=args.annotate, + output=args.output, + phantom=args.phantom, + template_dir=args.template_dir, + ) + + +# --------------------------------------------------------------------------- +# Public API +# --------------------------------------------------------------------------- + + def plot_vial_intensity( csv_file: str, - plot_type: str, + plot_type: str = "scatter", std_csv: str | None = None, roi_image: str | None = None, annotate: bool = False, output: str = "vial_subplot.png", -) -> str: - """Plot vial vs intensity (mean ± std) for 3D or 4D contrasts, with optional ROI overlay. - - Args: - csv_file: CSV file containing mean values (vial, mean[, vol1, vol2...]). - plot_type: Type of plot to generate: 'line', 'bar', or 'scatter'. - std_csv: Optional CSV file containing standard deviations (same shape as mean). - roi_image: Optional PNG image (e.g. mrview screenshot with ROI overlay). - annotate: Annotate points with mean ± std values. - output: Filename for saving the plot. - - Returns: - Absolute path to the saved plot file. + phantom: str | None = None, + template_dir: str | None = None, + output_format: str = "html", + nifti_image: str | None = None, + vial_niftis: dict | None = None, +): + """Plot vial vs intensity. Mode (ADC/FA/generic) auto-detected from csv_file name. + + Can be called programmatically or via the CLI entry point (main()). + + Parameters + ---------- + csv_file : str + Path to mean values CSV. + plot_type : str + "scatter", "line", or "bar". + std_csv : str, optional + Path to standard deviations CSV (same shape as mean CSV). + roi_image : str, optional + Path to ROI overlay PNG. Used in PNG mode only. + annotate : bool + Annotate points (PNG mode only). + output : str + Output file path. Extension is replaced with .html when output_format="html". + phantom : str, optional + Phantom name for ADC reference lookup. + template_dir : str, optional + Directory containing per-phantom adc_reference.json files. + output_format : str + "html" (default) for interactive HTML, or "png" for static matplotlib figure. """ - sep = detect_separator(csv_file) - mean_df = pd.read_csv(csv_file, sep=sep) + + # ---- Auto-detect contrast mode from csv_file filename ------------------ + csv_stem = Path(csv_file).stem + if re.search(r"ADC", csv_stem, re.IGNORECASE): + contrast_mode = "adc" + elif re.search(r"(? 1 else "Mean (SD) ADC" + else: + color = cmap(vol_idx % 10) + fmt_line = "-o" + fmt_scatter = "o" + marker_kw = {} + vol_label = f"Vol {vol_idx}" if plot_type == "line": ax.errorbar( vials, means, yerr=stds, - fmt="-o", + fmt=fmt_line, capsize=5, color=color, - label=f"Vol {vol_idx}", + label=vol_label, + **marker_kw, ) elif plot_type == "bar": x = np.arange(len(vials)) + (vol_idx - n_vols / 2) * 0.1 ax.bar( - x, - means, - yerr=stds, - capsize=5, - color=color, - width=0.1, - label=f"Vol {vol_idx}", + x, means, yerr=stds, capsize=5, color=color, width=0.1, label=vol_label ) ax.set_xticks(np.arange(len(vials))) ax.set_xticklabels(vials) @@ -106,10 +717,11 @@ def plot_vial_intensity( vials, means, yerr=stds, - fmt="o", + fmt=fmt_scatter, capsize=5, color=color, - label=f"Vol {vol_idx}", + label=vol_label, + **marker_kw, ) if annotate: @@ -119,18 +731,65 @@ def plot_vial_intensity( ax.text( vial, mean + (max(means) * 0.02), - f"{mean:.1f}±{std:.1f}" if stds is not None else f"{mean:.1f}", + f"{mean:.3f}±{std:.3f}" if stds is not None else f"{mean:.3f}", ha="center", fontsize=8, color=color, ) - ax.set_xlabel("Vial") - ax.set_ylabel("Intensity") - ax.set_title("Vial vs Intensity (Mean ± Std)") + # ---- ADC reference overlay (drawn after measured values so crosshairs + # are visible even when they coincide with measured data) ----------- + if ref_data is not None: + overlay_adc_reference(ax, ref_data) + + # ---- Axis labels ------------------------------------------------------- + ax.set_xlabel("Vial", fontsize=12) + + if contrast_mode == "adc": + ax.set_ylabel("ADC ×10⁻³ mm²/s", fontsize=12) + ax.set_title( + f"{phantom_label}Measured vs Reference ADC", fontsize=13, fontweight="bold" + ) + # Plain numeric ticks (values are already in ×10⁻³) + ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda val, _: f"{val:.2f}")) + elif contrast_mode == "fa": + ax.set_ylabel("Fractional Anisotropy", fontsize=12) + ax.set_title( + f"{phantom_label}Fractional Anisotropy (Mean ± Std)", + fontsize=13, + fontweight="bold", + ) + ax.set_ylim(0, 1) + else: + ax.set_ylabel("Intensity", fontsize=12) + ax.set_title(f"{phantom_label}Vial vs Intensity (Mean ± Std)", fontsize=13) + ax.grid(True, linestyle="--", alpha=0.6) - ax.legend(title="Volumes") + # ---- Legend ------------------------------------------------------------ + if contrast_mode == "adc": + extra_handles = build_adc_legend(has_measured=True) + if n_vols > 1: + vol_handles = [ + plt.Line2D( + [0], + [0], + marker="o", + color="crimson", + linestyle="-" if plot_type == "line" else "None", + markersize=7, + label=f"Vol {i}", + alpha=0.4 + 0.6 * i / max(n_vols - 1, 1), + ) + for i in range(n_vols) + ] + ax.legend(handles=extra_handles + vol_handles, fontsize=10) + else: + ax.legend(handles=extra_handles, fontsize=10) + else: + ax.legend(title="Volumes", fontsize=10) + + # ---- ROI overlay subplot ----------------------------------------------- if roi_image: ax_img = axes[1] img = mpimg.imread(roi_image) @@ -141,30 +800,29 @@ def plot_vial_intensity( plt.tight_layout() output_file = os.path.abspath(output) plt.savefig(output_file, bbox_inches="tight", dpi=300) - logger.info("Plot saved to: %s", output_file) plt.close(fig) return output_file -@click.command() +@click.command("vial-intensity") @click.argument("csv_file") -@click.argument("plot_type", type=click.Choice(["line", "bar", "scatter"])) -@click.option( - "--std_csv", default=None, help="Optional CSV file containing standard deviations." -) -@click.option("--roi_image", default=None, help="Optional PNG image with ROI overlay.") -@click.option( - "--annotate", is_flag=True, help="Annotate points with mean ± std values." -) +@click.argument("plot_type", default="scatter") +@click.option("--std-csv", default=None) +@click.option("--roi-image", default=None, help="ROI overlay PNG (PNG mode only).") +@click.option("--annotate", is_flag=True, default=False) +@click.option("--output", default="vial_subplot.png") +@click.option("--phantom", default=None) +@click.option("--template-dir", default=None) @click.option( - "--output", - default="vial_subplot.png", + "--format", "output_format", + default="html", + type=click.Choice(["html", "png"]), show_default=True, - help="Filename for saving the plot.", + help="Output format: interactive HTML (default) or static PNG.", ) -def main(csv_file, plot_type, std_csv, roi_image, annotate, output): - """Plot vial vs intensity (mean ± std) for 3D or 4D contrasts, with optional ROI overlay.""" - logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") +def main(csv_file, plot_type, std_csv, roi_image, annotate, output, + phantom, template_dir, output_format): + """Plot vial vs intensity (mean ± std) for 3D or 4D contrasts.""" plot_vial_intensity( csv_file=csv_file, plot_type=plot_type, @@ -172,6 +830,9 @@ def main(csv_file, plot_type, std_csv, roi_image, annotate, output): roi_image=roi_image, annotate=annotate, output=output, + phantom=phantom, + template_dir=template_dir, + output_format=output_format, ) diff --git a/phantomkit/plotting/viewer.py b/phantomkit/plotting/viewer.py new file mode 100644 index 0000000..bc9ea1d --- /dev/null +++ b/phantomkit/plotting/viewer.py @@ -0,0 +1,281 @@ +""" +Interactive MRI viewer for phantomkit QA results. + +Serves a plain FastAPI/uvicorn HTTP server so NIfTI files can be fetched over +HTTP. The viewer page is a self-contained HTML/JS file — NiiVue initialises +directly with no framework overhead. + +Usage (CLI):: + + phantomkit view /path/to/contrast.nii.gz \\ + --vials /path/to/vials/ \\ + --title "T1 Inversion Recovery" + +Usage (Python):: + + from phantomkit.plotting.viewer import launch_viewer + launch_viewer( + nifti_image="/path/to/contrast.nii.gz", + vial_niftis={"vial_A": "/path/to/vials/vial_A.nii.gz", ...}, + title="T1 IR", + ) +""" + +from __future__ import annotations + +import json +import re +import threading +import webbrowser +from pathlib import Path + +# --------------------------------------------------------------------------- +# NiiVue asset constants +# --------------------------------------------------------------------------- + +_NIIVUE_CDN = ( + "https://cdn.jsdelivr.net/npm/@niivue/niivue@0.46.0/dist/niivue.umd.min.js" +) +_NIIVUE_BUNDLE = Path(__file__).parent / "niivue.umd.min.js" + +_COLORMAPS = [ + "red", "green", "blue", "yellow", "cyan", + "warm", "cool", "plasma", "hot", "winter", +] + + +def _niivue_script_tag() -> str: + """Inline the local NiiVue bundle if present, else fall back to CDN.""" + if _NIIVUE_BUNDLE.exists(): + src = _NIIVUE_BUNDLE.read_text(encoding="utf-8") + src = re.sub(r"(?i)", r"<\/script>", src) + return f"" + return f'' + + +# --------------------------------------------------------------------------- +# Plain HTML page builder +# --------------------------------------------------------------------------- + +def _build_viewer_html( + title: str, + volumes_js: str, + overlays: list[dict], + dark: bool, +) -> str: + """Return a self-contained HTML viewer page.""" + niivue_script = _niivue_script_tag() + + if dark: + bg, bg2 = "#1c1c1a", "#252523" + text, text2 = "#e8e8e4", "#888780" + border = "rgba(255,255,255,0.12)" + chip_bg, chip_border = "rgba(255,255,255,0.08)", "rgba(255,255,255,0.25)" + else: + bg, bg2 = "#ffffff", "#f4f4f2" + text, text2 = "#1a1a18", "#5f5e5a" + border = "rgba(0,0,0,0.12)" + chip_bg, chip_border = "rgba(0,0,0,0.05)", "rgba(0,0,0,0.2)" + + chips_html = "".join( + f'' + for i, ov in enumerate(overlays) + ) + + vial_section = ( + f'

' + f"Toggle vial ROIs

" + f'
{chips_html}
' + ) if overlays else "" + + # DRAG_MODE.pan == 2 in NiiVue 0.46.0 + return f""" + + + + +{title} +{niivue_script} + + + +

{title}

+
+

MRI Viewer

+ + {vial_section} +

Scroll to zoom · drag to pan · scroll wheel to change slice

+
+ + + +""" + + +# --------------------------------------------------------------------------- +# Public launcher +# --------------------------------------------------------------------------- + + +def launch_viewer( + nifti_image: str, + vial_niftis: dict[str, str] | None = None, + title: str = "MRI Viewer", + port: int = 8080, + dark: bool = True, +) -> None: + """Launch an interactive MRI viewer with per-vial ROI toggle. + + Uses FastAPI + uvicorn to serve NIfTI files over HTTP so that NiiVue can + fetch them. The viewer page is plain HTML/JS with no framework overhead. + + Parameters + ---------- + nifti_image : str + Path to the background ``.nii`` or ``.nii.gz`` file. + vial_niftis : dict, optional + ``{vial_name: path}`` mapping for ROI overlay NIfTI files. + title : str + Browser tab / page title. + port : int + TCP port for the server (default 8080). + dark : bool + Dark colour scheme (default True). + """ + import uvicorn + from fastapi import FastAPI + from fastapi.responses import HTMLResponse, RedirectResponse + from fastapi.staticfiles import StaticFiles + + vial_niftis = vial_niftis or {} + nifti_path = Path(nifti_image).resolve() + + # Resolve the actual file when the caller omits the NIfTI extension. + if not nifti_path.exists(): + for _ext in (".nii.gz", ".nii"): + _candidate = Path(str(nifti_path) + _ext) + if _candidate.exists(): + nifti_path = _candidate + break + else: + raise FileNotFoundError(f"NIfTI file not found: {nifti_image}") + + app = FastAPI() + + # ------------------------------------------------------------------ + # Mount static directories so NiiVue can fetch NIfTIs over HTTP. + # ------------------------------------------------------------------ + app.mount("/niftis", StaticFiles(directory=str(nifti_path.parent)), name="niftis") + bg_url = f"/niftis/{nifti_path.name}" + + _vial_dir_route: dict[str, str] = {} + for vpath in vial_niftis.values(): + if vpath and Path(vpath).exists(): + d = str(Path(vpath).resolve().parent) + if d not in _vial_dir_route: + route = f"/vials{len(_vial_dir_route)}" + app.mount(route, StaticFiles(directory=d), name=f"vials{len(_vial_dir_route)}") + _vial_dir_route[d] = route + + overlays: list[dict] = [] + for i, (name, vpath) in enumerate(sorted(vial_niftis.items())): + if not vpath or not Path(vpath).exists(): + continue + d = str(Path(vpath).resolve().parent) + url = f"{_vial_dir_route[d]}/{Path(vpath).name}" + overlays.append({ + "name": name, + "url": url, + "colormap": _COLORMAPS[i % len(_COLORMAPS)], + }) + + volumes_js = json.dumps( + [{"url": bg_url, "colormap": "gray"}] + + [ + { + "url": o["url"], + "colormap": o["colormap"], + "opacity": 0.5, + } + for o in overlays + ] + ) + + html = _build_viewer_html(title, volumes_js, overlays, dark) + + @app.get("/viewer") + async def _viewer_page() -> HTMLResponse: + return HTMLResponse(content=html) + + @app.get("/") + async def _root() -> RedirectResponse: + return RedirectResponse(url="/viewer") + + viewer_url = f"http://127.0.0.1:{port}/viewer" + threading.Timer(1.5, lambda: webbrowser.open(viewer_url)).start() + + uvicorn.run(app, host="127.0.0.1", port=port, log_level="warning") diff --git a/phantomkit/plotting/visualization.py b/phantomkit/plotting/visualization.py index 2dba83f..7684ca0 100644 --- a/phantomkit/plotting/visualization.py +++ b/phantomkit/plotting/visualization.py @@ -120,6 +120,14 @@ class MrView(shell.Task["MrView.Outputs"]): argstr="-capture.prefix", help="Filename prefix for the screenshot.", ) + intensity_range: str | None = shell.arg( + default=None, + argstr="-intensity_range", + help=( + "Display intensity range as 'min,max'. " + "Use '0,1' for FA maps and '0,0.005' for ADC maps." + ), + ) capture_grab: bool = shell.arg( default=True, argstr="-capture.grab", @@ -187,13 +195,24 @@ def GeneratePlots( metrics_dir: Path, vial_dir: Path, session_name: str, + output_format: str = "html", + phantom_name: str | None = None, ) -> None: """ Generate per-contrast vial intensity scatter plots and parametric map plots (IR/TE) using the plotting API functions directly as pydra tasks. - Vial mask overlays are built using MrGrid + MrCat + MrMath pydra tasks. - Screenshots use mrview via MrView. + In HTML mode (default): NIfTI paths are passed directly to the plotting + functions for NiiVue embedding; mrview screenshots are skipped. + + In PNG mode: Vial mask overlays are built using MrGrid + MrCat + MrMath + pydra tasks and mrview captures screenshots as before. + + Parameters + ---------- + output_format : str + "html" (default) — interactive HTML output, no mrview required. + "png" — static matplotlib PNG, mrview used for ROI overlay. """ import re as _re from pathlib import Path as _Path @@ -206,112 +225,212 @@ def GeneratePlots( ) metrics_path = _Path(metrics_dir) + xlsx_dir = metrics_path / "xlsx" + plots_dir = metrics_path / "plots" + fits_dir = metrics_path / "fits" + plots_dir.mkdir(parents=True, exist_ok=True) + fits_dir.mkdir(parents=True, exist_ok=True) vial_path = _Path(vial_dir) tmp_vial_dir = vial_path / "tmp" vial_masks_list = sorted(vial_path.glob("*.nii.gz")) # triggers runtime fallback + def _classify_contrast(stem: str) -> str | None: + """Detect ADC / FA contrast types from filename stem.""" + import re as _re2 + if _re2.search(r"ADC", stem, _re2.IGNORECASE): + return "adc" + if _re2.search(r"(? str | None: + if contrast_type == "fa": + return "0,1" + if contrast_type == "adc": + return "0,0.005" + return None + + # Resolve template_dir (parent of phantom-specific dir) from metrics_dir. + # metrics_dir is //metrics/ — template_data/ is + # resolved from the installed package location. + import importlib.util as _ilu + _pkg_spec = _ilu.find_spec("phantomkit") + _pkg_dir = _Path(_pkg_spec.origin).parent if _pkg_spec else _Path(metrics_dir) + _template_data_root = None + for _candidate in [_pkg_dir.parent / "template_data", + _pkg_dir / "template_data"]: + if _candidate.is_dir(): + _template_data_root = str(_candidate) + break + # Per-contrast scatter plots for contrast_file in contrast_files: contrast_path = _Path(contrast_file) contrast_name = contrast_path.stem - mean_csv = str(metrics_path / f"{session_name}_{contrast_name}_mean_matrix.csv") - std_csv = str(metrics_path / f"{session_name}_{contrast_name}_std_matrix.csv") - if not _Path(mean_csv).exists(): + clean_contrast_name = contrast_name.replace(".nii", "").replace(".gz", "") + xlsx_file = str(xlsx_dir / f"{clean_contrast_name}.xlsx") + if not _Path(xlsx_file).exists(): continue - output_plot = str( - metrics_path / f"{session_name}_{contrast_name}_PLOTmeanstd.png" - ) - - roi_image: File | None = None - if vial_masks_list: - overlay = workflow.add( - BuildRoiOverlay( - vial_masks=vial_masks_list, - reference_image=contrast_file, - prefix=contrast_name, - tmp_dir=tmp_vial_dir, + # Output filename: .html or .png depending on format + _ext = ".html" if output_format == "html" else ".png" + output_plot = str(plots_dir / f"{contrast_name}{_ext}") + + contrast_type = _classify_contrast(contrast_path.stem) + intensity_range_str = _intensity_range_for(contrast_type) + + if output_format == "html": + _vial_niftis_scatter = { + p.name.replace(".nii.gz", "").replace(".nii", ""): str(p) + for p in vial_masks_list + } + workflow.add( + python.define(plot_vial_intensity)( + csv_file=xlsx_file, + plot_type="scatter", + roi_image=None, + output=output_plot, + phantom=None, + template_dir=_template_data_root, + output_format="html", + nifti_image=str(contrast_path), + vial_niftis=_vial_niftis_scatter, ), - name=f"overlay_{contrast_name}", + name=f"scatter_{contrast_name}", ) - screenshot = workflow.add( - MrView( - image=contrast_file, - roi_load=overlay.out, - roi_colour="1,0,0", - roi_opacity=1.0, - comments=0, - noannotations=True, - fullscreen=True, - capture_folder=tmp_vial_dir, - capture_prefix=f"{contrast_name}_roi_overlay", + else: + # PNG mode: build ROI overlay and capture mrview screenshot + roi_image: File | None = None + if vial_masks_list: + overlay = workflow.add( + BuildRoiOverlay( + vial_masks=vial_masks_list, + reference_image=contrast_file, + prefix=contrast_name, + tmp_dir=tmp_vial_dir, + ), + name=f"overlay_{contrast_name}", + ) + screenshot = workflow.add( + MrView( + image=contrast_file, + roi_load=overlay.out, + roi_colour="1,0,0", + roi_opacity=1.0, + comments=0, + noannotations=True, + fullscreen=True, + intensity_range=intensity_range_str, + capture_folder=tmp_vial_dir, + capture_prefix=f"{contrast_name}_roi_overlay", + ), + name=f"screenshot_{contrast_name}", + ) + roi_image = screenshot.out_png + + workflow.add( + python.define(plot_vial_intensity)( + csv_file=xlsx_file, + plot_type="scatter", + roi_image=roi_image, + output=output_plot, + phantom=None, + template_dir=_template_data_root, + output_format="png", ), - name=f"screenshot_{contrast_name}", + name=f"scatter_{contrast_name}", ) - roi_image = screenshot.out_png - - workflow.add( - python.define(plot_vial_intensity)( - csv_file=mean_csv, - plot_type="scatter", - std_csv=std_csv, - roi_image=roi_image, - output=output_plot, - ), - name=f"scatter_{contrast_name}", - ) # Parametric map plots (IR and TE) def _matches(stem: str, token: str) -> bool: - return bool(_re.search(rf"(? str | None: + for f in contrast_files: + if _re.search(r"t1|mprage", _Path(f).stem, _re.IGNORECASE): + return str(f) + return None + + _t1_bg = _find_t1_bg() + + for contrast_type, plot_fn in [ + ("ir", plot_ir), + ("te", plot_te), ]: matching = [f for f in contrast_files if _matches(_Path(f).stem, contrast_type)] if not matching: continue - output_plot = str(metrics_path / f"{session_name}_{suffix}") - - roi_image_arg: File | None = None - if vial_masks_list: - overlay = workflow.add( - BuildRoiOverlay( - vial_masks=vial_masks_list, - reference_image=matching[0], - prefix=contrast_type, - tmp_dir=tmp_vial_dir, + _ext = ".html" if output_format == "html" else ".png" + _plot_name, _fits_name = _mapping_names[contrast_type] + output_plot = str(plots_dir / f"{_plot_name}{_ext}") + _fits_output = str(fits_dir / f"{_fits_name}.csv") + + if output_format == "html": + _vial_niftis = { + p.name.replace(".nii.gz", "").replace(".nii", ""): str(p) + for p in vial_masks_list + } + workflow.add( + python.define(plot_fn)( + contrast_files=matching, + metric_dir=str(xlsx_dir), + output_file=output_plot, + roi_image=None, + output_format="html", + fits_output=_fits_output, + nifti_image=_t1_bg or str(matching[0]), + vial_niftis=_vial_niftis, + phantom=phantom_name, ), - name=f"overlay_{contrast_type}", + name=f"map_plot_{contrast_type}", ) - screenshot = workflow.add( - MrView( - image=matching[0], - roi_load=overlay.out, - roi_colour="1,0,0", - roi_opacity=1.0, - comments=0, - noannotations=True, - fullscreen=True, - capture_folder=tmp_vial_dir, - capture_prefix=f"roi_overlay_{contrast_type}", + else: + roi_image_arg: File | None = None + if vial_masks_list: + overlay = workflow.add( + BuildRoiOverlay( + vial_masks=vial_masks_list, + reference_image=matching[0], + prefix=contrast_type, + tmp_dir=tmp_vial_dir, + ), + name=f"overlay_{contrast_type}", + ) + screenshot = workflow.add( + MrView( + image=matching[0], + roi_load=overlay.out, + roi_colour="1,0,0", + roi_opacity=1.0, + comments=0, + noannotations=True, + fullscreen=True, + capture_folder=tmp_vial_dir, + capture_prefix=f"roi_overlay_{contrast_type}", + ), + name=f"screenshot_{contrast_type}", + ) + roi_image_arg = screenshot.out_png + + workflow.add( + python.define(plot_fn)( + contrast_files=matching, + metric_dir=str(xlsx_dir), + output_file=output_plot, + roi_image=roi_image_arg, + output_format="png", + fits_output=_fits_output, ), - name=f"screenshot_{contrast_type}", + name=f"map_plot_{contrast_type}", ) - roi_image_arg = screenshot.out_png - - workflow.add( - python.define(plot_fn)( - contrast_files=matching, - metric_dir=metrics_dir, - output_file=output_plot, - roi_image=roi_image_arg, - ), - name=f"map_plot_{contrast_type}", - ) @python.define diff --git a/phantomkit/registration.py b/phantomkit/registration.py index abfa31c..04ff7e1 100644 --- a/phantomkit/registration.py +++ b/phantomkit/registration.py @@ -1,18 +1,16 @@ """ Pydra tasks and workflows for phantom template registration. -Registers a phantom MRI scan to a reference template using ANTs SyN, -with an iterative orientation search over a rotation library. +Registers a phantom MRI scan to a reference template using ANTs rigid SyN. """ import logging -import re from pathlib import Path from fileformats.generic import File from fileformats.medimage import NiftiGz from pydra.compose import python, shell, workflow -from pydra.tasks.mrtrix3.v3_1 import MrConvert, MrGrid, MrStats, MrTransform +from pydra.tasks.mrtrix3.v3_1 import MrConvert logger = logging.getLogger(__name__) @@ -80,36 +78,6 @@ class Outputs(shell.Outputs): ) -# ============================================================================ -# Internal helpers (used inside workflow functions) -# ============================================================================ - - -def _load_rotations(rotation_library_file: File) -> list[str]: - """Load rotation matrix strings from a rotation library file.""" - rotations = [] - with open(rotation_library_file, "r") as f: - for line in f: - line = line.strip() - if not line or line.startswith("#"): - continue - match = re.search(r'"([^"]+)"', line) - if match: - rotations.append(match.group(1)) - return rotations - - -def _create_rotation_matrix_file(rotation_str: str, output_file: Path) -> Path: - """Write a 9-element rotation string as a 4×4 affine matrix text file.""" - v = rotation_str.split() - with open(output_file, "w") as f: - f.write(f"{v[0]} {v[1]} {v[2]} 0\n") - f.write(f"{v[3]} {v[4]} {v[5]} 0\n") - f.write(f"{v[6]} {v[7]} {v[8]} 0\n") - f.write("0 0 0 1\n") - return output_file - - # ============================================================================ # Python Tasks # ============================================================================ @@ -121,331 +89,56 @@ def ParseMrStatsStdout(stdout: str) -> list[float]: return [float(x) for x in stdout.strip().split()] -@python.define(outputs=["vial_name", "regridded_path", "vial_mask_out"]) -def PrepVialCheckPaths(vial_mask: NiftiGz, tmp_dir: Path) -> tuple[str, Path, NiftiGz]: - """Derive vial name and regridded-mask output path; pass vial_mask through.""" - from pathlib import Path as _Path - - vial_name = ( - _Path(vial_mask) - .name.replace(".nii.gz", "") - .replace(".nii", "") - .replace("Vial", "") - .replace("vial", "") - .strip() - ) - tmp = _Path(tmp_dir) / "check_reg" - tmp.mkdir(parents=True, exist_ok=True) - return vial_name, tmp / f"{vial_name}_regridded.nii.gz", vial_mask - - -@python.define(outputs=["is_valid"]) -def AggregateVialCheck( - vial_names: list[str], - means_stds: list[list[float]], -) -> bool: - """ - Given per-vial [mean, std] pairs, check intensity-ranking criteria: - - No vial std > 50 - - High-intensity vials A, O, Q are in top-5 by mean - - Low-intensity vials S, D, P are in bottom-5 by mean - """ - vial_means = {name: vals[0] for name, vals in zip(vial_names, means_stds)} - high_std = [(n, vals[1]) for n, vals in zip(vial_names, means_stds) if vals[1] > 50] - failures: list[str] = [] - - if high_std: - failures.append( - f"High std in {len(high_std)} vial(s): " - + ", ".join(f"{n}={v:.1f}" for n, v in high_std) - ) - - sorted_vials = sorted(vial_means.items(), key=lambda x: x[1], reverse=True) - top5 = [v[0] for v in sorted_vials[:5]] - bottom5 = [v[0] for v in sorted_vials[-5:]] - - for v in ["A", "O", "Q"]: - if v not in top5: - failures.append(f"Required high-intensity vial {v!r} not in top 5") - for v in ["S", "D", "P"]: - if v not in bottom5: - failures.append(f"Required low-intensity vial {v!r} not in bottom 5") - - if failures: - logger.warning("Registration check FAILED:") - for msg in failures: - logger.warning(" %s", msg) - return False - - logger.info("Registration check passed (top5=%s, bottom5=%s)", top5, bottom5) - return True - - # ============================================================================ # Registration Workflows # ============================================================================ -@workflow.define -def CheckRegistration( - warped_image: NiftiGz, - vial_masks: list[NiftiGz], - tmp_dir: Path, -) -> bool: - """ - Check whether a registration is correctly oriented. - - Split over each vial mask: - 1. **PrepVialCheckPaths** derives the output path. - 2. **MrGrid** regrids the vial mask to the warped image grid. - 3. **MrStats** + **ParseMrStatsStdout** compute mean and std. - - A combined **AggregateVialCheck** python task verifies intensity ranking - across all vials. - """ - prep = workflow.add( - PrepVialCheckPaths(vial_mask=vial_masks, tmp_dir=tmp_dir).split("vial_mask"), - name="prep", - ) - - regrid = workflow.add( - MrGrid( - in_file=prep.vial_mask_out, - operation="regrid", - template=warped_image, - out_file=prep.regridded_path, - interp="nearest", - quiet=True, - force=True, - ), - name="regrid", - ) - - stats = workflow.add( - MrStats( - image_=warped_image, - mask=regrid.out_file, - output=["mean", "std"], - quiet=True, - ), - name="stats", - ) - - parse = workflow.add( - ParseMrStatsStdout(stdout=stats.stdout), - name="parse", - ) - - agg = workflow.add( - AggregateVialCheck( - vial_names=prep.vial_name, - means_stds=parse.out, - ).combine("prep"), - name="aggregate", - ) - - return agg.is_valid - - -@workflow.define( - outputs=[ - "warped", - "transform", - "inverse_warped", - "iteration", - "rotated_input", - "rotation_matrix_file", - ] -) -def _RegistrationStep( - image_to_register: NiftiGz, - original_image: NiftiGz, - applied_rotation: File | None, +@workflow.define(outputs=["warped", "transform", "inverse_warped"]) +def RegisterToTemplate( + input_image: NiftiGz, template_phantom: NiftiGz, - rotations: list[str], - vial_masks: list[NiftiGz], session_name: str, tmp_dir: Path, - iteration: int, -) -> tuple[NiftiGz, File, NiftiGz, int, NiftiGz, File | None]: +) -> tuple[NiftiGz, File, NiftiGz]: """ - Single step of the iterative registration loop. + Register the input image to the template phantom using ANTs rigid SyN. - Runs **RegistrationSynN** then **CheckRegistration**. If the check - passes the results are returned directly. If it fails and rotations - remain, the next rotation is applied to *original_image* and this - workflow calls itself recursively with ``iteration + 1``. + A single **RegistrationSynN** call produces the warped image and affine + transform matrix. """ from pathlib import Path as _Path tmp = _Path(tmp_dir) tmp.mkdir(parents=True, exist_ok=True) - logger.info("=== Iteration %d ===", iteration) reg = workflow.add( RegistrationSynN( fixed_image=template_phantom, - moving_image=image_to_register, - output_prefix=tmp / f"{session_name}_Transformed{iteration}_", + moving_image=input_image, + output_prefix=tmp / f"{session_name}_Transformed_", transform_type="r", num_threads=8, use_histogram_matching=1, ), name="reg", ) - - check = workflow.add( - CheckRegistration( - warped_image=reg.warped_image, - vial_masks=vial_masks, - tmp_dir=tmp / "check", - ), - name="check", - ) - - if check.out: - logger.info("Correct orientation found at iteration %d", iteration) - return ( - reg.warped_image, - reg.out_matrix, - reg.inverse_warped_image, - iteration, - image_to_register, - applied_rotation, - ) - elif iteration < len(rotations): - logger.warning("Registration check failed, applying rotation %d", iteration) - next_rotation_file = tmp / f"rotation_{iteration + 1}.txt" - _create_rotation_matrix_file(rotations[iteration], next_rotation_file) - - rot = workflow.add( - MrTransform( - in_file=original_image, - linear=next_rotation_file, - out_file=tmp / f"{session_name}_iteration{iteration + 1}.nii.gz", - interp="nearest", - force=True, - ), - name="rotate", - ) - - next_step = workflow.add( - _RegistrationStep( - image_to_register=rot.out_file, - original_image=original_image, - applied_rotation=next_rotation_file, - template_phantom=template_phantom, - rotations=rotations, - vial_masks=vial_masks, - session_name=session_name, - tmp_dir=tmp.parent / f"step_{iteration + 1}", - iteration=iteration + 1, - ), - name="next_step", - ) - return ( - next_step.warped, - next_step.transform, - next_step.inverse_warped, - next_step.iteration, - next_step.rotated_input, - next_step.rotation_matrix_file, - ) - else: - raise RuntimeError( - f"Failed to find correct orientation after {iteration} attempts" - ) - - -@workflow.define( - outputs=[ - "warped", - "transform", - "inverse_warped", - "iteration", - "rotated_input", - "rotation_matrix_file", - ] -) -def IterativeRegistration( - input_image: NiftiGz, - template_phantom: NiftiGz, - rotation_library_file: File, - vial_masks: list[NiftiGz], - session_name: str, - tmp_dir: Path, -) -> tuple[NiftiGz, File, NiftiGz, int, NiftiGz, File | None]: - """ - Iteratively register the input image to the template phantom. - - Loads the rotation library (triggering pydra's runtime fallback), then - delegates to **_RegistrationStep** which recurses until the orientation - check passes or all rotations are exhausted. - """ - from pathlib import Path as _Path - - tmp = _Path(tmp_dir) - tmp.mkdir(parents=True, exist_ok=True) - - rotations = _load_rotations(rotation_library_file) - - step = workflow.add( - _RegistrationStep( - image_to_register=input_image, - original_image=input_image, - applied_rotation=None, - template_phantom=template_phantom, - rotations=rotations, - vial_masks=vial_masks, - session_name=session_name, - tmp_dir=tmp / "step_1", - iteration=1, - ), - name="step", - ) - return ( - step.warped, - step.transform, - step.inverse_warped, - step.iteration, - step.rotated_input, - step.rotation_matrix_file, - ) + return reg.warped_image, reg.out_matrix, reg.inverse_warped_image @workflow.define def SaveTemplateInScannerSpace( inverse_warped: NiftiGz, - rotation_matrix_file: File | None, - iteration: int, output_path: Path, ) -> NiftiGz: - """ - Save the template phantom warped into scanner (subject) space. - - Uses **MrConvert** (iteration == 1, no rotation) or **MrTransform** with - the inverse rotation (iteration > 1). - """ - if iteration == 1: - node = workflow.add( - MrConvert( - in_file=inverse_warped, - out_file=output_path, - quiet=True, - force=True, - ), - name="convert", - ) - else: - node = workflow.add( - MrTransform( - in_file=inverse_warped, - linear=rotation_matrix_file, - out_file=output_path, - interp="nearest", - inverse=True, - force=True, - ), - name="transform", - ) + """Save the template phantom warped into scanner (subject) space.""" + node = workflow.add( + MrConvert( + in_file=inverse_warped, + out_file=output_path, + quiet=True, + force=True, + ), + name="convert", + ) return node.out_file diff --git a/phantomkit/tests/test_cli.py b/phantomkit/tests/test_cli.py index ec48569..05ccac7 100644 --- a/phantomkit/tests/test_cli.py +++ b/phantomkit/tests/test_cli.py @@ -58,9 +58,8 @@ def test_run_vial_signal_help(runner) -> None: result = runner.invoke(main, ["run", "vial-signal", "--help"]) assert result.exit_code == 0 assert "--template-dir" in result.output - assert "--rotation-library-file" in result.output assert "--output-base-dir" in result.output - assert "--plugin" in result.output + assert "--worker" in result.output assert "--pattern" in result.output @@ -78,8 +77,6 @@ def test_run_vial_signal_single(runner, tmp_path) -> None: image = NiftiGz.sample(dest_dir=tmp_path, stem="t1") template_dir = tmp_path / "template" template_dir.mkdir() - rot_lib = tmp_path / "rotations.txt" - rot_lib.touch() mock_submitter = MagicMock() mock_submitter.__enter__ = MagicMock(return_value=mock_submitter) @@ -96,17 +93,15 @@ def test_run_vial_signal_single(runner, tmp_path) -> None: str(image), "--template-dir", str(template_dir), - "--rotation-library-file", - str(rot_lib), "--output-base-dir", str(tmp_path / "output"), - "--plugin", + "--worker", "serial", ], ) assert result.exit_code == 0, result.output - mock_sub.assert_called_once_with(plugin="serial") + mock_sub.assert_called_once_with(worker="serial") mock_submitter.assert_called_once() # sub(wf) @@ -122,8 +117,6 @@ def test_run_vial_signal_batch_from_dir(runner, tmp_path) -> None: template_dir = tmp_path / "template" template_dir.mkdir() - rot_lib = tmp_path / "rotations.txt" - rot_lib.touch() mock_submitter = MagicMock() mock_submitter.__enter__ = MagicMock(return_value=mock_submitter) @@ -138,11 +131,9 @@ def test_run_vial_signal_batch_from_dir(runner, tmp_path) -> None: str(tmp_path), "--template-dir", str(template_dir), - "--rotation-library-file", - str(rot_lib), "--output-base-dir", str(tmp_path / "output"), - "--plugin", + "--worker", "serial", "--pattern", "*.nii.gz", @@ -150,15 +141,13 @@ def test_run_vial_signal_batch_from_dir(runner, tmp_path) -> None: ) assert result.exit_code == 0, result.output - mock_sub.assert_called_once_with(plugin="serial") + mock_sub.assert_called_once_with(worker="serial") mock_submitter.assert_called_once() # sub(wf) def test_run_batch_no_matching_files(runner, tmp_path) -> None: template_dir = tmp_path / "template" template_dir.mkdir() - rot_lib = tmp_path / "rotations.txt" - rot_lib.touch() result = runner.invoke( main, @@ -168,8 +157,6 @@ def test_run_batch_no_matching_files(runner, tmp_path) -> None: str(tmp_path), "--template-dir", str(template_dir), - "--rotation-library-file", - str(rot_lib), "--pattern", "*.nii.gz", ], @@ -202,11 +189,11 @@ def test_plot_maps_ir_help(runner) -> None: result = runner.invoke(main, ["plot", "maps-ir", "--help"]) assert result.exit_code == 0 assert "CONTRAST_FILES" in result.output - assert "--metric_dir" in result.output + assert "--metric-dir" in result.output def test_plot_maps_te_help(runner) -> None: result = runner.invoke(main, ["plot", "maps-te", "--help"]) assert result.exit_code == 0 assert "CONTRAST_FILES" in result.output - assert "--metric_dir" in result.output + assert "--metric-dir" in result.output diff --git a/phantomkit/tests/test_metrics.py b/phantomkit/tests/test_metrics.py index 6302f35..b7b6b82 100644 --- a/phantomkit/tests/test_metrics.py +++ b/phantomkit/tests/test_metrics.py @@ -75,8 +75,6 @@ def test_transform_vials_to_subject_space_builds(tmp_path: Path) -> None: vial_masks=[vial], reference_image=ref, transform_matrix=affine, - rotation_matrix_file=None, - iteration=1, output_vial_dir=tmp_path / "vials", ) assert wf is not None @@ -99,8 +97,6 @@ def test_transform_contrasts_to_template_space_builds_empty(tmp_path: Path) -> N wf = TransformContrastsToTemplateSpace( contrast_files=[], transform_matrix=affine, - rotation_matrix_file=None, - iteration=1, template_phantom=template, tmp_dir=tmp_path / "tmp", output_dir=tmp_path / "output", diff --git a/phantomkit/tests/test_registration.py b/phantomkit/tests/test_registration.py index 070de32..4278d48 100644 --- a/phantomkit/tests/test_registration.py +++ b/phantomkit/tests/test_registration.py @@ -1,17 +1,9 @@ """Unit tests for phantomkit.registration.""" -from pathlib import Path +from phantomkit.registration import ParseMrStatsStdout import pytest -from fileformats.medimage import NiftiGz -from phantomkit.registration import ( - AggregateVialCheck, - ParseMrStatsStdout, - PrepVialCheckPaths, - _create_rotation_matrix_file, - _load_rotations, -) # ── ParseMrStatsStdout ──────────────────────────────────────────────────────── @@ -24,81 +16,3 @@ def test_parse_mrstats_stdout_multiple_values() -> None: def test_parse_mrstats_stdout_single_value() -> None: out = ParseMrStatsStdout(stdout="42.0")() assert out.out == pytest.approx([42.0]) - - -# ── AggregateVialCheck ──────────────────────────────────────────────────────── - -# 10 vials: A, O, Q in top-3; S, D, P in bottom-3 — should pass -_PASSING_NAMES = ["A", "O", "Q", "B", "C", "D", "P", "S", "E", "F"] -_PASSING_STATS = [ - [10.0, 1.0], - [9.0, 1.0], - [8.0, 1.0], - [7.0, 1.0], - [6.0, 1.0], - [5.0, 1.0], - [4.0, 1.0], - [3.0, 1.0], - [2.0, 1.0], - [1.0, 1.0], -] - - -def test_aggregate_vial_check_passes() -> None: - out = AggregateVialCheck(vial_names=_PASSING_NAMES, means_stds=_PASSING_STATS)() - assert out.is_valid is True - - -def test_aggregate_vial_check_fails_high_std() -> None: - stats = [list(s) for s in _PASSING_STATS] - stats[0][1] = 100.0 # vial A has std > 50 - out = AggregateVialCheck(vial_names=_PASSING_NAMES, means_stds=stats)() - assert out.is_valid is False - - -def test_aggregate_vial_check_fails_ranking() -> None: - # Put A at the bottom — should fail because A must be in top-5 - names = ["F", "E", "B", "C", "G", "D", "P", "S", "O", "A"] - stats = [[float(10 - i), 1.0] for i in range(10)] - out = AggregateVialCheck(vial_names=names, means_stds=stats)() - assert out.is_valid is False - - -# ── _load_rotations ─────────────────────────────────────────────────────────── - - -def test_load_rotations(tmp_path: Path) -> None: - lib = tmp_path / "rotations.txt" - lib.write_text( - "# comment\n" 'rotation "1 0 0 0 1 0 0 0 1"\n' 'rotation "0 1 0 -1 0 0 0 0 1"\n' - ) - rotations = _load_rotations(str(lib)) - assert rotations == ["1 0 0 0 1 0 0 0 1", "0 1 0 -1 0 0 0 0 1"] - - -def test_load_rotations_skips_blank_lines(tmp_path: Path) -> None: - lib = tmp_path / "rotations.txt" - lib.write_text('\nrotation "1 0 0 0 1 0 0 0 1"\n\n') - assert len(_load_rotations(str(lib))) == 1 - - -# ── _create_rotation_matrix_file ───────────────────────────────────────────── - - -def test_create_rotation_matrix_file(tmp_path: Path) -> None: - out_file = tmp_path / "rot.txt" - result = _create_rotation_matrix_file("1 0 0 0 1 0 0 0 1", out_file) - assert result == out_file - lines = out_file.read_text().splitlines() - assert lines == ["1 0 0 0", "0 1 0 0", "0 0 1 0", "0 0 0 1"] - - -# ── PrepVialCheckPaths ──────────────────────────────────────────────────────── - - -def test_prep_vial_check_paths(tmp_path: Path) -> None: - mask = NiftiGz.sample(dest_dir=tmp_path, stem="VialA") - out = PrepVialCheckPaths(vial_mask=mask, tmp_dir=tmp_path)() - assert out.vial_name == "A" - assert out.vial_mask_out.fspath == mask.fspath - assert str(out.regridded_path).endswith("A_regridded.nii.gz") diff --git a/pyproject.toml b/pyproject.toml index f5737f9..0a60706 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,8 +21,11 @@ dependencies = [ "pydra-tasks-ants", "pydra-tasks-fsl", "pydra-tasks-mrtrix3", + "openpyxl >=3.0", "scipy >=1.10.0", "typing_extensions >=4.6.3; python_version < '4.0'", + "fastapi >=0.100", + "uvicorn[standard] >=0.23", ] authors = [ @@ -89,6 +92,7 @@ repository = "https://github.com/Australian-Imaging-Service/phantomkit" [tool.hatch.version] source = "vcs" +fallback-version = "0.0.0" [tool.hatch.build.hooks.vcs] version-file = "phantomkit/_version.py" diff --git a/template_data/120E/ImageTemplate.nii.gz b/template_data/120E/ImageTemplate.nii.gz new file mode 100644 index 0000000..3bb3434 Binary files /dev/null and b/template_data/120E/ImageTemplate.nii.gz differ diff --git a/template_data/120E/VialSegmentationsCombined.nii.gz b/template_data/120E/VialSegmentationsCombined.nii.gz new file mode 100644 index 0000000..20c71c7 Binary files /dev/null and b/template_data/120E/VialSegmentationsCombined.nii.gz differ diff --git a/template_data/120E/VialsLabelled/A.nii.gz b/template_data/120E/VialsLabelled/A.nii.gz new file mode 100644 index 0000000..36358c5 Binary files /dev/null and b/template_data/120E/VialsLabelled/A.nii.gz differ diff --git a/template_data/120E/VialsLabelled/B.nii.gz b/template_data/120E/VialsLabelled/B.nii.gz new file mode 100644 index 0000000..02caa41 Binary files /dev/null and b/template_data/120E/VialsLabelled/B.nii.gz differ diff --git a/template_data/120E/VialsLabelled/C.nii.gz b/template_data/120E/VialsLabelled/C.nii.gz new file mode 100644 index 0000000..2c2015c Binary files /dev/null and b/template_data/120E/VialsLabelled/C.nii.gz differ diff --git a/template_data/120E/VialsLabelled/D.nii.gz b/template_data/120E/VialsLabelled/D.nii.gz new file mode 100644 index 0000000..2aef38f Binary files /dev/null and b/template_data/120E/VialsLabelled/D.nii.gz differ diff --git a/template_data/120E/VialsLabelled/E.nii.gz b/template_data/120E/VialsLabelled/E.nii.gz new file mode 100644 index 0000000..484e87c Binary files /dev/null and b/template_data/120E/VialsLabelled/E.nii.gz differ diff --git a/template_data/120E/VialsLabelled/F.nii.gz b/template_data/120E/VialsLabelled/F.nii.gz new file mode 100644 index 0000000..83a3195 Binary files /dev/null and b/template_data/120E/VialsLabelled/F.nii.gz differ diff --git a/template_data/120E/VialsLabelled/G.nii.gz b/template_data/120E/VialsLabelled/G.nii.gz new file mode 100644 index 0000000..d1ca263 Binary files /dev/null and b/template_data/120E/VialsLabelled/G.nii.gz differ diff --git a/template_data/120E/VialsLabelled/H.nii.gz b/template_data/120E/VialsLabelled/H.nii.gz new file mode 100644 index 0000000..eedfeb4 Binary files /dev/null and b/template_data/120E/VialsLabelled/H.nii.gz differ diff --git a/template_data/120E/VialsLabelled/I.nii.gz b/template_data/120E/VialsLabelled/I.nii.gz new file mode 100644 index 0000000..6792d81 Binary files /dev/null and b/template_data/120E/VialsLabelled/I.nii.gz differ diff --git a/template_data/120E/VialsLabelled/J.nii.gz b/template_data/120E/VialsLabelled/J.nii.gz new file mode 100644 index 0000000..a920682 Binary files /dev/null and b/template_data/120E/VialsLabelled/J.nii.gz differ diff --git a/template_data/120E/VialsLabelled/K.nii.gz b/template_data/120E/VialsLabelled/K.nii.gz new file mode 100644 index 0000000..e01e91b Binary files /dev/null and b/template_data/120E/VialsLabelled/K.nii.gz differ diff --git a/template_data/120E/VialsLabelled/L.nii.gz b/template_data/120E/VialsLabelled/L.nii.gz new file mode 100644 index 0000000..0ab1436 Binary files /dev/null and b/template_data/120E/VialsLabelled/L.nii.gz differ diff --git a/template_data/120E/VialsLabelled/M.nii.gz b/template_data/120E/VialsLabelled/M.nii.gz new file mode 100644 index 0000000..b475f45 Binary files /dev/null and b/template_data/120E/VialsLabelled/M.nii.gz differ diff --git a/template_data/120E/VialsLabelled/N.nii.gz b/template_data/120E/VialsLabelled/N.nii.gz new file mode 100644 index 0000000..bb600a3 Binary files /dev/null and b/template_data/120E/VialsLabelled/N.nii.gz differ diff --git a/template_data/120E/VialsLabelled/Noise.nii.gz b/template_data/120E/VialsLabelled/Noise.nii.gz new file mode 100644 index 0000000..47255e0 Binary files /dev/null and b/template_data/120E/VialsLabelled/Noise.nii.gz differ diff --git a/template_data/120E/VialsLabelled/O.nii.gz b/template_data/120E/VialsLabelled/O.nii.gz new file mode 100644 index 0000000..10787f0 Binary files /dev/null and b/template_data/120E/VialsLabelled/O.nii.gz differ diff --git a/template_data/120E/VialsLabelled/P.nii.gz b/template_data/120E/VialsLabelled/P.nii.gz new file mode 100644 index 0000000..fc5bc0e Binary files /dev/null and b/template_data/120E/VialsLabelled/P.nii.gz differ diff --git a/template_data/120E/VialsLabelled/Q.nii.gz b/template_data/120E/VialsLabelled/Q.nii.gz new file mode 100644 index 0000000..8ac09de Binary files /dev/null and b/template_data/120E/VialsLabelled/Q.nii.gz differ diff --git a/template_data/120E/VialsLabelled/R.nii.gz b/template_data/120E/VialsLabelled/R.nii.gz new file mode 100644 index 0000000..54d8045 Binary files /dev/null and b/template_data/120E/VialsLabelled/R.nii.gz differ diff --git a/template_data/120E/VialsLabelled/S.nii.gz b/template_data/120E/VialsLabelled/S.nii.gz new file mode 100644 index 0000000..e160899 Binary files /dev/null and b/template_data/120E/VialsLabelled/S.nii.gz differ diff --git a/template_data/120E/VialsLabelled/T.nii.gz b/template_data/120E/VialsLabelled/T.nii.gz new file mode 100644 index 0000000..ebd63a0 Binary files /dev/null and b/template_data/120E/VialsLabelled/T.nii.gz differ diff --git a/template_data/120E/VialsLabelled/U.nii.gz b/template_data/120E/VialsLabelled/U.nii.gz new file mode 100644 index 0000000..7d86a28 Binary files /dev/null and b/template_data/120E/VialsLabelled/U.nii.gz differ diff --git a/template_data/120E/VialsLabelled/V.nii.gz b/template_data/120E/VialsLabelled/V.nii.gz new file mode 100644 index 0000000..ef33f39 Binary files /dev/null and b/template_data/120E/VialsLabelled/V.nii.gz differ diff --git a/template_data/120E/VialsLabelled/W.nii.gz b/template_data/120E/VialsLabelled/W.nii.gz new file mode 100644 index 0000000..25991f6 Binary files /dev/null and b/template_data/120E/VialsLabelled/W.nii.gz differ diff --git a/template_data/120E/VialsLabelled/X.nii.gz b/template_data/120E/VialsLabelled/X.nii.gz new file mode 100644 index 0000000..889bf16 Binary files /dev/null and b/template_data/120E/VialsLabelled/X.nii.gz differ diff --git a/template_data/120E/adc_reference.json b/template_data/120E/adc_reference.json new file mode 100644 index 0000000..8e4f0ac --- /dev/null +++ b/template_data/120E/adc_reference.json @@ -0,0 +1,29 @@ +{ + "vials": ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X"], +"adc_mm2_per_s": { + "A": 1.0e-3, + "B": 0.84e-3, + "C": 0.54e-3, + "D": 0.32e-3, + "E": 0.84e-3, + "F": 0.54e-3, + "G": 1.82e-3, + "H": 1.59e-3, + "I": 1.37e-3, + "J": 1.18e-3, + "K": 2.02e-3, + "L": 1.91e-3, + "M": 1.82e-3, + "N": 1.59e-3, + "O": 1.37e-3, + "P": 1.18e-3, + "Q": 1.0e-3, + "R": 0.84e-3, + "S": 0.54e-3, + "T": 0.32e-3, + "U": 2.02e-3, + "V": 1.91e-3, + "W": 1.18e-3, + "X": 1.0e-3 + } +} diff --git a/template_data/120E/t1t2_reference.json b/template_data/120E/t1t2_reference.json new file mode 100644 index 0000000..d6b555a --- /dev/null +++ b/template_data/120E/t1t2_reference.json @@ -0,0 +1,55 @@ +{ + "vials": ["D", "K", "B", "L", "J", "M", "I", "N", "H", "O", "P", "W", "Q", "X", "G", "R", "F", "S", "E", "T", "A", "U", "C", "V"], + "T1_ms": { + "D": 2265, + "K": 2265, + "B": 1953, + "L": 1953, + "J": 1712, + "M": 1712, + "I": 1410, + "N": 1410, + "H": 1153, + "O": 1153, + "P": 920, + "W": 920, + "Q": 698, + "X": 698, + "G": 617, + "R": 617, + "F": 487, + "S": 487, + "E": 394, + "T": 394, + "A": 294, + "U": 294, + "C": 225, + "V": 225 + }, + "T2_ms": { + "D": 412, + "K": 412, + "B": 276, + "L": 276, + "J": 203, + "M": 203, + "I": 142, + "N": 142, + "H": 103, + "O": 103, + "P": 80, + "W": 80, + "Q": 52, + "X": 52, + "G": 44, + "R": 44, + "F": 33, + "S": 33, + "E": 26, + "T": 26, + "A": 19, + "U": 19, + "C": 14, + "V": 14 + } +} diff --git a/template_data/DIFFUSION-O-3574_Calibration_GSP_PVP_20220331.xlsx b/template_data/DIFFUSION-O-3574_Calibration_GSP_PVP_20220331.xlsx new file mode 100644 index 0000000..9eaa8da Binary files /dev/null and b/template_data/DIFFUSION-O-3574_Calibration_GSP_PVP_20220331.xlsx differ diff --git a/template_data/SPIRIT/GSP_ADCvalues.xlsx b/template_data/SPIRIT/GSP_ADCvalues.xlsx new file mode 100644 index 0000000..7c25fc1 Binary files /dev/null and b/template_data/SPIRIT/GSP_ADCvalues.xlsx differ diff --git a/template_data/ImageTemplate.nii.gz b/template_data/SPIRIT/ImageTemplate.nii.gz similarity index 100% rename from template_data/ImageTemplate.nii.gz rename to template_data/SPIRIT/ImageTemplate.nii.gz diff --git a/template_data/VialSegmentationsCombined.nii.gz b/template_data/SPIRIT/VialSegmentationsCombined.nii.gz similarity index 100% rename from template_data/VialSegmentationsCombined.nii.gz rename to template_data/SPIRIT/VialSegmentationsCombined.nii.gz diff --git a/template_data/vials_labelled/A.nii.gz b/template_data/SPIRIT/VialsLabelled/A.nii.gz similarity index 100% rename from template_data/vials_labelled/A.nii.gz rename to template_data/SPIRIT/VialsLabelled/A.nii.gz diff --git a/template_data/vials_labelled/B.nii.gz b/template_data/SPIRIT/VialsLabelled/B.nii.gz similarity index 100% rename from template_data/vials_labelled/B.nii.gz rename to template_data/SPIRIT/VialsLabelled/B.nii.gz diff --git a/template_data/vials_labelled/C.nii.gz b/template_data/SPIRIT/VialsLabelled/C.nii.gz similarity index 100% rename from template_data/vials_labelled/C.nii.gz rename to template_data/SPIRIT/VialsLabelled/C.nii.gz diff --git a/template_data/vials_labelled/D.nii.gz b/template_data/SPIRIT/VialsLabelled/D.nii.gz similarity index 100% rename from template_data/vials_labelled/D.nii.gz rename to template_data/SPIRIT/VialsLabelled/D.nii.gz diff --git a/template_data/vials_labelled/E.nii.gz b/template_data/SPIRIT/VialsLabelled/E.nii.gz similarity index 100% rename from template_data/vials_labelled/E.nii.gz rename to template_data/SPIRIT/VialsLabelled/E.nii.gz diff --git a/template_data/vials_labelled/F.nii.gz b/template_data/SPIRIT/VialsLabelled/F.nii.gz similarity index 100% rename from template_data/vials_labelled/F.nii.gz rename to template_data/SPIRIT/VialsLabelled/F.nii.gz diff --git a/template_data/vials_labelled/G.nii.gz b/template_data/SPIRIT/VialsLabelled/G.nii.gz similarity index 100% rename from template_data/vials_labelled/G.nii.gz rename to template_data/SPIRIT/VialsLabelled/G.nii.gz diff --git a/template_data/vials_labelled/H.nii.gz b/template_data/SPIRIT/VialsLabelled/H.nii.gz similarity index 100% rename from template_data/vials_labelled/H.nii.gz rename to template_data/SPIRIT/VialsLabelled/H.nii.gz diff --git a/template_data/vials_labelled/I.nii.gz b/template_data/SPIRIT/VialsLabelled/I.nii.gz similarity index 100% rename from template_data/vials_labelled/I.nii.gz rename to template_data/SPIRIT/VialsLabelled/I.nii.gz diff --git a/template_data/vials_labelled/J.nii.gz b/template_data/SPIRIT/VialsLabelled/J.nii.gz similarity index 100% rename from template_data/vials_labelled/J.nii.gz rename to template_data/SPIRIT/VialsLabelled/J.nii.gz diff --git a/template_data/vials_labelled/K.nii.gz b/template_data/SPIRIT/VialsLabelled/K.nii.gz similarity index 100% rename from template_data/vials_labelled/K.nii.gz rename to template_data/SPIRIT/VialsLabelled/K.nii.gz diff --git a/template_data/vials_labelled/L.nii.gz b/template_data/SPIRIT/VialsLabelled/L.nii.gz similarity index 100% rename from template_data/vials_labelled/L.nii.gz rename to template_data/SPIRIT/VialsLabelled/L.nii.gz diff --git a/template_data/vials_labelled/M.nii.gz b/template_data/SPIRIT/VialsLabelled/M.nii.gz similarity index 100% rename from template_data/vials_labelled/M.nii.gz rename to template_data/SPIRIT/VialsLabelled/M.nii.gz diff --git a/template_data/vials_labelled/N.nii.gz b/template_data/SPIRIT/VialsLabelled/N.nii.gz similarity index 100% rename from template_data/vials_labelled/N.nii.gz rename to template_data/SPIRIT/VialsLabelled/N.nii.gz diff --git a/template_data/SPIRIT/VialsLabelled/Noise.nii.gz b/template_data/SPIRIT/VialsLabelled/Noise.nii.gz new file mode 100644 index 0000000..e74d77d Binary files /dev/null and b/template_data/SPIRIT/VialsLabelled/Noise.nii.gz differ diff --git a/template_data/vials_labelled/O.nii.gz b/template_data/SPIRIT/VialsLabelled/O.nii.gz similarity index 100% rename from template_data/vials_labelled/O.nii.gz rename to template_data/SPIRIT/VialsLabelled/O.nii.gz diff --git a/template_data/vials_labelled/P.nii.gz b/template_data/SPIRIT/VialsLabelled/P.nii.gz similarity index 100% rename from template_data/vials_labelled/P.nii.gz rename to template_data/SPIRIT/VialsLabelled/P.nii.gz diff --git a/template_data/vials_labelled/Q.nii.gz b/template_data/SPIRIT/VialsLabelled/Q.nii.gz similarity index 100% rename from template_data/vials_labelled/Q.nii.gz rename to template_data/SPIRIT/VialsLabelled/Q.nii.gz diff --git a/template_data/vials_labelled/R.nii.gz b/template_data/SPIRIT/VialsLabelled/R.nii.gz similarity index 100% rename from template_data/vials_labelled/R.nii.gz rename to template_data/SPIRIT/VialsLabelled/R.nii.gz diff --git a/template_data/vials_labelled/S.nii.gz b/template_data/SPIRIT/VialsLabelled/S.nii.gz similarity index 100% rename from template_data/vials_labelled/S.nii.gz rename to template_data/SPIRIT/VialsLabelled/S.nii.gz diff --git a/template_data/vials_labelled/T.nii.gz b/template_data/SPIRIT/VialsLabelled/T.nii.gz similarity index 100% rename from template_data/vials_labelled/T.nii.gz rename to template_data/SPIRIT/VialsLabelled/T.nii.gz diff --git a/template_data/SPIRIT/adc_reference.json b/template_data/SPIRIT/adc_reference.json new file mode 100644 index 0000000..5a66fed --- /dev/null +++ b/template_data/SPIRIT/adc_reference.json @@ -0,0 +1,13 @@ +{ + "vials": ["E", "F", "G", "H", "I", "J", "K", "L"], +"adc_mm2_per_s": { + "E": 1.82e-3, + "F": 1.59e-3, + "G": 1.37e-3, + "H": 1.18e-3, + "I": 1.00e-3, + "J": 0.84e-3, + "K": 0.54e-3, + "L": 0.32e-3 + } +} \ No newline at end of file diff --git a/template_data/SPIRIT/t1t2_reference.json b/template_data/SPIRIT/t1t2_reference.json new file mode 100644 index 0000000..4992553 --- /dev/null +++ b/template_data/SPIRIT/t1t2_reference.json @@ -0,0 +1,31 @@ +{ + "vials": ["S", "D", "P", "M", "C", "N", "B", "T", "A", "R", "O", "Q"], + "T1_ms": { + "S": 2327, + "D": 1756, + "P": 1756, + "M": 1251, + "C": 994, + "N": 994, + "B": 758, + "T": 758, + "A": 435, + "R": 435, + "O": 306, + "Q": 236 + }, + "T2_ms": { + "S": 492, + "D": 235, + "P": 235, + "M": 123, + "C": 90, + "N": 90, + "B": 60, + "T": 60, + "A": 30, + "R": 30, + "O": 20, + "Q": 15 + } +} diff --git a/template_data/phantom_config.json b/template_data/phantom_config.json new file mode 100644 index 0000000..8f8b481 --- /dev/null +++ b/template_data/phantom_config.json @@ -0,0 +1,22 @@ +{ + "SPIRIT": { + "5% Aqueous PVP NiCl2": ["E"], + "10% Aqueous PVP NiCl2": ["F"], + "15% Aqueous PVP NiCl2": ["G"], + "20% Aqueous PVP NiCl2": ["H"], + "25% Aqueous PVP NiCl2": ["I"], + "30% Aqueous PVP NiCl2": ["J"], + "40% Aqueous PVP NiCl2": ["K"], + "50% Aqueous PVP NiCl2": ["L"] + }, + "120E": { + "5% Aqueous PVP NiCl2": ["G", "M"], + "10% Aqueous PVP NiCl2": ["H", "N"], + "15% Aqueous PVP NiCl2": ["I", "O"], + "20% Aqueous PVP NiCl2": ["J", "P", "W"], + "25% Aqueous PVP NiCl2": ["A", "Q", "X"], + "30% Aqueous PVP NiCl2": ["B", "E", "R"], + "40% Aqueous PVP NiCl2": ["C", "F", "S"], + "50% Aqueous PVP NiCl2": ["D", "T"] + } +} diff --git a/template_data/rotations.txt b/template_data/rotations.txt deleted file mode 100644 index 8a86666..0000000 --- a/template_data/rotations.txt +++ /dev/null @@ -1,168 +0,0 @@ - "" #dummy for indexing - "" #dummy for indexing -"1.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 1.0000" # Identity -"1.0000 0.0000 0.0000 0.0000 0.5000 -0.8660 0.0000 0.8660 0.5000" # Single-axis rotation X 60° -"1.0000 0.0000 0.0000 0.0000 -0.5000 -0.8660 0.0000 0.8660 -0.5000" # Single-axis rotation X 120° -"1.0000 0.0000 0.0000 0.0000 -1.0000 -0.0000 0.0000 0.0000 -1.0000" # Single-axis rotation X 180° -"1.0000 0.0000 0.0000 0.0000 0.5000 0.8660 0.0000 -0.8660 0.5000" # Single-axis rotation X -60° -"1.0000 0.0000 0.0000 0.0000 -0.5000 0.8660 0.0000 -0.8660 -0.5000" # Single-axis rotation X -120° -"0.5000 0.0000 0.8660 0.0000 1.0000 0.0000 -0.8660 0.0000 0.5000" # Single-axis rotation Y 60° -"-0.5000 0.0000 0.8660 0.0000 1.0000 0.0000 -0.8660 0.0000 -0.5000" # Single-axis rotation Y 120° -"-1.0000 0.0000 0.0000 0.0000 1.0000 0.0000 -0.0000 0.0000 -1.0000" # Single-axis rotation Y 180° -"0.5000 0.0000 -0.8660 0.0000 1.0000 0.0000 0.8660 0.0000 0.5000" # Single-axis rotation Y -60° -"-0.5000 0.0000 -0.8660 0.0000 1.0000 0.0000 0.8660 0.0000 -0.5000" # Single-axis rotation Y -120° -"0.5000 -0.8660 0.0000 0.8660 0.5000 0.0000 0.0000 0.0000 1.0000" # Single-axis rotation Z 60° -"-0.5000 -0.8660 0.0000 0.8660 -0.5000 0.0000 0.0000 0.0000 1.0000" # Single-axis rotation Z 120° -"-1.0000 -0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 1.0000" # Single-axis rotation Z 180° -"0.5000 0.8660 0.0000 -0.8660 0.5000 0.0000 0.0000 0.0000 1.0000" # Single-axis rotation Z -60° -"-0.5000 0.8660 0.0000 -0.8660 -0.5000 0.0000 0.0000 0.0000 1.0000" # Single-axis rotation Z -120° -"0.5000 0.7500 0.4330 0.0000 0.5000 -0.8660 -0.8660 0.4330 0.2500" # Sequential rotation X 60°, then Y 60° -"-0.5000 0.7500 0.4330 0.0000 0.5000 -0.8660 -0.8660 -0.4330 -0.2500" # Sequential rotation X 60°, then Y 120° -"-1.0000 0.0000 0.0000 0.0000 0.5000 -0.8660 -0.0000 -0.8660 -0.5000" # Sequential rotation X 60°, then Y 180° -"0.5000 -0.7500 -0.4330 0.0000 0.5000 -0.8660 0.8660 0.4330 0.2500" # Sequential rotation X 60°, then Y -60° -"-0.5000 -0.7500 -0.4330 0.0000 0.5000 -0.8660 0.8660 -0.4330 -0.2500" # Sequential rotation X 60°, then Y -120° -"0.5000 0.7500 -0.4330 0.0000 -0.5000 -0.8660 -0.8660 0.4330 -0.2500" # Sequential rotation X 120°, then Y 60° -"-0.5000 0.7500 -0.4330 0.0000 -0.5000 -0.8660 -0.8660 -0.4330 0.2500" # Sequential rotation X 120°, then Y 120° -"-1.0000 0.0000 -0.0000 0.0000 -0.5000 -0.8660 -0.0000 -0.8660 0.5000" # Sequential rotation X 120°, then Y 180° -"0.5000 -0.7500 0.4330 0.0000 -0.5000 -0.8660 0.8660 0.4330 -0.2500" # Sequential rotation X 120°, then Y -60° -"-0.5000 -0.7500 0.4330 0.0000 -0.5000 -0.8660 0.8660 -0.4330 0.2500" # Sequential rotation X 120°, then Y -120° -"0.5000 0.0000 -0.8660 0.0000 -1.0000 -0.0000 -0.8660 0.0000 -0.5000" # Sequential rotation X 180°, then Y 60° -"-0.5000 0.0000 -0.8660 0.0000 -1.0000 -0.0000 -0.8660 -0.0000 0.5000" # Sequential rotation X 180°, then Y 120° -"-1.0000 0.0000 -0.0000 0.0000 -1.0000 -0.0000 -0.0000 -0.0000 1.0000" # Sequential rotation X 180°, then Y 180° -"0.5000 -0.0000 0.8660 0.0000 -1.0000 -0.0000 0.8660 0.0000 -0.5000" # Sequential rotation X 180°, then Y -60° -"-0.5000 -0.0000 0.8660 0.0000 -1.0000 -0.0000 0.8660 -0.0000 0.5000" # Sequential rotation X 180°, then Y -120° -"0.5000 -0.7500 0.4330 0.0000 0.5000 0.8660 -0.8660 -0.4330 0.2500" # Sequential rotation X -60°, then Y 60° -"-0.5000 -0.7500 0.4330 0.0000 0.5000 0.8660 -0.8660 0.4330 -0.2500" # Sequential rotation X -60°, then Y 120° -"-1.0000 -0.0000 0.0000 0.0000 0.5000 0.8660 -0.0000 0.8660 -0.5000" # Sequential rotation X -60°, then Y 180° -"0.5000 0.7500 -0.4330 0.0000 0.5000 0.8660 0.8660 -0.4330 0.2500" # Sequential rotation X -60°, then Y -60° -"-0.5000 0.7500 -0.4330 0.0000 0.5000 0.8660 0.8660 0.4330 -0.2500" # Sequential rotation X -60°, then Y -120° -"0.5000 -0.7500 -0.4330 0.0000 -0.5000 0.8660 -0.8660 -0.4330 -0.2500" # Sequential rotation X -120°, then Y 60° -"-0.5000 -0.7500 -0.4330 0.0000 -0.5000 0.8660 -0.8660 0.4330 0.2500" # Sequential rotation X -120°, then Y 120° -"-1.0000 -0.0000 -0.0000 0.0000 -0.5000 0.8660 -0.0000 0.8660 0.5000" # Sequential rotation X -120°, then Y 180° -"0.5000 0.7500 0.4330 0.0000 -0.5000 0.8660 0.8660 -0.4330 -0.2500" # Sequential rotation X -120°, then Y -60° -"-0.5000 0.7500 0.4330 0.0000 -0.5000 0.8660 0.8660 0.4330 0.2500" # Sequential rotation X -120°, then Y -120° -"0.5000 -0.4330 0.7500 0.8660 0.2500 -0.4330 0.0000 0.8660 0.5000" # Sequential rotation X 60°, then Z 60° -"-0.5000 -0.4330 0.7500 0.8660 -0.2500 0.4330 0.0000 0.8660 0.5000" # Sequential rotation X 60°, then Z 120° -"-1.0000 -0.0000 0.0000 0.0000 -0.5000 0.8660 0.0000 0.8660 0.5000" # Sequential rotation X 60°, then Z 180° -"0.5000 0.4330 -0.7500 -0.8660 0.2500 -0.4330 0.0000 0.8660 0.5000" # Sequential rotation X 60°, then Z -60° -"-0.5000 0.4330 -0.7500 -0.8660 -0.2500 0.4330 0.0000 0.8660 0.5000" # Sequential rotation X 60°, then Z -120° -"0.5000 0.4330 0.7500 0.8660 -0.2500 -0.4330 0.0000 0.8660 -0.5000" # Sequential rotation X 120°, then Z 60° -"-0.5000 0.4330 0.7500 0.8660 0.2500 0.4330 0.0000 0.8660 -0.5000" # Sequential rotation X 120°, then Z 120° -"-1.0000 0.0000 0.0000 0.0000 0.5000 0.8660 0.0000 0.8660 -0.5000" # Sequential rotation X 120°, then Z 180° -"0.5000 -0.4330 -0.7500 -0.8660 -0.2500 -0.4330 0.0000 0.8660 -0.5000" # Sequential rotation X 120°, then Z -60° -"-0.5000 -0.4330 -0.7500 -0.8660 0.2500 0.4330 0.0000 0.8660 -0.5000" # Sequential rotation X 120°, then Z -120° -"0.5000 0.8660 0.0000 0.8660 -0.5000 -0.0000 0.0000 0.0000 -1.0000" # Sequential rotation X 180°, then Z 60° -"-0.5000 0.8660 0.0000 0.8660 0.5000 0.0000 0.0000 0.0000 -1.0000" # Sequential rotation X 180°, then Z 120° -"-1.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 -1.0000" # Sequential rotation X 180°, then Z 180° -"0.5000 -0.8660 -0.0000 -0.8660 -0.5000 -0.0000 0.0000 0.0000 -1.0000" # Sequential rotation X 180°, then Z -60° -"-0.5000 -0.8660 -0.0000 -0.8660 0.5000 0.0000 0.0000 0.0000 -1.0000" # Sequential rotation X 180°, then Z -120° -"0.5000 -0.4330 -0.7500 0.8660 0.2500 0.4330 0.0000 -0.8660 0.5000" # Sequential rotation X -60°, then Z 60° -"-0.5000 -0.4330 -0.7500 0.8660 -0.2500 -0.4330 0.0000 -0.8660 0.5000" # Sequential rotation X -60°, then Z 120° -"-1.0000 -0.0000 -0.0000 0.0000 -0.5000 -0.8660 0.0000 -0.8660 0.5000" # Sequential rotation X -60°, then Z 180° -"0.5000 0.4330 0.7500 -0.8660 0.2500 0.4330 0.0000 -0.8660 0.5000" # Sequential rotation X -60°, then Z -60° -"-0.5000 0.4330 0.7500 -0.8660 -0.2500 -0.4330 0.0000 -0.8660 0.5000" # Sequential rotation X -60°, then Z -120° -"0.5000 0.4330 -0.7500 0.8660 -0.2500 0.4330 0.0000 -0.8660 -0.5000" # Sequential rotation X -120°, then Z 60° -"-0.5000 0.4330 -0.7500 0.8660 0.2500 -0.4330 0.0000 -0.8660 -0.5000" # Sequential rotation X -120°, then Z 120° -"-1.0000 0.0000 -0.0000 0.0000 0.5000 -0.8660 0.0000 -0.8660 -0.5000" # Sequential rotation X -120°, then Z 180° -"0.5000 -0.4330 0.7500 -0.8660 -0.2500 0.4330 0.0000 -0.8660 -0.5000" # Sequential rotation X -120°, then Z -60° -"-0.5000 -0.4330 0.7500 -0.8660 0.2500 -0.4330 0.0000 -0.8660 -0.5000" # Sequential rotation X -120°, then Z -120° -"0.5000 0.0000 0.8660 0.7500 0.5000 -0.4330 -0.4330 0.8660 0.2500" # Sequential rotation Y 60°, then X 60° -"0.5000 0.0000 0.8660 0.7500 -0.5000 -0.4330 0.4330 0.8660 -0.2500" # Sequential rotation Y 60°, then X 120° -"0.5000 0.0000 0.8660 0.0000 -1.0000 -0.0000 0.8660 0.0000 -0.5000" # Sequential rotation Y 60°, then X 180° -"0.5000 0.0000 0.8660 -0.7500 0.5000 0.4330 -0.4330 -0.8660 0.2500" # Sequential rotation Y 60°, then X -60° -"0.5000 0.0000 0.8660 -0.7500 -0.5000 0.4330 0.4330 -0.8660 -0.2500" # Sequential rotation Y 60°, then X -120° -"-0.5000 0.0000 0.8660 0.7500 0.5000 0.4330 -0.4330 0.8660 -0.2500" # Sequential rotation Y 120°, then X 60° -"-0.5000 0.0000 0.8660 0.7500 -0.5000 0.4330 0.4330 0.8660 0.2500" # Sequential rotation Y 120°, then X 120° -"-0.5000 0.0000 0.8660 0.0000 -1.0000 0.0000 0.8660 0.0000 0.5000" # Sequential rotation Y 120°, then X 180° -"-0.5000 0.0000 0.8660 -0.7500 0.5000 -0.4330 -0.4330 -0.8660 -0.2500" # Sequential rotation Y 120°, then X -60° -"-0.5000 0.0000 0.8660 -0.7500 -0.5000 -0.4330 0.4330 -0.8660 0.2500" # Sequential rotation Y 120°, then X -120° -"-1.0000 0.0000 0.0000 0.0000 0.5000 0.8660 -0.0000 0.8660 -0.5000" # Sequential rotation Y 180°, then X 60° -"-1.0000 0.0000 0.0000 0.0000 -0.5000 0.8660 0.0000 0.8660 0.5000" # Sequential rotation Y 180°, then X 120° -"-1.0000 0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 1.0000" # Sequential rotation Y 180°, then X 180° -"-1.0000 0.0000 0.0000 -0.0000 0.5000 -0.8660 -0.0000 -0.8660 -0.5000" # Sequential rotation Y 180°, then X -60° -"-1.0000 0.0000 0.0000 -0.0000 -0.5000 -0.8660 0.0000 -0.8660 0.5000" # Sequential rotation Y 180°, then X -120° -"0.5000 0.0000 -0.8660 -0.7500 0.5000 -0.4330 0.4330 0.8660 0.2500" # Sequential rotation Y -60°, then X 60° -"0.5000 0.0000 -0.8660 -0.7500 -0.5000 -0.4330 -0.4330 0.8660 -0.2500" # Sequential rotation Y -60°, then X 120° -"0.5000 0.0000 -0.8660 -0.0000 -1.0000 -0.0000 -0.8660 0.0000 -0.5000" # Sequential rotation Y -60°, then X 180° -"0.5000 0.0000 -0.8660 0.7500 0.5000 0.4330 0.4330 -0.8660 0.2500" # Sequential rotation Y -60°, then X -60° -"0.5000 0.0000 -0.8660 0.7500 -0.5000 0.4330 -0.4330 -0.8660 -0.2500" # Sequential rotation Y -60°, then X -120° -"-0.5000 0.0000 -0.8660 -0.7500 0.5000 0.4330 0.4330 0.8660 -0.2500" # Sequential rotation Y -120°, then X 60° -"-0.5000 0.0000 -0.8660 -0.7500 -0.5000 0.4330 -0.4330 0.8660 0.2500" # Sequential rotation Y -120°, then X 120° -"-0.5000 0.0000 -0.8660 -0.0000 -1.0000 0.0000 -0.8660 0.0000 0.5000" # Sequential rotation Y -120°, then X 180° -"-0.5000 0.0000 -0.8660 0.7500 0.5000 -0.4330 0.4330 -0.8660 -0.2500" # Sequential rotation Y -120°, then X -60° -"-0.5000 0.0000 -0.8660 0.7500 -0.5000 -0.4330 -0.4330 -0.8660 0.2500" # Sequential rotation Y -120°, then X -120° -"0.2500 -0.8660 0.4330 0.4330 0.5000 0.7500 -0.8660 0.0000 0.5000" # Sequential rotation Y 60°, then Z 60° -"-0.2500 -0.8660 -0.4330 0.4330 -0.5000 0.7500 -0.8660 0.0000 0.5000" # Sequential rotation Y 60°, then Z 120° -"-0.5000 -0.0000 -0.8660 0.0000 -1.0000 0.0000 -0.8660 0.0000 0.5000" # Sequential rotation Y 60°, then Z 180° -"0.2500 0.8660 0.4330 -0.4330 0.5000 -0.7500 -0.8660 0.0000 0.5000" # Sequential rotation Y 60°, then Z -60° -"-0.2500 0.8660 -0.4330 -0.4330 -0.5000 -0.7500 -0.8660 0.0000 0.5000" # Sequential rotation Y 60°, then Z -120° -"-0.2500 -0.8660 0.4330 -0.4330 0.5000 0.7500 -0.8660 0.0000 -0.5000" # Sequential rotation Y 120°, then Z 60° -"0.2500 -0.8660 -0.4330 -0.4330 -0.5000 0.7500 -0.8660 0.0000 -0.5000" # Sequential rotation Y 120°, then Z 120° -"0.5000 -0.0000 -0.8660 -0.0000 -1.0000 0.0000 -0.8660 0.0000 -0.5000" # Sequential rotation Y 120°, then Z 180° -"-0.2500 0.8660 0.4330 0.4330 0.5000 -0.7500 -0.8660 0.0000 -0.5000" # Sequential rotation Y 120°, then Z -60° -"0.2500 0.8660 -0.4330 0.4330 -0.5000 -0.7500 -0.8660 0.0000 -0.5000" # Sequential rotation Y 120°, then Z -120° -"-0.5000 -0.8660 0.0000 -0.8660 0.5000 0.0000 -0.0000 0.0000 -1.0000" # Sequential rotation Y 180°, then Z 60° -"0.5000 -0.8660 -0.0000 -0.8660 -0.5000 0.0000 -0.0000 0.0000 -1.0000" # Sequential rotation Y 180°, then Z 120° -"1.0000 -0.0000 -0.0000 -0.0000 -1.0000 0.0000 -0.0000 0.0000 -1.0000" # Sequential rotation Y 180°, then Z 180° -"-0.5000 0.8660 0.0000 0.8660 0.5000 -0.0000 -0.0000 0.0000 -1.0000" # Sequential rotation Y 180°, then Z -60° -"0.5000 0.8660 -0.0000 0.8660 -0.5000 -0.0000 -0.0000 0.0000 -1.0000" # Sequential rotation Y 180°, then Z -120° -"0.2500 -0.8660 -0.4330 0.4330 0.5000 -0.7500 0.8660 0.0000 0.5000" # Sequential rotation Y -60°, then Z 60° -"-0.2500 -0.8660 0.4330 0.4330 -0.5000 -0.7500 0.8660 0.0000 0.5000" # Sequential rotation Y -60°, then Z 120° -"-0.5000 -0.0000 0.8660 0.0000 -1.0000 -0.0000 0.8660 0.0000 0.5000" # Sequential rotation Y -60°, then Z 180° -"0.2500 0.8660 -0.4330 -0.4330 0.5000 0.7500 0.8660 0.0000 0.5000" # Sequential rotation Y -60°, then Z -60° -"-0.2500 0.8660 0.4330 -0.4330 -0.5000 0.7500 0.8660 0.0000 0.5000" # Sequential rotation Y -60°, then Z -120° -"-0.2500 -0.8660 -0.4330 -0.4330 0.5000 -0.7500 0.8660 0.0000 -0.5000" # Sequential rotation Y -120°, then Z 60° -"0.2500 -0.8660 0.4330 -0.4330 -0.5000 -0.7500 0.8660 0.0000 -0.5000" # Sequential rotation Y -120°, then Z 120° -"0.5000 -0.0000 0.8660 -0.0000 -1.0000 -0.0000 0.8660 0.0000 -0.5000" # Sequential rotation Y -120°, then Z 180° -"-0.2500 0.8660 -0.4330 0.4330 0.5000 0.7500 0.8660 0.0000 -0.5000" # Sequential rotation Y -120°, then Z -60° -"0.2500 0.8660 0.4330 0.4330 -0.5000 0.7500 0.8660 0.0000 -0.5000" # Sequential rotation Y -120°, then Z -120° -"0.5000 -0.8660 0.0000 0.4330 0.2500 -0.8660 0.7500 0.4330 0.5000" # Sequential rotation Z 60°, then X 60° -"0.5000 -0.8660 0.0000 -0.4330 -0.2500 -0.8660 0.7500 0.4330 -0.5000" # Sequential rotation Z 60°, then X 120° -"0.5000 -0.8660 0.0000 -0.8660 -0.5000 -0.0000 0.0000 0.0000 -1.0000" # Sequential rotation Z 60°, then X 180° -"0.5000 -0.8660 0.0000 0.4330 0.2500 0.8660 -0.7500 -0.4330 0.5000" # Sequential rotation Z 60°, then X -60° -"0.5000 -0.8660 0.0000 -0.4330 -0.2500 0.8660 -0.7500 -0.4330 -0.5000" # Sequential rotation Z 60°, then X -120° -"-0.5000 -0.8660 0.0000 0.4330 -0.2500 -0.8660 0.7500 -0.4330 0.5000" # Sequential rotation Z 120°, then X 60° -"-0.5000 -0.8660 0.0000 -0.4330 0.2500 -0.8660 0.7500 -0.4330 -0.5000" # Sequential rotation Z 120°, then X 120° -"-0.5000 -0.8660 0.0000 -0.8660 0.5000 -0.0000 0.0000 -0.0000 -1.0000" # Sequential rotation Z 120°, then X 180° -"-0.5000 -0.8660 0.0000 0.4330 -0.2500 0.8660 -0.7500 0.4330 0.5000" # Sequential rotation Z 120°, then X -60° -"-0.5000 -0.8660 0.0000 -0.4330 0.2500 0.8660 -0.7500 0.4330 -0.5000" # Sequential rotation Z 120°, then X -120° -"-1.0000 -0.0000 0.0000 0.0000 -0.5000 -0.8660 0.0000 -0.8660 0.5000" # Sequential rotation Z 180°, then X 60° -"-1.0000 -0.0000 0.0000 -0.0000 0.5000 -0.8660 0.0000 -0.8660 -0.5000" # Sequential rotation Z 180°, then X 120° -"-1.0000 -0.0000 0.0000 -0.0000 1.0000 -0.0000 0.0000 -0.0000 -1.0000" # Sequential rotation Z 180°, then X 180° -"-1.0000 -0.0000 0.0000 0.0000 -0.5000 0.8660 -0.0000 0.8660 0.5000" # Sequential rotation Z 180°, then X -60° -"-1.0000 -0.0000 0.0000 -0.0000 0.5000 0.8660 -0.0000 0.8660 -0.5000" # Sequential rotation Z 180°, then X -120° -"0.5000 0.8660 0.0000 -0.4330 0.2500 -0.8660 -0.7500 0.4330 0.5000" # Sequential rotation Z -60°, then X 60° -"0.5000 0.8660 0.0000 0.4330 -0.2500 -0.8660 -0.7500 0.4330 -0.5000" # Sequential rotation Z -60°, then X 120° -"0.5000 0.8660 0.0000 0.8660 -0.5000 -0.0000 -0.0000 0.0000 -1.0000" # Sequential rotation Z -60°, then X 180° -"0.5000 0.8660 0.0000 -0.4330 0.2500 0.8660 0.7500 -0.4330 0.5000" # Sequential rotation Z -60°, then X -60° -"0.5000 0.8660 0.0000 0.4330 -0.2500 0.8660 0.7500 -0.4330 -0.5000" # Sequential rotation Z -60°, then X -120° -"-0.5000 0.8660 0.0000 -0.4330 -0.2500 -0.8660 -0.7500 -0.4330 0.5000" # Sequential rotation Z -120°, then X 60° -"-0.5000 0.8660 0.0000 0.4330 0.2500 -0.8660 -0.7500 -0.4330 -0.5000" # Sequential rotation Z -120°, then X 120° -"-0.5000 0.8660 0.0000 0.8660 0.5000 -0.0000 -0.0000 -0.0000 -1.0000" # Sequential rotation Z -120°, then X 180° -"-0.5000 0.8660 0.0000 -0.4330 -0.2500 0.8660 0.7500 0.4330 0.5000" # Sequential rotation Z -120°, then X -60° -"-0.5000 0.8660 0.0000 0.4330 0.2500 0.8660 0.7500 0.4330 -0.5000" # Sequential rotation Z -120°, then X -120° -"0.2500 -0.4330 0.8660 0.8660 0.5000 0.0000 -0.4330 0.7500 0.5000" # Sequential rotation Z 60°, then Y 60° -"-0.2500 0.4330 0.8660 0.8660 0.5000 0.0000 -0.4330 0.7500 -0.5000" # Sequential rotation Z 60°, then Y 120° -"-0.5000 0.8660 0.0000 0.8660 0.5000 0.0000 -0.0000 0.0000 -1.0000" # Sequential rotation Z 60°, then Y 180° -"0.2500 -0.4330 -0.8660 0.8660 0.5000 0.0000 0.4330 -0.7500 0.5000" # Sequential rotation Z 60°, then Y -60° -"-0.2500 0.4330 -0.8660 0.8660 0.5000 0.0000 0.4330 -0.7500 -0.5000" # Sequential rotation Z 60°, then Y -120° -"-0.2500 -0.4330 0.8660 0.8660 -0.5000 0.0000 0.4330 0.7500 0.5000" # Sequential rotation Z 120°, then Y 60° -"0.2500 0.4330 0.8660 0.8660 -0.5000 0.0000 0.4330 0.7500 -0.5000" # Sequential rotation Z 120°, then Y 120° -"0.5000 0.8660 0.0000 0.8660 -0.5000 0.0000 0.0000 0.0000 -1.0000" # Sequential rotation Z 120°, then Y 180° -"-0.2500 -0.4330 -0.8660 0.8660 -0.5000 0.0000 -0.4330 -0.7500 0.5000" # Sequential rotation Z 120°, then Y -60° -"0.2500 0.4330 -0.8660 0.8660 -0.5000 0.0000 -0.4330 -0.7500 -0.5000" # Sequential rotation Z 120°, then Y -120° -"-0.5000 -0.0000 0.8660 0.0000 -1.0000 0.0000 0.8660 0.0000 0.5000" # Sequential rotation Z 180°, then Y 60° -"0.5000 0.0000 0.8660 0.0000 -1.0000 0.0000 0.8660 0.0000 -0.5000" # Sequential rotation Z 180°, then Y 120° -"1.0000 0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 -1.0000" # Sequential rotation Z 180°, then Y 180° -"-0.5000 -0.0000 -0.8660 0.0000 -1.0000 0.0000 -0.8660 -0.0000 0.5000" # Sequential rotation Z 180°, then Y -60° -"0.5000 0.0000 -0.8660 0.0000 -1.0000 0.0000 -0.8660 -0.0000 -0.5000" # Sequential rotation Z 180°, then Y -120° -"0.2500 0.4330 0.8660 -0.8660 0.5000 0.0000 -0.4330 -0.7500 0.5000" # Sequential rotation Z -60°, then Y 60° -"-0.2500 -0.4330 0.8660 -0.8660 0.5000 0.0000 -0.4330 -0.7500 -0.5000" # Sequential rotation Z -60°, then Y 120° -"-0.5000 -0.8660 0.0000 -0.8660 0.5000 0.0000 -0.0000 -0.0000 -1.0000" # Sequential rotation Z -60°, then Y 180° -"0.2500 0.4330 -0.8660 -0.8660 0.5000 0.0000 0.4330 0.7500 0.5000" # Sequential rotation Z -60°, then Y -60° -"-0.2500 -0.4330 -0.8660 -0.8660 0.5000 0.0000 0.4330 0.7500 -0.5000" # Sequential rotation Z -60°, then Y -120° -"-0.2500 0.4330 0.8660 -0.8660 -0.5000 0.0000 0.4330 -0.7500 0.5000" # Sequential rotation Z -120°, then Y 60° -"0.2500 -0.4330 0.8660 -0.8660 -0.5000 0.0000 0.4330 -0.7500 -0.5000" # Sequential rotation Z -120°, then Y 120° -"0.5000 -0.8660 0.0000 -0.8660 -0.5000 0.0000 0.0000 -0.0000 -1.0000" # Sequential rotation Z -120°, then Y 180° -"-0.2500 0.4330 -0.8660 -0.8660 -0.5000 0.0000 -0.4330 0.7500 0.5000" # Sequential rotation Z -120°, then Y -60° -"0.2500 -0.4330 -0.8660 -0.8660 -0.5000 0.0000 -0.4330 0.7500 -0.5000" # Sequential rotation Z -120°, then Y -120° diff --git a/vial_subplot.png b/vial_subplot.png deleted file mode 100644 index ac4e996..0000000 Binary files a/vial_subplot.png and /dev/null differ