From 60deff46f045dd2916b4cff3e53565e0a95b7c3c Mon Sep 17 00:00:00 2001 From: Polina Binder Date: Thu, 21 May 2026 00:41:33 +0000 Subject: [PATCH 01/12] evo2_megatron: load Savanna HF checkpoints with weights_only=False MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit torch 2.6 changed the default of `weights_only` to True. The Savanna checkpoint pickle includes numpy globals (`numpy.core.multiarray._reconstruct`), which the safer loader rejects. The converter then exits 0 with no output written and the error gets buried in stderr — silent failure. The Savanna repos under arcinstitute/* are trusted sources, so load with weights_only=False. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/bionemo/evo2/utils/checkpoint/savanna_to_mbridge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bionemo-recipes/recipes/evo2_megatron/src/bionemo/evo2/utils/checkpoint/savanna_to_mbridge.py b/bionemo-recipes/recipes/evo2_megatron/src/bionemo/evo2/utils/checkpoint/savanna_to_mbridge.py index 811b07153e..156ce530b5 100644 --- a/bionemo-recipes/recipes/evo2_megatron/src/bionemo/evo2/utils/checkpoint/savanna_to_mbridge.py +++ b/bionemo-recipes/recipes/evo2_megatron/src/bionemo/evo2/utils/checkpoint/savanna_to_mbridge.py @@ -135,7 +135,7 @@ def load_savanna_state_dict(path: Path) -> dict[str, torch.Tensor]: Returns: Flat state dict with keys like 'sequential.{i}.xxx'. """ - raw = torch.load(str(path), map_location="cpu", weights_only=True, mmap=True) + raw = torch.load(str(path), map_location="cpu", weights_only=False, mmap=True) if "module" in raw: raw = raw["module"] From b640f66ab62600ccf5da05f8ced1bb7f2797534f Mon Sep 17 00:00:00 2001 From: Polina Binder Date: Thu, 21 May 2026 00:43:15 +0000 Subject: [PATCH 02/12] interpretability/sae: add Evo2 1B SAE recipe Mirrors the existing esm2 / codonfm SAE recipes. Pipeline: chunk -> convert (Savanna->MBridge) -> predict_evo2 -> pt_to_parquet -> train Differences from esm2/codonfm are forced by Evo2 specifics: - Hyena/Megatron-Core model, no HF AutoModel path => reuses the existing `predict_evo2` CLI for inference instead of writing a custom extract.py - `pt_to_parquet.py` shim bridges predict_evo2's .pt output to the universal `sae.activation_store` parquet contract - `chunk_fasta.py` preprocessor keeps inputs within the model's trained context length (8192 bp for 1B); Hyena fftconv OOMs on long sequences even at micro-batch=1 - `train.py` is the same as codonfm's, copied verbatim per bionemo-recipes' KISS-over-DRY convention Validated end-to-end on 100 organelle sequences (Evo2 1B layer 12): loss 0.67 -> 0.045, FVU 0.90 -> 0.10, var_exp 0.10 -> 0.90, 2m14s wall. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../recipes/evo2/README.md | 30 ++ .../recipes/evo2/pyproject.toml | 24 ++ .../recipes/evo2/scripts/1b.sh | 116 +++++++ .../recipes/evo2/scripts/chunk_fasta.py | 73 ++++ .../recipes/evo2/scripts/pt_to_parquet.py | 65 ++++ .../recipes/evo2/scripts/train.py | 321 ++++++++++++++++++ .../recipes/evo2/src/evo2_sae/__init__.py | 16 + 7 files changed, 645 insertions(+) create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/README.md create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml create mode 100755 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/1b.sh create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/chunk_fasta.py create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/pt_to_parquet.py create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/train.py create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/README.md b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/README.md new file mode 100644 index 0000000000..ad749dbedb --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/README.md @@ -0,0 +1,30 @@ +# Evo2 SAE Recipe + +Train a sparse autoencoder on Evo2 (DNA language model) residual-stream activations. + +Pipeline: + +``` +HF Savanna ckpt --convert--> MBridge ckpt + | + predict_evo2 --embedding-layer N (FASTA in, .pt out) + | + pt_to_parquet shim (.pt -> ActivationStore parquet shards) + | + train.py (TopK SAE) +``` + +The eval / dashboard stage from the esm2 recipe is intentionally not ported in v1. + +## Quick start (1B model, single GPU) + +```bash +bash scripts/1b.sh +``` + +This will: + +1. Convert `arcinstitute/savanna_evo2_1b_base` to MBridge format +2. Run `predict_evo2` on the OpenGenome2 organelle FASTA, extracting layer-12 embeddings +3. Convert the .pt outputs to parquet shards +4. Train a TopK SAE (expansion=8, k=32) diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml new file mode 100644 index 0000000000..26eff6b55c --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml @@ -0,0 +1,24 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "evo2-sae" +version = "0.1.0" +description = "Sparse Autoencoders for the Evo2 DNA language model" +readme = "README.md" +requires-python = ">=3.10" + +dependencies = [ + "sae", + "torch>=2.0", + "numpy>=1.20", + "tqdm>=4.60", + "pyarrow>=10.0", +] + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.uv.sources] +sae = { workspace = true } diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/1b.sh b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/1b.sh new file mode 100755 index 0000000000..d499b4f365 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/1b.sh @@ -0,0 +1,116 @@ +#!/bin/bash +# Evo2 1B SAE pipeline: convert -> predict_evo2 -> pt_to_parquet -> train. +# +# Assumes: +# - bionemo-recipes/recipes/evo2_megatron has been built (.ci_build.sh) and +# its .venv is active, providing predict_evo2 + evo2_convert_savanna_to_mbridge. +# - The sae workspace package is importable in that same venv. +# - HF_TOKEN is set if Savanna checkpoint repo is gated. +# +# Override any of these by exporting before invocation. + +set -euo pipefail + +EVO2_MEGATRON_DIR="${EVO2_MEGATRON_DIR:-/workspace/bionemo-framework/bionemo-recipes/recipes/evo2_megatron}" +RECIPE_DIR="$(cd "$(dirname "$0")/.." && pwd)" + +MODEL="${MODEL:-arcinstitute/savanna_evo2_1b_base}" +MODEL_SIZE="${MODEL_SIZE:-evo2_1b_base}" +LAYER="${LAYER:-12}" +# Trained context length. 1B = 8192. Bump for 7B/40B (context-extended). +CHUNK_BP="${CHUNK_BP:-8192}" + +FASTA="${FASTA:-/data/interp/evo2/OpenGenome2/fasta/organelles/organelle_sequences.fasta.gz}" +WORK_ROOT="${WORK_ROOT:-/data/interp/evo2}" + +CKPT_DIR="${WORK_ROOT}/checkpoints/${MODEL_SIZE}_mbridge" +PREDICT_DIR="${WORK_ROOT}/activations/${MODEL_SIZE}_layer${LAYER}_pt" +PARQUET_DIR="${WORK_ROOT}/activations/${MODEL_SIZE}_layer${LAYER}_parquet" +OUTPUT_DIR="${WORK_ROOT}/sae/${MODEL_SIZE}_layer${LAYER}" + +source "${EVO2_MEGATRON_DIR}/.venv/bin/activate" + +echo "============================================================" +echo "STEP 0: Chunk FASTA to <=${CHUNK_BP} bp (model trained context)" +echo "============================================================" +# chunk_fasta.py reads .gz directly and writes plain .fasta; no separate gunzip needed. +INPUT_STEM="$(basename "$FASTA")" +INPUT_STEM="${INPUT_STEM%.gz}" +INPUT_STEM="${INPUT_STEM%.fasta}" +CHUNKED_FASTA="${WORK_ROOT}/scratch/${INPUT_STEM}_chunked${CHUNK_BP}.fasta" +if [[ -f "$CHUNKED_FASTA" ]]; then + echo "Reusing existing chunked FASTA: $CHUNKED_FASTA" +else + python "${RECIPE_DIR}/scripts/chunk_fasta.py" \ + --input "$FASTA" \ + --output "$CHUNKED_FASTA" \ + --window "$CHUNK_BP" +fi +FASTA="$CHUNKED_FASTA" + +echo "============================================================" +echo "STEP 1: Convert Savanna -> MBridge" +echo "============================================================" +if [[ ! -f "${CKPT_DIR}/latest_checkpointed_iteration.txt" ]]; then + evo2_convert_savanna_to_mbridge \ + --savanna-ckpt-path "$MODEL" \ + --mbridge-ckpt-dir "$CKPT_DIR" \ + --model-size "$MODEL_SIZE" \ + --tokenizer-path "${EVO2_MEGATRON_DIR}/tokenizers/nucleotide_fast_tokenizer_512" +else + echo "Reusing existing checkpoint at $CKPT_DIR" +fi + +echo "============================================================" +echo "STEP 2: Extract layer-${LAYER} embeddings (predict_evo2)" +echo "============================================================" +mkdir -p "$PREDICT_DIR" +if compgen -G "${PREDICT_DIR}/predictions__*.pt" > /dev/null; then + echo "Reusing existing .pt files in $PREDICT_DIR" +else + predict_evo2 \ + --fasta "$FASTA" \ + --ckpt-dir "$CKPT_DIR" \ + --output-dir "$PREDICT_DIR" \ + --embedding-layer "$LAYER" \ + --micro-batch-size 1 \ + --devices 1 \ + --write-interval batch +fi + +echo "============================================================" +echo "STEP 3: Convert .pt -> parquet ActivationStore" +echo "============================================================" +if [[ -f "${PARQUET_DIR}/metadata.json" ]]; then + echo "Reusing existing parquet shards at $PARQUET_DIR" +else + python "${RECIPE_DIR}/scripts/pt_to_parquet.py" \ + --predict-dir "$PREDICT_DIR" \ + --output "$PARQUET_DIR" \ + --model-name "$MODEL" \ + --layer "$LAYER" +fi + +echo "============================================================" +echo "STEP 4: Train TopK SAE" +echo "============================================================" +python "${RECIPE_DIR}/scripts/train.py" \ + --cache-dir "$PARQUET_DIR" \ + --model-path "$MODEL" \ + --layer "$LAYER" \ + --model-type topk \ + --expansion-factor 8 --top-k 32 \ + --auxk 64 --auxk-coef 0.03125 \ + --init-pre-bias \ + --n-epochs 3 \ + --batch-size 4096 \ + --lr 3e-4 \ + --log-interval 50 \ + --no-wandb \ + --output-dir "$OUTPUT_DIR" \ + --checkpoint-dir "${OUTPUT_DIR}/checkpoints" \ + --checkpoint-steps 999999 + +echo "============================================================" +echo "DONE: SAE checkpoint at ${OUTPUT_DIR}/checkpoints/checkpoint_final.pt" +echo "============================================================" diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/chunk_fasta.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/chunk_fasta.py new file mode 100644 index 0000000000..55b26cad30 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/chunk_fasta.py @@ -0,0 +1,73 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-Apache2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Chunk a FASTA into <=N-bp windows so predict_evo2 stays inside the model's trained context. + +Evo2 1B was trained with seq_length=8192; longer inputs OOM in the Hyena +fftconv path (intermediates scale super-linearly with L). For 7B/40B raise +--window to whatever those checkpoints were context-extended to. + +Non-overlapping windows by default. Each chunk gets a header of the form +">{orig_id}:{start}-{end}" so downstream parquet can be back-mapped. +""" + +import argparse +import gzip +from pathlib import Path + + +def parse_fasta(path: Path): + """Yield (seq_id, sequence) tuples from a FASTA file (transparently handles .gz).""" + opener = gzip.open if path.suffix == ".gz" else open + seq_id, parts = None, [] + with opener(path, "rt") as f: + for line in f: + line = line.rstrip() + if line.startswith(">"): + if seq_id is not None: + yield seq_id, "".join(parts) + seq_id = line[1:].split()[0] + parts = [] + else: + parts.append(line) + if seq_id is not None: + yield seq_id, "".join(parts) + + +def main(): + """Read input FASTA, write non-overlapping <=window-bp chunks to output FASTA.""" + p = argparse.ArgumentParser() + p.add_argument("--input", type=Path, required=True) + p.add_argument("--output", type=Path, required=True) + p.add_argument("--window", type=int, default=8192) + args = p.parse_args() + + n_in = n_out = bp_out = 0 + args.output.parent.mkdir(parents=True, exist_ok=True) + with open(args.output, "w") as out: + for seq_id, seq in parse_fasta(args.input): + n_in += 1 + for start in range(0, len(seq), args.window): + end = min(start + args.window, len(seq)) + chunk = seq[start:end] + out.write(f">{seq_id}:{start}-{end}\n{chunk}\n") + n_out += 1 + bp_out += len(chunk) + + print(f"Chunked {n_in} sequences -> {n_out} chunks ({bp_out:,} bp) at window={args.window}") + + +if __name__ == "__main__": + main() diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/pt_to_parquet.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/pt_to_parquet.py new file mode 100644 index 0000000000..6a182b575d --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/pt_to_parquet.py @@ -0,0 +1,65 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-Apache2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Convert predict_evo2 .pt outputs to SAE ActivationStore parquet shards. + +predict_evo2 with --embedding-layer writes dicts of: + hidden_embeddings: [B, S, H] (bf16) + pad_mask: [B, S] (1 = valid token, 0 = padding) + seq_idx, tokens: metadata, ignored here + +We read each file, mask out padding, flatten to [N_tokens, H], and append +to an ActivationStore so train.py's load_activations() can consume it. +""" + +import argparse +import json +from pathlib import Path + +import torch +from sae.activation_store import ActivationStore, ActivationStoreConfig +from tqdm import tqdm + + +def main(): + """Walk predict_evo2 .pt files, mask padding, and write to an ActivationStore.""" + p = argparse.ArgumentParser() + p.add_argument("--predict-dir", type=Path, required=True, help="Dir containing predictions__*.pt") + p.add_argument("--output", type=Path, required=True, help="ActivationStore output dir") + p.add_argument("--model-name", type=str, required=True, help="Stamped into metadata.json") + p.add_argument("--layer", type=int, required=True, help="Stamped into metadata.json") + p.add_argument("--shard-size", type=int, default=100_000) + args = p.parse_args() + + pt_files = sorted(args.predict_dir.rglob("predictions__*.pt")) + if not pt_files: + raise FileNotFoundError(f"No predictions__*.pt under {args.predict_dir}") + + store = ActivationStore(args.output, ActivationStoreConfig(shard_size=args.shard_size)) + n_sequences = 0 + for pt in tqdm(pt_files, desc="pt->parquet"): + d = torch.load(pt, map_location="cpu", weights_only=False) + hidden = d["hidden_embeddings"] + mask = d["pad_mask"].bool() + flat = hidden[mask].float() + store.append(flat) + n_sequences += hidden.shape[0] + + store.finalize(metadata={"model_name": args.model_name, "layer": args.layer, "n_sequences": n_sequences}) + print(json.dumps(store.metadata, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/train.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/train.py new file mode 100644 index 0000000000..19355822ae --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/train.py @@ -0,0 +1,321 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-Apache2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Step 2: Train SAE from cached CodonFM activations. + +Loads pre-extracted activations from an ActivationStore cache directory +and trains a Sparse Autoencoder. Requires extract.py to have been run first. + +Single-GPU: + python scripts/train.py \ + --cache-dir .cache/activations/encodon_1b_layer-2 \ + --model-path path/to/encodon_1b --layer -2 \ + --expansion-factor 8 --top-k 32 --batch-size 4096 --n-epochs 3 + +Multi-GPU DDP: + torchrun --nproc_per_node=4 scripts/train.py \ + --cache-dir .cache/activations/encodon_1b_layer-2 \ + --model-path path/to/encodon_1b --layer -2 \ + --expansion-factor 8 --top-k 32 --batch-size 4096 --n-epochs 3 \ + --dp-size 4 +""" + +import argparse +import os +from pathlib import Path + +import numpy as np +import torch +from sae.activation_store import load_activations +from sae.architectures import ReLUSAE, TopKSAE +from sae.perf_logger import PerfLogger +from sae.training import ParallelConfig, Trainer, TrainingConfig, WandbConfig +from sae.utils import get_device, set_seed + + +def parse_args(): # noqa: D103 + p = argparse.ArgumentParser( + description="Train SAE from cached CodonFM activations", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + ) + + # Required + p.add_argument("--cache-dir", type=str, required=True, help="Path to activation cache (from extract.py)") + p.add_argument("--model-path", type=str, required=True, help="Encodon model path (for cache validation)") + p.add_argument("--layer", type=int, required=True, help="Layer index (for cache validation)") + + # SAE architecture + sae_group = p.add_argument_group("SAE model") + sae_group.add_argument("--model-type", type=str, default="topk", choices=["topk", "relu"]) + sae_group.add_argument("--expansion-factor", type=int, default=8) + sae_group.add_argument("--top-k", type=int, default=32) + sae_group.add_argument("--normalize-input", action=argparse.BooleanOptionalAction, default=False) + sae_group.add_argument("--auxk", type=int, default=None) + sae_group.add_argument("--auxk-coef", type=float, default=1 / 32) + sae_group.add_argument("--dead-tokens-threshold", type=int, default=10_000_000) + sae_group.add_argument("--init-pre-bias", action=argparse.BooleanOptionalAction, default=False) + sae_group.add_argument("--l1-coeff", type=float, default=1e-2, help="L1 coefficient (relu only)") + + # Training + train_group = p.add_argument_group("Training") + train_group.add_argument("--lr", type=float, default=3e-4) + train_group.add_argument("--n-epochs", type=int, default=3) + train_group.add_argument("--batch-size", type=int, default=4096) + train_group.add_argument("--log-interval", type=int, default=50) + train_group.add_argument("--shuffle", action=argparse.BooleanOptionalAction, default=True) + train_group.add_argument("--num-workers", type=int, default=0) + train_group.add_argument("--pin-memory", action=argparse.BooleanOptionalAction, default=False) + train_group.add_argument("--max-grad-norm", type=float, default=None) + train_group.add_argument("--lr-scale-with-latents", action=argparse.BooleanOptionalAction, default=False) + train_group.add_argument("--lr-reference-hidden-dim", type=int, default=2048) + train_group.add_argument("--warmup-steps", type=int, default=0, help="Linear LR warmup steps") + train_group.add_argument( + "--lr-schedule", + type=str, + default="constant", + choices=["constant", "cosine", "linear"], + help="LR schedule after warmup", + ) + train_group.add_argument("--lr-min", type=float, default=0.0, help="Minimum LR for decay schedules") + train_group.add_argument( + "--lr-decay-steps", + type=int, + default=None, + help="Total steps for LR decay (None = full training)", + ) + + # W&B + wb_group = p.add_argument_group("Weights & Biases") + wb_group.add_argument("--wandb", action=argparse.BooleanOptionalAction, default=False, dest="wandb_enabled") + wb_group.add_argument("--wandb-project", type=str, default="sae_codonfm_recipe") + wb_group.add_argument("--wandb-run-name", type=str, default=None) + wb_group.add_argument("--wandb-group", type=str, default=None) + wb_group.add_argument("--wandb-job-type", type=str, default=None) + + # Checkpointing + ckpt_group = p.add_argument_group("Checkpointing") + ckpt_group.add_argument("--checkpoint-dir", type=str, default=None) + ckpt_group.add_argument("--checkpoint-steps", type=int, default=None) + ckpt_group.add_argument("--resume-from", type=str, default=None) + + # Infrastructure + p.add_argument("--dp-size", type=int, default=1) + p.add_argument("--output-dir", type=str, default="./outputs") + p.add_argument("--seed", type=int, default=42) + p.add_argument("--device", type=str, default=None) + p.add_argument( + "--num-sequences", + type=int, + default=None, + help="Subset cached activations to this many sequences' worth of shards", + ) + + return p.parse_args() + + +def build_sae(args, input_dim: int) -> torch.nn.Module: # noqa: D103 + hidden_dim = input_dim * args.expansion_factor + + if args.model_type == "topk": + return TopKSAE( + input_dim=input_dim, + hidden_dim=hidden_dim, + top_k=args.top_k, + normalize_input=args.normalize_input, + auxk=args.auxk, + auxk_coef=args.auxk_coef, + dead_tokens_threshold=args.dead_tokens_threshold, + ) + elif args.model_type == "relu": + return ReLUSAE( + input_dim=input_dim, + hidden_dim=hidden_dim, + l1_coeff=args.l1_coeff, + ) + else: + raise ValueError(f"Unknown model type: {args.model_type}") + + +def build_training_config(args, device: str) -> TrainingConfig: # noqa: D103 + return TrainingConfig( + lr=args.lr, + n_epochs=args.n_epochs, + batch_size=args.batch_size, + device=device, + log_interval=args.log_interval, + shuffle=args.shuffle, + num_workers=args.num_workers, + pin_memory=args.pin_memory, + checkpoint_dir=args.checkpoint_dir, + checkpoint_steps=args.checkpoint_steps, + lr_scale_with_latents=args.lr_scale_with_latents, + lr_reference_hidden_dim=args.lr_reference_hidden_dim, + warmup_steps=args.warmup_steps, + max_grad_norm=args.max_grad_norm, + lr_schedule=args.lr_schedule, + lr_min=args.lr_min, + lr_decay_steps=args.lr_decay_steps, + ) + + +def build_wandb_config(args) -> WandbConfig: # noqa: D103 + return WandbConfig( + enabled=args.wandb_enabled, + project=args.wandb_project, + run_name=args.wandb_run_name, + group=args.wandb_group, + job_type=args.wandb_job_type, + config=vars(args), + ) + + +def build_parallel_config(args) -> ParallelConfig: # noqa: D103 + return ParallelConfig(dp_size=args.dp_size) + + +def main(): # noqa: D103 + args = parse_args() + + set_seed(args.seed) + device = args.device or get_device() + print(f"Using device: {device}") + print(f"Config: {vars(args)}") + + # Load cached activations + cache_path = Path(args.cache_dir) + if not (cache_path / "metadata.json").exists(): + raise FileNotFoundError(f"No cache found at {cache_path}. Run extract.py first.") + + store = load_activations(cache_path) + meta = store.metadata + + # Validate cache matches config + cached_model = meta.get("model_path", meta.get("model_name", "")) + if cached_model and cached_model != args.model_path: + print(f"WARNING: Cache model '{cached_model}' != '{args.model_path}'") + if meta.get("layer") != args.layer: + raise ValueError(f"Cache layer mismatch: {meta['layer']} vs {args.layer}") + + # Compute subsetting + cached_sequences = meta.get("n_sequences", None) + max_shards = None + if args.num_sequences and cached_sequences and args.num_sequences < cached_sequences: + keep_ratio = args.num_sequences / cached_sequences + max_shards = max(1, int(np.ceil(keep_ratio * meta["n_shards"]))) + print( + f"Subsetting: {args.num_sequences}/{cached_sequences} sequences " + f"-> using {max_shards}/{meta['n_shards']} shards (~{keep_ratio:.1%})" + ) + + # Estimate memory + n_shards_to_use = max_shards or meta["n_shards"] + shard_size = meta.get("shard_size", 100_000) + est_tokens = n_shards_to_use * shard_size + est_gb = est_tokens * meta["hidden_dim"] * 4 / (1024**3) + use_streaming = est_gb > 50 + + input_dim = meta["hidden_dim"] + sae = build_sae(args, input_dim) + print(f"SAE: {args.model_type}, input_dim={input_dim}, hidden_dim={sae.hidden_dim}") + + # Initialize pre_bias + if args.init_pre_bias and hasattr(sae, "init_pre_bias_from_data"): + print("Initializing pre_bias from geometric median of data...") + first_shard = torch.from_numpy(store._load_shard(0)).float() + sample_size = min(32768, len(first_shard)) + sae.init_pre_bias_from_data(first_shard[:sample_size]) + print(f" pre_bias initialized (mean={sae.pre_bias.mean().item():.4f})") + del first_shard + + # Build configs + training_config = build_training_config(args, device) + wandb_config = build_wandb_config(args) + parallel_config = build_parallel_config(args) + + perf_logger = PerfLogger( + log_interval=args.log_interval, + use_wandb=args.wandb_enabled, + print_logs=True, + device=device, + ) + + # Train + trainer = Trainer( + sae, + training_config, + wandb_config=wandb_config, + perf_logger=perf_logger, + parallel_config=parallel_config, + ) + + if use_streaming: + rank = int(os.environ.get("RANK", 0)) + world_size = int(os.environ.get("WORLD_SIZE", 1)) + print( + f"Streaming from disk (~{est_gb:.0f}GB). " + f"Peak RAM: ~{shard_size * meta['hidden_dim'] * 4 / (1024**3):.1f}GB/process" + ) + + dataloader = store.get_streaming_dataloader( + batch_size=args.batch_size, + shuffle=args.shuffle, + seed=args.seed, + rank=rank, + world_size=world_size, + max_shards=max_shards, + ) + # Compute min batch count across all ranks to keep DDP in sync + # Read parquet footers for all ranks' shards (a few KB each, no data loading) + if world_size > 1: + import pyarrow.parquet as pq_meta + + dataset = dataloader.dataset + per_rank = len(dataset.shard_indices) + # Each rank got per_rank contiguous shards; compute batch count for each rank + min_batches = None + for r in range(world_size): + total_rows = sum( + pq_meta.read_metadata(store.path / f"shard_{idx:05d}.parquet").num_rows + for idx in range(r * per_rank, (r + 1) * per_rank) + ) + batches = total_rows // args.batch_size + if min_batches is None or batches < min_batches: + min_batches = batches + dataset.max_batches = min_batches + print(f"[rank {rank}] capped to {min_batches} batches/epoch for DDP sync") + trainer.fit( + dataloader, + resume_from=args.resume_from, + data_sharded=True, + ) + else: + shards = [] + for i, shard in enumerate(store.iter_shards(shuffle_shards=False)): + if max_shards is not None and i >= max_shards: + break + shards.append(torch.from_numpy(shard).float()) + activations_flat = torch.cat(shards) + print(f"Loaded {activations_flat.shape[0]:,} cached activations into memory") + + trainer.fit( + activations_flat, + resume_from=args.resume_from, + ) + + print("Training complete.") + + +if __name__ == "__main__": + main() diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py new file mode 100644 index 0000000000..d8ac513dc8 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py @@ -0,0 +1,16 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-Apache2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Sparse autoencoders for the Evo2 DNA language model.""" From 5edbf6ef0d8b658d5cc24a1b36dff634237689fc Mon Sep 17 00:00:00 2001 From: Polina Binder Date: Tue, 26 May 2026 21:14:43 +0000 Subject: [PATCH 03/12] evo2 recipe: drop empty src/evo2_sae package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The recipe currently has no model-specific Python module — the extractor is upstream (`predict_evo2`) and the two scripts are simple CLIs in scripts/. Drop the empty package and adjust pyproject.toml so setuptools doesn't try to discover anything. Will reintroduce when there's actual library code to put there (eval, dashboard, dataloaders). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../recipes/evo2/pyproject.toml | 7 +++++-- .../recipes/evo2/src/evo2_sae/__init__.py | 16 ---------------- 2 files changed, 5 insertions(+), 18 deletions(-) delete mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml index 26eff6b55c..1f00a62bc5 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/pyproject.toml @@ -17,8 +17,11 @@ dependencies = [ "pyarrow>=10.0", ] -[tool.setuptools.packages.find] -where = ["src"] +# No package code lives here yet — the recipe is just an entry-point for +# scripts/ that depends on the shared `sae` workspace package. Declare no +# packages so setuptools doesn't try to discover anything. +[tool.setuptools] +packages = [] [tool.uv.sources] sae = { workspace = true } diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py deleted file mode 100644 index d8ac513dc8..0000000000 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/src/evo2_sae/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: LicenseRef-Apache2 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Sparse autoencoders for the Evo2 DNA language model.""" From efbb7e07834c48f17bfb0b30ee58ec255a4a865b Mon Sep 17 00:00:00 2001 From: Polina Binder Date: Tue, 26 May 2026 22:48:45 +0000 Subject: [PATCH 04/12] evo2 recipe: add v1 SAE dashboard mockup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fork of recipes/codonfm/codon_dashboard adapted for DNA + Evo 2, populated with synthetic data. Demo-able artifact, not a real result. What's here: - scripts/make_mockup_features.py: deterministic synthetic data generator (seed 42). Writes features_atlas.parquet, feature_metadata.parquet, feature_examples.parquet to evo2_dashboard_mockup/public/. Fixtures are committed for one-step npm-only setup. - evo2_dashboard_mockup/: Vite/React SPA forked from codon_dashboard with these swaps: * Removed molstar dep + MolstarThumbnail.jsx * Renamed ProteinSequence.jsx -> SequenceView.jsx; per-base rendering (no codon framing, no AA translation) * Renamed ProteinDetailModal.jsx -> RegionDetailModal.jsx; UniProt content swapped for genomic-region content * utils.js: getRegionLabel + parseBases (replacing getAccession/uniprotUrl/parseCodons/codonToAA) * MOCKUP banner at top of App * "Evo 2 SAE Feature Explorer (Mockup)" title - v2 roadmap placeholders (greyed em-dashes with hover tooltips): * FeatureCard: Annotation, Sensitivity, Recon Δ stats * FeatureDetailPage: Annotations, Conservation sections Quick start: cd evo2_dashboard_mockup && npm install && npm run dev The synthetic data schema is the contract the future real eval pipeline will need to target. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../evo2/evo2_dashboard_mockup/README.md | 55 + .../evo2/evo2_dashboard_mockup/index.html | 104 + .../evo2_dashboard_mockup/package-lock.json | 6366 +++++++++++++++++ .../evo2/evo2_dashboard_mockup/package.json | 24 + .../public/feature_examples.parquet | Bin 0 -> 182767 bytes .../public/feature_metadata.parquet | Bin 0 -> 6558 bytes .../public/features_atlas.parquet | Bin 0 -> 6558 bytes .../evo2/evo2_dashboard_mockup/src/App.jsx | 1639 +++++ .../src/EmbeddingView.jsx | 334 + .../evo2_dashboard_mockup/src/FeatureCard.jsx | 793 ++ .../src/FeatureDetailPage.jsx | 522 ++ .../evo2_dashboard_mockup/src/FeatureList.jsx | 83 + .../evo2_dashboard_mockup/src/Histogram.jsx | 85 + .../evo2_dashboard_mockup/src/InfoButton.jsx | 78 + .../src/RegionDetailModal.jsx | 157 + .../src/SequenceView.jsx | 267 + .../evo2/evo2_dashboard_mockup/src/index.jsx | 9 + .../evo2/evo2_dashboard_mockup/src/utils.js | 22 + .../evo2/evo2_dashboard_mockup/vite.config.js | 13 + .../evo2/scripts/make_mockup_features.py | 239 + 20 files changed, 10790 insertions(+) create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/README.md create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/index.html create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_examples.parquet create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_metadata.parquet create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/features_atlas.parquet create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/App.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/EmbeddingView.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureList.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Histogram.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/InfoButton.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/RegionDetailModal.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/SequenceView.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/index.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/utils.js create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/vite.config.js create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/README.md b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/README.md new file mode 100644 index 0000000000..b0c15231cc --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/README.md @@ -0,0 +1,55 @@ +# Evo 2 SAE Feature Explorer — Mockup + +**Mockup, not a real artifact.** This is a fork of `recipes/codonfm/codon_dashboard` adapted for DNA / Evo 2, populated with **synthetic data**. No real SAE outputs flow through it yet. The point of this v1 is to lock in the data contract that the future real eval pipeline will target. + +A `MOCKUP — synthetic data, not from a real SAE run` banner is rendered at the top of the app so nobody mistakes it for actual results. + +## Quick start (local) + +```bash +# In this directory: +npm install +npm run dev +# open http://localhost:5173 +``` + +The dashboard reads three parquet fixtures from `public/`: + +- `features_atlas.parquet` — UMAP coordinates + per-feature aggregates +- `feature_metadata.parquet` — feature label/stats table +- `feature_examples.parquet` — long table of (feature_id, example_rank, sequence_id, start, end, sequence, activations, ...) rows + +The fixtures are committed to the repo. To regenerate them: + +```bash +python ../scripts/make_mockup_features.py +``` + +That writes all three files into `public/`. Seed is fixed (`--seed 42`). + +## What's mocked vs. real + +| Thing | Source | +| ------------------------------------ | --------------------------------------------------------------- | +| Number of features | 20, hardcoded | +| Feature labels | Hardcoded biological-sounding strings | +| UMAP coordinates | 4 cluster centers + gaussian noise — fake but visibly clustered | +| Top activator windows | Random `ACGT` with a label-matching central motif spliced in | +| Per-token activations | Gaussian bump centered randomly in [80, 120], sigma ~= 8 bp | +| Vocab logits (promoted / suppressed) | Empty arrays — not in scope for v1 | + +## v2 roadmap placeholders + +A few greyed-out stats on each feature card (`Annotation`, `Sensitivity`, `Recon Δ`) and two empty sections on the feature detail page (`Annotations`, `Conservation`) hint at what's coming in v2. They render as em-dashes / dashed empty boxes with hover tooltips explaining what they'll show. + +## Out of scope (v1) + +- Real SAE inference or activation pass +- Annotation overlays (RefSeq / Rfam / JASPAR) +- Conservation tracks (phyloP) +- Strand handling, codon framing, chromosome ideograms +- External link-outs (UCSC, Ensembl) +- `sae.launch_dashboard()` Python wiring — run `npm run dev` directly +- Lepton-based serving + +These are deferred to v2, once the real eval pipeline produces matching parquet shapes. diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/index.html b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/index.html new file mode 100644 index 0000000000..5d09d6738d --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/index.html @@ -0,0 +1,104 @@ + + + + + + Evo 2 SAE Feature Explorer (Mockup) + + + +
+ + + diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json new file mode 100644 index 0000000000..8bb23148d4 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json @@ -0,0 +1,6366 @@ +{ + "name": "protein-dashboard", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "protein-dashboard", + "version": "0.1.0", + "dependencies": { + "@uwdata/mosaic-core": "^0.21.1", + "@uwdata/mosaic-sql": "^0.21.1", + "@uwdata/vgplot": "^0.21.1", + "embedding-atlas": "^0.16.1", + "lucide-react": "^0.577.0", + "molstar": "^4.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.2.0", + "vite": "^5.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@duckdb/duckdb-wasm": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@duckdb/duckdb-wasm/-/duckdb-wasm-1.30.0.tgz", + "integrity": "sha512-9aWrm+4ayl4sTlvGtl/b+LxrUyXaac3yyVqkoJ3F7Vkd62PoS8PcQIRJ/KjXBW36LP1CnPY5jjvFyIcTFLtcXA==", + "license": "MIT", + "dependencies": { + "apache-arrow": "^17.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@observablehq/plot": { + "version": "0.6.17", + "resolved": "https://registry.npmjs.org/@observablehq/plot/-/plot-0.6.17.tgz", + "integrity": "sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==", + "license": "ISC", + "dependencies": { + "d3": "^7.9.0", + "interval-tree-1d": "^1.0.0", + "isoformat": "^0.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/argparse": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-2.0.17.tgz", + "integrity": "sha512-fueJssTf+4dW4HODshEGkIZbkLKHzgu1FvCI4cTc/MKum/534Euo3SrN+ilq8xgyHnOjtmg33/hee8iXLRg1XA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/benchmark": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", + "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==", + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "license": "MIT" + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "license": "MIT" + }, + "node_modules/@types/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==", + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.13.tgz", + "integrity": "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/swagger-ui-dist": { + "version": "3.30.5", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-dist/-/swagger-ui-dist-3.30.5.tgz", + "integrity": "sha512-SrXhD9L8qeIxJzN+o1kmf3wXeVf/+Km3jIdRM1+Yq3I5b/dlF5TcGr5WCVM7I/cBYpgf43/gCPIucQ13AhICiw==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@uwdata/flechette": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@uwdata/flechette/-/flechette-2.3.0.tgz", + "integrity": "sha512-FdTqVEJZL4MwTv+vY1jOUMW2i5pr/G5S4BGdmQ/7wSOCtA0I74UP117kzXiKe1FrB5+ydM4tFxrCdF8Dq9WgNA==", + "license": "BSD-3-Clause" + }, + "node_modules/@uwdata/mosaic-core": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-core/-/mosaic-core-0.21.1.tgz", + "integrity": "sha512-nRh93+A7U/06x/6boSLUUaSCo4pkNAjOgV8P2Zl6ZZeF5pWynLcSqT30WLQPx+VewTvFgJGCymocymdbirFxYw==", + "license": "BSD-3-Clause", + "dependencies": { + "@duckdb/duckdb-wasm": "1.30.0", + "@uwdata/flechette": "^2.2.5", + "@uwdata/mosaic-sql": "^0.21.1" + } + }, + "node_modules/@uwdata/mosaic-inputs": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-inputs/-/mosaic-inputs-0.21.1.tgz", + "integrity": "sha512-9h/PFk71QL5+Nhqsai9pqVdnHUQb8OAemZrPossbfvb3q62o7RpU+jMwxcAId4uB/qRTAFxr0LgRfoPxrjfZYg==", + "license": "BSD-3-Clause", + "dependencies": { + "@uwdata/mosaic-core": "^0.21.1", + "@uwdata/mosaic-sql": "^0.21.1" + } + }, + "node_modules/@uwdata/mosaic-plot": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-plot/-/mosaic-plot-0.21.1.tgz", + "integrity": "sha512-ZPBD0Km44VIexZ7l88n1yWh8QpVJakJnmkyq6zr8aujw2i2+MkrcI8Abc2aPJ74o2YiSb9hMKxno83nB/Mfy7A==", + "license": "BSD-3-Clause", + "dependencies": { + "@observablehq/plot": "^0.6.17", + "@uwdata/mosaic-core": "^0.21.1", + "@uwdata/mosaic-sql": "^0.21.1", + "d3": "^7.9.0" + } + }, + "node_modules/@uwdata/mosaic-spec": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-spec/-/mosaic-spec-0.21.1.tgz", + "integrity": "sha512-DSc1Cgg5WdYaVzZIDE5mUlNtDEwus84iCfgLfEf3v69X31/8tD03y1Aii8K8sbjzqP5kkgOVV8GA419THn7N2w==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@uwdata/mosaic-core": "^0.21.1", + "@uwdata/mosaic-sql": "^0.21.1", + "@uwdata/vgplot": "^0.21.1", + "ts-json-schema-generator": "^2.4.0" + } + }, + "node_modules/@uwdata/mosaic-sql": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@uwdata/mosaic-sql/-/mosaic-sql-0.21.1.tgz", + "integrity": "sha512-2B4Dle4odyxIaBaDVRfQchebH/CUZvUV8kIwKF3V2GksQoF8KYY/Q6zTLTJhYrDEdUkt8M0OIy4U/Ntw93CV1A==", + "license": "BSD-3-Clause" + }, + "node_modules/@uwdata/vgplot": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@uwdata/vgplot/-/vgplot-0.21.1.tgz", + "integrity": "sha512-R+CFYeTPdNoMzMAxNwt7coTqcWWY6aOKUj28SqkQ4dbL3Ig37RjCnRDcpFzCqvxaSeOwZRXQ1Ld3WhnagqDh/Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@uwdata/mosaic-core": "^0.21.1", + "@uwdata/mosaic-inputs": "^0.21.1", + "@uwdata/mosaic-plot": "^0.21.1", + "@uwdata/mosaic-sql": "^0.21.1" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/apache-arrow": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-17.0.0.tgz", + "integrity": "sha512-X0p7auzdnGuhYMVKYINdQssS4EcKec9TCXyez/qtJt32DrIMGbzqiaMiQ0X6fQlQpw8Fl0Qygcv4dfRAr5Gu9Q==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/command-line-args": "^5.2.3", + "@types/command-line-usage": "^5.0.4", + "@types/node": "^20.13.0", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^24.3.25", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" + }, + "bin": { + "arrow2csv": "bin/arrow2csv.cjs" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "is-string": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001769", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", + "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT", + "peer": true + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.286", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/embedding-atlas": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/embedding-atlas/-/embedding-atlas-0.16.1.tgz", + "integrity": "sha512-ab4LsqiW+YMiFkf5LIv/e0fATGZh9AloScfRvTB39eOPp+MwS7ncOV3Xd4EdLS0RyYP3ZlBHR2tuGFYwN9yayg==", + "license": "MIT", + "peerDependencies": { + "@uwdata/mosaic-core": ">=0.19.0", + "@uwdata/mosaic-spec": ">=0.19.0", + "@uwdata/mosaic-sql": ">=0.19.0", + "@uwdata/vgplot": ">=0.19.0", + "react": ">=17.0.0", + "svelte": ">=5.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "svelte": { + "optional": true + } + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/flatbuffers": { + "version": "24.12.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.12.23.tgz", + "integrity": "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==", + "license": "Apache-2.0" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fp-ts": { + "version": "2.16.11", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz", + "integrity": "sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==", + "license": "MIT", + "peer": true + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/h264-mp4-encoder": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/h264-mp4-encoder/-/h264-mp4-encoder-1.0.12.tgz", + "integrity": "sha512-xih3J+Go0o1RqGjhOt6TwXLWWGqLONRPyS8yoMu/RoS/S8WyEv4HuHp1KBsDDl8srZQ3gw9f95JYkCSjCuZbHQ==", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/interval-tree-1d": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz", + "integrity": "sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==", + "license": "MIT", + "dependencies": { + "binary-search-bounds": "^2.0.0" + } + }, + "node_modules/io-ts": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.22.tgz", + "integrity": "sha512-FHCCztTkHoV9mdBsHpocLpdTAfh956ZQcIkWQxxS0U5HT53vtrcuYdQneEJKH6xILaLNzXVl2Cvwtoy8XNN0AA==", + "license": "MIT", + "peerDependencies": { + "fp-ts": "^2.5.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isoformat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/isoformat/-/isoformat-0.2.1.tgz", + "integrity": "sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==", + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.577.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", + "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/molstar": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/molstar/-/molstar-4.18.0.tgz", + "integrity": "sha512-mU2da9laqdFtGKGCqOyFywCAxuvRYevOMFjrX/6RwIUd+HB5yOpbLXXRA5ErVadHXLTlEYOutCzNv+AwvmrfmA==", + "license": "MIT", + "dependencies": { + "@types/argparse": "^2.0.17", + "@types/benchmark": "^2.1.5", + "@types/compression": "1.8.1", + "@types/express": "^5.0.3", + "@types/node": "^18.19.111", + "@types/node-fetch": "^2.6.12", + "@types/swagger-ui-dist": "3.30.5", + "argparse": "^2.0.1", + "compression": "^1.8.0", + "cors": "^2.8.5", + "express": "^5.1.0", + "h264-mp4-encoder": "^1.0.12", + "immer": "^10.1.1", + "immutable": "^5.1.2", + "io-ts": "^2.2.22", + "node-fetch": "^2.7.0", + "react-markdown": "^10.1.0", + "rxjs": "^7.8.2", + "swagger-ui-dist": "^5.24.0", + "tslib": "^2.8.1", + "util.promisify": "^1.1.3" + }, + "bin": { + "cif2bcif": "lib/commonjs/cli/cif2bcif/index.js", + "cifschema": "lib/commonjs/cli/cifschema/index.js", + "model-server": "lib/commonjs/servers/model/server.js", + "model-server-preprocess": "lib/commonjs/servers/model/preprocess.js", + "model-server-query": "lib/commonjs/servers/model/query.js", + "mvs-print-schema": "lib/commonjs/cli/mvs/mvs-print-schema.js", + "mvs-render": "lib/commonjs/cli/mvs/mvs-render.js", + "mvs-validate": "lib/commonjs/cli/mvs/mvs-validate.js", + "volume-server": "lib/commonjs/servers/volume/server.js", + "volume-server-pack": "lib/commonjs/servers/volume/pack.js", + "volume-server-query": "lib/commonjs/servers/volume/query.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@google-cloud/storage": "^7.14.0", + "canvas": "^2.11.2", + "gl": "^6.0.2", + "jpeg-js": "^0.4.4", + "pngjs": "^6.0.0", + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + }, + "peerDependenciesMeta": { + "@google-cloud/storage": { + "optional": true + }, + "canvas": { + "optional": true + }, + "gl": { + "optional": true + }, + "jpeg-js": { + "optional": true + }, + "pngjs": { + "optional": true + } + } + }, + "node_modules/molstar/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/molstar/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz", + "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.8", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "gopd": "^1.2.0", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz", + "integrity": "sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-json-schema-generator": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.5.0.tgz", + "integrity": "sha512-sYY7AInozRbtj9OD3ynJJuMDWZ5lGxzxTevtmH3W9Hnd2J2szBC0HdPqSyuIirXnQ6g8KDJxS/HENoypUwBrlg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15", + "commander": "^14.0.2", + "json5": "^2.2.3", + "normalize-path": "^3.0.0", + "safe-stable-stringify": "^2.5.0", + "tslib": "^2.8.1", + "typescript": "^5.9.3" + }, + "bin": { + "ts-json-schema-generator": "bin/ts-json-schema-generator.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/ts-json-schema-generator/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util.promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.3.tgz", + "integrity": "sha512-GIEaZ6o86fj09Wtf0VfZ5XP7tmd4t3jM5aZCgmBi231D0DB1AEBa3Aa6MP48DMsAIi96WkpWLimIWVwOjbDMOw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "for-each": "^0.3.3", + "get-intrinsic": "^1.2.6", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "object.getownpropertydescriptors": "^2.1.8", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wordwrapjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json new file mode 100644 index 0000000000..82810c8cd0 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json @@ -0,0 +1,24 @@ +{ + "name": "evo2-dashboard-mockup", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@uwdata/mosaic-core": "^0.21.1", + "@uwdata/mosaic-sql": "^0.21.1", + "@uwdata/vgplot": "^0.21.1", + "embedding-atlas": "^0.16.1", + "lucide-react": "^0.577.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.2.0", + "vite": "^5.0.0" + } +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_examples.parquet b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_examples.parquet new file mode 100644 index 0000000000000000000000000000000000000000..ca2ebe2cb452aa3812e9c6b1faf872f4f8e6dae9 GIT binary patch literal 182767 zcmeFZXINCp*XY|ztFSkr1r)^0Qnt`4iWwC{i7m7_pkk(!R@$6%+K#Pa&f*w`R#7mG z3CBFNih`nI#tbTknK8{6FwA(?p7;OWd(Lz2b3fg0_srui=0)$oy4>h0L6?y(g)VoxJm~VI%Zn}(T_x%A zrpw367(t```(LU5{PZ*U#reh8^xLQSdHcEfxm5@-{`W@##{cv&_!~n0AKvxxq0hrk z6sLBd0zASH0TIO_ibt>r9^n>IBElGI*m8Q#&E`Pep&=o*eS-Q&6Ri1=U;XfOz_@AF7ggI`0x8Q#f z!+(GHzl!01fA?Q8XvN=l|8GIe3S1x-HV#S4{Bc^?1?#Sp;lE#MY8<$HpsDT9{m&{b z9(!$Q?aNdDGR+Ctmh{8Q-n);M*t+r1-9-l-y#0%&VP553~zt>&yI@Cn%gyI&sAPJ zD!%zd-n7GttYw?S`TB9=GegTL3-iv`9r@;XnIAQbp&c zt%lGlPmVR%{GoJcm-roTtF##P`Q!FU!zP!Wa^sg5B{qDo_~YZaGM{&~8fB?G>CUs* zN-gEEK3is_jhfhe*3)pUYrA1bmRufjwrmAstIW{@s`h(VS?T9$y*6&-fW*cXGUQqk z#q4%|Sz+yU^VJZ)yNA&O2BSN_ZL;O$g#fW9`wcsXhK@8ESv6T%20diDJ|q z90=4NT3M4?@moV`r~J^C+W9R5sXczU1hr3YFlskSUuuJzH>37hMkKXy_1jZB_GU|J zlcGvv3GuE7J0`JpB0vyb;0(`QE?DOtu1E6m)Rx&5ZZ8vDjqqOONE>oS;{9`}{m#%CWY(2&O;gwv3XI)+e(H&?6y#?}ou-Erhw6?$Vp8FL7`HbxoE zLatcDjOm~1&>fo}*QbvzNF|S5eP9kSx;FdKY%eY_S;_L_@W z^m|%s%^6COvDx(|JdpKVVC`(&Hc%m%=A|j4jnn-q)32%Sc5n8DTfEMEUd0O`T z+DOaZR$Yl^5Kf|LQe@6DRwx!t18+|;2e34YJ=IvZxjzley3yyBb4my^el`cP=28h` zeJ7Lh>NHk5vqeeDY-ZXJ%kT28rEJj=do7hlw>w& zV`75wY*i~q_Tv$A7#ov8qh8NR9L;jhDc;Pr%9_QZ_9+Wk@@$gNmU4*(*5d`ew|#~+ z-}r8a;IVAW9U7;~O0wkV2dv)g-J8TDHfSAfqiz{8z70M~5_{aA8rIluWJg>yYNc_B z(d>C!Qss(Fx;J!@eL2fNL~~wDHhZ%fm#wKRG>BHX=x37H??xqoJvv8AF#Vl2o6Yd0 ziEh<3FJ}#FD;X^FlM=`Fw>Ix%QV|D#GSYxa*djvcD5>|;LTsPndt)?7Aj zm~{bb<7OxOMCx~XiL#uXEM+#bCm!}J*591gl6lpn&e|zb_~S`5TNtN1QZ6SZu5nqf-m<$fX(8

Nd`PMA9W?Wh-TXTbiF}odU-s=ZzH0vKjrr&#;y)!F)CM|)*Hl+D|vh534 z8#P$@k#<6}e zWKxbsFY}GJiq})`u!ov`AKP<=bh6Y+!)R+s=RIDK%zqzD>sS*+O->S-|MvAt0#mmu zomur^N**h@Qz>HR<+Qd1Z|q5I*C^6MWK%NU?MX^Y<`U*CW-MV}&XyFCvE_YAOklpL zs&RKiXqi3Xt}~)+%vq_$B_6 z(XcMZ>N0k!9L0TD;{!@K+fbE^2~)}A*Eq}xtkxS6T=EQB;jrT*<^D}x7O^IIX<2Oi z&*m_;VyHRVaC=WQ+qji9eAJJoiyo(Bv7LXBoy-C2a@IVGG}6B*eVUR-BYo;g`>(T_ zx@26nhp=6Vq@Wig%vo&IdUGDbPH9Hw89^_5pQHu0XhVv0{!9)XHih=;`ClQ2w4mz5j@&`@Th!GHRD3J>+Ci7}`JD|AmpId(b^oD$yF!^#uIe z^2E+8FOwAZmr4%!a1oio!*e9UiXZKHEUp2quyhWsI`KG3e|;=TB5zN2OZLh;F`50= zmv+6i8%2Yqvq)IOj*+vE1yx&fVays>p3=~Oq@M>O?Fe&u(g+PZ(9Vm+ zlNb+HrF|UiP3D`j=jC$t+Z=OeR_B^Ij@4U7D-CO?6EZs4`G1+0|?zH5L zb~M{YlM=$(cQwbdM{7ukt&aIe8`;h{iVPF}Aro&>#rlFd1Jeww_eTFz6APG5LRoex zJB%G)LE1RegEaKLIT>-y+cfFS71>#AOgs&{c>wMI!B?d-V>_wenC<2Ow(~RH3kOI} zBmGDZf334pv3EB+jy3*ZAI(}1_s{iUu4d#k858Y+tbZ4OZzH?;x4DQFURSbMw=(89 z19UL5^DV7KY}`g#cDq@$i~ix}Ja%hiVlaEs)G4Fk*PD%y?VbEI-zb_vD69xqs(=6@({V>4TJM7QH{#BCg+EO`V~Tj6f2L$hhG)H7mzHOJqJx}gecRVBI9sZ7 zYs@Si6C*SIV&k2e{(Z+6WR{7Wi{}F3SIcu{6Sg_el^cGj;9U99XYqW6@i*l8ij$u@ z&sUoMzTkZ2*{n)d;M~#!vv5JsmaHm^>p#w_y1aFj?4Z>#1GCkn_$}GhHjaOs9h^M3 z%7u_^s|Q{%r*7MFq5AGak1y2NcecvKnul%-ycl}q>6VMNPP~77v33TlniF=m^q`zN zSwUNK>gLpcl2b3Yb=6DtZ^R6`)F3Z@>!pVG$3MB$D1UC%%i&K~54zm=#kQ@NoBVO; z$>pYR&sMz>@&3l3E6s|YZoSg{+xsV1S{QgxZcFADpDT>&w%k^p4W8ykdRv07wl3X0 z{;DOww(V-03KO1QjS6%GU5gG{6MxMblCteu+nVW5ueA%y47%RF{>}L79l{H@UGEt2 z;pz2GExCH5b8A1_jV{q@%8jn=8x-E?*4d)ojEU)PyV*U~mU6R4-wA~`d&W7`Te0zL zY`1zPq@>*HJv_beR-e(C>g~ScZ`yA6n_QT3yZ`hLg|`RH=GF4z=K2lJlMB@Cc>@eKl-fSko#k@)E)Q7<}`SIe_XC5_`&!a-G@AwkZ0TR zVB-A=&mT<6cLYD2{B+Hbhf`jp?07i!kM!pcr@hS#el-34%^{Cwlr1XU@o46^56>UX zGPs50&u0D!`I@m>YW^J0hA;Ae@NN@QFt>D%gaSvv;M9V76(+tYm>)PVnEm$|!5)S3I!zs&u^UpjNo57e3a*1ya> zZII5~(^u)tt^BStx0tIlcPF7U_Yc45%)RTT&fM_>b>{x#U*_KH(wRG?fzI4bZt2V& z7p*h*MV+~OozR(kcWa%w8>i~by+1@}?(UvCbN`g4Gq>fH&fJ3{bmm_CRA=rR|1$S` zow;A=%w5%@Gk0n&ow-ll*O^<(C*~fsQfKbVI&%lvbmk6p)0ul?xX#?&M(WJH`;pGv zy@u(`eXfzt+>StdZZCrq0~4<#p!nevfz$gLLMud|hYm znOl{77TA@T`^Yw(xn~U~<}N!=XKvRSow;A>%w2W}HI*I^bMO7AGxrY{y5FLVEr zOU&)rP-pJhf9uR09AFM%KaQnJ?XAw-Gm3QP9{faS?v(>6Bdvc(%$@j?&fNQQC}UzK z)wuU`=B{ejnLA>l&fNCVW^cA_G9|fbD=1w|o<`uX@F``Fi#l_67-J1&$I^+p|M-`= zTWr>u+x|1<4DS!L*7rJd^BX#IS57469zIBC?&O`s+^zj}<{s@~_hzTvtYIu)XKwL~ zCdy2s)s$FC;om%sa$3YRDy#y2ptPiJrqnfjs=XyE^M+D%nUeHgtG<+V#SUu%8}y!t zd!ly_E; zmX6$odVVT>i;z1rG?|(ESl_bn1f31~U#D#8US3INH8v4)FAma?d*D%X7;EgJQ8!#l z9L-jrr|g-y+M2~m?x(^cK_l@DEuUy$m0r?&BWDtFA5GPfd+1#n=Qka>e?DmSW=G#r z>aCGPwf+|!xd-`Dg|l-2H90zR&pu6~J|pBd{@gBr$FW}L=;jYPbEl@$q^q1}Z)Uk- zO=TZ+=I*wSWOh)YB522XTEi`!xh`;Zt#NF6 z4P_s@qcivLPS#x3bhwp>zl5FavkLWFxKvrr9Hq@hw#(C=#i~`O@b$6Bln_!#8hUy zO}p+h*xH#{8<1uzJ|(Fhsz!$MUPta$E6H%4>B#*_NA9#L<^?RgvpULX_^}na#rZn+ zI5x5kVQ9w#I&#lmGMSZ#qe^PZ5?Xovo783cO|t5TI&!D3Hm9;}>2?E~If97iz*`c` z)QUZLc!(viE$ z-z4LIbmZ=IBC&|2Cz@xoqaWywDUIpgvo7mC7U4yP`KM0YS9Idu;YxeUwscPmVLwfy zJLYd9_i1*+sM705+WWRnX|e2rj@&nOd4)1d|E2&caww>-JTSGQ%CM<-K}A)N{YR+@&1_xyd?{4L<_j1GdFmX1wPQ3`{&I( z*l4Jq_cE2e(3$(Y&fL+HX%%O5y$(@GcqY0E^Wn@ZGXZ3(urF;PJzbkpn!2z zC+&f^>{z!iRN(b&ghndsZZ5_DZ>A>Cjtv!j28%;{^h#=D)xthN%hiFq`!h1Nr!r7o8GNhL}ZugsKPGBE(+)kKD>#KLdO2MP) z%OY0nPFfa=*k=x7y@nBP|FkEX#cw0!YW_5v_jo0XjeSoh(zcj&Idh99bySO>PebQMF$L%VoXniH3NQ?G;LoI)x%5h4CcQvZ8H0{rg<_;uSr(9_7G`2`y~%%hAPT)qv53v z+3aI@a(hj&wiDkYo%q`ixJX+5k!fj(pD^JQ*iC)$?_K(in7j)j9 z7DW4))$u(Xa&{Q|VWpMM)O(VK z&bJ^Ney`(po0Zvg%x0ru2glLwQ@$y5G@|2n;~nMz!`O0R9xPkO?S}rOhT}>a{yZ=tVOKpCR%r? z*(CRBjmf$;Z%T}2k)^G(*-f3dKj^$&;m5SjtYJy}TXu_ho1NWDOPYQw+nZ(UxV*V4QKDuRc}--Dh!P?yh8L?ZVj`m=MNCXoB>jtoG6D2^ zWR!>j|N8V!OpJ((jHJ#{Q4kaq85t8P=-x;HwQ5F1(TkXVeT7WD}B8w6B`x%?j<24!fH8=kZd0jeQJMPy1ZjHeDaaR$_biP%t`MXz$;1+L*W zuo@1ApZOO|hB0bOs7$MjH`30rsnP>Z>JztCqcIp3qXI5|3ER`HMfk!Hh3laLmZMh{ z;2VCTIV0)!LGa2DBgzRcP(h(#V&FF@MU&2_Ve6^QA%_M;6WtsunlajETlHCo{<>TT zSVG|x+N|ZFuNn@6_$rtK^RX+8tdpb;!}d7S5T$4|$s8OZT3{cHhE%nzYT`@yXR(2# zoWuk98k+i>noDxxId}wDLyRF3+u(V4Eha)YwH_ShPx z${4r@J-}1=Tjrr%Ey7Q7Fkff+M=m2Bib)F426|u#sA-6Sc65!AX7f>lz`aJY1U1Rh z1p>@HVV*=InGsfpkp`h&7MF1jE`#zIL_L>_T=+@Ml|2kGHY-%%6XjTo-QfcT;<0=u z7CA=Si+R6SX!(Vb&+FJ(qs~jV0==t<@Hua7(LbxobN{+H&#F+A#P8d(|jt4nu@Ro6UPc79QZWVUbT~$m5>c zQR&y`FZgT zKH?pz@1}-7Pk;RRpGN!dAjv#L8i|b}0uYd^bdDUa$k|Iy;gEGCP>?zBAvEhjndB zp@pc5t#KI+5}%*}UyhgIxROJwJPlj55w4>us1f`mFR6u-dv(WPwX`A9)g3g<6Ne!m z=UaTZuk|4GbhLsD^fyad?R;pUdgEvaN6$hzvT3XfX3%99P6+LzF#CM#0mR zwV?r|yH@H!^g?Ihd!;=z0G?@q!B|0S2*%fv~t!Cd*& zlED7}cc`GwQhlH`3QNI=kk`cFv9Hk3&tryNmwfEIfrL zDIPG5{3=Nl!^hALPn&uv5RMwUi*VV=6mLW?wLX8NnY2)8g-9X61%Be2>_Act;%8+Q zao%*uSWs6eVvr~VYUKvdpr+RdaS?2=3cA7ttsJhk#i9`LUX5jY?1Td5@o3muH~~^& z3V?b>l#=725+Y_@dL`e}&vGyoa&WcnyIPr4ei0*GMR1>Y#r@(gw6#01M?p#7Fr$|1 zT8^t|^}q6Sa_^qivJ~7Acb(6`Q}F^5>=f%@Iv(Puaj2sgmJ{>%AOL;<5A&X(YavYp z!!x+&Jc^}oqb*RR(<=pDd=pib~mP!uPP!CHXdz(GL4XcVR z`~WoJ8vh0_+N zS!Alu#A>K2>fy(f)z1Ckr!1rN(N8qc9%?;AMHo&F+8rB#D!o$?BS&D`~|n>n+0^@uIVu z10iZVJ_@bsv4SMEEA7Nx+=KzJ(l#qGOG$vaX(weN;eppykf?}$!b?pQ zCt#KVPb%m=$Zm+@SGvaD@R&!2M=&2;ydw4PLcKb z3uq-LLsJ+l)>EH(oEP*`d*D{F7EJOPKd&`Von8Qicn4)3 zN239L5+l;S*i%BQ`NkXhBy$o@v#fxQS}S#p?;G+qryYlgCXRRfHvC|Twj5UO%Ep## zTYs$%zLrt8Q(~+o!_}AzwJv`L0oql_mWxtKIK!3Rt{1jO*1_sV?VM$yXjJZPNij{` z12e31!6F~?QqDs-80LtQ&Zf3ja1e%32;YMjxwo7HHF!@RA@d5F!YT1tG=%Y#*MnR$ z@FWj{6iA0tmgf*m8NC<}%50fs2{H9|mk-4+ zwoU2?*!_Kui8$U>J_t>!HULQi-td%!?Q7lYvq)NvTFyVe2fisw|B zqq74JK{pIQE4c?3FQ7YtMPU&+Ik@4%c}20?Ud4T7g_&3s7V_i zDcwwy-62ObfThmQHiHOt&V&Ov62@r>a1V?)2vZBjz$)|t3ujmhUgLP|WqYDzK`9g| z<>4*2@@^?5ZR1~EhsV4HG)?S+J1uAAL--S1+G%BVW*qz?BeV+G#4B3PqmeIo-O?IB zbrC|C=_i`- z-IQuNQkc4|8D*aA15JeuT`*Mj<=5~BzMTs`7H;#?R8izPX4<{A(eO$9g?%toYYiuy zyA+3I2Uagw?5v=^rS*-#?s!P6s@l~|*8wqAJcj||^2;JESd`#x@gnW2l{m`xgTHee z&J%;Vz;`%Pj*(%uE;zt)2HXn%#6sggM3=t70dBQ4mKgg#1jh=X)>fn~TWl+5-VuI5X9`??be#^Peau5kIQ zRvj$Bq#M?w+9r`=Zxzc`@f&uBIv5RU6h5oNG8t57ot6e&l_Cmht*2KWZd;shRrZZHVzKnMO4S=Ci%h)Hp`6heaRVDrnY3L|a58-zU!IyfWY zp&Fw#z<*S`tvwGbXsWuAu#Q^}3omgavplvGBcP^peLLfNInmZDmk&fc z+*jsfW4KJdJI55KpoeS~dd+zlXB6y!53-4TL^1RO^eC+9x&@WApJ1T+O6IdNkpRpSDw@IuGp_->Gzy-J*h6*?3EbMfgg&287rrNu)b)EU0rW+DH@!4d{jYOIy69*^-&x8q< zUho>4+G|rzGUEzdj-|mY`(kNA?UlSNx}lHjqOCrR7bS5SmNDfSg+;cZ%v3SrV&oU}I&uR8n6V4Oka*mkP>Ltze;6veXR zLBqAOLdtvRB+CbSx3SvV*%!PD!!6hRR~QK|k3tLifOa2hO;@y()gm2sS?q1XqJfF2Z} z?u*8BoTiB^*Bq!R=i?es>m>07YVWk#mYw2=^BtU2E5d1hSvGO5Qdbpz(gqU%9pj-? zg^z~$P!oGt65x-tK&XJzU_KeAFTVo61JxYzAnz&5S*{drfRRcFF}b_%dk=YmRxk)} zz#G$Q1(~^vTE+C)NH_0r))oHv5ThJ@wQ}&Ma1&cG(lRV_lo%spML&}A8>hEAgVz?l z5)VlWZn6!-aPg3Hn24&##RimkJL2E+8%lg`DpI%$K9Q))I%5f(OmM28yZI3Oh>R?2 zDsC!xDaj5+Lul)Dj^8$=Df}R87u&=<=~Bw#94xQC#1v=`hp@8TiMzE%;3c-o0C`Gu zwudQoL+{D5mU*IrS^|S@V_?3k6#OitsEh?9!ci2s&uB)tCsv8({0eTdT&4o5oRZ;K zN=dCc1}cHtMO8ut5iLK$J6n#kjut8Rn>Py=Sy!a91s!ep@k!2jF}2`>cFcSatvFHP zmO!{Gny8^-jinK6EQrH~aEDG{Q?V(26up#SGV>}>M?;FPKY)+8E0($Xiw`1`yh^Ia zo#8N@7$`=DS|&R~ES8i~6a$ySez-|z)VET0qea~Wlc5z0j@5A`jp zWO@1nO`HqINg*})G}}rzOtHk~GTC;UdV8zi!OnA)UAAwEAL>q)?DE5hT656`dW(Zp z)~fg$l^lqJgu?%V&B|xXWVr5?B^tlF9^qWV3oVTf5P8zK{O!$_NKz9 zk_MtFP7`KIMlC1@+;F5r2U{szYs&F}^Wtmh98EKSv3#YEZkb*g(Rl03I++HQLTsITRqbsIA3(^B>9}rIWgg z0z!eXi)Pfvg~9wjxIsH*1|Qr#&Y2Bna-v~Eb3K7-lFlHt^C`hRTN~nL3~PyUIq ze4>~Rd$qZt3oyyI$cU9dh3mM^5k&E48C2AK+(Gg6@L~K<98?< zZ3CmDwBIG{pf!@o;uqK_`#GZ}9YSKbmg8)KE8&31EGQI9aJ0k4tI2$AW4Xm%a0dQ{ z)s|b>3>@ks7(fTN&%x@f4hL!asT7yI@gr3peaJBz`elk9B#XDW7y9y6*~K6rWr^=j zW11C$qyxg8O$i2?rnDe?E=>GOWRtzz*FK^P_qtZNYD2zrZb~%X!boTf^WX09Z?bMQ?0U>mPn`S z;yurC{bswU{wBjP7DnO^rizMbr_ogzuWH5MwXCeTpuFuHglQv1s{9GMz(r19{K1Lz z1gVF}gU#xAXz9pKsR|#R)1a}YSUk1cZ~;rIhlGzD3U>{nTy!OzEY=s4=Aqmj{bXr# zS*!qO)R}5DeuH?bTI;xeNgm zkpd&Nrs9-S~!5g@OvoPIR23*!a zQG=d$6q$ba&?;#g;e`CgTcI!P7EPf&njQDy8DyBAxKl)M$aPo>oA9&RP`pRU>k(dq zL(tq+mu^X>LgT{WBVGHCJ9L5{gF0v9uvJkN1L8}S_;W2!~bG)2?cZH5Z z9o*t|Y($u8wg=|IAQ+|kLtV-`b>U~#gEtX@6vyVNRlprjsY>WU(>n#*B0Vg@BeoQ) z#jCv5K$I$o=cDA{>>-qpFTpudO%VJD5~@N19JI87vLYUhuuAQRcVUzz%oZezg9GRh zf$M?nA(kpWutKW~m1F8LKcmF57$E{G0t3>T&gz@!2S3gLZ~9#;hIxm#WNZc zL+oe8G4U|7EY(trz4%T!46ea;{4U>vCk~hWMKOp>yM=?rDoWvjun>#c7D*pimbQs! zQvvGEuW9+zHX-b5tB!OQM=srYCYGmj)`PxZ6$sXRNx`3BnkmazE-yHxjd+c(Vn(hjP$KyF}GZBkc@ScY;L`D_uQFnUjD95(m_2>Lklt5hz+~C7_HLR4~KV z9|jT%MZpMD4ii78fGDlBuhFPplD**sJcX;|q+LwAjbadj`kI%+3OEKD5}RLF4!~4MmuoaD zI>4e2e=4=1!mFAXqz=H*Qa?|)DIzs@ypIuD zD*OVGRC!i5I*iU1YCS^W<^?N7L*)Xzms_QDBph}>n<2(2O z;{}k7=b;MKI!)9hD62{Ivz@>t^zL$Jo-N%{9X|0OSb_;MFzpk$%mo-u8DaVav+Blu zouM#aRu^tyh1!{dO68iUs?$xEN{Tw5;0e4dt4lX6(y;)1D;+5DSK z(-kB4$0H<>A@EXcAT}r~>|%#_#}n|2tU`(IAig@vZNP&z&`d0++=@^pi7AglgrSo1EQAlmp?SZ?p$oa5RJy1v9*=X;+{kOmj`7 zICm9ZVik2rEPd@-rWwkFF3>$7In6?&4Iq?DXMBv_AZ~JcSv2A6BH~ ze^cy&o?fT1hPgGa!E|jWepPCTY9nmWh}V|8ahhp{5pDJvP{Vl{IPLQzc1+A@CG;%IO#g(GV`4i`!y4 zj-&4e4Yyq2Yq2qO#ro!9#FKO$NW#eQKjH1%TW|`tn>9+*B{2?ei-4C*_Q8L$z0{g` zgQsH)*aSwkr|M4MUGPxNDU&e;V%3`??(-3_h;PAfcoO>CR)|m7h2IeC9 zX{#X^2JuRGg`P*3mJ9Hfbt+NwHQR4u92UpP_}X;eopMV*=NHk@RU879tESdN>A=>hl8@07%$h$2OM2a^>4gzyfVA!SLJ_>~gf2_R&(zQn71v{sdOv-yd|RQP@OIR^{i zAIp#6rmdhc_ftBY>AWI)nBKVyGaZ@DvMhG)R9iu6BIDgeC7y$?3NFJ*Q)wfni+Zrw z)*m;+h{ETnnr^y-UBs)4#Upwu`wN*{MI+zHYlN<%Iq3G08O8NMWg~@RdiMk41Y+3)zxi#kxR`Erl2QK|J0P zVcbsf(wH{DvPKzhG2rEb$0FU)N}Y%k_$cuizH9#4F)bc?%Be8SQQJDk83Lu%$5P=r zsu%q2?4vY+`s#YiXF9O>jlOF(+1U#E+Sbb*JP?Ak6kjw-MT-<17L$)$k^OKc%EWJQ z+VT;4{6>}52WN5XNV1r^;u)dz;KCNr3Hn%WLnVUZaUd*ArdqDTLO7|6wIN2) zNM1BboVaDaD#OHVxr2(0D&j1U1smMKahL~5mN09)!-|pO0xBYb6f^;DD&2$=dx%L| z0(_(Ba0rgW4T@%G)SL1W257C6%P4V){0FX@(MLtCB1cQ8rWMI~AR1&;*y6YKe9@kAnHD-a}hX&A{E_HtYcAK=gIRi7OO~Cs4Q?58cHU{Kpak z$ECEK<&n_a_D!5HJ@r6?JS$4W7@h&M)Yg0#o&Qm?-C~J`W^|Ob2-3-sI&0&26fZ;d z&O%3;a|3QtPs=8jQqFshTucAV3$mRl-H7{Om|BV2m!`c&%Q|T6U!jbaE9z6WIj1fI zcibkwyZ(`turw73%M0G}P;ndgXdcde&P}#7>p=L^ItQ*p6I$?7d6Dk;AnQ77J6F^{h+K&feOZX(pIM_xY;^yu};9KVpyAF4tpK zt+MSK%w96y(v=v=3zNYMZpb*!;a6;gR{2F;OJ{CvND1|U&e&l_oei+X{!5BVUs3!( zrDHbtA`aF=ts(;DN!h@>UcR(#Q9FQHh!Ni?5SPLmu4bmvURo@!at1o=uuJJzaF5EV zXL!an5$mY8g{RhsEO)L~A-up+1VR3tmjl7Uc!)#Xk4KE!FfB!p#8V+wNFGFwc&4ez@VlwLV(AF&um=C=)2@zD?$aK- zw&Cc+wy*_WK#H}6+8w^&95Fyfk(^ zT}+96tDW{@5X4q{DNh^3PSvgqVqaUOTCEOZZpaFUTHnl zdn8iLrD67b`L66riW zrixUQrn{@LUk9iae!-{gGr#BoVtLE-0{kMBS3f}~Z+ zZ5o9OsGJ@NZ7yM-`@0&IdXm=SN>JQ7QFq`TEhNdC1el9rev7rP^WuY zpYTr-NQ>Z8I_o`a>0S7GVNP~24 zw5E2r?=;l!FqHCAYno$kH|5dFJQpmOD9O)x`jyhSjTwg`R7rrlm6Hbxolc=Pb}>_i z`w6?i5c$N#u}05SHlqC-#P)IuqrW>ag-NAN&6@zQ&qH<}! zij~(oOFHSBU@>)F7{GDVLU+C`x3Ch^>^yPO%U6TWr~+ulvz$Tn4|ZEkykU>J#+Hz@ zs&d~Mp(>FdL+F*-=lweZPlSqtN~$_$w7AuBGuJwy=i*C2nw+`~ zy69Q(B(K7^)(z=;eaF#UR#Ldf{swwG`fyP!5*}0DH^{z;np9tf+={%x+czTomir0c z{Dod~AFOgms{Y8Qd!Pp@*xA+6@EFurrSXEklgZQuG)R6(yHKQei|{SO4ogoq4djY*(i;p?H+gjjT#?8M1i5-X1Q!pf2$_w zV%MU8WJb+RYu+Vwk|V6-cWJz%<9ZpsLk0*P#53~QA-M9BY#l`{RA*`<$yH#HByipN zzFLI;@m1`i4ZJVmuy>k=&ZDsNL2wLK(_C{}f5=z$4HU5oau^U*eyod1 z9&nPbC;un~!5%y!Py|PPbDY*rQpza|R8LXgd&_dGpg5ft;A!jqC_-@grD|ta&anKq zkX2}A>%kvdeoWMrQGq`V2-8x=I5kyB5%y5uW43r5-xHcWcJp}7D}*R zAOh9#D3DK8HkV?~M(S=fB-EZC@wC*udaOB$v7x=;GQzR*VFi7tWs(Aug|;lELfoE4 z`&xTfd+b;K$@C&vJy;Htxm9rZ;0lOBvfR>q`j>m8uIAx7lNiT5wO!&)c}#YH4Q){t zT8Jf166W){G(z9j33g_5Og|;~T;6|Z8!J~Rd)G6K8$w)6Q zRoMb+fE^o>wkw^V7vP{>T#Hsr-Kj^g5U!HVDJV-m{i!`JYO#vsm1aA(%8Sj^=cs3( zBv+sfP7j>LVN7!RdUs~ivxPO45|3_87uXUT7G159x*3}z8{hHHvEWJF4*T>tYl3o+ zAop=hrBXqxH5b%a<5vUCg>V!a(TGq%?By;z5M$7gBIqQ_-~v_4#MU{hHnrDR(67Qc zq-Xr5mj$M&7~z6L*+%}5%X!Jt_jsC6v%A={_;e^1neEkfoKW5tsX?@G^9pikDNRZH zt`n9|aW82FzoBOdAzdE7=*7q@uYMLeaLE0GHl%sTi}85ved(e5@&(^fS>&Y@{W0Zm z8VX3<-mVY}xf3E!^c zOj9i8CiWs4kDm5j97Q$#(&>vz?m$?9=JvptS{|JD)uPwfA$ZPk(r#KTQT~s~o6hV`=_|Mxrg5Kz=bi!)St)zq(@L($)G+(Q> zx;wgwxlIdxDsprkw54Ne#TKI$hGV7Q!%4ATMXwW9v6OOCAFknE4z!?Qvbd?|DqP~PBJj!0}7E1}aPn^MCHybSre5Xmp1rl`^t9R%k zjiAq+ygbfXN-@Z+rPozYayFq;ASa3jzAEy2A=*LDgM%xe>Y~ zcT=Z*Cj^*Ps6b2)%cO7vNnm2p4z-+IBAm9c5gtcB(Mr_j%X$lS#9Mgi0P1l8%F21+ zqYX&ZZ)vLjl={hSbih9tA1_y<VH{)TryzrlTaV4|qX5N(^IePH- zJjZv*4Ce+|?puurI^z4;+c-*8|Iw5+w!LLbQwRMlDfTg|sCz|X^hl?@G#Y2I5@c-c zT+D3?A5%l$=5VCFWIL1GSzh#&k?~_j8CmnUb;+w z32FKe#e3+%j=Sopl?7FKH44}cr|>PiEOb)=Z-*b_wc+S>DM}_P^>+?<7mb>F<$~C%K=K=({5H{2M#PWB(EoN*Gm_ zqNqn~vF!9A^3g!G*?gW_n~Cb^@e*ggMjtVTO7x6UQE9%il6Z{T;(#h4U*{8liVpm$Tf1NJR4Ctd(S(YN zO5DQR$TC941JTH1SI@}e9gqzZ!-H_%oUspclaLfqb>&byH4GiFg*K=4)KxeZEqu$V zyOn_^YKR>})$RELe#x90cT)H1M)VuMqE6z$5H32xs*FuNwgpb34C&YpJh7*$Nek;UI|tgDmlFP)*@3jM{T%hQ)U;(9_Og4F-*IJE+KbW0 z8b|vAnF3`9v_+l8|F{Czr1I`i45lyf08^->yUO@YSsKi1tp<|O43c_u(g~9nxl~13 zj42ha<59*s>kI`^5*=~L&O{5)3y!|7{^We@7u|gprc+i)khZF-yj+jNONn&JYKdEv zy6^%uQ7xvjR5$5AI>H5Gk9&BkSs8eR7MzRy`d9R);>gSgB`sgeC8-@35mvWczs3Uf z8Uyj0lN%$_{!v-Yw@B6f^hEkB)BrzFyg=;`{)tDJU%cfbuwKk-yj>BSOw~;7rRH~@ zmI`THkJkDWT@Oq#6+)#ooV{^E&I2V(Q)=PUMZlnK?LOBkIo!Mvfq0t`*1 zbAc!o|LXaOQ{|9_hV$ov-}$P2P}GFS7|1IEvEf|i1sbuUFNRm6mI5lZkuUHeCD3p^ znua0Xx%s{y=0D2M105mg80Z^qHlm!Cgr6s7)bS1TKchkDr03hUoH=SBW=5S+tA$3+ zw!83Fe4=-83%r&w;~WTjqb$tf_TCvDT2DSYt`=fTXh-b*JXjHEpquj?`Y-9a_(oP- zLu1sSH+(H|8Fs5k?9k0HpU&X1XzTe>%A+#-gijXJi}fN{b}|N_qFTTmMVFC+OYx{5 zy&pzMR$^16^(3x+j9rh0a&@;!+FA)`m8~*VP~7ulkud(J{?Uo>n(vtSfhmRa0VQPR zg?wvq{zzPT;SLH76P8_{gKE8m%YP)%IUT1Lqd7N9t7;17#{dTpVb=o#8t)zICU1apc|$R zZ$TWDPO3yR_>nu#e4z3mckmOM?>sO?Bm;R7s8=B}^?Rx$#gPs4b^7P(9Fo_qrPmmW0o_=nW$u(4plOWQQeF%4hSuh=3#FG3tJ@c)DDkgLx12GYhs|G1k7D%iz&Wk zxEm-DjPp-ak3~hx6(|?@OckX+c|0vMeYBrXpgnS7ioT?lprX{a`|Eeep7<61P|avv z#yk4V&68RJzw0tqv7{f}C&)o(#k7m4Tr$JpUF)IJ_6(JmW>Q}C5Y`-4v+yI=thL3@0+F9rW#pG zFdzAKG1rHRoL6~L7Y*Kog@OK|ih3|v!CIk3LBhwOoZ{&Fbq3cAb)!-$hZ;lIX=>C- z9JO4QQC<=#-$V@arf^IEc5FPz3sBkczJK|p|NT*W& z6J9YlT*K}zzPc;QulGrMvO;1@W2Xw|P@RJ}xN=a&YmCeQs7=1x3ClPNcXbw=@hSRfAXMGVSCjC& zGG)(XvOlC8W*cgAC%YJD;rU#jvpWY-+D+!%Yz{5BPZW=zp=iRiT^$F=YlBArMQ^NhbuhRTQmaC(28EDv#PZFtuGq) z@U?HMpu#?^=DBo$hFVow;otaT*)s-Xv0F-#@TurXDLCs*h@d#{EKhhimNT$h-dV+r zy?l_y^HrLGda9g`pf;FAIYglU(~PEhG(zv8Mk)sf=?4F)3-BA0+uqFONghgqhx8@) z6{7VOZS=R`4&I-#qdKLjd2RzW1^ej>{Xg6a_23P(-IS&~@H!@6nQYTKQ1dYe$;cq#|~F z;1IT}yuSUklK!;YJMU0Ja>cSwwTE2}NlV`*3SZPHEYQA!6|kB{X?X5b3}$)nC1 z_a-lj+fd9Z89d|Wpnp&_JyDO;5yE4Bp-FKCEoAr((UH_XWQ#WNH+R6-&OYlRUDl6N zx6pJnLS+;(ODTV_h+Ts!2PaTQD3eO35m;l_P5qrK-~sp5J5(878yfBY7g|rb*%ldv zYYanD!bfT>hN^gUcII)kN`(w!g$7`&_|IvREkkj4QB+4oL`7o{&BF+9iY2ji0Q#YX zDT&pgebf`3q)Y9Qbu{L;6yWoiug-H{Una9w z57pb~5Y-KO5s^AmPGL71n7P~u7wmfi8ja0_;A(GmOaJ(w44)F_&`4jFoTVcdLSoDi zk9_?EaxEw&%VttmsLu}?z$U~4s1an7TU?#DB99=W7k6dhFyd9l_=LlTX` zI6X3^Uv?RP&Mc>DP$!`VmA6-^4#;A5P>NI7?2weFnEKB9%EDlCD0MqaF;SP7thcLM z&N)HN9bx~{VzwMP%@xzz8lx-d(^?G5t!K`q7v>FaA$5$3hIfjb-qT%xkMM&26&%Q> zzr|_Rf}6HObkaCW7g&K~ z;gJ+c1(G(p#yanfmw5^Ol>Z9;CdKnJR0#Pw&FPokCNxWuhhhjhH^c3e-?ZlA-VM@x z7dtI?#%*1ns?rlTKU?NCQuz$>($D%OcOe-m2&7Op^;W05KlyX(+R^9mwc3Y|DX+5! z`;t4Dc35gPpdG4*^pft@`RLf->zvaqCxLpJ(9vc31JnrpWPksJ?vp4BS#3(L!CL%cw(wUI65hY0>LR`o!J`7NG00Tp zb%98FDOHFo!g%rrp80=34oWu@bS#>OR++A5|3^z5`RMLEl%mg^O74E%WSzt!-2^jy z&(Two;*%*QRjS>OriyCPRX5hF@fpqInkXEYiMkFQk#Ha5xCtM{2I(r!fy$|) zbrdGjuTD`_S`Fg5zKOgfcRH2BbzMf{nj8hbrGKfj#E|2-4-W>qnWO_)mvJ$)E)0ZY5U5UBcJzw!r+f_ZCww4VJ*c6 zn>dHvF?t_msAa;FhKm^$IJ)SL=Xd_qXlfdBdHWzrYA5w3J>vH6a!%5W zL)s4gU}quCrL~_HIZx;t`kxt#&cSr&Am!!Wh|>XA`;MyBlnGtYLAMbJw-8MX%@c`w zj`CrX1mkKE>awte9=MdWQ!RC*0Rukku$fI?5D9SZRN8*yE1^!}ctT12z2M0mlk0S@ z_p4im@{hC#9=13ve)q3Via8QV|3h0t_{qL(hUj%1O;bWyxdy4*tSdbUFUS{eor>j^_EaLGG8o7Em0eQ|h2E(S^|;i$D&T0ff65Ib}5Hja8* zcrX(gxG4bDAK&Z8NX}R;!KFJj=U?!P@Tl=TRVSmR*{*hSXM3Hxh3CQ?xAF#GEwc(K z*pJr~GB4;RT3TnU$|8*A^H7!G2rSWc=x3Y@&sB|hs2)Lmd^zdcU@K}6{+6d>9)1vo zD`t2$fur;KW}pIjXe-|}-wTI5tGmT6$ri2}%7bmlW1yCKTUnS!pOA+?NLcN(RZo*@ z3K{&HGmB-n^?Q&Yw|<%OQFm;0ZJLK}D5wtE%P^D!Q64=46)~J1n_PMef7|A7Kt`4A-kMs$QhJi8Et|2>o5zwOb1uCT^-eFb zCy4evCn|M<5Xgnz6&9}BpC^C7kGvmvIFH*0;Qag;M?xRyvzAXEl~kCrx=!?I{B7T{ zD%pAHuhe--iDE8)P(!<%#Qn`;BW)3>UwL<1oRnIebJ82J%sJs#i08)i3uZ_~%zq_) z4b_249e@fLNhbm|NSc9B$cjv=5PcReIXl*%u`XlF2q(%oEOy&opA#s!W|AZh{%+5r zv8KP8#MOZZulasp44%cDw9uSg*&wjnI*+f-$2x1UymVk?&~R=YSmGNh1F1Rf72%cK zLrBp&+oH`*AL>VAcqh+-l{f+|X|~u?w0xMHJX&U3VCcETdeacieF}eMWOaKaC#o~t zFuFfK=5)I(PgDyzi`@Au38=4GhNPVO$ZeNL3?*|mn#nt9A2$zglW?P?IW&d4nPdzj z8Kl4^;ebkc{wRY)3W%9k4BwDp+1FNwK%y0i6Ygk^_ccjB&zbl-H@C|1T(b?GFpBDL z`AC;gHf9Q_enb&&An=pg8e?U{3_ZcLwFY6Q^VGbdPw}&ieJ%(zGl%scKB5b`%k`$T zM@}y9WXqYxrPW$t5#8-Bq1DbV{DD{$($ee+>8tW)^0;%AMYX7=+tfFbZd1rv%H^DX z>QGR7TU+#_sl+L`5Id*7&V)7ehKErLG^2RCIZr`3=Me31w&+hVm4~1_q-T~(>0*-B zk;s9aytOTCc9Y5L&X<(vCXe8lP&=Az=Tk$4LLHDc%s(jyIXq3R#y@!D^bOV2opf`3 z!QF$8tsHbhyr8LDj8;$s`x%ZPJ+LBBGGm_mopsYrOU;K%DFx7oh6=3pq!E~BucdpS z;Gb$Y)zjyZ$Q7xhPO+c!7T*_A&*(~b)qS&!>PcC9KN7V?-36ORnRr`D1kMMNWDT-} z;b4*Ss9Nd*kD;Jl8)K1(y*O;DItv0XP{`ZT3fI>;ByKdfUr>Y8HSp@A(y86I3T+gy z=mkj=^;xyReoIUIA5lQ8CWlD+)kC{z0Iv}aS4fvKXRRg@^Ut{1S6LhrQxOkMOg2X}xT`gSHHQYu57X)F}K!?e$G=hAO594G(y8e;LRuw~R7+ zAlg}%`C8~Bu5Xp_E%Tk`LNwhCN_f0&KD2v>lOemAym1~%!o=Vu6p@>n?duafMY(W} z9#Q^`JCa6yA1F$bs0J-H*Qv9rZNj0^e99~jE;4^o1+w)sLC`03N)5Ma1;%mJsI=s+ z;ryZZ3mRLZi#Ui3-BYB2+evLQjjW#V$K5E3LiP<+$EhOxC)NI%TJUw;5Bw=*p6j&B zdoh}}JHKN&=hL6*MM?S8MLrVzNzJA*sbA83TB&aZ(&&U)Ndse=WV2#m^I<`pOTk`L zln$#wLP5S@TYmkFbD>&z1yXe$ZbtX9HkQDWB5eDisjGUhA4%>Xep{CEtZIqHTakKU@KJc{+BK4 zoG%OI3bi!@5*}#BJ)-X87rRNY7533mv{RX#g~-lp?d+x)J*K~DG?e>NIOgxF5~k|1 z5-!*li;AQ;Dk7g?nR7*?u;*?W8pX40KV-F_J(jXtVq&@|e<`2hM>J69FeV^%ndHF& z*IpE`AL_>HsxFJ66clCcLc$&@te48)COU;^BUV$pU^#n#o4&}8JNk*$-aFP~WmD;< zi&$(V4`455Avtgr(Sge*w;*~P!_7sXbL(&?xrC4k;xZlJ=XBa08Hl2$_#ftCvW}-p z+{S9Ftut(tpZAVESn5m&?qoXJ{ zji)H8rrW4;s&(j^lylnPmy}CX*#1BdQX2%w)5&AnP>sa=&K!M12*Y-G!#(Z4@VB0g zs?M`elsNED(z0}vTFLb+){VG^_j`}1>2cHq2QiH*V>X&%sYn^Qg_j>kdFqz#kfLNt z;M^eX2~`l2=%fnz`yvVDu~b~HkXc02cq6V-KD(FDpt9UWrI4W*DwsM(_oX+K6ew>l zOPci&uL*6}^W?1sWzEb(+ao{udwhhE_?m~AE#`_@Cyu^^mr1d%ZlGM+2SmJzmf8J6 zXY5b$yJ_~GXvujWQHR}Vd5t~diB(ifjL_xfHrDIXI^Ie09Y*U=EtJMP`kqE&Bi12} zo`$c|Pu!mda^Y}0dP1e?O0-RFeHY*&%^j%ANKb@ZU};FNo`{IEh46#^ zN7UC`h3q`EO-|=7)}kprbGL`9((jZHhv|@=lRAe!vwLGQM(d5Pqy5My&hsTYs)4+c zx9Cb_(+^><sH2gG7MBB3{V<(1&Qdj91ir_}+r)f-*>_fs|Y6T4w zd}@JO=n`5~VOh{%scOuf-2Q@^CG7$T0s048EumzGlZS8W%1#=$M?*yGe&#g!xsR4U zBkt!bj;6sYv_i7htE}MH1$i4iQBA3>iq+B76w7!fTe`f7a_DTCw@IHJ-GO0DS2 zEd*-?&1Y$PpvL@!GWjQ`4@tje;=^U=F@ENF@vxBd3H1dDPuWI|sJGjSq+Kd}oAZXo zW50OYQ%V1J#QmJSJ;=;l{p4p;JWYOjTMRBq{yo)z*vZL*{W`q3&el%H; zC}GpWH}-d8qhIhX-u3>ZlHR%jDruHPzr;8m&3mXk%F%H1j&jB9wx~qtnVXrOCZ$N^ z%_5Abl5ZuJ>2;<7CWfs(?%{}!g2AE`< zLrwL3uN9RXiO=z|DnT37GujgKS9UkvE*qsN57MwkK4Durh|#_r&NJUZ^rup0U8tP% z7#dB5SXG8soaWciGE-PpvcGl8aAP{>uI5$d21=&4rf3x5MvB!bp>Zm5-lz_@L$Q#hZtfeeyrdMLCD(R*}1yk_f=`6^pucdAd-WGW_iT6n7M%XSa ziS!|pA0P8494o8(4hzxv-rX2@Nex6dPo}b_jNYT#r=M1$ z1D`g{={I4e0q1Q-?@(RS$jvSXoUA{=pCr#<5TrcHuT>x2Lv7ZN%|TR_E~fBQYas1$ zKF6u(!A^JKJj28+*6VKsMC#KU2|TrZnNWh(@obF3K910p^hSQ5|D_ea?DUQ4proRC zz8A8IATZdULh*qClAe^yT^*eysJPzRoCr?s3xz5gUIC5w9~KT z$P@85wwv4Zk@-`f5D7RJ_o93H6-DtZit_gJARmvz2sCn-22sI;`AGEF#16@vw(G_I zvr&Ewl;j~XbWU8QZ0uu8$&jXV%V}kLJ{TC6xm<8|Qg2Koo9|OsYGr59HvPw~u$4v% zyPhZ~@PP!!R*F%9OVJ0kQ!l`H-A!((29H1i{?^C}bTl(3gCkWQET%b#(yetgT5-Df ztcNehovKEI+yxY*{y3;xV5FKWecYL;m{fM%b^2sVnm$Np0(HzJtfT^QFFoojtGTbb zaHpQStox88sR|yW54nL^M`_eZ=eFN*e_c0uNoqq};lY9O&NR0Nb>Y)ATx}q~TVD_) zfvVV@r2zNFqZhpoBI>UC#Hwyb2l|ey;!Z$$r(mcHl)V@Icz1Xh7SJcoXPBh+^DcZv zZH3McR4pkSU%jle%^fCAyTjhk#q9^F+3ce3pSregWO@ohbvHSYEV)Hq^BbL2??=vV zQWVas(-beZ&7lXizLiv#Y#e0QxnDiyOxbfV65i*`nR z9d4#~3qLQ3Vpfzal8bbUiZa-fx;O>Bbt7nlT`=5ORF7`v0Ahu6MPp>(w0zug30VWX zQNa|Z|E%xzTPnz#LLKESkDIGb>x9!5VTfo66+}aGr_(c<Z2U~5m;QA=!n;p3T=Y4koXUo_lqYghsL2ktZ;GU##wbj{p55N7;a3pg%@=2*7RVx zy_hHIoVvIfY*rwM3i>MvAJeEI%AD?nt(faPwZBhVj3wl^q$v|qaGR^kLT*ZsJE)+R zb3GWkjN*w^=&r=K5>|c*#(%4#(m7Jrqvxp>NxRaY(PXvQ{gZy7g+fZsb90p&9fGHD zf)~4a)Os)_>ce&mlnFf|;1v=%TA&~uw?Y$C1tg(Vur{}rq~VhDk=>p8xD|!K!93C9 zsA#B|V0IIlAZV~R@Ji-`=7oC8yKV?8c4BMP@y(Jfx;B>4SfSW6^$c3>TvVhVaeg&8 z@VT9d>hK*}MIEeS;YdltnyWKz=J%~P$GqQI?k_r)2MAou(?_vHbdcr3N~3YtZ_#&Y zSGY^u%JO=v>SiwTRxT`Q##pmS=MT5E3yE%jm9kSAsh%onhvi1nR9J$#suL)kx&@c0 z6V`He^p1HM$)oL{wx~Q!5+{Fb7ZCbeFl_;sf-DvCM{jlJ0PU#9DZ6^-`1dJu_L)Fb^e2N16|fz#EsK zO{gW=T2;QT%ky=4qpfH^CE0%ovtOTh(hnv5Tg*L4;Yuuh5?>n)O)8=j|h@ z-_y6|IdwL*C^xyGUMN7BqeDW*U(->VNW+iD+UUCEkd#! zUS}Ye-3LV*gx`lSgDEP!7*kES|h+s_;0dkV$9_T#N$_Wih2nB zU5m09!i`N@=mu|+W-@_a+sg6wZgKswI->q=~1(xS;)dM$Ew+Nq+{C!Ue<{ z_n0Agf!nBn$3g%ODWA%M8^Za%2|q(uYD+~_nvsE1tH&t z4+O7?<@>3Ux@)%$kbF%WwLWc;zY$;KJ0a1O=@I^C-w+UKYfrQ*>+K;+7p0#19Et~8 z;xk={12~75NYoL!6)(YWSQ*G--wh3;15^Q%g@1iY!tRin99`J1#nsR`uq$}V%;4#% zf9eX_;@S3XY?RC1;MCI3-Tyh&c$Rrh(Q!MxT#{Bu;Cq73ax)@3n;&Tqo||SO#YldP zAxX`Bb))l93Hn3HH`0jUhx$yBgE_d7IWzc?GaH*YjWm*M&<$Zdr%&tt7)06oN+@l2&J(@ut^+B!t^8?+*AqEAexN~$P zDEEcaNO#~LsAMQz54C=yF|wYnrcN~<#+J;6Y!Vj^U?Oj^ZN5ntGM3w8DaCE%wqvP5 zQ6of35_uT4qQ=qtz42G&&6m{4`VW8S)H1`rrg#B~);tj9_z+E@aY**gjLu0^-!s3dF?0+^OhdPalc=gW@{knMPmCj$yU!)6iM2MKw$UC-5@25YhYApSt1*O@fsXq85}PM60ge zr%w7`bEkkw%K_25?UUZM*|>mM^nJSHTZ+TsL3A6^X$Lq})fap^G!Gr+1P^g0)S}Ow z-$Os?Vz6V5c=V6)nJQslRM~KTokmk|`*h~|B51q9%)Bh0bsh(U~fVSW%EPBAV&|U_#dr?_^&Rj7IseoNI zl!Lao!*QLzP_^Zxi*vddW@ZUfgCxN?BTx1`$;SoOdSIOSPg)@4F(jc_`bl!+_sjRH zpq2g&h3SBqjs^Uot|-^~rPEhHu&exQh=x(5em{NRK>x(~v5Fl06e^{CIwyx@wbWGi zL+VNCgG=LhDBeCsZFrX%q9=;|cIP^nPO0zzKh?l-v<^Mim%P_4duL@ zS4z;Oyw^PTYPC;y*1c(VdQUsj_ekRT_JFM#xLwog(?f1f!Q@NH+aMV%{~`aD81*^o z@FjDc-rvFieHnF~D>UE9f-O{>s>Cj;o+PdL5{ORXojF6jDVE14loDoI(&SJU{bi+4 zX(b{JT}Cz8v)n#5(&NrV5q=l6ZnFZIfb1l zgnKgk6rV2wpV1r|qgt8?T%T)5-2H?yyGb-6p{`ZkOpx47;Y8pa#fKXz155Ryv~V_B z3B`l#9sY-0P_?2oUD)04?hHoLG$hE(1~Gl)?_wUIM5rHy?|s(?+8XUu@~xf>8p@P8$#6(z?9I& z@Yi-B{nQlV%@2IEk&JF4Nu_L8W!d$~ol#IX(vBK|dbH0xF+6qJNVd#npwSW9<$_?ZH- zr~Kue>A^DI70QGB{52mj3+zSCX*aWPydIU-J8tiI^`mj^1>S$Mb5RWN=@EsxM6oaIzEuscAgo2cY%eMU<-C!IsZM6H`97NT}2MfqqJ)#SRt zXLxMx#melSVcJxAKGZ)L<``V*AAe!G{4?Yb`(bJtz`R(O$HZ7$$ znxEi|12m_1Jkc#Dyy-ZK&{(vS8sZCb?H&3JR?FYNio4Ol?x(Ya{=@jd32Ml)P*&ni zvKyrOwzw?y(=sU`9j!O52noR>s0PoV-(wm_;*N03-r><=*aNtmUM%L>#L7j_q|o6V zl`V7$Go9a}Ch|P@LlHH*Md;r6MfgQ+?{JUVD66$LT&^FujyT!FGz&+0r*8^h67rmr z=i*NE1wC%EBUBXpbq-swNsG}V5%%3)B0HI&!Q1lMnjUeaB-Z;Za?vnSJ+RpL#;!1 zoE4~`8q*nGs-HX0?ERq};dp6omIscRJ+v7UD1~NYzC`*B*k@))2!GBO1ZJwM%QP=J zhaO75Yo){;(UjlloPme-Q~RWPz?F1=b;9YSu9(%d+5aoIrUjIP3sDn#h_!KjzX;9d z*7%63nu{#EHJpZ2iSwY5Snp(NE!=vWs_EY4rL=^~=byPlbWh49#N|0H3Vv;x!>j+G>VYP7mV5JwP(C#0iR25)gK=VZ zYCwfsfJqMba z97$z#L+mvtOc%7U#`~l6zqDEz*MtKzZ3v(LuO+K3b1ia`3bGFOx?gqr7h& zg+x?%=JiF>XQDZj#9dQeu&aKmml|_9+~P(!k8Zw5+OCHh58`Q}#HoFp1@qiva^J65 zn$R&^M3Q^Fi_=tV2)PX{rfM`ruQJir4sv;W zTJ$md^(2I&&F*!pIRNHVG6Ft@C&_S(t z-&n2W%yX&ywCKSH_UYhhO(Metl84|HGV@8Aku;w+J6Y`kq4BCSDp4N15{9xKYt0mv z{%tC5w{ZFznVrP%v`F_61HXa$a_)uAMQXsza@ zp;vS*SwB`Jo3?ds3`1)aSF)m5zI_08NnoBu!+EeO ztEd>|lJf@^Hk06H(OsnfV-eh#i=NYGcrQhg-z;%AF}tz^$@c@# z6jz^ZKl2ue(ADL}n#t+U6vNHQrK}(6t$H46APi-QY%R%>4N-JdEiq%Ho1(5>iDIFR zNJ3^;*m(x&YIKArn>soZ7l0ADzlmOg=JKB}wKP`YEfVZbluQ2<_dJ_wV_#M+$fFXu zJ%;Ov!CcZ0F@jri_9&pDwC;#Qcb5CwMl*a%>}9y3a$;e6X(Z5W6D{3nZz#8}qTA>~ zW}Ten_ZWe)>c6m9YfMf{w%AFIdsMQ!%(8fOz8=IS*zsRfWiZwhm-vglfvM)YE=4W4 zFP~Q#IEKu+x~i8FPk93EFp0l$Bg`#)=0A`aP1)#Q8s=LZj72fsLfd+ij{fSZcxr|R9R1$#vm8ix8-oxmnMLgwLRMVl!R9K;Fo^p;K>rFZLxq2p=| zvgpbBEXAP(J;zrm-BFmXOG*A5-LvgbH6bcfuqNsNzM?U1fg~66=n>tbqLjgpQm?6A z{(LmYI^&+Y+|u17;?nXcz# zk7~%J%?e@V7RIQqI!Ee)Kxdpb^(d=T$D7+~^RIa0)0mf*D43b)qA(s8^0X(}DuzeY zRWS5NR22@kgtMmY7W2=^JIq$|GJ%wsiaEklc~U4&cXNay>!1@)L3Gr!Q}5dkB|B(9V`9I_W;);` zd+1?e^*~!)3Z4+V11NAHC&AP%p`le zdeUcl$9de^a@=nb#pl4>Md!l=w+Vk4sKwcRZ*_uxZMO^QxJE_PGAFMy&KJt~fj!pb zz-g_iGhVyB)dIn|NjM-m$tA(sS$2S$s?7KYpMWJ~jiIOMkQ8#WlJ#5gyC-!yt0;9- z?^GRq%q|>0jCtZCUvnnwC6~totie{^Z|%?t_&Z@#@*Nb_{dt*$xcc~7-wnOdvieu{ zjvZ6G!#Se7ZZUNmCv+Yfm3m$E#tM2Vm;N!Qpobaa-qH?Q$%GqS^4*gtHr_x&`En^$ z9Cgw)yCtxfp5SGA4@}a>Xj05JE3|~lsW#jMndPt+TLDp%E73=RNdA?lAah_C6$fZ5 z2KqmCpV6-rg;9a*GJR=Ja7v?=d7*_4;D}CF$HGOZ2kxeSCv@Y$;N3KZhxjJaIcgo~ ziIcKyyST)hS@NSYQCYfy-h3~#4~6-e)kvbwP?VuYJdZ|FJio;r?yLXB4UvRC5GmtW z$hOBIuf(EQJdZai}7{>!tv`aYWHc+d4XH0*AioGJTj6!que~zv^z^3y3&nNTdo>?w4GWO-c zi;Ed!-8=apbg&;hA7^ zB)3&6d_az(7VVR*E*pcT%u4Hgum+9MekvI(i2A|ru`<1+`?Wil@6#D_t!P~swPX)z zOQhU+rm6;7nx?XuX z$S1U?C|Xo_e*d4l7twLjN0tT^E&r1%it$QRC(-d%s&EePYHC52YsodxQ-0kmI!)FI zmlXC_VHOr9VYDqMca)zy34$Cg9I=f01=Bhm6Fy=VMVcAaTwwvcfy>UI;q=gqda>@S}G`Tv;2O0U>q(d z50%P87}@$d!qirfyo<|JOBI*T8w%y$6|9U(qh30TRG=DHr6XJu^Kpa=pakVm!0x9T z7=UIpHd@R@&doZ@c}a6D?&*c0eF)`NyYL#M4Tk?#h2=LjRW=V76aS|4 z_wEgpR&i9BPN^Shao`?Z5zKN)wTc!JE?9J@&6^jFij#IxA2@ zKAk42)m9gPCgl7P=ADJmDNwgm^=%IO)tL zyi^@_U>@RhC{`?Dd1__oYqo;Qx_-gL3oFD z&~w$1GMx{dR+K3Ds!3QbZ>J{itGrll;2c05IqT=Ng6c;#CtD2O`izv&dv<=k4_9c6 zJ(E6_$ShtQS%SQa`eeypx3es3YmP{~uiKeTsx`@^vWbgoZohBR@SYsNel)-&5rO{5 z@p21HBG&2q!P{<@Tn5~OYMZG#o=(XH3)>~oTRjuec~xR4X`yw$$5zgz7ppB+@ldD0 z>QHm4V+y-TJe^;cvHaTj$gOQ}#9_f36U+xXOHb#8bYH~PZ`gSS`;xz>-CQvKU{snJ zhy<@Ft)#{F+sAvU&v+PvHB4AG`^u-Us?Wt`=B0SAG1bNs{J)dZ&VDt%csQjWwraSWSTY$0iv56t$$B z^0O;Oi1XkmEr&wG;Hx!y(^0)EQYWJhx?rA}Ct=zFdnJxhR}uCpC`Nu7!(FL=f{d?fBeUTc(fR;0ZuIy*nm=Uy*$!kH+}WGgmV?J&pN;AMr!+_40wO$%fu zoW@~$p1F@*rjq-y$>4@GjyAdDMMSP~^FTq_IT_;}73d)CM&8uHsgeD`r~04Z$tZT` zV`tzdcJupzd7^gH{HuK=JH2%?B#1#@h)vGdyr9ksCBzDPAWzdT@fTH5HFQCh7;&XN zP6C{{!o~25#ZjEIWu$`G8$tY@)Fy@1LBM4-yBAjT3-1hd!q0(e&J2{(C-6V6V7g@N zRr4@1Wt~A@%4g^A*l%9%gC^UwPV}&#=g3I!zf;^N6GBcp@DxC7rw;2eavTSe93+UUpxn zzFHgUnQ|sd!mQ48mpXG!X|4r635I-?B~tc!9i~x zzI8J&fHz=_xkAsaD)h0C;;xJd{en68$?hu=O@YuiXycw!(IN!zsS;>lcFG?dG&k^z z`WqD`n^=IdXtGL^SyZgyNmSbN1lTP$4W0W|p};@zBt$606XTcD5L3&XqGo8s*C@fH zQcsbv<*K`Dvuy0-81BpusVy4$e-_3hdP-X&zav$?>S-^@Y2`fEc~uAZFRKFQ#J?Y? zw@yDqIVTTY4Ydi*(vmTtpC!LzbC}+0{c}{BEH0C6xuO&+DX%$d-s1H_aPyXa=Jdjl z#Df;SOmckQTy)~O&V4&i%D=hjlH0?7FxL8z&rxCe!T9V-;zh0@iw_0&NtiO5nycSJ zDRc%UskhxX{PCUh{y9DY3$xs5+=3oUXf^=-oSriBkT>`gb2-C&?Y<$}x_Q$V;@Xt- zc-7K-yhoT9O7phKK;0=6(S?;q;|9-C=iKW0Q^^?&CeWXDUsaK6WD4IqV!1N)lEQlD z@S7@+*u}gOv(~iFQ}xIYKIfD&|Idu0#9nH{7b+-~1H5qF<-a~m;b3R_SUkvefC|!aoZ%DP7_HoPW}TU!CsQe!BpV`5^8?6yJAM(sTU1atf`-1e}VLR}*A^SkOnK z_)sL(e24^ID;8068#(`B+?3|3Ed2-iZ~%QNE58gl@Kd)a_dsPgm3Ac7wsa575cRs2 z*;$RC9UKKAZTGIzbHU#y|E$Dcddo2jg+TrlmNS5)0f(xaIb25H)d4Q-K5-oSGyWSh zLg&^w8+PjnztOaK($c7KP?G&SeW5h{lbT7zXfQ1j1QRcP3m+;sGSh3Nem2uZ6}#dc zyCc1++IW71bXVSvBW}F-(gR*OP6;2EzpbNRs;=TI`qf#&Bc+K>wk%D?X z7@F(;nsJyV9?Xc3>V?9z3$`=QKhRfPR+dfBf2d3}=O|N=mUCC>va!)vU**~6H-TPV zBma|V|CEWR#T0L+;R~;;uE=Gmr!$yGI3rX&+DgUU3C??_1;YO2*06edI*te1;r0LT ztQLlG^HZt3d7Y^ALRc6{riRvb$tz73-!%e7ys>Df@>8^)i{Z#Xfd)Uk&zVT9Osobe)5i!KFcU^%yTbMa)1#9%FC^#00m z_*2@sKJW&GW?`(^sDGtCm{4Vr9*WC$5CxEl^z6UvA|lE)B(o_g=Sal%dH)KOxhbD# z@^lP}YM$Lom6nL7b7BXdq?o=p<5WD_V+l$lh%4r%ooqgkXKNX00O3!i&r;@rN~5Fu zH@9Pp@=Fy*s*^k2!dwpHB_vym@s#0YiZ-1v72I)&7lctkywqrHqd)jIFO!6re~Hhj zF4A+E{y>w!T(c+AOcs>1GmS7ApVN229aR>lH%1?~IX)GgmqtR}+uKj=LTPlBd}v1d zsSqw<5UQal*@^RGWoMpDi#mD2qtO!)RCnJqMR^Th@lLkBF9I+IBlx-hvX9;q|2Y@` zQ9cySe~P!@4J6|&D;P*ZmR|1n#aY{6t9<^hG4S(LCoe8=raB)QsUDzAau$6+HSlZZ zr<@ub=U?Ho9crBTs`QYVMVKbZoDs4k=udu!OY>jUE&pjQsuxH4psB9OBShLQw_&^t zQwY~eS80qhzvxsX1s*!R%s8hx7Zuh%Dz0Z@g?T08x$e*LyxF$t0_v%YI)idbJ;RVF zO)=gKlvk&)$m+f+i{5so```85S%#kUNcX}%(;t1Pu6WqJ>O;(@7&?a4b}{-LD&qxx z6gc4Z;xv=nETXCTSGk#zpd)lNAQXU`NjT!X=InM8aWEWI6(n{0 z$Xy-$izXtWbynyRwKFAf6f?|TfeOD-ae1>3rB~!RGN?;(PTSopJY5ZPGP18wgbLG1 z`V~I<-rgJ9La7PIBdx`#j|#r#&*!td;A3iK2BE55)t}cw|MXT$b^&Q=6bU`y@sxm< zQO%RHbbbAsfcSyI_f$6hVV=@2stnC>vc)78Q=Of5$RF7lLUAun!1ct0^I}{+rpGi# zGHMHTKoovH|6tt60cG(RG^O8KpP_LArE;qwl$DX6ADi3w!g<#Xqb=pdzj_HRQgcj- z5iUWq52uhHDW;0rsQmO5L*#^G0!s4c+qMCGtmZt2=Tyo4h%Ju5^IUU;_2Yf83ud)_I1X zd6e^y{S}W_7ImaA=~(0s$Cj{Twlg7P3vHEmE1fKn!}8^P+#SXBIj#46$T2MEf^X95u z14-OWaQJ$hG8rN{k0ph$m=#BCb48pqiL4E znNJOgOc6&t#t2Iv-sXllN_n|IGwP~J+D$J9V^*UW7ZNERXYv}q>5T-83zUcqS25z3 zn^8M?z!|!+I}not^=XS^@m}{Ww>&k_cY{;JAGSgPC9Tc$k*;DIXBJTxy*|N~wA_7Y zwmCvzg?q{^+oCw;(J*&6jDJ&{c*Y!Nlu0Jp^K*}2iO_s|5kH`#_)d^zmv9>{nVDOi zcH8QIoP@xCxF=y)Yw>eOM4l?Di|QA3Q4Hk_JQ9;b2$;Ij%{ll2>nRcznqo;LG<1hp zf2oQ3Q#mh(PtsHWUEjJ9bi!RH5yRhj7kiu^HCg#_k6*zPmg*CjJH0#E!;eDo0c z`ES$7Nf4ae7_$W)KH)V{orKmsy#~7TWn@CBauSx^p#Gs0iB?TGR&{n);UMpjuxeKF zDEc8VUmaF6_!m{)pBAq!AyE%A=S7?w%F*6-d#W_587a;XZ&;ibs83|Vcv^lM;4ByC zcT_Ob3yPz=&L;n3pKgl7d|Pe9yY@)C43cT7RR_nsSrm(scE9W%evUD9xRDY<1HE4y z{Mz_gR0U27JSs-`D0SN(i(*XJXyG~EC)gvdKzY*}>LtaA%9)Kcrj1KDxNeALo z^Q4k_uuO7m9o&-XyHJI1n5UsJW|y!ja$%e#hAcNS4F$fpLcBjEHY8OSl_H6M~99!|h+v%(~K2WbS3>0g{c;^r76 zIdfEBY{FNnn{G+7oD6$du(0^8nrcb73Ibx?_EBvsk%sX5NK4=1#)@fJ=^PJLw63E; zyiByAnYt&?{4Xy*&7!@@H=SzkLeo~LyUJPiWcMXms3I!-I~UgjMT{#XFNmCEIJVv` zCtZf-(s|dhSDAQ83FIRyIMzNS%15Zor&JM+PVY-YxdVidgdPQpU=_Ct_V9n@b6U7x zVT44y^XzTTKGRovbNk^>-YgF$)I9h>?k|NSj1q8{fqUsOG)M$ahTCZ+E@L`w^FdD2 zqtqt#ZPJc{b_zEMRF_AXp54-)ZP8W?po^gf7~+0K>(p=Q5P|A#6D{+;qa5bh%ZL-V zJOI7T0m(UZ#V9A@CZHRwlAq%wdHM-zpfLSO?_zPJY^2Dh1#T`0UJAl>Hdt#Dg{!0l znxhQBIUDkdi)nfeZ5nYQu1u5ZABl+E=At?01EoMMImp-e43Y-Cx#b!1GH4;M3?^*<-1A?%}{@lI37ne%umiB z|2Yfa3uvfmA*g4j|CQaCwwt@EigOIV@hHk?MyhXklRc7#b3^~Tv5A{~^a-5wqV#&G z0S^MylnD4kj^TFri_4sTmpf$yXp>rpbMz@m3=m1BKird4)tGhV&8rgptWd{A9-_rO z_oJm^_$*pL?cDK*M{Bv?L5UT5yTuYO$Cxr!755*L+v~6XM^Jpj(M$Y@%HpRcsE?ecVhMi4_tcdp^HZ|v zd&xAM5@c60IYFPK)#T$S=Pox9Y1pfaaT$J_22l_C7Dqypv!g{e(qn0-n4;hC7G2M- z>yB`8ntHyLk(iUxV)!0{bj`?o9Mx9E^$*hejOG4ru`*D;whUT0R|5PgZVPV%fv=NJg^SF*c#9e$w?UxWBn#QUFdc4jXzdccwEN{g?=TAz& zyWCzsmY{E&dQ*BB@0b`W5kCo&X{fYr1jQZJiVR>+n1dR{STBu;Hr=GB=7a#->AXkZ za|fsZjW*W><0R<*>Bj9uwJ{`^nw>-^=(5R$?e03!-EwNGI}I{ND33VQaX2>>@mI9W zD6S^&#Ib|iQ7?59jpH76ZHfFw(+RyE6REfgGRT zadm$n21Uh%;di7-#9GZO?A25wr9QYQ5k4;wpV5ExJ|&6;EadnpUto#Y|Mlb(E$E(E znhF>h2Ne`kik_GQn8KYApS=_h5i;NS-;&LuQO!#oh||;69(rA@*>8fiQ^oVwP=jZ` zg2Cz$&qJ~FY33<5@bR4GqZ1{(k_|B!AIac(+6{&87ynki=2$NCx%g*+>&4w=;7$ZqQx3GQTge>zitnX&U}3N?J3W15l=l*-UlKWx;aw z@Sa@@L;U+=u+*6ls6cLbu(Vl^hd;4eEQEGmZvHy$F{P-6`-8xczey)v_e%@$8a$_$ z>Nlzwdc?_eSS`jTJ&>Y8$FL!>yv&->BrZm>j49NOZUzVQKh`E{?N-GtiH(+Ebow7& zEtQkBhslR+rUf6NnWC-jF+>#$9mNwQ@>`|`MkkK;ITd({UO;8cB*AOzlAgqpBf4II z9?`U{R@+wG>L@PNpmSg;A@zr&On(}*+a2r3;i>!{uFxi2bg!bFgusvab9LQ+*vG5sG@77~-4+#$i~s&V|0@TzVekeTsHb{G zvVV4#SYyn;CS+&CLtl{a$-j41;h7y;;9v@=%IeDdEaJ9)~izqutg`K_$LRCCsO~x-P^)Y<5pm zmboo)Y!}mwdj*Q)Lmpy&2^JDmu!3@UXTxfUJ47XVLnVhG4RWZYU~XEsAcQR$t-NZq zf`@Z!ejBCrL%(dAzwT^zmV|}N6Pt0AKIhMpR#g)3-2%s~VZSHn|4C1aeO_-<%|fmG z4ScBO78gUh3nlCg{D(lC-@HEI76OsJRAE#%HQ6WXQX9h^*>EY-<1=ZoD#u@QVRb`% zL>M38MYV-+y z^Vjy_W9Ped$0d|nKe!t2cTcK@a&ceq4CU3+B#SoCS;>C{)`<~_Hlu^X>9E9#{=~N| z+4_8$+F3QJd(OJ$ot)tJd;m?uKva{QY^&hMx(>dh_skD^Ca#(xP6|!ux^}iU&T%n0 z5cjgyz2mf!=)PTcrO?57FaB`HYtQ?f z8~FQM5)oEUC@!b>?07G3!$;k<;VT$vd3Igrs2Z7k$ITYpyirax)!fBeuS(=WWCsqI zu%4hGY5qi(U5l7uN3)F!fyS-#L3ShP@69Kao0sA^KQTLG#_NbrXHjMR8Xv8D#YgNt zNTDQ*U}7K`nhNn_X998-WuM|`rz73wjEFQNsHAXu#oD+gVFNYdI2)FQn{AiRANGu<#2ibiy zzY!A0VSvsu z-}@U|{{FFMBK<@iC^6{qQydfXHv^+}78W8L>4;M4yG&ctB$(G6!~{y?rksm*OUSub zeJM1!BKfD$+rKP^8?kJ0lund1`w{_*Fvwk{Q-WWZ*F=rLPbkDgxHx34mlrAR^yPG^ z-P}M+vSbgf9d_#A(zMgITbI>YBwe%*n zX5E6wC~uhEOK&qv^#JD#VzgpCd`n z<<{B1sn5~Kl&5CqdsUu3$0{ans9T5~-Aj+mmw3i~=~p?p8yTTereY7)v z9&H|*tDdyhnSHz;O=z(0oc@K`C9Bzrm<%qh6LCP?N>3;%&81CI`WX||3S_AEq&Qu_ z9`;%;Z@hTX!au$wmU-;{}Afp5${ zyPbSC9v{+2W)cswTj6DES)a(Ss_C2}&i@B$8kwu(+%$WT6R)aK&e(J>yk%d)F?%Uh z$2^sd$MV-zB#iiomZQIy#;a%#x}b8as%>|?1`T~`li zeXt&mx^ZTT2xxK4^bd>6=p`8UA2FRv@G}x<0-Zo-_hX!(_o?_ z{ueQn4{w<_Oh6TN`XOlY@<9xzZ1XX`lG`}@)n~e){6!``3{8@^8;^c;n1AvH@FLD{ zEdMnNmx5=I<_$q0oFZ=VnYnE`BTe^nx7x3BBU&0s!cuYD-#ZEyjdliMn)IqYc2cRH zekAh{rX20k#Z7T@#_4N@Q?0;iJn;IVlo`%9okbGx?Ke?5c@K=C+BCxy#p!T`$Vq2} zJAtm?3m#)fkcFPXqSQ_#=N6<@Q>j2AE}~8NIu#eN{3Cr6&}eP)hKeCZ6_xCde1q>z zyYMKCaO+@U@D)_2G^d(CqcuwQNg)ly<8&d^^55}!<1r1LaNc>Us_MEZZA&MrobNSM zSLL!7JN=5cDDKWRhuro254Ht7c>@L1bLUucA0A8ulMxmhf04J~sm@~AKj*HuR?!FM z93IGywU(S4<=5SH^YIbX4A!&H@jEay!u*Ll;^dm3U@(=4a}t+ti6$mX)VUxq0a@mV zR}vhWvu>ZMj1{^zKl2xhVM&iT+v$cLge$?Brb{SDGxU6JAAZiVNL<&aFO8yKFwe`S z+DZi0IAb|gxKqi^)w+Qj&DkcTh8Uqo&M2VA(Jrxb-}$>+yxs4_=B&?n!|WzIK-M98 zMa1SQ=W~my3}?QRi(2y?NqF1|<_%QPHH0$E*Ip{Zvc;r!4A$b5+lMEbo#_`PNq>&2 zN|hotFjVr|g6w3Nd4XzzO5dg=HCY`YsXVC~{1^8#mDOO3 z!^rp}=0`3sW~8;=MCGtw@P8~1c3bMJNJbB9p4y+$hXQspx4x34L%bP@^o0I3Ur{}^ z#M__>s}=$nDxn(hQiI$T>JhcVNK=g;Wv<}nTut2CU9>fGsEH|>p2h7-fg=tzbzs72>iyMswL*M-8J#C&je5j*>FjgEvPoE)W`I# zTUHm~k&!t3ZJp*RT+;-xN?oL6ek=w%xBT49JV1fSJ)WPr4fm`P_*@LZKJLrH_(0dq z9{g@MF&A+%{SqF~3+3ZKXoYSyxGR-)@6voz&fK#+^{UV!ZKUR6W*Z;{3GHW71PSVn z)de|Rg&Fn%J&M|*zkSOdi&I!b7QgLGGe4mj52fPtf@*SW{*F5(d}sdTk%A$LCO-1v z>*Nk8r=!r6Qo#{n&7lEGrhm~Lb(|0UR$jbG4?W@bb<)*c5smlsGhwUWu1;}2vxu9( z<}Fp2qOmWW%L!TAsgwNtuT$B5OH^+iDw~sZ$sUf@_>xojf0^4c2(>8A$%9cQ5qI79 z)q85X7QJ&uMK-%V?XLs5usjZ&#+0CA{7{=-}0-#b`*ca#P{BZktbR zOckjRJ*Fvik~cYJjgVqwUK6GM2&*XI=wM$bO22gfq8y^{h3Z=s_Ffa|+v~OwoZAD# z@h;wuL~|P~w#%W481~}kscGyEqi4L8Qp9mRwdbTa3N40-6coHP#WY3Zb+SnY&9!&D zV#Xp?+|!&$&PN$Iow1QTsg`tX{~2tIIlj_VS@)Gw3IjFNt7f4IJ3~!h-hl^_V4D?B z0WM~W+G*%*V*C^1%w;5}*Wi9)^Ka=j=!%#2-z19*)NQ?l|JL~+**>!vD=(KS)-&c^~>pKyX(+F2(4rG|Y%G&9TkQU9bbq<1sxwTw=91J*mBO$*zjDNGx~da#&0))kBip2@XiYZzGj-s+dWVqlt2!SPe-*CYKP6 z9pe8Z%8yhYOXR{miVFBTGAKKp8OP{5e@mbG&uWA`*dow6*}am!ln3)Kw~47DCG6F!Jwo&l*iizgSpUDU7&AN51JxQ=caYWZ+w(U<1sQ) z)Luo4%uLFnMbUOeZsOd>WGXDc|D>~5 zy)Uk)8jve}m88&S&XK^3C+bZfiB*as`XH&k#co zC2O^Xy9m1NM14@!|1b_ei+LRpSs-1+yYL=QrVetzTL5|P(TL!bjwUITaE8PetMCt( zmx9~9?02aa_Gy1;t2!j%_)95-$mh;lT^dW(wORR}jhf&?p> z9!OQkX_=~ovdVJ*!wl0OhgC;>jVr=oQ#*$9xOuUga#0`miu+l5RTL>)zF~T{Jk}$Q zO+V{NPp>+xex+t~kh;iS8=LMtpDyc~ZaO}spZImT+G)3lz=f)i@n5%0AY*n*ZLfRG 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 { + document.documentElement.classList.toggle('dark', darkMode) + }, [darkMode]) + + const [features, setFeatures] = useState([]) + const [loading, setLoading] = useState(true) + const [loadingProgress, setLoadingProgress] = useState({ step: 0, total: 4, message: 'Starting up...' }) + const [error, setError] = useState(null) + const [sortBy, setSortBy] = useState('frequency') + const [selectedFeatureIds, setSelectedFeatureIds] = useState(null) // null = all selected + const [mosaicReady, setMosaicReady] = useState(false) + const [categoryColumns, setCategoryColumns] = useState([]) + const [selectedCategory, setSelectedCategory] = useState('mean_variant_1bcdwt') + const [hiddenCategories, setHiddenCategories] = useState(new Set()) + const [clickedFeatureId, setClickedFeatureId] = useState(null) + const [clusterLabels, setClusterLabels] = useState(null) + const [vocabLogits, setVocabLogits] = useState(null) + const [featureAnalysis, setFeatureAnalysis] = useState(null) + + const brushRef = useRef(null) + const [showGuideModal, setShowGuideModal] = useState(false) + const [showMetricsModal, setShowMetricsModal] = useState(false) + const [searchTerm, setSearchTerm] = useState('') + const [cardResetKey, setCardResetKey] = useState(0) + const [plotResetKey, setPlotResetKey] = useState(0) + const [viewportState, setViewportState] = useState(null) // null = let embedding-atlas auto-fit on first load + const [displayedCardCount, setDisplayedCardCount] = useState(20) // Pagination: start with 20 cards + const [showEditedOnly, setShowEditedOnly] = useState(false) // Filter for edited features only + const [histMetric1, setHistMetric1] = useState('log_frequency') + const [histMetric2, setHistMetric2] = useState('max_activation') + const [histMetric3, setHistMetric3] = useState('mean_variant_1bcdwt') // tracks color-by selection + const featureRefs = useRef({}) + const featureListRef = useRef(null) + const endOfListRef = useRef(null) + const searchSource = useRef({ source: 'search' }) + const editedSource = useRef({ source: 'edited' }) + const legendSource = useRef({ source: 'legend' }) + const loadingMoreRef = useRef(false) + + // Lazy-load examples for a single feature from DuckDB (feature_examples VIEW) + const loadExamplesForFeature = useCallback(async (featureId) => { + const result = await vg.coordinator().query( + `SELECT * FROM feature_examples WHERE feature_id = ${featureId} ORDER BY example_rank` + ) + return result.toArray().map(row => ({ + sequence_id: row.sequence_id, + start: row.start, + end: row.end, + sequence: row.sequence, + activations: Array.from(row.activations), + max_activation: row.max_activation, + best_annotation: row.best_annotation, + })) + }, []) + + // Intersection Observer for infinite scroll pagination + useEffect(() => { + const sentinel = endOfListRef.current + const scrollContainer = featureListRef.current + if (!sentinel || !scrollContainer) return + + const observer = new IntersectionObserver( + entries => { + console.log('[scroll] sentinel intersecting:', entries[0].isIntersecting, 'loadingMore:', loadingMoreRef.current) + if (entries[0].isIntersecting && !loadingMoreRef.current) { + loadingMoreRef.current = true + setDisplayedCardCount(prev => prev + 20) + // Reset flag after a delay to allow next batch + setTimeout(() => { + loadingMoreRef.current = false + }, 300) + } + }, + { root: scrollContainer, threshold: 0.1, rootMargin: '200px' } + ) + + observer.observe(sentinel) + + return () => { + observer.disconnect() + } + }, [mosaicReady]) + + // Handle click on a feature in the UMAP (or null for empty canvas click) + const animationRef = useRef(null) + const currentViewportRef = useRef(null) + const initialViewportRef = useRef(null) + + // Handle viewport changes from the UMAP component + const handleViewportChange = useCallback((vp) => { + // Capture initial viewport on first report, slightly zoomed out so all points fit + if (!initialViewportRef.current && vp) { + initialViewportRef.current = { ...vp, scale: vp.scale * 0.5 } + setViewportState(initialViewportRef.current) + currentViewportRef.current = { ...initialViewportRef.current } + } + // Clamp zoom to max scale of 5 + if (vp && vp.scale > 5) { + const clamped = { ...vp, scale: 5 } + setViewportState(clamped) + currentViewportRef.current = clamped + return + } + // Always track current viewport (but not during our own animations) + if (!animationRef.current) { + currentViewportRef.current = vp + } + }, []) + + // Easing functions + const easeOutQuart = (t) => 1 - Math.pow(1 - t, 4) + const easeInOutCubic = (t) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2 + const easeInOutQuad = (t) => t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2 + + // Smooth zoom-in with "fly-to" trajectory (zoom out -> pan -> zoom in) + const zoomToPoint = useCallback((x, y) => { + if (x == null || y == null) return + + if (animationRef.current) { + cancelAnimationFrame(animationRef.current) + animationRef.current = null + } + + const start = currentViewportRef.current || initialViewportRef.current || { x: 0, y: 0, scale: 1 } + const targetScale = 4 // capped below max zoom of 5 + const duration = 800 + const startTime = performance.now() + + // Calculate how far we need to pan (in data space) + const panDistance = Math.sqrt(Math.pow(x - start.x, 2) + Math.pow(y - start.y, 2)) + + // Determine the "cruise altitude" - how much to zoom out during the pan + // Zoom out more for longer distances, less for short distances + const minScale = Math.min(start.scale, 0.8) // Never zoom out below 0.8 + const maxZoomOut = Math.max(0, start.scale - minScale) + const zoomOutAmount = Math.min(maxZoomOut, panDistance * 0.1) // Scale zoom-out with distance + const cruiseScale = start.scale - zoomOutAmount + + const animate = (currentTime) => { + const elapsed = currentTime - startTime + const t = Math.min(elapsed / duration, 1) + + // Use smooth ease-in-out for the overall progress + const smoothT = easeInOutCubic(t) + + // Pan follows the smooth progress + const panT = smoothT + + // Zoom follows a "U-shaped" profile: + // - First half: ease from start.scale down to cruiseScale (or stay flat if already low) + // - Second half: ease from cruiseScale up to targetScale + let zoomScale + if (t < 0.4) { + // First 40%: zoom out slightly (ease-out) + const zoomOutT = t / 0.4 + const easeOut = 1 - Math.pow(1 - zoomOutT, 2) + zoomScale = start.scale + (cruiseScale - start.scale) * easeOut + } else if (t < 0.6) { + // Middle 20%: hold at cruise altitude + zoomScale = cruiseScale + } else { + // Last 40%: zoom in to target (ease-in then ease-out) + const zoomInT = (t - 0.6) / 0.4 + const easeInOut = easeInOutQuad(zoomInT) + zoomScale = cruiseScale + (targetScale - cruiseScale) * easeInOut + } + + const newViewport = { + x: start.x + (x - start.x) * panT, + y: start.y + (y - start.y) * panT, + scale: zoomScale + } + + setViewportState(newViewport) + + if (t < 1) { + animationRef.current = requestAnimationFrame(animate) + } else { + currentViewportRef.current = { x, y, scale: targetScale } + animationRef.current = null + } + } + + animationRef.current = requestAnimationFrame(animate) + }, []) + + // Smooth zoom-out: zoom out first, then pan back + const resetViewport = useCallback(() => { + if (animationRef.current) { + cancelAnimationFrame(animationRef.current) + animationRef.current = null + } + + const start = currentViewportRef.current || { x: 0, y: 0, scale: 1 } + const target = initialViewportRef.current || { x: 0, y: 0, scale: 1 } + const duration = 600 + const startTime = performance.now() + + const animate = (currentTime) => { + const elapsed = currentTime - startTime + const t = Math.min(elapsed / duration, 1) + + // Zoom out fast at start (ease-out) + const zoomT = easeOutQuart(t) + + // Pan eases in-out + const panT = easeInOutCubic(t) + + const newViewport = { + x: start.x + (target.x - start.x) * panT, + y: start.y + (target.y - start.y) * panT, + scale: start.scale + (target.scale - start.scale) * zoomT + } + + setViewportState(newViewport) + + if (t < 1) { + animationRef.current = requestAnimationFrame(animate) + } else { + currentViewportRef.current = { ...target } + animationRef.current = null + } + } + + animationRef.current = requestAnimationFrame(animate) + }, []) + + // Handle click on a feature in the UMAP (with coordinates for zooming) + const handleFeatureClick = useCallback((featureId, x, y) => { + + setClickedFeatureId(featureId) + + if (featureId == null) return + + // Scroll to the feature card + setTimeout(() => { + const ref = featureRefs.current[featureId] + if (ref) { + ref.scrollIntoView({ behavior: 'smooth', block: 'center' }) + } + }, 50) + }, []) + + // Handle click on a feature card (highlights point in UMAP, no zoom) + const handleCardClick = useCallback(async (featureId, isExpanding) => { + + if (!isExpanding) { + setClickedFeatureId(null) + return + } + + setClickedFeatureId(featureId) + }, []) + + // Initialize Mosaic and load data + useEffect(() => { + async function init() { + try { + // Step 1: Initialize DuckDB-WASM + setLoadingProgress({ step: 1, total: 4, message: 'Initializing database engine...' }) + const wasm = wasmConnector() + vg.coordinator().databaseConnector(wasm) + + // Step 2: Load parquet data + setLoadingProgress({ step: 2, total: 4, message: 'Loading embedding data...' }) + const urlParams = new URLSearchParams(window.location.search) + const dataPath = urlParams.get('data') || '/features_atlas.parquet' + const parquetUrl = dataPath.startsWith('http') + ? dataPath + : new URL(dataPath, window.location.origin).href + + + await vg.coordinator().exec(` + CREATE TABLE features AS + SELECT * FROM read_parquet('${parquetUrl}') + `) + + // HDBSCAN assigns -1 to noise points; embedding-atlas casts category + // columns to UTINYINT which can't hold negatives. Remap to NULL. + try { + await vg.coordinator().exec(` + UPDATE features SET cluster_id = NULL WHERE cluster_id < 0 + `) + } catch (e) { + // cluster_id column may not exist — that's fine + } + + // Step 3: Process columns and categories + setLoadingProgress({ step: 3, total: 4, message: 'Processing columns...' }) + const schemaResult = await vg.coordinator().query(` + SELECT column_name, column_type + FROM (DESCRIBE features) + `) + + const columns = schemaResult.toArray().map(row => ({ + name: row.column_name, + type: row.column_type + })) + + const detectedCategories = [] + const sequentialColumns = [] + + for (const col of columns) { + if (['x', 'y', 'feature_id', 'top_example_idx'].includes(col.name)) continue + + if (col.type === 'VARCHAR') { + const isGsea = col.name.startsWith('gsea_') + const maxUnique = isGsea ? Infinity : 50 + const cardinalityResult = await vg.coordinator().query(` + SELECT COUNT(DISTINCT "${col.name}") as n_unique FROM features WHERE "${col.name}" IS NOT NULL AND "${col.name}" != 'unlabeled' + `) + const nUnique = cardinalityResult.toArray()[0]?.n_unique ?? 0 + if (nUnique > 0 && nUnique <= maxUnique) { + // For high-cardinality GSEA columns, collapse to top 20 + "other" + if (isGsea && nUnique > 20) { + await vg.coordinator().exec(` + CREATE OR REPLACE TABLE features AS + SELECT * REPLACE ( + CASE + WHEN "${col.name}" IS NULL OR "${col.name}" = 'unlabeled' THEN 'unlabeled' + WHEN "${col.name}" IN ( + SELECT "${col.name}" FROM features + WHERE "${col.name}" IS NOT NULL AND "${col.name}" != 'unlabeled' + GROUP BY "${col.name}" ORDER BY COUNT(*) DESC LIMIT 20 + ) THEN "${col.name}" + ELSE 'other' + END AS "${col.name}" + ) FROM features + `) + detectedCategories.push({ name: col.name, type: 'string', nUnique: 22 }) + } else { + detectedCategories.push({ name: col.name, type: 'string', nUnique }) + } + } + } else if (col.type === 'BIGINT' || col.type === 'INTEGER') { + if (col.name.includes('cluster') || col.name.includes('category') || col.name.includes('group')) { + const cardinalityResult = await vg.coordinator().query(` + SELECT COUNT(DISTINCT "${col.name}") as n_unique FROM features WHERE "${col.name}" IS NOT NULL + `) + const nUnique = cardinalityResult.toArray()[0]?.n_unique ?? 0 + if (nUnique > 0 && nUnique <= 50) { + detectedCategories.push({ name: col.name, type: 'integer', nUnique }) + } + } + } else if (col.type === 'DOUBLE' || col.type === 'FLOAT') { + // Numeric columns for sequential coloring + if (['log_frequency', 'max_activation', 'activation_freq', 'frequency', + 'mean_variant_1bcdwt', + 'high_score_fraction', 'clinvar_fraction', + 'mean_phylop', 'mean_variant_delta', 'mean_site_delta', 'mean_local_delta', + 'high_score_delta', 'low_score_delta', + 'gc_mean', 'gc_std', + 'trinuc_entropy', 'trinuc_dominant_frac', + 'pli_mean_pli', 'pli_frac_constrained', 'pli_max_pli', + 'codon_cai', 'codon_tai', 'codon_rscu', + 'gene_entropy', 'gene_n_unique', 'gene_dominant_frac', + ].includes(col.name)) { + sequentialColumns.push({ name: col.name, type: 'sequential' }) + } + } + } + + // Create integer-encoded versions of string category columns + for (const col of detectedCategories) { + if (col.type === 'string') { + await vg.coordinator().exec(` + CREATE OR REPLACE TABLE features AS + SELECT *, + CASE WHEN "${col.name}" IS NULL THEN NULL + ELSE DENSE_RANK() OVER (ORDER BY "${col.name}") - 1 + END AS "${col.name}_cat" + FROM features + `) + } + } + + // Create binned versions of sequential columns (10 bins) + const NUM_BINS = 10 + for (const col of sequentialColumns) { + await vg.coordinator().exec(` + CREATE OR REPLACE TABLE features AS + SELECT *, + CASE WHEN "${col.name}" IS NULL THEN NULL + ELSE LEAST(${NUM_BINS - 1}, CAST( + (("${col.name}" - (SELECT MIN("${col.name}") FROM features)) / + NULLIF((SELECT MAX("${col.name}") - MIN("${col.name}") FROM features), 0)) * ${NUM_BINS} + AS INTEGER)) + END AS "${col.name}_bin" + FROM features + `) + detectedCategories.push({ name: col.name, type: 'sequential', nUnique: NUM_BINS }) + } + + setCategoryColumns(detectedCategories) + + // Create crossfilter selection + brushRef.current = vg.Selection.crossfilter() + + + // Step 4: Load feature metadata from parquet via DuckDB + setLoadingProgress({ step: 4, total: 4, message: 'Loading feature metadata...' }) + const metaUrl = new URL('/feature_metadata.parquet', window.location.origin).href + const examplesUrl = new URL('/feature_examples.parquet', window.location.origin).href + + await vg.coordinator().exec(` + CREATE TABLE IF NOT EXISTS feature_metadata AS + SELECT * FROM read_parquet('${metaUrl}') + `) + await vg.coordinator().exec(` + CREATE VIEW IF NOT EXISTS feature_examples AS + SELECT * FROM read_parquet('${examplesUrl}') + `) + + // Load features from the features table (which has labels + category columns) + const categorySelectCols = detectedCategories + .filter(c => c.type === 'string' || c.type === 'integer') + .map(c => `"${c.name}"`) + .join(', ') + const extraSelect = categorySelectCols ? `, ${categorySelectCols}` : '' + const featuresResult = await vg.coordinator().query(` + SELECT + feature_id, + label, + activation_freq, + max_activation, + x, + y + ${extraSelect} + FROM features + ORDER BY feature_id + `) + const loadedFeatures = featuresResult.toArray().map(row => { + const f = { + feature_id: row.feature_id, + label: row.label, + description: row.label, + activation_freq: row.activation_freq, + max_activation: row.max_activation, + x: row.x, + y: row.y, + } + for (const col of detectedCategories) { + if (col.type === 'string' || col.type === 'integer') { + f[col.name] = row[col.name] + } + } + return f + }) + setFeatures(loadedFeatures) + + // Generate cluster labels from DuckDB (non-fatal if cluster_id doesn't exist) + try { + const clusterResult = await vg.coordinator().query(` + SELECT + cluster_id, + AVG(x) as cx, + AVG(y) as cy, + MODE(label) as top_label, + COUNT(*) as n + FROM features + WHERE cluster_id IS NOT NULL + GROUP BY cluster_id + ORDER BY n DESC + `) + const labels = clusterResult.toArray() + .filter(row => row.top_label && !row.top_label.startsWith('Feature ')) + .map((row, i) => ({ + x: Number(row.cx), + y: Number(row.cy), + text: row.top_label.length > 40 ? row.top_label.slice(0, 40) + '...' : row.top_label, + priority: row.n, + level: 0, + })) + console.log('[cluster labels] generated:', labels.length, labels.slice(0, 5)) + if (labels.length > 0) { + setClusterLabels(labels) + } + } catch (e) { + console.log('[cluster labels] query failed:', e.message) + } + + // Load cluster labels from file (overrides computed ones if present) + try { + const labelsRes = await fetch('./cluster_labels.json') + if (labelsRes.ok) { + const labelsData = await labelsRes.json() + setClusterLabels(labelsData) + } + } catch (labelErr) { + } + + // Load vocab logits (non-fatal if missing) + try { + const logitsRes = await fetch('./vocab_logits.json') + if (logitsRes.ok) { + const logitsData = await logitsRes.json() + setVocabLogits(logitsData) + } + } catch (e) { + } + + // Load feature analysis (non-fatal if missing) + try { + const analysisRes = await fetch('./feature_analysis.json') + if (analysisRes.ok) { + const analysisData = await analysisRes.json() + setFeatureAnalysis(analysisData) + } + } catch (e) { + } + + setMosaicReady(true) + setLoading(false) + + } catch (err) { + console.error('Init error:', err) + setError(err.message) + setLoading(false) + } + } + + init() + }, []) + + // Create a Mosaic client that receives filtered feature IDs + useEffect(() => { + if (!mosaicReady || !brushRef.current) return + + const coordinator = vg.coordinator() + const selection = brushRef.current + const totalFeatures = features.length + + // Create a class that extends MosaicClient + class FeatureFilterClient extends MosaicClient { + constructor(filterBy) { + super(filterBy) + this._isConnected = true + } + + query(filter = []) { + // Use Mosaic's Query builder + const q = Query + .select({ feature_id: 'feature_id' }) + .distinct() + .from('features') + + // Apply filter if present + if (filter.length > 0) { + q.where(filter) + } + + return q + } + + queryResult(data) { + if (!this._isConnected) return + + try { + let ids = new Set() + if (data && typeof data.getChild === 'function') { + const col = data.getChild('feature_id') + if (col) { + for (let i = 0; i < col.length; i++) { + ids.add(col.get(i)) + } + } + } else if (data && data.toArray) { + ids = new Set(data.toArray().map(r => r.feature_id)) + } + setSelectedFeatureIds(ids.size > 0 && ids.size < totalFeatures ? ids : null) + } catch (err) { + console.error('Error processing result:', err) + } + } + + // Required by Mosaic for selection updates + update() { + return this + } + + queryError(err) { + if (this._isConnected) { + console.error('FeatureFilterClient error:', err) + } + } + + disconnect() { + this._isConnected = false + } + } + + const client = new FeatureFilterClient(selection) + + // Delay connection slightly to ensure Mosaic is fully ready + const timeoutId = setTimeout(() => { + try { + coordinator.connect(client) + } catch (err) { + console.warn('Error connecting FeatureFilterClient:', err) + } + }, 0) + + return () => { + clearTimeout(timeoutId) + try { + client.disconnect() + coordinator.disconnect(client) + } catch (err) { + // Ignore disconnect errors + } + } + }, [mosaicReady, features.length]) + + // Clear ALL selections (search, histograms, UMAP, clicked feature) + const handleClearSelection = useCallback(() => { + if (brushRef.current) { + const selection = brushRef.current + // Clear each clause by updating with null predicate for each source + const clauses = selection.clauses || [] + for (const clause of clauses) { + if (clause.source) { + try { + selection.update({ source: clause.source, predicate: null, value: null }) + } catch (e) { + // Ignore errors from clearing + } + } + } + // Also clear the search clause specifically + if (searchSource.current) { + try { + selection.update({ source: searchSource.current, predicate: null, value: null }) + } catch (e) { + // Ignore + } + } + } + setSelectedFeatureIds(null) + setSearchTerm('') + setClickedFeatureId(null) + setHiddenCategories(new Set()) + // Reset viewport to the auto-fit view captured on first load + if (initialViewportRef.current) { + setViewportState({ ...initialViewportRef.current }) + currentViewportRef.current = { ...initialViewportRef.current } + } else { + setViewportState(null) + currentViewportRef.current = null + } + // Reset all cards to collapsed state + setCardResetKey(k => k + 1) + // Reset histograms and UMAP to clear brush visuals + setPlotResetKey(k => k + 1) + }, []) + + // Export all edited features to CSV with full data + const handleExportEdited = useCallback(() => { + // Get all edited features + const editedFeatures = features.filter(f => localStorage.getItem(`featureTitle_${f.feature_id}`) !== null) + + if (editedFeatures.length === 0) { + alert('No edited features to export') + return + } + + const lines = [] + const escapeCsv = (str) => `"${(str || '').toString().replace(/"/g, '""')}"` + + // Codon mapping for amino acids + const CODON_AA = { + 'TTT':'F','TTC':'F','TTA':'L','TTG':'L','TCT':'S','TCC':'S','TCA':'S','TCG':'S', + 'TAT':'Y','TAC':'Y','TAA':'*','TAG':'*','TGT':'C','TGC':'C','TGA':'*','TGG':'W', + 'CTT':'L','CTC':'L','CTA':'L','CTG':'L','CCT':'P','CCC':'P','CCA':'P','CCG':'P', + 'CAT':'H','CAC':'H','CAA':'Q','CAG':'Q','CGT':'R','CGC':'R','CGA':'R','CGG':'R', + 'ATT':'I','ATC':'I','ATA':'I','ATG':'M','ACT':'T','ACC':'T','ACA':'T','ACG':'T', + 'AAT':'N','AAC':'N','AAA':'K','AAG':'K','AGT':'S','AGC':'S','AGA':'R','AGG':'R', + 'GTT':'V','GTC':'V','GTA':'V','GTG':'V','GCT':'A','GCC':'A','GCA':'A','GCG':'A', + 'GAT':'D','GAC':'D','GAA':'E','GAG':'E','GGT':'G','GGC':'G','GGA':'G','GGG':'G', + } + + editedFeatures.forEach((f, idx) => { + const userTitle = localStorage.getItem(`featureTitle_${f.feature_id}`) + const label = f.label || `Feature ${f.feature_id}` + + // Add separator for readability + if (idx > 0) lines.push('') + + // Feature metadata + lines.push(`=== FEATURE ${f.feature_id} ===`) + lines.push(`Feature ID,${f.feature_id}`) + lines.push(`Original Label,${escapeCsv(label)}`) + lines.push(`Your Title,${escapeCsv(userTitle)}`) + lines.push(`Activation Frequency,${(f.activation_freq || 0).toFixed(6)}`) + lines.push(`Max Activation,${(f.max_activation || 0).toFixed(4)}`) + lines.push('') + + // Vocab logits + const logits = vocabLogits?.[String(f.feature_id)] + if (logits) { + lines.push('TOP PROMOTED CODONS') + lines.push('Codon,Amino Acid,Logit Value') + ;(logits.top_positive || []).forEach(([codon, val]) => { + lines.push(`${codon},${CODON_AA[codon] || '?'},${val.toFixed(4)}`) + }) + lines.push('') + + lines.push('TOP SUPPRESSED CODONS') + lines.push('Codon,Amino Acid,Logit Value') + ;(logits.top_negative || []).forEach(([codon, val]) => { + lines.push(`${codon},${CODON_AA[codon] || '?'},${val.toFixed(4)}`) + }) + lines.push('') + } + + // Feature analysis + const analysis = featureAnalysis?.[String(f.feature_id)] + if (analysis?.codon_annotations) { + lines.push('CODON ANNOTATIONS') + const ann = analysis.codon_annotations + if (ann.amino_acid) { + lines.push(`Amino Acid,${ann.amino_acid.aa}`) + lines.push(`AA Frequency,${(ann.amino_acid.fraction * 100).toFixed(1)}%`) + } + if (ann.codon_usage) { + lines.push(`Codon Usage,${ann.codon_usage.bias}`) + } + if (ann.wobble) { + lines.push(`Wobble Position,${ann.wobble.preference}`) + } + if (ann.cpg) { + lines.push(`CpG Context,${ann.cpg.fraction}`) + } + lines.push('') + } + }) + + // Create and download file + const csv = lines.join('\n') + const blob = new Blob([csv], { type: 'text/csv' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `edited_features_${new Date().toISOString().split('T')[0]}.csv` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(url) + }, [features, vocabLogits, featureAnalysis]) + + // Update Mosaic crossfilter when "Edited Only" toggle changes + useEffect(() => { + if (!brushRef.current || !mosaicReady) return + + const selection = brushRef.current + + if (showEditedOnly) { + // Get all edited feature IDs from localStorage + const editedIds = features + .filter(f => localStorage.getItem(`featureTitle_${f.feature_id}`) !== null) + .map(f => f.feature_id) + + if (editedIds.length > 0) { + // Create predicate: feature_id IN (id1, id2, id3, ...) + const idsStr = editedIds.join(',') + // Use raw SQL string, not literal() which would quote it as a string + const predicateSql = `feature_id IN (${idsStr})` + + try { + selection.update({ + source: editedSource.current, + predicate: predicateSql, + value: 'edited' + }) + } catch (err) { + console.warn('Error updating edited filter:', err) + } + } + } else { + // Clear the edited filter + try { + selection.update({ + source: editedSource.current, + predicate: null, + value: null + }) + } catch (err) { + console.warn('Error clearing edited filter:', err) + } + } + }, [showEditedOnly, mosaicReady, features]) + + // Update Mosaic crossfilter when legend selection changes + useEffect(() => { + if (!brushRef.current || !mosaicReady) return + + const selection = brushRef.current + + if (hiddenCategories.size > 0 && selectedCategory && selectedCategory !== 'none') { + const colInfo = categoryColumns.find(c => c.name === selectedCategory) + if (colInfo && (colInfo.type === 'string' || colInfo.type === 'integer')) { + const values = Array.from(hiddenCategories).map(v => `'${v.replace(/'/g, "''")}'`).join(',') + const predicateSql = `"${selectedCategory}" IN (${values})` + + try { + selection.update({ + source: legendSource.current, + predicate: predicateSql, + value: Array.from(hiddenCategories).join(',') + }) + } catch (err) { + console.warn('Legend filter update failed:', err) + } + } + } else { + try { + selection.update({ + source: legendSource.current, + predicate: null, + value: null + }) + } catch (err) { + // Ignore + } + } + }, [hiddenCategories, selectedCategory, mosaicReady, categoryColumns]) + + // Handle search - updates both Mosaic crossfilter (for UMAP/histograms) and local state (for cards) + const handleSearchChange = useCallback((e) => { + const term = e.target.value + setSearchTerm(term) + + // Also update Mosaic crossfilter so UMAP and histograms filter + if (brushRef.current) { + const selection = brushRef.current + + try { + if (term.trim()) { + // Build predicate using sql template - ILIKE for case-insensitive search + const pattern = literal('%' + term.trim() + '%') + const predicate = sql`label ILIKE ${pattern}` + + selection.update({ + source: searchSource.current, + predicate: predicate, + value: term.trim() + }) + } else { + // Clear search by removing the clause + selection.update({ + source: searchSource.current, + predicate: null, + value: null + }) + } + } catch (err) { + console.warn('Search update error:', err) + } + } + }, []) + + // Filter and sort features + const filteredFeatures = useMemo(() => { + let result = features + + // Filter by Mosaic selection (includes UMAP brush) + if (selectedFeatureIds !== null) { + result = result.filter(f => selectedFeatureIds.has(f.feature_id)) + } + + // Also filter by search term client-side (searches metadata fields) + if (searchTerm.trim()) { + const q = searchTerm.toLowerCase() + result = result.filter(f => + f.description?.toLowerCase().includes(q) || + f.feature_id.toString().includes(q) || + f.best_annotation?.toLowerCase().includes(q) + ) + } + + // Filter by edited features only + if (showEditedOnly) { + result = result.filter(f => localStorage.getItem(`featureTitle_${f.feature_id}`) !== null) + } + + // Helper: unlabeled features sort last + const isUnlabeled = (f) => { + const lbl = (f.label || f.description || '').toLowerCase() + return !lbl || lbl.startsWith('feature ') || lbl.includes('common codons') + } + + // Sort (labeled features first, then by chosen metric) + if (sortBy === 'frequency') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (b.activation_freq || 0) - (a.activation_freq || 0)) + } else if (sortBy === 'max_activation') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (b.max_activation || 0) - (a.max_activation || 0)) + } else if (sortBy === 'feature_id') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || a.feature_id - b.feature_id) + } else if (sortBy === 'high_score_fraction') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (b.high_score_fraction || 0) - (a.high_score_fraction || 0)) + } else if (sortBy === 'mean_variant_delta') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || Math.abs(b.mean_variant_delta || 0) - Math.abs(a.mean_variant_delta || 0)) + } else if (sortBy === 'mean_site_delta') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || Math.abs(b.mean_site_delta || 0) - Math.abs(a.mean_site_delta || 0)) + } else if (sortBy === 'mean_local_delta') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || Math.abs(b.mean_local_delta || 0) - Math.abs(a.mean_local_delta || 0)) + } else if (sortBy === 'clinvar_fraction') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (b.clinvar_fraction || 0) - (a.clinvar_fraction || 0)) + } else if (sortBy === 'mean_phylop') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (b.mean_phylop || 0) - (a.mean_phylop || 0)) + } else if (sortBy === 'gc_mean') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || Math.abs((b.gc_mean || 0.5) - 0.5) - Math.abs((a.gc_mean || 0.5) - 0.5)) + } else if (sortBy === 'trinuc_entropy') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (a.trinuc_entropy ?? 99) - (b.trinuc_entropy ?? 99)) + } else if (sortBy === 'gene_entropy') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (a.gene_entropy ?? 99) - (b.gene_entropy ?? 99)) + } else if (sortBy === 'gene_n_unique') { + result = [...result].sort((a, b) => isUnlabeled(a) - isUnlabeled(b) || (a.gene_n_unique || 999) - (b.gene_n_unique || 999)) + } + + return result + }, [features, sortBy, selectedFeatureIds, searchTerm, showEditedOnly]) + + // Reset pagination when filters change + useEffect(() => { + setDisplayedCardCount(20) + loadingMoreRef.current = false + }, [searchTerm, sortBy, selectedFeatureIds, showEditedOnly]) + + if (loading) { + const pct = Math.round(((loadingProgress.step - 1) / loadingProgress.total) * 100) + return ( +

+
Loading dashboard...
+
+
+
+
{loadingProgress.message}
+
+ ) + } + + if (error) { + return ( +
+

Error: {error}

+

+ Make sure features_atlas.parquet, feature_metadata.parquet, and feature_examples.parquet exist in the public/ folder. +

+
+ ) + } + + return ( +
+
+ MOCKUP — synthetic data, not from a real SAE run +
+
+
+

Evo 2 SAE Feature Explorer (Mockup)

+
+
+ + +
+
+ +
+
+
+
+ + Decoder UMAP + +
+ + + setShowMetricsModal(true)} + style={{ + display: 'inline-flex', alignItems: 'center', justifyContent: 'center', + width: '15px', height: '15px', borderRadius: '50%', border: '1px solid var(--border-input)', + fontSize: '10px', fontWeight: '600', color: 'var(--text-tertiary)', cursor: 'pointer', + userSelect: 'none', lineHeight: 1, flexShrink: 0, + }} + >i + +
+
+
+ {mosaicReady && ( + + )} + {selectedCategory && selectedCategory !== 'none' && (() => { + const colInfo = categoryColumns.find(c => c.name === selectedCategory) + if (!colInfo) return null + + if (colInfo.type === 'sequential') { + const colors = [ + "#c359ef", "#9525C6", "#0046a4", "#0074DF", "#3f8500", + "#76B900", "#ef9100", "#F9C500", "#ff8181", "#EF2020" + ] + const vals = features + .map(f => f[selectedCategory]) + .filter(v => v != null && !isNaN(v)) + const minVal = vals.length > 0 ? Math.min(...vals) : 0 + const maxVal = vals.length > 0 ? Math.max(...vals) : 1 + const fmt = (v) => Math.abs(v) >= 100 ? v.toFixed(0) : Math.abs(v) >= 1 ? v.toFixed(1) : v.toFixed(3) + return ( +
+ {fmt(maxVal)} +
+ {fmt(minVal)} + + {selectedCategory.replace(/_/g, ' ')} + +
+ ) + } + + if (colInfo.type === 'string' || colInfo.type === 'integer') { + const catColors = [ + "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", + "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf", + "#aec7e8", "#ffbb78", "#98df8a", "#ff9896", "#c5b0d5", + "#c49c94", "#f7b6d2", "#c7c7c7", "#dbdb8d", "#9edae5" + ] + // Count occurrences of each category value, sorted alphabetically + // (matching DENSE_RANK ORDER BY which is alphabetical) + const counts = {} + for (const f of features) { + const val = f[selectedCategory] + if (val != null && val !== '') { + counts[val] = (counts[val] || 0) + 1 + } + } + // Sort alphabetically to match dense_rank ordering + const sortedCategories = Object.keys(counts).sort() + return ( +
+
+ {selectedCategory.replace(/_/g, ' ').replace('gsea ', '')} +
+ {sortedCategories.map((cat, i) => { + const hasFilter = hiddenCategories.size > 0 + const isHidden = hasFilter && !hiddenCategories.has(cat) + return ( +
{ + if (e.metaKey || e.ctrlKey) { + // Cmd/Ctrl+click: toggle this category in the selection + setHiddenCategories(prev => { + const next = new Set(prev) + if (next.has(cat)) { + next.delete(cat) + // If nothing left selected, clear filter + return next.size === 0 ? new Set() : next + } else { + next.add(cat) + return next + } + }) + } else { + // Regular click: solo this category (or clear if already solo'd) + setHiddenCategories(prev => { + if (prev.size === 1 && prev.has(cat)) return new Set() + return new Set([cat]) + }) + } + }} + style={{ + display: 'flex', alignItems: 'center', gap: '5px', padding: '2px 0', + cursor: 'pointer', opacity: isHidden ? 0.15 : 1, + userSelect: 'none', + }} + > + + + {cat} + + + {counts[cat]} + +
+ ) + })} +
+ ) + } + + return null + })()} +
+
+ +
+ {[ + { value: histMetric1, setter: setHistMetric1 }, + { value: histMetric2, setter: setHistMetric2 }, + { value: histMetric3, setter: setHistMetric3 }, + ].map(({ value, setter }, i) => ( +
+
+ +
+ {mosaicReady && value && value !== 'none' && ( + + )} +
+ ))} +
+
+ +
+
+ + + +
+ +
+ + Showing {filteredFeatures.length} of {features.length} features + {selectedFeatureIds !== null && ` (${selectedFeatureIds.size} selected in UMAP)`} + + setShowGuideModal(true)} + style={{ + display: 'inline-flex', alignItems: 'center', justifyContent: 'center', + width: '15px', height: '15px', borderRadius: '50%', border: '1px solid #bbb', + fontSize: '10px', fontWeight: '600', color: '#888', cursor: 'pointer', + userSelect: 'none', lineHeight: 1, flexShrink: 0, + }} + >i +
+ + +
+
+ + {showGuideModal && ( +
setShowGuideModal(false)} + style={{ + position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.45)', + display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 1000, + }} + > +
e.stopPropagation()} + style={{ + background: 'var(--bg-card)', borderRadius: '10px', maxWidth: '560px', width: '90%', + maxHeight: '80vh', overflowY: 'auto', padding: '28px 32px', + boxShadow: '0 8px 30px rgba(0,0,0,0.2)', + }} + > +
+

Feature Card Guide

+ setShowGuideModal(false)} + style={{ cursor: 'pointer', fontSize: '20px', color: '#999', lineHeight: 1 }} + >× +
+ +
+

Decoder Logits

+

+ The decoder logits histogram shows the projection of each feature's learned decoder weight vector through the language model's prediction head, with the mean logit vector subtracted across all features. This mean-centering removes the model's shared baseline bias toward common codons (e.g. GCC), so values reflect what each feature specifically promotes or suppresses relative to the average feature. Each bar represents a codon. Green bars indicate codons the feature promotes above baseline; red bars indicate codons it suppresses below baseline. Gray bars have no feature-specific effect. This tells you what the feature pushes the model to output — not what activates it. Stop codons (TAA, TAG, TGA) are excluded because the model was trained on coding sequences where internal stops almost never appear, so all features uniformly suppress them. +

+ +

Top Activating Sequences

+

+ These are the protein-coding sequences where this feature fires most strongly. Each codon is colored by its activation value — brighter highlights mean the feature responds more strongly at that position. This shows what inputs trigger the feature, which is conceptually distinct from decoder logits. A feature can activate strongly on a particular codon (e.g., lysine codons) without promoting that same codon in the output — it may instead influence downstream or contextual predictions. +

+ +
+
+
+ )} + + {showMetricsModal && ( +
setShowMetricsModal(false)} + style={{ + position: 'fixed', inset: 0, background: 'rgba(0,0,0,0.45)', + display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 1000, + }} + > +
e.stopPropagation()} + style={{ + background: 'var(--bg-card)', borderRadius: '10px', maxWidth: '620px', width: '90%', + maxHeight: '80vh', overflowY: 'auto', padding: '28px 32px', + boxShadow: '0 8px 30px rgba(0,0,0,0.2)', + }} + > +
+

Variant Analysis Metrics

+ setShowMetricsModal(false)} + style={{ cursor: 'pointer', fontSize: '20px', color: '#999', lineHeight: 1 }} + >× +
+ +
+

Mean Variant Score (per model)

+

+ For each feature, the average model effect score across variant sequences where the feature fires. Computed for the 1b_cdwt model score column. A high value means the feature preferentially activates on variants that model predicts to be functionally impactful. +

+ +

High Score Fraction

+

+ Variants are split at the median model score. Among variants where a feature fires, what fraction are high-scoring? A value of 0.5 means no preference. Above 0.5 means the feature disproportionately fires on high-impact variants. Robust to outliers — measures distributional preference rather than average. +

+ +

ClinVar Fraction

+

+ Among variant sequences where the feature fires, the fraction from ClinVar vs COSMIC. ClinVar variants are germline (inherited, Mendelian disease). COSMIC variants are somatic (cancer mutations). High ClinVar fraction means the feature responds to germline disease patterns; low means it prefers somatic cancer mutation patterns. +

+ +

Mean PhyloP

+

+ Average evolutionary conservation score (PhyloP) across sequences where the feature fires. High values indicate conserved positions (functionally important). Negative values indicate rapidly evolving regions. Features with high mean PhyloP capture evolutionarily constrained patterns. +

+ +

Mean Variant Delta

+

+ For each gene, the difference in max feature activation between the variant and reference sequence: max_act(variant) − max_act(ref), averaged across all variant-ref pairs. Positive means the mutation increases feature activation; negative means it suppresses it. Near zero means the feature responds to the gene background, not the specific mutation. This controls for gene identity. +

+ +

Mean Site Delta

+

+ Like mean variant delta, but measured only at the exact codon position where the mutation occurs: activation_f(variant, pos) − activation_f(ref, pos). This captures direct effects — the feature responding to the changed codon itself. Compare with mean variant delta: a large variant delta but small site delta means the feature captures indirect/distal effects of the mutation (e.g., changes to predicted protein folding context), not the local codon change. +

+ +

Mean Local Delta

+

+ Like variant delta, but using the max activation within a 3-codon window around the variant site instead of the full sequence. Captures local effects of the mutation: max(window_variant) − max(window_ref). A large local delta with a small global delta means the mutation's effect is localized. Compare with site delta (exact position only) and variant delta (full sequence). +

+ +

GC Content (mean, std)

+

+ Mean and standard deviation of GC content across all sequences where the feature fires. Features with extreme GC mean (far from ~0.5) are GC-biased. Features with low GC std activate only on sequences with similar GC content — suggesting sensitivity to nucleotide composition rather than specific codon patterns. +

+ +

Trinuc Entropy

+

+ Shannon entropy (in bits) of the trinucleotide context distribution among variant sequences where the feature fires. Low entropy means the feature concentrates on specific mutation contexts (e.g., C[C>T]G for CpG transitions). High entropy means it fires across diverse mutation types. The dominant fraction shows what fraction of activations come from the most common trinuc context. +

+ +

Gene Distribution

+

+ Shannon entropy of the gene distribution among sequences where the feature fires. Low entropy means the feature is gene-specific — it concentrates on a few genes. High entropy means it fires broadly. gene_n_unique is the number of distinct genes. gene_dominant_frac is the fraction from the most common gene. A feature with low entropy and high dominant fraction has learned something specific to one gene family. +

+ +

High Score Delta

+

+ Same as mean variant delta, but averaged only over variants with model scores above the median. Shows how the feature responds specifically to high-impact mutations. Compare with low score delta: if high_score_delta >> low_score_delta, the feature selectively detects impactful mutations. +

+ +

Low Score Delta

+

+ Same as mean variant delta, but averaged only over variants with model scores below the median. Features where high score delta and low score delta differ significantly have learned to discriminate mutation severity. Features where both are similar just detect that a mutation occurred without distinguishing impact. +

+
+
+
+ )} +
+ ) +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/EmbeddingView.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/EmbeddingView.jsx new file mode 100644 index 0000000000..bc14226257 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/EmbeddingView.jsx @@ -0,0 +1,334 @@ +import React, { useEffect, useRef } from 'react' +import { EmbeddingViewMosaic } from 'embedding-atlas' + +// Color palette for categories (D3 category10 + extended) +const CATEGORY_COLORS = [ + "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", + "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf", + "#aec7e8", "#ffbb78", "#98df8a", "#ff9896", "#c5b0d5", + "#c49c94", "#f7b6d2", "#c7c7c7", "#dbdb8d", "#9edae5" +] + +// Sequential color palette (NVIDIA brand) +const SEQUENTIAL_COLORS = [ + "#c359ef", "#9525C6", "#0046a4", "#0074DF", "#3f8500", + "#76B900", "#ef9100", "#F9C500", "#ff8181", "#EF2020" +] + +// Default color for uniform coloring (NVIDIA green) +const DEFAULT_COLOR = "#76b900" + +// Custom tooltip renderer +class FeatureTooltip { + constructor(node, props) { + this.node = node + this.inner = document.createElement("div") + this.inner.style.cssText = ` + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: 4px; + padding: 8px 12px; + font-family: 'NVIDIA Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + font-size: 13px; + box-shadow: 0 2px 8px rgba(0,0,0,0.25); + max-width: 300px; + color: var(--text); + ` + this.node.appendChild(this.inner) + this.update(props) + } + + update(props) { + const { tooltip } = props + if (!tooltip) { + this.inner.innerHTML = "" + return + } + const featureId = tooltip.identifier ?? "" + const label = tooltip.fields?.label ?? tooltip.text ?? "" + const logFreq = tooltip.fields?.log_frequency + const maxAct = tooltip.fields?.max_activation + const colorField = tooltip.fields?.color_field + + this.inner.innerHTML = ` +
Feature #${featureId}
+
${label}
+ ${colorField ? `
Category: ${colorField}
` : ""} + ${logFreq !== undefined ? `
Log Frequency: ${logFreq.toFixed(3)}
` : ""} + ${maxAct !== undefined ? `
Max Activation: ${maxAct.toFixed(2)}
` : ""} + ` + } + + destroy() { + this.inner.remove() + } +} + +export default function EmbeddingView({ brush, categoryColumn, categoryColumns, onFeatureClick, highlightedFeatureId, viewportState, onViewportChange, labels, features, selectedCategory, darkMode, hiddenCategories }) { + const containerRef = useRef(null) + const viewRef = useRef(null) + const onFeatureClickRef = useRef(onFeatureClick) + const onViewportChangeRef = useRef(onViewportChange) + + // Keep the callback refs updated + useEffect(() => { + onFeatureClickRef.current = onFeatureClick + }, [onFeatureClick]) + + useEffect(() => { + onViewportChangeRef.current = onViewportChange + }, [onViewportChange]) + + // Update selection and tooltip when highlightedFeatureId changes + useEffect(() => { + if (viewRef.current && highlightedFeatureId != null) { + // Find the feature data + const feature = features?.find(f => f.feature_id === highlightedFeatureId) + + // Build tooltip fields + const fields = { + label: feature?.label || `Feature ${highlightedFeatureId}`, + log_frequency: feature?.log_frequency || feature?.activation_freq || 0, + max_activation: feature?.max_activation || 0, + color_field: null + } + + // Add selected category metric if available + if (selectedCategory && selectedCategory !== 'none' && feature) { + const metricName = selectedCategory.replace(/_/g, ' ') + const metricValue = feature[selectedCategory] + if (metricValue !== undefined && metricValue !== null) { + fields.color_field = `${metricName}: ${typeof metricValue === 'number' ? metricValue.toFixed(3) : metricValue}` + } + } + + // Construct tooltip object with feature data + const tooltipObj = { + identifier: highlightedFeatureId, + text: `Feature #${highlightedFeatureId}`, + x: feature?.x, + y: feature?.y, + fields: fields + } + // Clear previous selection first to avoid animated transition + viewRef.current.update({ + selection: null, + tooltip: null + }) + viewRef.current.update({ + selection: [highlightedFeatureId], + tooltip: tooltipObj + }) + } else if (viewRef.current && highlightedFeatureId == null) { + viewRef.current.update({ + selection: null, + tooltip: null + }) + } + }, [highlightedFeatureId, features, selectedCategory]) + + // Update viewport when viewportState changes (skip null to let auto-fit persist) + useEffect(() => { + if (viewRef.current && viewportState != null) { + viewRef.current.update({ + viewportState: viewportState + }) + } + }, [viewportState]) + + // Update color scheme when dark mode changes + useEffect(() => { + if (viewRef.current) { + viewRef.current.update({ + config: { colorScheme: darkMode ? "dark" : "light" } + }) + } + }, [darkMode]) + + // Update labels when they change + useEffect(() => { + if (viewRef.current && labels) { + console.log('[EmbeddingView] updating labels:', labels.length, labels.slice(0, 2)) + viewRef.current.update({ + labels: labels + }) + } + }, [labels]) + + useEffect(() => { + if (!containerRef.current || !brush) return + + // Clear previous view + if (viewRef.current) { + containerRef.current.innerHTML = '' + } + + // Determine category column and colors + let categoryColName = null + let colors = Array(50).fill(DEFAULT_COLOR) + let additionalFields = { + label: "label", + log_frequency: "log_frequency", + max_activation: "max_activation", + } + + if (categoryColumn && categoryColumn !== "none") { + const colInfo = categoryColumns?.find(c => c.name === categoryColumn) + if (colInfo) { + if (colInfo.type === 'sequential') { + // Sequential column - use binned version and sequential colors + categoryColName = `${categoryColumn}_bin` + colors = SEQUENTIAL_COLORS + } else if (colInfo.type === 'string') { + // Categorical string column + categoryColName = `${categoryColumn}_cat` + colors = CATEGORY_COLORS.slice(0, Math.max(colInfo.nUnique, 10)) + } else { + // Integer categorical column + categoryColName = categoryColumn + colors = CATEGORY_COLORS.slice(0, Math.max(colInfo.nUnique, 10)) + } + additionalFields.color_field = categoryColumn + } + } + + const width = containerRef.current.clientWidth + const height = containerRef.current.clientHeight + + try { + viewRef.current = new EmbeddingViewMosaic( + containerRef.current, + { + table: "features", + x: "x", + y: "y", + category: categoryColName, + text: "label", + identifier: "feature_id", + filter: brush, + rangeSelection: brush, + selection: highlightedFeatureId != null ? [highlightedFeatureId] : null, + viewportState: viewportState, + categoryColors: colors, + width: width, + height: height, + labels: labels || null, + config: { + mode: "points", + colorScheme: document.documentElement.classList.contains('dark') ? "dark" : "light", + autoLabelEnabled: false, + }, + theme: { + brandingLink: { + text: "NVIDIA BioNeMo", + href: "https://github.com/NVIDIA/bionemo-framework", + }, + }, + additionalFields: additionalFields, + customTooltip: FeatureTooltip, + onSelection: (selection) => { + // selection is DataPoint[] | null + if (!onFeatureClickRef.current) return + + if (selection && selection.length > 0) { + // Get the last clicked point (most recent selection) + const lastPoint = selection[selection.length - 1] + const featureId = lastPoint?.identifier ?? lastPoint + const x = lastPoint?.x + const y = lastPoint?.y + if (featureId != null) { + onFeatureClickRef.current(featureId, x, y) + } + } else { + // Clicked on empty canvas - clear selection + onFeatureClickRef.current(null) + } + }, + onViewportState: (vp) => { + if (onViewportChangeRef.current && vp) { + onViewportChangeRef.current(vp) + } + }, + } + ) + } catch (err) { + console.warn('Error creating EmbeddingViewMosaic:', err) + } + + return () => { + if (containerRef.current) { + containerRef.current.innerHTML = '' + } + } + }, [brush]) + + // Update category coloring in-place (without recreating the view) + useEffect(() => { + if (!viewRef.current) return + + let categoryColName = null + const HIDDEN_COLOR = darkMode ? "#0a0a0a" : "#fafafa" + let colors = Array(50).fill(HIDDEN_COLOR) + + if (categoryColumn && categoryColumn !== "none") { + const colInfo = categoryColumns?.find(c => c.name === categoryColumn) + if (colInfo) { + if (colInfo.type === 'sequential') { + categoryColName = `${categoryColumn}_bin` + colors = SEQUENTIAL_COLORS + } else if (colInfo.type === 'string') { + categoryColName = `${categoryColumn}_cat` + colors = CATEGORY_COLORS.slice(0, Math.max(colInfo.nUnique, 10)) + // Map colors to match DENSE_RANK order, dim non-selected when filtering + if (hiddenCategories && hiddenCategories.size > 0 && features) { + const allCatNames = [...new Set( + features.map(f => f[categoryColumn]).filter(v => v != null) + )].sort() + colors = colors.map((c, i) => { + const name = allCatNames[i] + if (!name) return c + return !hiddenCategories.has(name) ? HIDDEN_COLOR : c + }) + } + } else { + categoryColName = categoryColumn + colors = CATEGORY_COLORS.slice(0, Math.max(colInfo.nUnique, 10)) + } + } + } + + viewRef.current.update({ + category: categoryColName, + categoryColors: colors, + selection: null, + tooltip: null, + }) + }, [categoryColumn, categoryColumns, hiddenCategories]) + + // Handle resize + useEffect(() => { + const handleResize = () => { + if (viewRef.current && containerRef.current) { + const width = containerRef.current.clientWidth + const height = containerRef.current.clientHeight + viewRef.current.update({ width, height }) + } + } + + const resizeObserver = new ResizeObserver(handleResize) + if (containerRef.current) { + resizeObserver.observe(containerRef.current) + } + + return () => { + resizeObserver.disconnect() + } + }, []) + + return ( +
+ ) +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx new file mode 100644 index 0000000000..97ec01e178 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx @@ -0,0 +1,793 @@ +import React, { useState, useEffect, useRef, forwardRef } from 'react' +import SequenceView, { computeAlignInfo } from './SequenceView' +import FeatureDetailPage from './FeatureDetailPage' +import { getRegionLabel } from './utils' + +const styles = { + card: { + background: 'var(--bg-card)', + borderRadius: '8px', + border: '1px solid var(--border)', + flexShrink: 0, + }, + cardHighlighted: { + background: 'var(--bg-card)', + borderRadius: '8px', + border: '2px solid var(--highlight-border)', + flexShrink: 0, + boxShadow: '0 2px 8px var(--highlight-shadow)', + }, + header: { + padding: '12px 14px', + borderBottom: '1px solid var(--border-light)', + cursor: 'pointer', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'flex-start', + gap: '10px', + }, + headerLeft: { + flex: 1, + minWidth: 0, + }, + featureId: { + fontSize: '11px', + color: 'var(--text-tertiary)', + fontFamily: 'monospace', + marginBottom: '2px', + }, + description: { + fontSize: '13px', + fontWeight: '500', + wordBreak: 'break-word', + lineHeight: '1.4', + color: 'var(--text)', + }, + userTitle: { + fontSize: '13px', + fontWeight: '500', + wordBreak: 'break-word', + lineHeight: '1.4', + color: 'var(--accent)', + fontStyle: 'italic', + }, + stats: { + display: 'flex', + gap: '12px', + fontSize: '11px', + color: 'var(--text-secondary)', + flexShrink: 0, + }, + stat: { + display: 'flex', + flexDirection: 'column', + alignItems: 'flex-end', + }, + statLabel: { + color: 'var(--text-muted)', + fontSize: '9px', + textTransform: 'uppercase', + }, + statValue: { + fontFamily: 'monospace', + fontWeight: '500', + }, + expandIcon: { + color: 'var(--text-muted)', + fontSize: '10px', + marginLeft: '6px', + }, + expandedContent: { + padding: '10px 14px', + background: 'var(--bg-card-expanded)', + maxHeight: '900px', + overflowY: 'auto', + }, + sectionHeader: { + fontSize: '10px', + color: 'var(--text-tertiary)', + textTransform: 'uppercase', + marginBottom: '8px', + fontWeight: '500', + }, + example: { + marginBottom: '8px', + padding: '8px 10px', + background: 'var(--bg-example)', + borderRadius: '4px', + border: '1px solid var(--border-light)', + }, + exampleMeta: { + fontSize: '10px', + color: 'var(--text-muted)', + marginBottom: '4px', + fontFamily: 'monospace', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + }, + proteinId: { + color: 'var(--text-heading)', + fontWeight: '700', + }, + annotation: { + color: 'var(--text-secondary)', + fontStyle: 'italic', + marginLeft: '8px', + }, + uniprotLink: { + color: 'var(--link)', + textDecoration: 'none', + fontSize: '11px', + marginLeft: '4px', + opacity: 0.6, + }, + noExamples: { + color: 'var(--text-muted)', + fontSize: '12px', + fontStyle: 'italic', + }, + densityBar: { + width: '50px', + height: '3px', + background: 'var(--density-bar-bg)', + borderRadius: '2px', + overflow: 'hidden', + marginTop: '3px', + }, + densityFill: { + height: '100%', + background: '#76b900', + borderRadius: '2px', + }, + alignBar: { + display: 'flex', + alignItems: 'center', + gap: '6px', + marginBottom: '10px', + fontSize: '10px', + color: '#888', + }, + alignLabel: { + textTransform: 'uppercase', + fontWeight: '500', + }, + alignBtn: { + padding: '2px 8px', + border: '1px solid #ddd', + borderRadius: '3px', + background: '#fff', + cursor: 'pointer', + fontSize: '10px', + color: '#555', + }, + alignBtnActive: { + padding: '2px 8px', + border: '1px solid #76b900', + borderRadius: '3px', + background: '#f0f9e0', + cursor: 'pointer', + fontSize: '10px', + color: '#333', + fontWeight: '600', + }, +} + +const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, forceExpanded, onClick, loadExamples, vocabLogits, featureAnalysis }, ref) { + const [expanded, setExpanded] = useState(false) + const [showDetailPage, setShowDetailPage] = useState(false) + const [examples, setExamples] = useState([]) + const [loadingExamples, setLoadingExamples] = useState(false) + const examplesCacheRef = useRef(null) + const [alignMode, setAlignMode] = useState('start') + const scrollGroupRef = useRef([]) + const [hoveredCodon, setHoveredCodon] = useState(null) + const [editingTitle, setEditingTitle] = useState(false) + const [userTitle, setUserTitle] = useState('') + const inputRef = useRef(null) + + // Load user-provided title from localStorage + useEffect(() => { + const stored = localStorage.getItem(`featureTitle_${feature.feature_id}`) + if (stored) { + setUserTitle(stored) + } + }, [feature.feature_id]) + + // Focus input when editing starts + useEffect(() => { + if (editingTitle && inputRef.current) { + inputRef.current.focus() + inputRef.current.select() + } + }, [editingTitle]) + + // Reset scroll group when alignment changes + useEffect(() => { scrollGroupRef.current = [] }, [alignMode]) + + // If forceExpanded changes to true, expand the card + useEffect(() => { + if (forceExpanded) { + setExpanded(true) + } + }, [forceExpanded]) + + // Lazy-load examples from DuckDB when card is expanded + useEffect(() => { + if (!expanded || !loadExamples || examplesCacheRef.current) return + let cancelled = false + setLoadingExamples(true) + loadExamples(feature.feature_id).then(result => { + if (cancelled) return + examplesCacheRef.current = result + setExamples(result) + setLoadingExamples(false) + }).catch(err => { + if (cancelled) return + console.error('Error loading examples for feature', feature.feature_id, err) + setLoadingExamples(false) + }) + return () => { cancelled = true } + }, [expanded, loadExamples, feature.feature_id]) + + const freq = feature.activation_freq || 0 + const maxAct = feature.max_activation || 0 + const highScoreFrac = feature.high_score_fraction + const variantDelta = feature.mean_variant_delta + const siteDelta = feature.mean_site_delta + const localDelta = feature.mean_local_delta + const clinvarFrac = feature.clinvar_fraction + const phylop = feature.mean_phylop + const gcMean = feature.gc_mean + const trinucEntropy = feature.trinuc_entropy + const geneEntropy = feature.gene_entropy + const geneNUnique = feature.gene_n_unique + const rawDesc = feature.label || feature.description || `Feature ${feature.feature_id}` + const description = rawDesc.toLowerCase().includes('common codons') ? 'Unidentified Feature' : rawDesc + + + const handleClick = () => { + const willExpand = !expanded + // Update UMAP highlight immediately, defer card expansion so it doesn't block + if (onClick) { + onClick(feature.feature_id, willExpand) + } + requestAnimationFrame(() => { + setExpanded(willExpand) + }) + } + + const handleSaveTitle = () => { + if (userTitle.trim()) { + localStorage.setItem(`featureTitle_${feature.feature_id}`, userTitle.trim()) + } else { + localStorage.removeItem(`featureTitle_${feature.feature_id}`) + setUserTitle('') + } + setEditingTitle(false) + } + + const handleCancelEdit = () => { + const stored = localStorage.getItem(`featureTitle_${feature.feature_id}`) + setUserTitle(stored || '') + setEditingTitle(false) + } + + const displayTitle = userTitle || description + + const handleTitleKeyDown = (e) => { + if (e.key === 'Enter') { + handleSaveTitle() + } else if (e.key === 'Escape') { + handleCancelEdit() + } + } + + const exportToCSV = () => { + const lines = [] + + // Feature metadata section + lines.push('=== FEATURE METADATA ===') + lines.push(`Feature ID,${feature.feature_id}`) + lines.push(`Label,${displayTitle}`) + if (userTitle) { + lines.push(`User Title,${userTitle}`) + } + lines.push(`Activation Frequency,${(freq * 100).toFixed(2)}%`) + lines.push(`Max Activation,${maxAct.toFixed(4)}`) + lines.push('') + + // Vocab logits section + const logits = vocabLogits?.[String(feature.feature_id)] + if (logits) { + lines.push('=== TOP PROMOTED CODONS ===') + lines.push('Codon,Amino Acid,Logit Value') + const CODON_AA = { + 'TTT':'F','TTC':'F','TTA':'L','TTG':'L','TCT':'S','TCC':'S','TCA':'S','TCG':'S', + 'TAT':'Y','TAC':'Y','TAA':'*','TAG':'*','TGT':'C','TGC':'C','TGA':'*','TGG':'W', + 'CTT':'L','CTC':'L','CTA':'L','CTG':'L','CCT':'P','CCC':'P','CCA':'P','CCG':'P', + 'CAT':'H','CAC':'H','CAA':'Q','CAG':'Q','CGT':'R','CGC':'R','CGA':'R','CGG':'R', + 'ATT':'I','ATC':'I','ATA':'I','ATG':'M','ACT':'T','ACC':'T','ACA':'T','ACG':'T', + 'AAT':'N','AAC':'N','AAA':'K','AAG':'K','AGT':'S','AGC':'S','AGA':'R','AGG':'R', + 'GTT':'V','GTC':'V','GTA':'V','GTG':'V','GCT':'A','GCC':'A','GCA':'A','GCG':'A', + 'GAT':'D','GAC':'D','GAA':'E','GAG':'E','GGT':'G','GGC':'G','GGA':'G','GGG':'G', + } + ;(logits.top_positive || []).forEach(([codon, val]) => { + lines.push(`${codon},${CODON_AA[codon] || '?'},${val.toFixed(4)}`) + }) + lines.push('') + + lines.push('=== TOP SUPPRESSED CODONS ===') + lines.push('Codon,Amino Acid,Logit Value') + ;(logits.top_negative || []).forEach(([codon, val]) => { + lines.push(`${codon},${CODON_AA[codon] || '?'},${val.toFixed(4)}`) + }) + lines.push('') + } + + // Codon annotations section + const analysis = featureAnalysis?.[String(feature.feature_id)] + if (analysis?.codon_annotations) { + lines.push('=== CODON ANNOTATIONS ===') + const ann = analysis.codon_annotations + if (ann.amino_acid) { + lines.push(`Amino Acid,${ann.amino_acid.aa}`) + lines.push(`AA Frequency,${(ann.amino_acid.fraction * 100).toFixed(1)}%`) + } + if (ann.codon_usage) { + lines.push(`Codon Usage,${ann.codon_usage.bias}`) + } + if (ann.wobble) { + lines.push(`Wobble Position,${ann.wobble.preference}`) + } + if (ann.cpg) { + lines.push(`CpG Enriched,Yes`) + } + if (ann.position) { + lines.push(`Position,${ann.position.label}`) + } + lines.push('') + } + + // GSEA enrichment section + const gseaCsvFields = [ + { key: 'gsea_overall_best', label: 'GSEA Overall Best' }, + { key: 'gsea_GO_Biological_Process', label: 'GSEA GO Biological Process' }, + { key: 'gsea_GO_Molecular_Function', label: 'GSEA GO Molecular Function' }, + { key: 'gsea_GO_Cellular_Component', label: 'GSEA GO Cellular Component' }, + { key: 'gsea_InterPro_Domains', label: 'GSEA InterPro Domains' }, + { key: 'gsea_GO_Slim', label: 'GSEA GO Slim' }, + ] + const gseaLines = gseaCsvFields + .filter(({ key }) => feature[key] && feature[key] !== 'unlabeled') + .map(({ key, label }) => `${label},${feature[key]}`) + if (gseaLines.length > 0) { + lines.push('=== GSEA ENRICHMENT ===') + gseaLines.forEach(l => lines.push(l)) + lines.push('') + } + + // Examples section + if (examples && examples.length > 0) { + lines.push('=== ACTIVATION EXAMPLES ===') + lines.push('Rank,Protein ID,Max Activation,Sequence') + examples.forEach((ex, i) => { + lines.push(`${i + 1},${getRegionLabel(ex) || ''},${ex.max_activation?.toFixed(4) || ''},${ex.sequence || ''}`) + }) + } + + // Generate CSV + const csv = lines.join('\n') + + // Create download link + const filename = `feature_${feature.feature_id}_${displayTitle.replace(/[^a-z0-9]/gi, '_').substring(0, 20)}.csv` + const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }) + const link = document.createElement('a') + link.setAttribute('href', URL.createObjectURL(blob)) + link.setAttribute('download', filename) + link.style.visibility = 'hidden' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + } + + return ( +
+
+
+
Feature #{feature.feature_id}
+ {editingTitle ? ( +
+ setUserTitle(e.target.value)} + onKeyDown={handleTitleKeyDown} + onClick={(e) => e.stopPropagation()} + style={{ + fontSize: '13px', + fontWeight: '500', + padding: '4px 8px', + border: '1px solid #76b900', + borderRadius: '4px', + flex: 1, + }} + /> + + +
+ ) : ( +
+
{displayTitle}
+ { e.stopPropagation(); setEditingTitle(true) }} + style={{ + fontSize: '11px', + color: '#999', + cursor: 'pointer', + padding: '2px 4px', + borderRadius: '3px', + userSelect: 'none', + }} + title="Click to edit title" + > + ✎ + +
+ )} +
+
+
+ Freq + {(freq * 100).toFixed(1)}% +
+
+
+
+
+ Max + {maxAct.toFixed(1)} +
+ {/* v2 roadmap placeholders — populated when real eval pipeline lands. */} +
+ Annotation + +
+
+ Sensitivity + +
+
+ Recon Δ + +
+ {highScoreFrac != null && !isNaN(highScoreFrac) && ( +
+ Hi-Score + 0.6 ? '#d32f2f' : highScoreFrac < 0.4 ? '#388e3c' : '#666' }}> + {(highScoreFrac * 100).toFixed(0)}% + +
+ )} + {variantDelta != null && !isNaN(variantDelta) && ( +
+ Δ Var + 0.5 ? '#1565c0' : '#666' }}> + {variantDelta > 0 ? '+' : ''}{variantDelta.toFixed(2)} + +
+ )} + {siteDelta != null && !isNaN(siteDelta) && ( +
+ Δ Site + 0.5 ? '#7b1fa2' : '#666' }}> + {siteDelta > 0 ? '+' : ''}{siteDelta.toFixed(2)} + +
+ )} + {localDelta != null && !isNaN(localDelta) && ( +
+ Δ Local + 0.5 ? '#00695c' : '#666' }}> + {localDelta > 0 ? '+' : ''}{localDelta.toFixed(2)} + +
+ )} + {clinvarFrac != null && !isNaN(clinvarFrac) && ( +
+ ClinVar + {(clinvarFrac * 100).toFixed(0)}% +
+ )} + {phylop != null && !isNaN(phylop) && ( +
+ PhyloP + {phylop.toFixed(1)} +
+ )} + {gcMean != null && !isNaN(gcMean) && ( +
+ GC + 0.1 ? '#e65100' : '#666' }}> + {(gcMean * 100).toFixed(0)}% + +
+ )} + {trinucEntropy != null && !isNaN(trinucEntropy) && ( +
+ Trinuc H + + {trinucEntropy.toFixed(1)} + +
+ )} + {geneNUnique != null && geneNUnique > 0 && ( +
+ Genes + + {geneNUnique} + +
+ )} + {expanded ? '▼' : '▶'} +
+
+ + {/* Details and export buttons - shown when expanded */} + {expanded && ( +
+ + +
+ )} + + {expanded && ( +
+ {/* Vocabulary logits - all codons grouped by amino acid */} + {vocabLogits && vocabLogits[String(feature.feature_id)] && (() => { + const logits = vocabLogits[String(feature.feature_id)] + const CODON_AA = { + 'TTT':'F','TTC':'F','TTA':'L','TTG':'L','CTT':'L','CTC':'L','CTA':'L','CTG':'L', + 'ATT':'I','ATC':'I','ATA':'I','ATG':'M','GTT':'V','GTC':'V','GTA':'V','GTG':'V', + 'TCT':'S','TCC':'S','TCA':'S','TCG':'S','CCT':'P','CCC':'P','CCA':'P','CCG':'P', + 'ACT':'T','ACC':'T','ACA':'T','ACG':'T','GCT':'A','GCC':'A','GCA':'A','GCG':'A', + 'TAT':'Y','TAC':'Y','TAA':'*','TAG':'*','CAT':'H','CAC':'H','CAA':'Q','CAG':'Q', + 'AAT':'N','AAC':'N','AAA':'K','AAG':'K','GAT':'D','GAC':'D','GAA':'E','GAG':'E', + 'TGT':'C','TGC':'C','TGA':'*','TGG':'W','CGT':'R','CGC':'R','CGA':'R','CGG':'R', + 'AGT':'S','AGC':'S','AGA':'R','AGG':'R','GGT':'G','GGC':'G','GGA':'G','GGG':'G', + } + // Build codon logit map from all entries, excluding stop codons + const codonLogitMap = {} + for (const [codon, val] of (logits.top_positive || [])) { + if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val + } + for (const [codon, val] of (logits.top_negative || [])) { + if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val + } + const maxAbs = Math.max(...Object.values(codonLogitMap).map(Math.abs), 0.001) + // Group by AA, excluding stop codons + const aaGroups = {} + for (const [codon, aa] of Object.entries(CODON_AA)) { + if (aa === '*') continue + if (!aaGroups[aa]) aaGroups[aa] = [] + aaGroups[aa].push(codon) + } + const aaOrder = Object.keys(aaGroups).sort() + return ( +
+
Decoder Logits
+
+ {hoveredCodon && (() => { + const val = codonLogitMap[hoveredCodon] || 0 + const aa = CODON_AA[hoveredCodon] + return ( +
+ {hoveredCodon} ({aa}): {val.toFixed(3)} +
+ ) + })()} +
+ {aaOrder.map(aa => { + const codons = aaGroups[aa] || [] + return ( +
+
{aa}
+
+ {codons.sort().map(codon => { + const val = codonLogitMap[codon] || 0 + const h = Math.max(1, (Math.abs(val) / maxAbs) * 24) + const isHovered = hoveredCodon === codon + const barColor = val === 0 ? '#ccc' : val > 0 ? '#76b900' : '#e57373' + return ( +
setHoveredCodon(codon)} + onMouseLeave={() => setHoveredCodon(null)} + > +
+
+ ) + })} +
+
+ ) + })} +
+
+
+ ) + })()} + + {/* Analysis summary tags */} + {featureAnalysis && featureAnalysis[String(feature.feature_id)] && (() => { + const analysis = featureAnalysis[String(feature.feature_id)] + const tags = [] + const ann = analysis.codon_annotations || {} + + if (ann.amino_acid) tags.push({ label: `AA: ${ann.amino_acid.aa} (${(ann.amino_acid.fraction * 100).toFixed(0)}%)`, color: '#e3f2fd' }) + if (ann.codon_usage) tags.push({ label: `${ann.codon_usage.bias} codons`, color: '#fff3e0' }) + if (ann.wobble) tags.push({ label: `wobble ${ann.wobble.preference}`, color: '#f3e5f5' }) + if (ann.cpg) tags.push({ label: `CpG enriched`, color: '#fce4ec' }) + if (ann.position) tags.push({ label: `N-terminal`, color: '#e8f5e9' }) + + // GSEA enrichment tags + const gseaFields = [ + { key: 'gsea_GO_Biological_Process', prefix: 'GO:BP', color: '#e8eaf6' }, + { key: 'gsea_GO_Molecular_Function', prefix: 'GO:MF', color: '#ede7f6' }, + { key: 'gsea_GO_Cellular_Component', prefix: 'GO:CC', color: '#e0f2f1' }, + { key: 'gsea_InterPro_Domains', prefix: 'InterPro', color: '#fff8e1' }, + { key: 'gsea_GO_Slim', prefix: 'GO Slim', color: '#f1f8e9' }, + ] + for (const { key, prefix, color } of gseaFields) { + const val = feature[key] + if (val && val !== 'unlabeled' && val !== 'other') { + tags.push({ label: `${prefix}: ${val}`, color }) + } + } + + // Codon optimality metrics from annotations + if (ann.cai != null) tags.push({ label: `CAI: ${ann.cai.toFixed(3)}`, color: '#e0f7fa' }) + if (ann.tai != null) tags.push({ label: `tAI: ${ann.tai.toFixed(3)}`, color: '#e0f7fa' }) + if (ann.rscu != null) tags.push({ label: `RSCU: ${ann.rscu.toFixed(2)}`, color: '#e0f7fa' }) + + if (tags.length === 0) return null + return ( +
+ {tags.map((t, i) => ( + {t.label} + ))} +
+ ) + })()} + + {/* Sequence examples */} +
+
Top Activating Sequences
+
+ Align by: + {['start', 'first_activation', 'max_activation'].map(mode => ( + + ))} +
+
+ {loadingExamples ? ( +
+ Loading examples... +
+ ) : examples.length > 0 ? ( + <> + {(() => { + const visibleExamples = examples.slice(0, 6) + const { anchor: alignAnchor, totalLength } = computeAlignInfo(visibleExamples, alignMode) + return visibleExamples.map((ex, i) => ( +
+
+ + {getRegionLabel(ex)} + {ex.best_annotation && ( + {ex.best_annotation} + )} + + max: {ex.max_activation?.toFixed(3) || 'N/A'} +
+ +
+ )) + })()} + + + ) : ( +
No examples available
+ )} +
+ )} + + {showDetailPage && ( + setShowDetailPage(false)} + /> + )} +
+ ) +}) + +export default FeatureCard diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx new file mode 100644 index 0000000000..8e3ec0ce9b --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx @@ -0,0 +1,522 @@ +import React, { useState, useEffect, useRef } from 'react' +import SequenceView, { computeAlignInfo } from './SequenceView' +import { getRegionLabel } from './utils' + +// ── Codon-to-AA lookup for logit chart ────────────────────────────── +const CODON_AA = { + 'TTT':'F','TTC':'F','TTA':'L','TTG':'L','CTT':'L','CTC':'L','CTA':'L','CTG':'L', + 'ATT':'I','ATC':'I','ATA':'I','ATG':'M','GTT':'V','GTC':'V','GTA':'V','GTG':'V', + 'TCT':'S','TCC':'S','TCA':'S','TCG':'S','CCT':'P','CCC':'P','CCA':'P','CCG':'P', + 'ACT':'T','ACC':'T','ACA':'T','ACG':'T','GCT':'A','GCC':'A','GCA':'A','GCG':'A', + 'TAT':'Y','TAC':'Y','TAA':'*','TAG':'*','CAT':'H','CAC':'H','CAA':'Q','CAG':'Q', + 'AAT':'N','AAC':'N','AAA':'K','AAG':'K','GAT':'D','GAC':'D','GAA':'E','GAG':'E', + 'TGT':'C','TGC':'C','TGA':'*','TGG':'W','CGT':'R','CGC':'R','CGA':'R','CGG':'R', + 'AGT':'S','AGC':'S','AGA':'R','AGG':'R','GGT':'G','GGC':'G','GGA':'G','GGG':'G', +} + +// Group codons by amino acid, excluding stop codons +const AA_GROUPS = {} +for (const [codon, aa] of Object.entries(CODON_AA)) { + if (aa === '*') continue + if (!AA_GROUPS[aa]) AA_GROUPS[aa] = [] + AA_GROUPS[aa].push(codon) +} +const AA_ORDER = Object.keys(AA_GROUPS).sort() + +// Color palette for amino acid groups +const AA_COLORS = { + // Nonpolar + 'G': '#e8e8e8', 'A': '#c8c8c8', 'V': '#b0b0b0', 'L': '#a0a0a0', 'I': '#909090', + 'P': '#d0d0a0', 'F': '#c0b0a0', 'W': '#b0a090', 'M': '#a09080', + // Polar + 'S': '#b0d0ff', 'T': '#a0c0f0', 'C': '#90b0e0', 'Y': '#80a0d0', + 'N': '#a0d0b0', 'Q': '#90c0a0', + // Charged + 'D': '#ffb0b0', 'E': '#ffa0a0', 'K': '#b0b0ff', 'R': '#a0a0ff', 'H': '#c0b0ff', +} + +const styles = { + overlay: { + position: 'fixed', + inset: 0, + background: 'rgba(0, 0, 0, 0.5)', + zIndex: 2000, + overflowY: 'auto', + }, + page: { + maxWidth: '960px', + margin: '20px auto', + background: 'var(--bg-card)', + borderRadius: '8px', + boxShadow: '0 4px 24px rgba(0,0,0,0.2)', + color: 'var(--text)', + }, + header: { + padding: '12px 20px', + borderBottom: '1px solid var(--border-light)', + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + }, + title: { + fontSize: '14px', + fontWeight: '700', + color: 'var(--text-heading)', + }, + subtitle: { + fontSize: '11px', + color: 'var(--text-secondary)', + }, + closeBtn: { + background: 'none', + border: '1px solid var(--border-input)', + borderRadius: '4px', + padding: '3px 10px', + cursor: 'pointer', + fontSize: '11px', + color: 'var(--text-secondary)', + }, + section: { + padding: '10px 20px', + borderBottom: '1px solid var(--border-light)', + }, + sectionTitle: { + fontSize: '11px', + fontWeight: '600', + marginBottom: '6px', + color: 'var(--text-heading)', + textTransform: 'uppercase', + }, + sectionSubtitle: { + fontSize: '9px', + color: 'var(--text-muted)', + marginBottom: '6px', + }, + statsGrid: { + display: 'grid', + gridTemplateColumns: 'repeat(4, 1fr)', + gap: '8px', + }, + statCard: { + background: 'var(--bg-card-expanded)', + borderRadius: '4px', + padding: '6px 8px', + textAlign: 'center', + }, + statNumber: { + fontSize: '14px', + fontWeight: '700', + color: 'var(--text-heading)', + }, + statLabel: { + fontSize: '8px', + color: 'var(--text-tertiary)', + textTransform: 'uppercase', + marginTop: '2px', + }, + tag: { + display: 'inline-block', + padding: '3px 8px', + borderRadius: '4px', + fontSize: '11px', + fontWeight: '500', + marginRight: '6px', + marginBottom: '4px', + }, + example: { + marginBottom: '6px', + padding: '6px 8px', + background: 'var(--bg-example)', + borderRadius: '4px', + border: '1px solid var(--border-light)', + }, + exampleMeta: { + fontSize: '10px', + color: 'var(--text-secondary)', + marginBottom: '4px', + fontFamily: 'monospace', + display: 'flex', + justifyContent: 'space-between', + }, +} + + +// ── Vocab Logit Chart Component ───────────────────────────────────── + +function VocabLogitChart({ logits }) { + if (!logits) return null + + // Build codon logit map, excluding stop codons (universally suppressed, not informative) + const codonLogitMap = {} + for (const [codon, val] of logits.top_positive) { + if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val + } + for (const [codon, val] of logits.top_negative) { + if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val + } + + const maxAbs = Math.max(...Object.values(codonLogitMap).map(Math.abs), 0.001) + + return ( +
+
+ {AA_ORDER.map(aa => { + const codons = AA_GROUPS[aa] || [] + const aaColor = AA_COLORS[aa] || 'var(--border-light)' + return ( +
+
+ {aa} +
+
+ {codons.sort().map(codon => { + const val = codonLogitMap[codon] || 0 + const h = Math.max(2, (Math.abs(val) / maxAbs) * 34) + const isPos = val > 0 + return ( +
+
+ + {codon} + +
+ ) + })} +
+
+ ) + })} +
+
+ Promoted + Suppressed +
+
+ ) +} + + +// ── Codon Annotations Component ───────────────────────────────────── + +function CodonAnnotations({ annotations }) { + if (!annotations || Object.keys(annotations).length === 0) { + return
No significant annotations detected
+ } + + const items = [] + + if (annotations.amino_acid) { + items.push({ + label: 'Amino Acid', + value: `${annotations.amino_acid.aa} (${(annotations.amino_acid.fraction * 100).toFixed(0)}% of activations)`, + color: '#e3f2fd', + }) + } + if (annotations.codon_usage) { + items.push({ + label: 'Codon Usage', + value: `Prefers ${annotations.codon_usage.bias} codons (${(annotations.codon_usage.fraction * 100).toFixed(0)}%)`, + color: '#fff3e0', + }) + } + if (annotations.wobble) { + items.push({ + label: 'Wobble Position', + value: `${annotations.wobble.preference} preference (${(annotations.wobble.fraction * 100).toFixed(0)}%)`, + color: '#f3e5f5', + }) + } + if (annotations.cpg) { + items.push({ + label: 'CpG Context', + value: `Enriched (${(annotations.cpg.enrichment * 100).toFixed(0)}% of activations at CpG boundaries)`, + color: '#fce4ec', + }) + } + if (annotations.position) { + items.push({ + label: 'Gene Position', + value: `N-terminal enriched (${annotations.position.enrichment.toFixed(1)}x over expected)`, + color: '#e8f5e9', + }) + } + + return ( +
+ {items.map((item, i) => ( +
+ + {item.label}: + {' '} + {item.value} +
+ ))} +
+ ) +} + + +// ── Feature Metrics Component ─────────────────────────────────────── + +function FeatureMetrics({ feature }) { + const metrics = [ + { key: 'mean_variant_1bcdwt', label: 'Mean Variant (1B CDWT)' }, + { key: 'high_score_fraction', label: 'High Score Fraction' }, + { key: 'clinvar_fraction', label: 'ClinVar Fraction' }, + { key: 'mean_phylop', label: 'Mean PhyloP' }, + { key: 'mean_variant_delta', label: 'Mean Variant Delta' }, + { key: 'mean_site_delta', label: 'Mean Site Delta' }, + { key: 'mean_local_delta', label: 'Mean Local Delta' }, + { key: 'gc_mean', label: 'GC Mean' }, + { key: 'gc_std', label: 'GC Std' }, + { key: 'trinuc_entropy', label: 'Trinuc Entropy' }, + { key: 'gene_entropy', label: 'Gene Entropy' }, + { key: 'gene_n_unique', label: 'Gene N Unique' }, + ] + + const available = metrics.filter(m => feature[m.key] != null && !isNaN(feature[m.key])) + if (available.length === 0) return null + + return ( +
+ {available.map(m => ( +
+
+ {typeof feature[m.key] === 'number' + ? Math.abs(feature[m.key]) >= 100 ? feature[m.key].toFixed(0) + : Math.abs(feature[m.key]) >= 1 ? feature[m.key].toFixed(2) + : feature[m.key].toFixed(4) + : feature[m.key]} +
+
{m.label}
+
+ ))} +
+ ) +} + + +// ── Main Detail Page ──────────────────────────────────────────────── + +export default function FeatureDetailPage({ feature, examples, vocabLogits, featureAnalysis, onClose }) { + const [alignMode, setAlignMode] = useState('max_activation') + const scrollGroupRef = useRef(null) + + const fid = String(feature.feature_id) + const logits = vocabLogits ? vocabLogits[fid] : null + const analysis = featureAnalysis ? featureAnalysis[fid] : null + + const freq = feature.activation_freq || 0 + const maxAct = feature.max_activation || 0 + const description = feature.description || `Feature ${feature.feature_id}` + + // Close on Escape + useEffect(() => { + const handleKey = (e) => { if (e.key === 'Escape') onClose() } + document.addEventListener('keydown', handleKey) + return () => document.removeEventListener('keydown', handleKey) + }, [onClose]) + + const visibleExamples = (examples || []).slice(0, 6) + const { anchor: alignAnchor, totalLength } = computeAlignInfo(visibleExamples, alignMode) + + return ( +
{ if (e.target === e.currentTarget) onClose() }}> +
+ + {/* Header + stats in one row */} +
+
+
Feature #{feature.feature_id} {description}
+
+
+
+ freq: {(freq * 100).toFixed(1)}% + max: {maxAct.toFixed(1)} +
+ +
+
+ + {/* Feature Metrics from color-by columns */} +
+
Feature Metrics
+
+ Variant analysis and sequence composition metrics for this feature. +
+ +
+ + {/* Vocabulary Logits */} +
+
Decoder Logits — Promoted / Suppressed Codons
+
+ Projection of this feature's decoder weight through the Encodon LM head, with the mean logit vector subtracted. + This mean-centering removes the model's shared baseline bias (e.g. toward common codons like GCC), so values reflect what this feature specifically promotes (green) or suppresses (red) relative to the average feature. + Stop codons (TAA/TAG/TGA) are excluded — they are uniformly suppressed across all features since the model was trained on coding sequences. +
+ +
+ + {/* Gene-Level GSEA Enrichment */} + {(() => { + const gseaFields = [ + { key: 'gsea_GO_Biological_Process', label: 'GO Biological Process' }, + { key: 'gsea_GO_Molecular_Function', label: 'GO Molecular Function' }, + { key: 'gsea_GO_Cellular_Component', label: 'GO Cellular Component' }, + { key: 'gsea_InterPro_Domains', label: 'InterPro Domains' }, + { key: 'gsea_GO_Slim', label: 'GO Slim' }, + ] + const gseaEntries = gseaFields + .map(({ key, label }) => ({ label, value: feature[key] })) + .filter(e => e.value && e.value !== 'unlabeled' && e.value !== 'other') + const overallBest = feature.gsea_overall_best + if (gseaEntries.length === 0 && (!overallBest || overallBest === 'unlabeled')) return null + return ( +
+
Gene-Level Enrichment (GSEA)
+
+ Genes ranked by activation strength, tested against GO and InterPro databases. +
+ {overallBest && overallBest !== 'unlabeled' && ( +
+ Best: {overallBest} +
+ )} +
+ {gseaEntries.map(({ label, value }) => ( +
+
+ {label} +
+
{value}
+
+ ))} +
+
+ ) + })()} + + {/* Codon Annotations */} +
+
Codon-Level Annotations
+
+ Computed per-codon properties correlated with this feature's activations. +
+ +
+ + {/* Top Activating Sequences */} +
+
+
Top Activating Sequences
+
+ {['start', 'first_activation', 'max_activation'].map(mode => ( + + ))} +
+
+ + {visibleExamples.length > 0 ? ( + <> + {visibleExamples.map((ex, i) => ( +
+
+ + {getRegionLabel(ex)} + + max: {ex.max_activation?.toFixed(3)} +
+ +
+ ))} + + ) : ( +
No examples loaded
+ )} +
+ + {/* v2 roadmap placeholders — populated when annotation + conservation pipelines land. */} +
+
+ Annotations +
+
+ Annotation overlay (RefSeq, Rfam, JASPAR) — coming in v2 +
+
+ +
+
+ Conservation +
+
+ Conservation track (phyloP) — coming in v2 +
+
+ +
+
+ ) +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureList.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureList.jsx new file mode 100644 index 0000000000..26cd6c2457 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureList.jsx @@ -0,0 +1,83 @@ +import React, { memo } from 'react' +import FeatureCard from './FeatureCard' + +const styles = { + featureList: { + flex: 1, + overflowY: 'auto', + overflowX: 'hidden', + display: 'flex', + flexDirection: 'column', + gap: '10px', + paddingRight: '8px', + minHeight: 0, + }, +} + +function FeatureListComponent({ + filteredFeatures, + displayedCardCount, + clickedFeatureId, + features, + cardResetKey, + handleCardClick, + loadExamples, + vocabLogits, + featureAnalysis, + featureListRef, + endOfListRef, + featureRefs, +}) { + const visibleFeatures = filteredFeatures.slice(0, displayedCardCount) + const clickedIsVisible = clickedFeatureId != null && + visibleFeatures.some(f => Number(f.feature_id) === Number(clickedFeatureId)) + const clickedFeature = clickedFeatureId != null && !clickedIsVisible + ? features.find(f => Number(f.feature_id) === Number(clickedFeatureId)) + : null + + return ( +
+ {/* Only render clicked feature at top if NOT already in visible list */} + {clickedFeature && ( + { featureRefs.current[clickedFeature.feature_id] = el }} + feature={clickedFeature} + isHighlighted={true} + forceExpanded={true} + onClick={handleCardClick} + loadExamples={loadExamples} + vocabLogits={vocabLogits} + featureAnalysis={featureAnalysis} + /> + )} + {visibleFeatures.map(feature => ( + { featureRefs.current[feature.feature_id] = el }} + feature={feature} + isHighlighted={Number(clickedFeatureId) === Number(feature.feature_id)} + forceExpanded={Number(clickedFeatureId) === Number(feature.feature_id)} + onClick={handleCardClick} + loadExamples={loadExamples} + vocabLogits={vocabLogits} + featureAnalysis={featureAnalysis} + /> + ))} + {/* Sentinel element for infinite scroll detection */} +
+ {displayedCardCount < filteredFeatures.length && ( +
+ Scroll to load more... ({visibleFeatures.length} of {filteredFeatures.length}) +
+ )} + {filteredFeatures.length === 0 && clickedFeatureId == null && ( +
+ No features match your selection. +
+ )} +
+ ) +} + +export default memo(FeatureListComponent) diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Histogram.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Histogram.jsx new file mode 100644 index 0000000000..553330862d --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Histogram.jsx @@ -0,0 +1,85 @@ +import React, { useEffect, useRef } from 'react' +import * as vg from '@uwdata/vgplot' + +const FILL_COLOR = "#76b900" + +function injectAxisLine(plot, marginLeft, marginRight, marginBottom, height, axisColor) { + const svg = plot.tagName === 'svg' ? plot : plot.querySelector?.('svg') + if (!svg) return + // Remove any previously injected line + svg.querySelectorAll('.x-axis-line').forEach(el => el.remove()) + const svgWidth = svg.getAttribute('width') || svg.clientWidth + const line = document.createElementNS('http://www.w3.org/2000/svg', 'line') + line.classList.add('x-axis-line') + line.setAttribute('x1', marginLeft) + line.setAttribute('x2', svgWidth - marginRight) + line.setAttribute('y1', height - marginBottom) + line.setAttribute('y2', height - marginBottom) + line.setAttribute('stroke', axisColor) + line.setAttribute('stroke-width', '1') + svg.appendChild(line) +} + +export default function Histogram({ brush, column, label }) { + const containerRef = useRef(null) + + useEffect(() => { + if (!containerRef.current || !brush) return + + // Clear previous content + containerRef.current.innerHTML = '' + + const bgColor = getComputedStyle(document.documentElement).getPropertyValue('--density-bar-bg').trim() || '#e0e0e0' + const axisColor = getComputedStyle(document.documentElement).getPropertyValue('--text-tertiary').trim() || '#888' + const width = containerRef.current.clientWidth - 20 + const height = 50 + const marginLeft = 45 + const marginBottom = 20 + const marginRight = 10 + const marginTop = 5 + + const plot = vg.plot( + // Background histogram: full data (no filterBy) + vg.rectY( + vg.from("features"), + { x: vg.bin(column), y: vg.count(), fill: bgColor, inset: 1 } + ), + // Foreground histogram: filtered data + vg.rectY( + vg.from("features", { filterBy: brush }), + { x: vg.bin(column), y: vg.count(), fill: FILL_COLOR, inset: 1 } + ), + vg.intervalX({ as: brush }), + vg.xLabel(null), + vg.yLabel(null), + vg.width(width), + vg.height(height), + vg.marginLeft(marginLeft), + vg.marginBottom(marginBottom), + vg.marginTop(marginTop), + vg.marginRight(marginRight) + ) + + containerRef.current.appendChild(plot) + + // Inject axis line into the SVG directly (immune to container resize) + // Use a short delay to ensure the SVG is rendered + const timer = setTimeout(() => { + injectAxisLine(plot, marginLeft, marginRight, marginBottom, height, axisColor) + }, 50) + + return () => { + clearTimeout(timer) + if (containerRef.current) { + containerRef.current.innerHTML = '' + } + } + }, [brush, column, label]) + + return ( +
+ ) +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/InfoButton.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/InfoButton.jsx new file mode 100644 index 0000000000..40184d0ef6 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/InfoButton.jsx @@ -0,0 +1,78 @@ +import React, { useState, useEffect, useRef } from 'react' +import { createPortal } from 'react-dom' + +export default function InfoButton({ text }) { + const [open, setOpen] = useState(false) + const wrapperRef = useRef(null) + const buttonRef = useRef(null) + const [pos, setPos] = useState(null) + + useEffect(() => { + if (!open) return + const handleClick = (e) => { + if (wrapperRef.current && !wrapperRef.current.contains(e.target)) { + setOpen(false) + } + } + document.addEventListener('mousedown', handleClick) + return () => document.removeEventListener('mousedown', handleClick) + }, [open]) + + useEffect(() => { + if (open && buttonRef.current) { + const rect = buttonRef.current.getBoundingClientRect() + setPos({ + top: rect.top - 8, + left: rect.left + rect.width / 2, + }) + } + }, [open]) + + return ( + + setOpen(o => !o)} + style={{ + display: 'inline-flex', + alignItems: 'center', + justifyContent: 'center', + width: '15px', + height: '15px', + borderRadius: '50%', + border: '1px solid var(--border-input)', + fontSize: '10px', + fontWeight: '600', + color: 'var(--text-tertiary)', + cursor: 'pointer', + userSelect: 'none', + lineHeight: 1, + }} + > + i + + {open && pos && createPortal( +
+ {text} +
, + document.body + )} +
+ ) +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/RegionDetailModal.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/RegionDetailModal.jsx new file mode 100644 index 0000000000..d72dc41358 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/RegionDetailModal.jsx @@ -0,0 +1,157 @@ +import React, { useEffect } from 'react' +import ReactDOM from 'react-dom' +import SequenceView from './SequenceView' +import { getRegionLabel } from './utils' + +const styles = { + backdrop: { + position: 'fixed', + inset: 0, + background: 'rgba(0,0,0,0.5)', + zIndex: 9999, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }, + modal: { + background: '#fff', + borderRadius: '12px', + width: '90vw', + maxWidth: '1000px', + maxHeight: '85vh', + display: 'flex', + flexDirection: 'column', + overflow: 'hidden', + boxShadow: '0 20px 60px rgba(0,0,0,0.3)', + position: 'relative', + }, + closeBtn: { + position: 'absolute', + top: '12px', + right: '12px', + zIndex: 10, + background: 'rgba(255,255,255,0.9)', + border: '1px solid #ddd', + borderRadius: '50%', + width: '32px', + height: '32px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + cursor: 'pointer', + fontSize: '16px', + color: '#555', + }, + body: { + flex: 1, + padding: '32px', + overflowY: 'auto', + display: 'flex', + flexDirection: 'column', + gap: '20px', + }, + header: { + display: 'flex', + alignItems: 'center', + gap: '8px', + flexWrap: 'wrap', + }, + regionLabel: { + fontSize: '18px', + fontWeight: '700', + fontFamily: 'monospace', + color: '#222', + }, + statsRow: { + display: 'flex', + gap: '20px', + flexWrap: 'wrap', + }, + statBox: { + padding: '10px 14px', + background: '#f9fafb', + borderRadius: '8px', + border: '1px solid #eee', + }, + statLabel: { + fontSize: '10px', + color: '#888', + textTransform: 'uppercase', + marginBottom: '2px', + }, + statValue: { + fontSize: '14px', + fontWeight: '600', + fontFamily: 'monospace', + color: '#333', + }, + sectionLabel: { + fontSize: '11px', + color: '#888', + textTransform: 'uppercase', + fontWeight: '500', + }, + sequenceBox: { + background: '#fafafa', + border: '1px solid #eee', + borderRadius: '8px', + padding: '12px', + maxHeight: '300px', + overflowY: 'auto', + }, +} + +export default function RegionDetailModal({ region, onClose }) { + useEffect(() => { + const handleKey = (e) => { if (e.key === 'Escape') onClose() } + document.addEventListener('keydown', handleKey) + return () => document.removeEventListener('keydown', handleKey) + }, [onClose]) + + const label = getRegionLabel(region) + const sequenceLength = (region.sequence || '').length + + const modal = ( +
+
e.stopPropagation()}> +
x
+ +
+
+ {label} +
+ +
+
+
Max Activation
+
{(region.max_activation || 0).toFixed(4)}
+
+
+
Sequence Length
+
{sequenceLength} bp
+
+ {region.best_annotation && ( +
+
Annotation
+
{region.best_annotation}
+
+ )} +
+ +
+
Sequence (activation highlighted)
+
+ +
+
+
+
+
+ ) + + return ReactDOM.createPortal(modal, document.body) +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/SequenceView.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/SequenceView.jsx new file mode 100644 index 0000000000..5583180fc5 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/SequenceView.jsx @@ -0,0 +1,267 @@ +import React, { useState, useEffect, useRef } from 'react' +import { parseBases } from './utils' + +function activationColorHex(value, maxValue) { + if (maxValue <= 0 || value <= 0) return 'transparent' + const n = Math.min(value / maxValue, 1) + const r = Math.round(255 - n * 137) + const g = Math.round(255 - n * 70) + const b = Math.round(255 * (1 - n)) + const toHex = (c) => c.toString(16).padStart(2, '0') + return `#${toHex(r)}${toHex(g)}${toHex(b)}` +} + +const BASE_WIDTH = 12 + +const styles = { + container: { + fontFamily: 'Monaco, Menlo, "Courier New", monospace', + fontSize: '11px', + lineHeight: '1.2', + overflowX: 'auto', + position: 'relative', + }, + baseRow: { + display: 'inline-flex', + whiteSpace: 'nowrap', + }, + baseBlock: { + display: 'inline-flex', + flexDirection: 'column', + alignItems: 'center', + cursor: 'default', + borderRadius: '2px', + padding: '1px 1px', + marginRight: '0px', + minWidth: `${BASE_WIDTH}px`, + }, + padBlock: { + display: 'inline-flex', + flexDirection: 'column', + alignItems: 'center', + borderRadius: '2px', + padding: '1px 1px', + marginRight: '0px', + minWidth: `${BASE_WIDTH}px`, + background: 'var(--density-bar-bg)', + }, + padText: { + fontSize: '10px', + color: 'var(--text-muted)', + }, + baseText: { + fontSize: '10px', + letterSpacing: '0.5px', + color: 'var(--text)', + }, + idxText: { + fontSize: '7px', + color: 'var(--text-tertiary)', + marginTop: '0px', + lineHeight: '1', + }, + tooltip: { + position: 'fixed', + background: 'var(--bg-card)', + color: 'var(--text)', + border: '1px solid var(--border)', + padding: '4px 8px', + borderRadius: '4px', + fontSize: '10px', + fontFamily: 'monospace', + zIndex: 1000, + pointerEvents: 'none', + whiteSpace: 'nowrap', + }, +} + +// Show index under every Nth base to keep the row scannable +const INDEX_INTERVAL = 10 + +export default function SequenceView({ + sequence, activations, maxActivation, + alignMode, alignAnchor, totalLength, + scrollGroupRef, +}) { + const [tooltip, setTooltip] = useState(null) + const scrollRef = useRef(null) + const anchorRef = useRef(null) + + const bases = parseBases(sequence) + const acts = activations ? activations.slice(0, bases.length) : [] + const maxAct = maxActivation || Math.max(...acts, 0.001) + + // Compute local anchor index + let localAnchor = 0 + if (alignMode === 'first_activation') { + localAnchor = acts.findIndex(a => a > 0) + if (localAnchor < 0) localAnchor = 0 + } else if (alignMode === 'max_activation') { + let maxVal = -1 + acts.forEach((a, i) => { if (a > maxVal) { maxVal = a; localAnchor = i } }) + } + + // Padding + const isAligned = alignMode && alignMode !== 'start' && alignAnchor != null + const leftPad = isAligned ? Math.max(0, alignAnchor - localAnchor) : 0 + const rightPad = (totalLength != null) + ? Math.max(0, totalLength - leftPad - bases.length) + : 0 + + // Scroll to anchor when alignMode changes + useEffect(() => { + if (isAligned && anchorRef.current && scrollRef.current) { + anchorRef.current.scrollIntoView({ behavior: 'instant', inline: 'center', block: 'nearest' }) + } + }, [alignMode, alignAnchor]) + + // Synchronized scrolling across sequences in the same card + useEffect(() => { + const el = scrollRef.current + if (!el || !scrollGroupRef) return + + if (!scrollGroupRef.current) scrollGroupRef.current = [] + const group = scrollGroupRef.current + if (!group.includes(el)) group.push(el) + + let isSyncing = false + const handleScroll = () => { + if (isSyncing) return + isSyncing = true + const scrollLeft = el.scrollLeft + for (const other of group) { + if (other !== el) other.scrollLeft = scrollLeft + } + isSyncing = false + } + + el.addEventListener('scroll', handleScroll) + return () => { + el.removeEventListener('scroll', handleScroll) + const idx = group.indexOf(el) + if (idx !== -1) group.splice(idx, 1) + } + }, [scrollGroupRef]) + + if (!sequence || sequence.length === 0) { + return No sequence + } + + const handleMouseEnter = (e, base, idx, act) => { + setTooltip({ + x: e.clientX + 10, + y: e.clientY - 25, + text: `${base} pos ${idx + 1} — activation: ${act.toFixed(4)}`, + }) + } + + const handleMouseMove = (e) => { + if (tooltip) { + setTooltip((prev) => prev ? { ...prev, x: e.clientX + 10, y: e.clientY - 25 } : null) + } + } + + const handleMouseLeave = () => { + setTooltip(null) + } + + const shouldShowIdx = (idx) => (idx + 1) % INDEX_INTERVAL === 0 || idx === 0 + + return ( +
+
+ {/* Left padding */} + {Array.from({ length: leftPad }, (_, i) => ( + + · +   + + ))} + + {/* Actual bases */} + {bases.map((base, idx) => { + const act = acts[idx] || 0 + const bg = activationColorHex(act, maxAct) + const isAnchor = isAligned && idx === localAnchor + const hasActivation = act > 0 + const activeTextColor = hasActivation ? '#000' : undefined + return ( + handleMouseEnter(e, base, idx, act)} + onMouseMove={handleMouseMove} + onMouseLeave={handleMouseLeave} + > + {base} + {shouldShowIdx(idx) ? idx + 1 : ' '} + + ) + })} + + {/* Right padding */} + {Array.from({ length: rightPad }, (_, i) => ( + + · +   + + ))} +
+ {tooltip && ( + + {tooltip.text} + + )} +
+ ) +} + +/** + * Compute alignment info for a set of examples — same logic as the codonfm + * version, just operating on per-base activation arrays rather than per-codon. + */ +export function computeAlignInfo(examples, alignMode) { + if (!examples || examples.length === 0) return { anchor: 0, totalLength: 0 } + + if (alignMode === 'start') { + const maxLen = Math.max(...examples.map(ex => (ex.activations || []).length)) + return { anchor: 0, totalLength: maxLen } + } + + let maxAnchor = 0 + for (const ex of examples) { + const acts = ex.activations || [] + let anchor = 0 + if (alignMode === 'first_activation') { + anchor = acts.findIndex(a => a > 0) + if (anchor < 0) anchor = 0 + } else if (alignMode === 'max_activation') { + let maxVal = -1 + acts.forEach((a, i) => { if (a > maxVal) { maxVal = a; anchor = i } }) + } + if (anchor > maxAnchor) maxAnchor = anchor + } + + let totalLength = 0 + for (const ex of examples) { + const acts = ex.activations || [] + let anchor = 0 + if (alignMode === 'first_activation') { + anchor = acts.findIndex(a => a > 0) + if (anchor < 0) anchor = 0 + } else if (alignMode === 'max_activation') { + let maxVal = -1 + acts.forEach((a, i) => { if (a > maxVal) { maxVal = a; anchor = i } }) + } + const leftPad = maxAnchor - anchor + const thisTotal = leftPad + acts.length + if (thisTotal > totalLength) totalLength = thisTotal + } + + return { anchor: maxAnchor, totalLength } +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/index.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/index.jsx new file mode 100644 index 0000000000..38853006d7 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/index.jsx @@ -0,0 +1,9 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + +) diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/utils.js b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/utils.js new file mode 100644 index 0000000000..936d971eae --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/utils.js @@ -0,0 +1,22 @@ +/** + * Build a human-readable label for a genomic region example. + * Expects an object with sequence_id, start, end fields. Falls back + * gracefully if any of those are missing. + */ +export function getRegionLabel(example) { + if (!example) return '' + const sid = example.sequence_id || example.protein_id || '' + if (example.start != null && example.end != null) { + return `${sid}:${example.start}-${example.end}` + } + return sid +} + +/** + * Parse a DNA sequence into an array of single-base tokens. + * No codon framing — each base is rendered independently. + */ +export function parseBases(sequence) { + if (!sequence) return [] + return sequence.split('') +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/vite.config.js b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/vite.config.js new file mode 100644 index 0000000000..6df23efee3 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/vite.config.js @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + root: '.', + build: { + outDir: 'dist', + }, + server: { + port: 5176, + }, +}) diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py new file mode 100644 index 0000000000..dc7f72e1cc --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py @@ -0,0 +1,239 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: LicenseRef-Apache2 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Generate synthetic features.json + features_atlas.parquet for the evo2 SAE mockup dashboard. + +Run once, commit outputs as fixtures. No real SAE involved — this is a v1 demo of the +visualization shell. The data shape is the contract the real eval pipeline will target later. +""" + +import argparse +import json +from pathlib import Path + +import numpy as np +import pandas as pd + + +# Plausible biological labels (20 features) — visible motifs in the synthetic sequences. +LABELS = [ + "exon-start motif", + "tRNA acceptor stem", + "intergenic GC-rich", + "stop codon context", + "ribosome binding site", + "promoter -10 box", + "CpG island", + "splice donor", + "polyA signal", + "start codon ATG context", + "transposon repeat", + "rRNA conserved region", + "operon intergenic", + "frameshift-sensitive region", + "high-conservation coding", + "intron branch point", + "TF binding motif", + "phage integrase region", + "origin of replication", + "Shine-Dalgarno sequence", +] + +# Plausible accessions to rotate across examples. +SEQ_IDS = ["NC_000913.3", "NC_002695.2", "chr1", "chr17"] + +# Central motifs to splice into each feature's top-activating windows. +# Doesn't need biological rigor — just makes features visually distinguishable in the demo. +CENTRAL_MOTIFS = { + "exon-start motif": "AGGTAAGT", + "tRNA acceptor stem": "CCCGGGT", + "intergenic GC-rich": "GCGCGCGC", + "stop codon context": "TAATAATAA", + "ribosome binding site": "AGGAGG", + "promoter -10 box": "TATAAT", + "CpG island": "CGCGCGCG", + "splice donor": "GTAAGT", + "polyA signal": "AATAAA", + "start codon ATG context": "ATGGCC", + "transposon repeat": "TTAATTAA", + "rRNA conserved region": "GUCAGCUGGUC".replace("U", "T"), + "operon intergenic": "AAATTT", + "frameshift-sensitive region": "AAAAAAA", + "high-conservation coding": "GCAGCAGCA", + "intron branch point": "TACTAAC", + "TF binding motif": "TGACTCA", + "phage integrase region": "GCTAGGTGT", + "origin of replication": "ATCGATCG", + "Shine-Dalgarno sequence": "AGGAGGT", +} + + +def _random_dna(rng: np.random.Generator, length: int) -> str: + """Generate a length-N DNA string by uniform-sampling A/C/G/T.""" + return "".join(rng.choice(list("ACGT"), size=length)) + + +def _make_example(rng: np.random.Generator, label: str, feature_max: float, window: int = 200) -> dict: + """Build one top-activating example: 200bp window with a central motif + a gaussian activation bump.""" + seq = list(_random_dna(rng, window)) + + # Splice the feature's central motif into the middle ± a few bp jitter. + motif = CENTRAL_MOTIFS[label] + center = window // 2 + int(rng.integers(-5, 6)) + motif_start = center - len(motif) // 2 + for i, base in enumerate(motif): + pos = motif_start + i + if 0 <= pos < window: + seq[pos] = base + + # Activation bump: gaussian centered in [80, 120], sigma ~= 8 bp, peak = feature_max * U(0.5, 1.0). + bump_center = int(rng.integers(80, 121)) + sigma = 8.0 + peak = float(feature_max * rng.uniform(0.5, 1.0)) + positions = np.arange(window) + activations = peak * np.exp(-((positions - bump_center) ** 2) / (2 * sigma**2)) + activations[activations < 0.01] = 0.0 # zero out the tails so the JSON is sparse-ish + + seq_id = SEQ_IDS[int(rng.integers(0, len(SEQ_IDS)))] + start = int(rng.integers(1, 5_000_001)) + + return { + "sequence_id": seq_id, + "start": start, + "end": start + window, + "sequence": "".join(seq), + "activations": [round(float(a), 3) for a in activations], + "max_activation": round(float(activations.max()), 4), + "max_activation_position": int(activations.argmax()), + } + + +def _make_features(rng: np.random.Generator) -> list[dict]: + """Build the 20 synthetic feature entries for features.json.""" + features = [] + for fid, label in enumerate(LABELS): + activation_freq = float(np.exp(rng.uniform(np.log(0.001), np.log(0.1)))) + max_activation = float(rng.uniform(5.0, 30.0)) + examples = [_make_example(rng, label, max_activation) for _ in range(30)] + + features.append( + { + "feature_id": fid, + "description": label, + "label": label, + "activation_freq": round(activation_freq, 6), + "max_activation": round(max_activation, 4), + "top_positive_logits": [], + "top_negative_logits": [], + "examples": examples, + } + ) + return features + + +def _make_atlas(rng: np.random.Generator, features: list[dict]) -> pd.DataFrame: + """Build features_atlas.parquet — synthetic UMAP coords with 4 visible clusters of 5 features each.""" + n_clusters = 4 + cluster_centers = rng.uniform(-5.0, 5.0, size=(n_clusters, 2)) + coords = [] + for fid in range(len(features)): + cluster_idx = fid // (len(features) // n_clusters) + center = cluster_centers[cluster_idx] + xy = center + rng.normal(0, 0.5, size=2) + coords.append(xy) + coords = np.array(coords) + + return pd.DataFrame( + { + "feature_id": [f["feature_id"] for f in features], + "x": coords[:, 0].round(4), + "y": coords[:, 1].round(4), + "label": [f["label"] for f in features], + "activation_freq": [f["activation_freq"] for f in features], + "log_frequency": [round(float(np.log10(f["activation_freq"])), 4) for f in features], + "max_activation": [f["max_activation"] for f in features], + "cluster": [fid // (len(features) // n_clusters) for fid in range(len(features))], + } + ) + + +def _make_examples_table(features: list[dict]) -> pd.DataFrame: + """Flatten per-feature examples into a long table for feature_examples.parquet. + + One row per (feature_id, example_rank). The dashboard lazy-loads these via DuckDB. + """ + rows = [] + for feature in features: + for rank, ex in enumerate(feature["examples"]): + rows.append( + { + "feature_id": feature["feature_id"], + "example_rank": rank, + "sequence_id": ex["sequence_id"], + "start": ex["start"], + "end": ex["end"], + "sequence": ex["sequence"], + "activations": ex["activations"], + "max_activation": ex["max_activation"], + "max_activation_position": ex["max_activation_position"], + "best_annotation": None, + } + ) + return pd.DataFrame(rows) + + +def main(): + """Generate synthetic parquet fixtures (atlas + metadata + examples) for the mockup dashboard.""" + p = argparse.ArgumentParser() + p.add_argument( + "--output-dir", + type=Path, + default=Path(__file__).resolve().parent.parent / "evo2_dashboard_mockup" / "public", + help="Where to write the three parquet fixtures", + ) + p.add_argument( + "--write-json", + action="store_true", + help="Also write features.json (only useful if you point the dashboard at the legacy JSON path)", + ) + p.add_argument("--seed", type=int, default=42) + args = p.parse_args() + + rng = np.random.default_rng(args.seed) + args.output_dir.mkdir(parents=True, exist_ok=True) + + features = _make_features(rng) + + atlas = _make_atlas(rng, features) + atlas.to_parquet(args.output_dir / "features_atlas.parquet", index=False) + # feature_metadata is the same shape as the atlas for the mockup — the dashboard + # loads them as two tables but the queried columns are identical. + atlas.to_parquet(args.output_dir / "feature_metadata.parquet", index=False) + + examples = _make_examples_table(features) + examples.to_parquet(args.output_dir / "feature_examples.parquet", index=False) + + if args.write_json: + with open(args.output_dir / "features.json", "w") as f: + json.dump({"features": features}, f) + print(f"Wrote {len(features)} features -> {args.output_dir / 'features.json'}") + + print(f"Wrote {len(atlas)} atlas rows -> {args.output_dir / 'features_atlas.parquet'}") + print(f"Wrote {len(atlas)} metadata rows -> {args.output_dir / 'feature_metadata.parquet'}") + print(f"Wrote {len(examples)} example rows -> {args.output_dir / 'feature_examples.parquet'}") + + +if __name__ == "__main__": + main() From 20a34a1bae949f1056f98c760ac1a1444e71030e Mon Sep 17 00:00:00 2001 From: Polina Binder Date: Tue, 26 May 2026 23:46:43 +0000 Subject: [PATCH 05/12] evo2 dashboard mockup: trim codonfm bloat, refine labels, add unlabeled features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three changes on top of the initial mockup commit: 1. Drop codonfm-specific scaffolding from forked components. - .gitignore the auto-generated package-lock.json (regenerates on `npm install`) - FeatureCard.jsx: 793 -> 508 lines. Removed dead stat tiles (Hi-Score, Variant/Site/Local deltas, ClinVar, PhyloP, GC, Trinuc/Gene entropy), codonfm vocab-logits chart, codonfm GSEA tags, codonfm CSV export sections — all conditional on fields our synthetic data doesn't provide. - FeatureDetailPage.jsx: 522 -> 187 lines. Replaced codonfm-specific VocabLogitChart / CodonAnnotations / FeatureMetrics components with a simpler DNA-friendly detail view. 2. Refine the synthetic feature set. - 11 labeled DNA-native features in 3 thematic UMAP clusters: * eukaryotic regulatory (TATA box, polyA signal, CpG island, splice donor, splice acceptor) * bacterial regulatory (-10 box, -35 box, Shine-Dalgarno) * codon context (start ATG, stop TAA, stop TAG) - 9 unlabeled features in a 4th diffuse cluster (label=NULL, db_source=NULL) — mimics the realistic case where most SAE features are uninterpreted. - New `db_source` column on each feature (RefSeq / JASPAR-ENCODE / bacterial annotation / RefSeq UTR / ENCODE-RefSeq / NULL). 3. Bug fixes for cross-pod port-forward demo: - App.jsx defaults: `selectedCategory` and `histMetric3` were hardcoded to codonfm's `mean_variant_1bcdwt` column, which doesn't exist in our atlas and threw Binder errors. Switched to `cluster_id`. - Atlas column rename: `cluster` -> `cluster_id` to match what App.jsx queries. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../evo2/evo2_dashboard_mockup/.gitignore | 4 + .../evo2_dashboard_mockup/package-lock.json | 6366 ----------------- .../public/feature_examples.parquet | Bin 182767 -> 185822 bytes .../public/feature_metadata.parquet | Bin 6558 -> 7048 bytes .../public/features_atlas.parquet | Bin 6558 -> 7048 bytes .../evo2/evo2_dashboard_mockup/src/App.jsx | 4 +- .../evo2_dashboard_mockup/src/FeatureCard.jsx | 289 +- .../src/FeatureDetailPage.jsx | 429 +- .../evo2/scripts/make_mockup_features.py | 180 +- 9 files changed, 185 insertions(+), 7087 deletions(-) create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/.gitignore delete mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/.gitignore b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/.gitignore new file mode 100644 index 0000000000..f4daeb0de8 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +package-lock.json +dist/ +.vite/ diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json deleted file mode 100644 index 8bb23148d4..0000000000 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package-lock.json +++ /dev/null @@ -1,6366 +0,0 @@ -{ - "name": "protein-dashboard", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "protein-dashboard", - "version": "0.1.0", - "dependencies": { - "@uwdata/mosaic-core": "^0.21.1", - "@uwdata/mosaic-sql": "^0.21.1", - "@uwdata/vgplot": "^0.21.1", - "embedding-atlas": "^0.16.1", - "lucide-react": "^0.577.0", - "molstar": "^4.8.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@vitejs/plugin-react": "^4.2.0", - "vite": "^5.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@duckdb/duckdb-wasm": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@duckdb/duckdb-wasm/-/duckdb-wasm-1.30.0.tgz", - "integrity": "sha512-9aWrm+4ayl4sTlvGtl/b+LxrUyXaac3yyVqkoJ3F7Vkd62PoS8PcQIRJ/KjXBW36LP1CnPY5jjvFyIcTFLtcXA==", - "license": "MIT", - "dependencies": { - "apache-arrow": "^17.0.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@observablehq/plot": { - "version": "0.6.17", - "resolved": "https://registry.npmjs.org/@observablehq/plot/-/plot-0.6.17.tgz", - "integrity": "sha512-/qaXP/7mc4MUS0s4cPPFASDRjtsWp85/TbfsciqDgU1HwYixbSbbytNuInD8AcTYC3xaxACgVX06agdfQy9W+g==", - "license": "ISC", - "dependencies": { - "d3": "^7.9.0", - "interval-tree-1d": "^1.0.0", - "isoformat": "^0.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.27", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", - "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@scarf/scarf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", - "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", - "hasInstallScript": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", - "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@types/argparse": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-2.0.17.tgz", - "integrity": "sha512-fueJssTf+4dW4HODshEGkIZbkLKHzgu1FvCI4cTc/MKum/534Euo3SrN+ilq8xgyHnOjtmg33/hee8iXLRg1XA==", - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/benchmark": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", - "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==", - "license": "MIT" - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/command-line-args": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", - "license": "MIT" - }, - "node_modules/@types/command-line-usage": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", - "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", - "license": "MIT" - }, - "node_modules/@types/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==", - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", - "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.13", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.13.tgz", - "integrity": "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/swagger-ui-dist": { - "version": "3.30.5", - "resolved": "https://registry.npmjs.org/@types/swagger-ui-dist/-/swagger-ui-dist-3.30.5.tgz", - "integrity": "sha512-SrXhD9L8qeIxJzN+o1kmf3wXeVf/+Km3jIdRM1+Yq3I5b/dlF5TcGr5WCVM7I/cBYpgf43/gCPIucQ13AhICiw==", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@uwdata/flechette": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@uwdata/flechette/-/flechette-2.3.0.tgz", - "integrity": "sha512-FdTqVEJZL4MwTv+vY1jOUMW2i5pr/G5S4BGdmQ/7wSOCtA0I74UP117kzXiKe1FrB5+ydM4tFxrCdF8Dq9WgNA==", - "license": "BSD-3-Clause" - }, - "node_modules/@uwdata/mosaic-core": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@uwdata/mosaic-core/-/mosaic-core-0.21.1.tgz", - "integrity": "sha512-nRh93+A7U/06x/6boSLUUaSCo4pkNAjOgV8P2Zl6ZZeF5pWynLcSqT30WLQPx+VewTvFgJGCymocymdbirFxYw==", - "license": "BSD-3-Clause", - "dependencies": { - "@duckdb/duckdb-wasm": "1.30.0", - "@uwdata/flechette": "^2.2.5", - "@uwdata/mosaic-sql": "^0.21.1" - } - }, - "node_modules/@uwdata/mosaic-inputs": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@uwdata/mosaic-inputs/-/mosaic-inputs-0.21.1.tgz", - "integrity": "sha512-9h/PFk71QL5+Nhqsai9pqVdnHUQb8OAemZrPossbfvb3q62o7RpU+jMwxcAId4uB/qRTAFxr0LgRfoPxrjfZYg==", - "license": "BSD-3-Clause", - "dependencies": { - "@uwdata/mosaic-core": "^0.21.1", - "@uwdata/mosaic-sql": "^0.21.1" - } - }, - "node_modules/@uwdata/mosaic-plot": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@uwdata/mosaic-plot/-/mosaic-plot-0.21.1.tgz", - "integrity": "sha512-ZPBD0Km44VIexZ7l88n1yWh8QpVJakJnmkyq6zr8aujw2i2+MkrcI8Abc2aPJ74o2YiSb9hMKxno83nB/Mfy7A==", - "license": "BSD-3-Clause", - "dependencies": { - "@observablehq/plot": "^0.6.17", - "@uwdata/mosaic-core": "^0.21.1", - "@uwdata/mosaic-sql": "^0.21.1", - "d3": "^7.9.0" - } - }, - "node_modules/@uwdata/mosaic-spec": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@uwdata/mosaic-spec/-/mosaic-spec-0.21.1.tgz", - "integrity": "sha512-DSc1Cgg5WdYaVzZIDE5mUlNtDEwus84iCfgLfEf3v69X31/8tD03y1Aii8K8sbjzqP5kkgOVV8GA419THn7N2w==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@uwdata/mosaic-core": "^0.21.1", - "@uwdata/mosaic-sql": "^0.21.1", - "@uwdata/vgplot": "^0.21.1", - "ts-json-schema-generator": "^2.4.0" - } - }, - "node_modules/@uwdata/mosaic-sql": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@uwdata/mosaic-sql/-/mosaic-sql-0.21.1.tgz", - "integrity": "sha512-2B4Dle4odyxIaBaDVRfQchebH/CUZvUV8kIwKF3V2GksQoF8KYY/Q6zTLTJhYrDEdUkt8M0OIy4U/Ntw93CV1A==", - "license": "BSD-3-Clause" - }, - "node_modules/@uwdata/vgplot": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@uwdata/vgplot/-/vgplot-0.21.1.tgz", - "integrity": "sha512-R+CFYeTPdNoMzMAxNwt7coTqcWWY6aOKUj28SqkQ4dbL3Ig37RjCnRDcpFzCqvxaSeOwZRXQ1Ld3WhnagqDh/Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@uwdata/mosaic-core": "^0.21.1", - "@uwdata/mosaic-inputs": "^0.21.1", - "@uwdata/mosaic-plot": "^0.21.1", - "@uwdata/mosaic-sql": "^0.21.1" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", - "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.0", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.27", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/apache-arrow": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-17.0.0.tgz", - "integrity": "sha512-X0p7auzdnGuhYMVKYINdQssS4EcKec9TCXyez/qtJt32DrIMGbzqiaMiQ0X6fQlQpw8Fl0Qygcv4dfRAr5Gu9Q==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.11", - "@types/command-line-args": "^5.2.3", - "@types/command-line-usage": "^5.0.4", - "@types/node": "^20.13.0", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.1", - "flatbuffers": "^24.3.25", - "json-bignum": "^0.0.3", - "tslib": "^2.6.2" - }, - "bin": { - "arrow2csv": "bin/arrow2csv.cjs" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", - "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "is-string": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/binary-search-bounds": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", - "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "license": "MIT", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", - "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^4.1.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", - "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT", - "peer": true - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", - "dev": true, - "license": "ISC" - }, - "node_modules/embedding-atlas": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/embedding-atlas/-/embedding-atlas-0.16.1.tgz", - "integrity": "sha512-ab4LsqiW+YMiFkf5LIv/e0fATGZh9AloScfRvTB39eOPp+MwS7ncOV3Xd4EdLS0RyYP3ZlBHR2tuGFYwN9yayg==", - "license": "MIT", - "peerDependencies": { - "@uwdata/mosaic-core": ">=0.19.0", - "@uwdata/mosaic-spec": ">=0.19.0", - "@uwdata/mosaic-sql": ">=0.19.0", - "@uwdata/vgplot": ">=0.19.0", - "react": ">=17.0.0", - "svelte": ">=5.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "svelte": { - "optional": true - } - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "license": "MIT", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/flatbuffers": { - "version": "24.12.23", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.12.23.tgz", - "integrity": "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==", - "license": "Apache-2.0" - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "2.16.11", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.11.tgz", - "integrity": "sha512-LaI+KaX2NFkfn1ZGHoKCmcfv7yrZsC3b8NtWsTVQeHkq4F27vI5igUuO53sxqDEa2gNQMHFPmpojDw/1zmUK7w==", - "license": "MIT", - "peer": true - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/h264-mp4-encoder": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/h264-mp4-encoder/-/h264-mp4-encoder-1.0.12.tgz", - "integrity": "sha512-xih3J+Go0o1RqGjhOt6TwXLWWGqLONRPyS8yoMu/RoS/S8WyEv4HuHp1KBsDDl8srZQ3gw9f95JYkCSjCuZbHQ==", - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immer": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", - "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", - "license": "MIT" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/interval-tree-1d": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/interval-tree-1d/-/interval-tree-1d-1.0.4.tgz", - "integrity": "sha512-wY8QJH+6wNI0uh4pDQzMvl+478Qh7Rl4qLmqiluxALlNvl+I+o5x38Pw3/z7mDPTPS1dQalZJXsmbvxx5gclhQ==", - "license": "MIT", - "dependencies": { - "binary-search-bounds": "^2.0.0" - } - }, - "node_modules/io-ts": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-2.2.22.tgz", - "integrity": "sha512-FHCCztTkHoV9mdBsHpocLpdTAfh956ZQcIkWQxxS0U5HT53vtrcuYdQneEJKH6xILaLNzXVl2Cvwtoy8XNN0AA==", - "license": "MIT", - "peerDependencies": { - "fp-ts": "^2.5.0" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isoformat": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/isoformat/-/isoformat-0.2.1.tgz", - "integrity": "sha512-tFLRAygk9NqrRPhJSnNGh7g7oaVWDwR0wKh/GM2LgmPa50Eg4UfyaCO4I8k6EqJHl1/uh2RAD6g06n5ygEnrjQ==", - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-bignum": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", - "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.577.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", - "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/molstar": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/molstar/-/molstar-4.18.0.tgz", - "integrity": "sha512-mU2da9laqdFtGKGCqOyFywCAxuvRYevOMFjrX/6RwIUd+HB5yOpbLXXRA5ErVadHXLTlEYOutCzNv+AwvmrfmA==", - "license": "MIT", - "dependencies": { - "@types/argparse": "^2.0.17", - "@types/benchmark": "^2.1.5", - "@types/compression": "1.8.1", - "@types/express": "^5.0.3", - "@types/node": "^18.19.111", - "@types/node-fetch": "^2.6.12", - "@types/swagger-ui-dist": "3.30.5", - "argparse": "^2.0.1", - "compression": "^1.8.0", - "cors": "^2.8.5", - "express": "^5.1.0", - "h264-mp4-encoder": "^1.0.12", - "immer": "^10.1.1", - "immutable": "^5.1.2", - "io-ts": "^2.2.22", - "node-fetch": "^2.7.0", - "react-markdown": "^10.1.0", - "rxjs": "^7.8.2", - "swagger-ui-dist": "^5.24.0", - "tslib": "^2.8.1", - "util.promisify": "^1.1.3" - }, - "bin": { - "cif2bcif": "lib/commonjs/cli/cif2bcif/index.js", - "cifschema": "lib/commonjs/cli/cifschema/index.js", - "model-server": "lib/commonjs/servers/model/server.js", - "model-server-preprocess": "lib/commonjs/servers/model/preprocess.js", - "model-server-query": "lib/commonjs/servers/model/query.js", - "mvs-print-schema": "lib/commonjs/cli/mvs/mvs-print-schema.js", - "mvs-render": "lib/commonjs/cli/mvs/mvs-render.js", - "mvs-validate": "lib/commonjs/cli/mvs/mvs-validate.js", - "volume-server": "lib/commonjs/servers/volume/server.js", - "volume-server-pack": "lib/commonjs/servers/volume/pack.js", - "volume-server-query": "lib/commonjs/servers/volume/query.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@google-cloud/storage": "^7.14.0", - "canvas": "^2.11.2", - "gl": "^6.0.2", - "jpeg-js": "^0.4.4", - "pngjs": "^6.0.0", - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - }, - "peerDependenciesMeta": { - "@google-cloud/storage": { - "optional": true - }, - "canvas": { - "optional": true - }, - "gl": { - "optional": true - }, - "jpeg-js": { - "optional": true - }, - "pngjs": { - "optional": true - } - } - }, - "node_modules/molstar/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/molstar/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz", - "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==", - "license": "MIT", - "dependencies": { - "array.prototype.reduce": "^1.0.8", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "gopd": "^1.2.0", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" - }, - "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/swagger-ui-dist": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz", - "integrity": "sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg==", - "license": "Apache-2.0", - "dependencies": { - "@scarf/scarf": "=1.4.0" - } - }, - "node_modules/table-layout": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", - "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "wordwrapjs": "^5.1.0" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-json-schema-generator": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-json-schema-generator/-/ts-json-schema-generator-2.5.0.tgz", - "integrity": "sha512-sYY7AInozRbtj9OD3ynJJuMDWZ5lGxzxTevtmH3W9Hnd2J2szBC0HdPqSyuIirXnQ6g8KDJxS/HENoypUwBrlg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15", - "commander": "^14.0.2", - "json5": "^2.2.3", - "normalize-path": "^3.0.0", - "safe-stable-stringify": "^2.5.0", - "tslib": "^2.8.1", - "typescript": "^5.9.3" - }, - "bin": { - "ts-json-schema-generator": "bin/ts-json-schema-generator.js" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/ts-json-schema-generator/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=20" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util.promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.3.tgz", - "integrity": "sha512-GIEaZ6o86fj09Wtf0VfZ5XP7tmd4t3jM5aZCgmBi231D0DB1AEBa3Aa6MP48DMsAIi96WkpWLimIWVwOjbDMOw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "for-each": "^0.3.3", - "get-intrinsic": "^1.2.6", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "object.getownpropertydescriptors": "^2.1.8", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wordwrapjs": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", - "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_examples.parquet b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_examples.parquet index ca2ebe2cb452aa3812e9c6b1faf872f4f8e6dae9..6b69aa32f7746790e5f02c1e6c65c5ada701d3a2 100644 GIT binary patch delta 108610 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 O6~WdiLl79V%>N&HvQg;( delta 105511 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

fM25!!!Iz9N^k)R-V4jc8wzNPcI3e`Uj( zdGFp+KBs=>+f1>J#Z)KT2KggfLnt23C7641{6(=cAJP+=FNvwe+AoT~kiR!xd@tGasrK2_F!7II-mZzU;B~1%Bc&_HXw~o~RsZAEe!M zBJziIB_Nq=C#7wt9df_YFA_N_j~C6|QCwdL7sHz>U3=`K+iJV6EIFrLD8Sq1?vO-Q z&HATr@lmK0pqY2&2_gX68Q~*=bLfHq>1zd zpGXY8lnbP`vt0$zIihxRsT=lWJjDV3n|32zp^B8uBsPs{EY0z~5v_(srkaI<(uAfD z?{GsLr##$G0`=EbCGDk_gE1RWj0=ec0|9^NO z5n3y8ddE;ZD4KFv{j4sF&HMn5#r6>V=Jlv%9QX&DDUvSC#gbQO=nZwAsmXes9GT_Q z^xStpI%5=_@-ifpc!?p{XK!e7^5X%&hNoep>iFN3{L&~q^*xQIN661FO$Qq<=(#cG z3S@lB8?$u~&i7Oy>*&r`F$+qSlaTE;^$S&&Sk|P+s!rZo9Olm@;+m5*hQ9YNR7ceZ z{Ie?WONmogkf4W~iz3tw<#g|QJyia(h&$R1mO&D&aO&bjcn-y)q}w;MhmT`SU2dd=vp^pdhrcOq4wXWh zIWHZgs*$(Gw9hO?l2*q(^N)X2YGt$1tLh%1-_&!2Be~^q-ci3}8Y((x^+#qHCS#xo zM-4igw920|?T~~9d#S(t`4HQa+@N}F-K=Xl3a09I3LZ-X={9g-4lp3BGzus5&(@#tX$%tWeANfr z@TKaeThJVv<_-@O7B5yyEl;lszu370RL4o6q5K|FQn!1tVj@1aCqosTTWAm`^JREL zJrKnHES#U_(Eg+!ZFO(4X)T;xDvIt(Bj1Ng8q`YN9axNkgzSQZ`a#+af8JOITA7p55YXN)TF-5@?1p z0B3EuD=tRrFKE+<3vm?+(%%v*dCf$DF8WKOencZL9^$WUAFGyu>NF2OOJq^WH!E7q zOK)=->0~KMa$D((kYVe4+i(J7?Jm{BsTArdcyN?-l%LkYT4sS$HU3&?An(XrYD%Dk zuENz?)%GfzF#4!hX0k804`Fr9m4P+~@{;XrPX3IllAo%H4DHQFF@fyr6jp?Hp%niu zus#uc_?FJk(%vVaDj3d&JZTGQK|<~rUJ~xFrQjth{io>Qby{qK!+b?@@dT=Aey{_5 z7aV*iD592wfS#TDEVD7~GWS(gdjh}l7|Lr#tFL*RJDNstL*J0tgioVsC2VR@dNb63 z2Lftp1U!>txDB3hnX^NL_YMyN>7U2fIBN;T}=j76N zl8QJZXs={aygp4ED4Mg```kn%V!tlNW%wN$NImFV918_AqeMPZW9bXANxz{p-O7AD z=#8>j-7{awWXfr2>Klmw-83?;Ms-wi{k?P@W3{hatc-haDud>BB3_}1?~;#RM|m^e z>m&8BPgO)~PQ?3YYYNa2zU+;`9(*mJH%`q(h<2kad6ds4p_$ML;J#@qn(%2j#Rlbs zdk2;4$vg>KnTuZKK=-W0inZ+9ltjmPxJ{xvbSgZ|)S<@wk?bA2#ihA^pu1NZ!vsAZ zR?Vg4lm}TXw>ivXRRhVig0^C5U;)<^*tmzkQ3oY7h@$c8ke;aX#O+Fu#mPG`!2U_` z7{YD!6BQISP;X1y;5`#VCE}(aNW-K(A|T$ecBDUtg)690jPtJ%0jD47xj7|pcLwj% z54`@$Ph-t3K|S%hU#jssP#p{nBxfelDY|O1W0#j9DqK!Y^QJ=v`{W&mS<5-8h_9k! z#&C7H7V8G2SxT?)5{&hZdai_pW9gLMjLB5ol*2~(MiE6m%0logp_8ZN4Ht*vrI_VA z9n_|~~69}FxNT8+~ zJohyWR*!iBilt6B&#{G1W~~vOERmP2bHT(&8ZXdZAcWC@`W(wCJUTQ}SN0)y`YpbW zA{fmLy~dQu1*K?agL}Dx_{RI_MOC;(_~Y3uJ_-WzFliuz=%b+gkjoof8<*~nJ23>Wasl*b=@ z8?E_**rtJIoBAVM0L9XC$hOC7sY_&b1pS>0l)wjrv*PFlUFCGA3H}lGh~9uVQBqz@ zcpfdMnDBIpC|4|Y3O=@nambzv&7_L7*{oGns8o7_V7#XwqB76iO^aIM7WAbJ%O??&ZZs!(gAlNO8{;C3hK(}P&YpKiu?yAI+armUvs$}J})p!B@ zjq2u+dd^p$fp{|SbG}3&pXXCmV zYAe$We%;N~#-0@01MxMRJYn0B=)X;7rO-mS^fwhB-7dYVT`u-d^CrF}5bPEDn1ArU zh+~2q>8QY)DAtjAvg)uQHqdoxwp-FFI(7KH%HA^C%O7LC4XUs_##YooEC1&*%N&DF zz8E=wwI6?Y6LmQJ2{-Wdb0k`<5no)+@5RYp{1zYgHl<&~XeaExZjYAc19HB0g}V*u^D(<5qbg>kIUEW+mn16*$RH&F3<3 zbu3yhqbm3%E=u=`i@5txnG!Lc(|Dtt{&tm=us_;cDrfsOTHBG_Ll!(<_AQN}a*{Jw zcq3fg4sNxQyZeg9!q36{YNPs3OlLDSmJ0C`I|*3}u+MOmZBKVOEh25eIOp96H0SRH zFi*52&`DQ8e(dM&ScI;spZ-GN_E89D4}L&*vxXnj8d2E0p*D5{#@Y|;DS@U}LyaIr zTX;x5G>Z2pl#kT|-9EEqSokh_rgjVG51rE4dJx7Og_;j z@KXx$P%aJ`xaB2E+diBs^`6^kL5^&db<=HKT*)YhU${2U;`T`A;`44kwEe*#xbB~%Q>=3eKZM#vJt4ap-Bo)9#bAZm#U`)aa;qbG&ZDKI(+x8d z69)R|GxN55^%m03Id2jFg+%=kx61rYeS$`&JiTGQQ|0LstYzYcy1AIt{q)%E#tZI4 zzsS+uPRoH8bdN947;4G&(Z=|Ata)OthozIv90>A3G@-$|Q|f1CkL*<|V$!&@PQW4Y zF+HKEG?z9-=_gE9YmlbelHyeTFMmyIvUQksf}SG4b<7HHs=$-h_*(bm-4agjupgPC zwn=!>tjcsqBAv7HV9V%O+zA>Ot|tl8TwF3TN2ae!nk$hYL7MR+iTW#F_FTTVgxNat zA?M+g#Dr+vk-RH93I_aF!k!>^bavrCKCD|yGo6f+N?BySs3QOBh3!lQK{M|&%q8=1NCs+%VnmDlorQq-|$>%y#)FGEmm|nenLD= zqEqPPeTY-^9`(}Spm~N55VN@+hjk{!h;&`2nWA5@{DwG|66O`{Uqc0Y*`@JEu@JBGaVjb4S0{Co1(vH){DIkVuN;-d zGCJZLQbQLV#%Su1D`yAy3#V8KajMR{)>RrekS-bIX%kK=6&!(Bnm2p)tM zhjiaevU{jp+y&%Ic;-V%QRD7nZK6$tC;0w}p}gp9IvT$!YWpH!^6+7dpiJ{2zLf8= z2i1DrQ2xa%dK8)>Hynq)bd-Mx_va;?-#EUT4z2{gK}vWi{OOg&Nxm?5O(&%2zTS?Y z`zAM{6_G@&5I6pvRk&=l9f;}D8TP~`Q$77yMiNXp+M|n`;^rIM$Bdxb{tb8-?u$}p z1pjE4NHBQNWXsBoU>wz<4@^;N=o&ubac%_5&@)h!+KBYrfpkYIyoMT-Vyg>S+Nfj;6jDGu zK^H=8-@WMYL`+8qT(r+sHT^nDyVCwCM|=}CRJqKhwr}y~#l4Tr5pOg9jh+6mTtWf$ zmpzg6E)Nb8!K9^&y}!)c@mw!s*&gR@cGlAS<^mqdezX>x6Xi4RdwKa7Y6a@K7kCg1 zjWU1Yp18awC>Tg4;;a;BXHm!`2}u|ECt;a67A^@6&CfVss$h+-!!LZrVptL=b{E~& z192@d+jI#9gsfLDI+&UgcNyLJp>2##c#GSKiQ3{NO09@4MgCQZlnq~s(zK>e=$LqdZnC-VO!z71 zLNvEi(a1py{M7}jzC(#BsE*NpLCULY@-yyhs;I%3fYEWs%ndFt_N0~GM&)o&;(}Nn z?6uI>k%S)30(CI$UGlqcc=eU63F1$YKu_tF`I73X<>4)=uxc&N$Z@sd*0FRF3!b|5YPvu%BfVJu} zCGiun-8tpwH_Ss6h&dAyi0PshL>Z2B?hqwsR?hcy-U|f-JhiH207mL#@%zz2lC@ z8Ehnn-?7up4|s!zQE~c*YH=$*&mH2=n?HH9V2Yv%!N<|~Dyd!Nv)Ry;lED#S$)WyA z#&Xdeb?y5;ClB7HM`2<6wW;d9h{s6%LdfiQsWY6{Ea4__d3#l+C>%)7ZbQy4>L5SA zvQ@m!qJbHxVouW)cLZ8tH&^EW&Dw>5s7<+SZj3PrxbFquQzO+3E$U~-L_YO;x?lPG zo$TNWS4ZFlEao z6m2`ChA0lCKjc5cduAzFsv91JcH#Q86b&f{Hx=sZ)_KL&RF$ey@Ci+&)4a`=H9~$d z>!v98Jgg(b9a7fqtH^ANI^kRQ%zGe&XBb)Xr{v_E2b@B#XZfbU{YR6!`Za0 z6qW)@`?l-hV%*7(P1TGqZ7B@UP&v$ElWvEZKKwZzN*-=b9QnDJDe9)6w~6sh&SkD5 zDYYi|75jfjZ$wx8>%JseEuik|<@{3Tg=7WIQmnxo)yhqA#$Y$J%B^dm+`SJGyhTqr z-YacaiL^$*ZW9M`&`cWKhTo#{m}zdA8R?7gD*j^HI9x|wb#IgOAT+XZnadDl``uyjbMBGjD%luB3FCt4MavY42*&&Z%Y z8XGBJAy0TG3`%;#c%oY{kR46cCHh+RpsBctADwS}CYlmxB1T7wx@&2PnN7>+r23U( z`3hADq5?m|cNpj{@)xGwg*&)1t}O}aF%;!i_nXT1)2HJ`nE*-+C-ZJ-p24ocFiS@wQbclCyr*=R7|Byp+Td@=`IAe&9Fd5+e3RJ=Q>YS4PCJM=9xAY;B`=74hg#k~ulBuok=^6Ew)dl!g<7cM)PZaA zB&{%8&0{`7<<%FFXr67i;vLCAUJz4s46jso&I4t?a+``{iua@!kp|Hz^Ad$|N%(`3 z(N@B*5_sFZW`_qF#?9a8i_3;k~OHNc|ZkC9{hqu0;{B?N@kGQr~bMR&*az(y}OKc;E&84J1jy-MgNNbg54 zJ1ymWraWrV5Dcc#O6E60cU3R0lHS$z+~HDTIiePdq9@xFXzF05axS}x#z#KT<-C6S zXF4LZ#E`fQ>qrS4>C5xlwo?CwPS_-RmwKjOR>7K!pv!$;Rts#3q+l&s?XJ8dG89MY_-tM?lzyRJ+#kj ztBdk={f@iBUpD;@)aHO9vri_&k^^N_MXrgW_7ctVO^ba{0`FlHg3YZI-`rJ#{r-_m zGnbA#5sT+r9!I(zR-e4h3;hXRMZq82AzK=gD2u^s zD~dap?3B=P(;*<;40aHu*oyQUy73lMPwdfpOt6~2pjHAK9O%F-gzt4i3(n=tr_bn3 zY)#l5FUx5bW&D6C{?fK7kHAZMq?1us-BeRxcoLSRR^e=DtQshdPx(D){t=aY!5+Ep z^->kRttiV&&{qV$5^bR2DuO9|Ebxt+o0hswI9ArzoRM6dEQ!@&`rEWI*Eqv1=^v_- zxh{RH9tIkDk3>8gnGu2Jm@e>eysWY-hs}5u*BygRDO&D)^Z^VF4$oBuu?z?KQf4_@S+LqRdsQ7rx?SPEFw?0k zF;cl0?#>Es=V@{kw@@)LDOz>%HH!Ay()GBL_#jeUHO6F`&(b}BPcZ_&(yWA`F?2Tl zxjo?Kkj+NjXp9{cnQGdo!eS77DBznJJL_1u2UkT6Gmb~HKjBUcW?{2b0zc*1{K_t8 zA#Tw{A}?%Pngga8slmc}HQvBMGG0Zs3D2m#dz|vqY@TeM#(fj0&OKF7+V@imZz!*7 zqm4;K6||wIJVCm`>R?g0FdooX`W@5REz{%W_aA(9G=vKZk{Y{jqr>00a|6HArz{l9ydza274zWt7di%UVuYh3L7PrheEw*E);Qje z<`LGrOUytDM9yc`)whME;4d|uE@CupMVfK&s_E)>y>}y2kGFY?QwLK72}$j_NZL<) zoZEuXNBt!LvOwS;Ux64T(>VdZ3&>N;{e|u8dJwG<#>l4bRr5DOIK=JD4(BeN(@y+p zy$DybSnZPWr%vJakj%5BQNO@HdK-N1UwD^xsiWcSvMg5Z|9@1=O>{nAO()Pl`t zDO&xiWf+7yr*#aCF;}zDl6d1w;aG174pUfs@Vnu>wkutrqNavBo@E89n5{v9g>;)n z+9MJ^Mfu9ah^f9|yPG*_Iiy$NLx(r`n#QPVyp>;ygK3F<5VE2|c;z|RDK=Gch-9`+ zZ0li^wUr_XG*;}`rbuZqmECniJA@}9nlB5zCI+MzmA-@b_yKJ*-O)R;pJHY;#87PF zKH;>afR4uvN#8Xy%ly|w!cM9O+>DBesP|S^d>vw>@>dr^>r1PH>a@NrJ#VeigihEm zQQ!NU0;q$6^e58IE^`}I!vU00O7L-aObbU9u3tfCaXN4C4EqN!#YqX3|D$XwGjW}R zX1GS@>~+c`SC);NW4>8L!Y3m1ZolY;3Gt5n_CdCycweA_*+Sbmd(bQnmyrhCs>mO1 zir0yGQQVox_Rmf`52-p5{CT~`zL0~wfqQ~(=J6IfhNIM;Zv+;Y&4_pkGh`ReI{P__cR^3kMVeOBtJG$CACi;tWeMn7xYpp zJVpO)R)?G5EeSA&qAZ2N)li*g;s9Uc0crA9ZmQbP_0{I|L$nz!$rsAn>VH8#x-Lk1 z?Z#4+*wy-hKxxL!(qoJg%UOx$p<$K;7 z95umHB8Yd*m*xmP6n88=aZU6NuOrn)G1JJ-HG8}*+(z>Ak0=y+#0|M3TAKd)EDDFV zBZ-fzl}W3mS?O-*rJ8Ryi@PkY3)pDx%d5gUy;5DQ}{WDA82&QfL`wVgxl{ zjcN2HdU!z!=XML?x>pdwYO2h_bgUdz*Jk-7Uq!G zmF6q0`kR?l*>o^Lb4@69R_iakOqx-6SwAX+JYvg_sb^GFdA1-1Vh?STz$t~wp-pN5 zk=OiG3f1r;^R1xxq51w*RNh>K%cs*rbd-wfZ|Ory@uC7vY*Cu-)(Wq2!P`|~jHX7? z_O&6hV{)J^sQr9!^1f#7)4uaBX`; zFVsJ)@n)2-f3({IKJPl0w2$Jy6^GlDPh&QHZt|Iqn1(Zvytti^D@H-g$5=A}hXXYw zV>5y0=<(9kXJx-VO42~_bSH2oC^E5D4Ru@Cv+5UW!uv3Yo(6neRLsLTT#T1NX*%OB z#b^4X2dhjwxmTY&RY8uU4ykSBQ}ddK?qtu2f~-A6^eBIrPcaaK3R zU|l0H#mX{nX@?UrU*=mFt+x9&svocs<5NrMWxUY52a`A~I>8?;5%oa6Ove2Q?eVzk z$GR8gv<*}`?VtfjHqrKdyTccsTNUFur)+%kx2^n;N>9NORtPg3N71iCj8$~z$= zeNL-mR5Az9DO8GQQ(M$^V{8t!hOQ^xj7Ay<%n8%d`-1-D9#jjiuY$wd^fI&FU)3aq z?$a--ok~Yv@y6TS3@;XELRH*|UQ6})Gj5{J(H=_kE>UoYq~SWI%kp#+Kr6|bZWi&| zix2ccIA&G=;#`~X$0*M&y!>*=Yb#-^d53af484Xwq=#VuJ>c=S7fv8gxI?RABFN30 zBKD*}u)(SK)O7Dss3uzQuapaA+?sYFj)qcwi=$IdP$_#*Y~64f7SazX;S6;L%eK*zJk$(he|oco+cCTlU1&6QbR)bQ3G}xY3g->)O}&r8 zcp2y^xm&K1*dYNj?c=+f3sK>H7%p3YR=M|d39-OiWKyV)`3Z@U;gM?keY#59DL4Xg zs#c&oTGI%3z`bL(l)0lH&_voJZv79Nmaz-XxDF4a{c~efTlzFxii8>a-PsAvb7N-e znLzT~*TeH^E*9uR7%E~ApvwBRYJlHTkE5B5r*(Rwl7+RX$2CZs7F<@9vmSX~DY{Rm z18;|do;`~4PIU!dtH1fP68xqihgG4lpG)GgSdsro@}ar@9&eHC}<1?`j1 zD{n932Obs7$fFi=2fi43OM1zsMJM!%<-fxlbZ_d4NAwwjoV5?5kd%0O&>~zzv&83F zWK?An9>&_={dKnaCEH#Tr|f4^YZ>926Q}O*9y~BtkV}kI?no{^X5SL~e+jSL1a{5D zSr5!w8*h7tfAn?9tt#5!Pi}vttG8wEGDYJ-WSW4mN%&TL`X+UZ_M{4*l?mepLg8Ne zEm=08WR6+wac9s)wcPxnCSY#T+JwH2)YME9AZyT8;ECGa=e&`_iw}2&KdIR9CLSikfp7x%px4F?zGrGX5a+J8$C| z7|Krt&K9=`aCj0O(G5ALEg=qVGo|uH%8!I#ps)Wt7m+aGntOo?Vk{6yMy9)odhu_O z-f=C^g`cYfzG2ak2~>uj**sz>Zn3s$_`^VbMz!;wRnt(^ypJd^3Z(>le5BTSzdG~C zM<38s0Sd>wdO{I+88yvcyt=q-c&rwZd?4lJyqSI>3$<^EL)}3RJ>je}#$~in4{4AY zu8O<2(_g5!{rQj+!gh|Waw83>9^LoHW+o^3tYgl3hx`wuBT{Yq7o*q}aCKij6%hE1 znL>l{zS&II3E~9CMgHVpGvjg7_QZRXNd4_)`c)k40CWvfpRn*Bx^uWich1;N;mq7=RkBf;mU-dVZxVZ|| zi&UA`Si1sa{Br`&1sPF9}G(ao8naTj%N>5t4)qEZ6!%3xaBJO`HTs8(V`F;upm#8BjQx`yp{M%7 zH&He((LMQ?MU>6_Pof6NKT=an)h%g|fY{3Bxmt^EI*W9uJ*q_7hz_Jkr_D;;-xnQ? zAH!0_kt9~?8tNdap6*U3oC{o{?gIH9nfKIL%vJxX9JU^HlKw`2w9Q5`|6B}HsgIoD zPSXZ!(InK^*-RU;S`z&Z@1RdmDLs>_>l*xo=c?jX9IrHmkWdSH7t+roxBCk^`d&z_ z+HS%B@G-XXXH;J{AiSqmU})Tz;XZgj{0MC#gQ)?&fIp$=79! z=Cf$D3epliE3k?FmTV?FSczAnumYGPqXTzjibr5%xn$G&Ot@CflW=FC30|+Uy;mbnFs05sR~{8 z@6eZYS2{rLxS{kQ2Agn{f19Z#O+VXs2;~U{;>Ms-=*!S{jMwkmSbRw>@jjlIOgUAT zJKH19CQQdH-tNxkYElmQ2?=QJw|FWU*MVI20t`t)sTGro6S zubQu4E|Vs=w2PvRY&^5K#Sk{fWV!gZ7-#3%@6Z8j@BkU=Grp5Ki6>!(ilPFNgiefA z;}hn@nK$(Z_wvdomo$65Su}%#KbpSu6rO5syO=)uYyBaB`*s>uiYfTg8N^Mfy)DgY zp$e43h3tP)3VYXl!DEq6%|TDm`bM^)D9>2^gy7Z`?=stWrU2!Z?>rGWOMU$-RaP_K z&wNJ}FwyQylQn+#iM?gIsXtLee?-AwXkXwtj`=n_zBAFt!1?s0rZsn=RTSpEw3i?A z0N;f;{!rBog`B?FmA**oP4*QxQXfc(wU2G1{K9BY4!JfMF_wldfjq5i&72}0B*UBQW^qVdALfgsx9 zINih|mK}mzkQ#-5=AKDQ!t3sJQ1t_jnAqxiK%|*Ypnnk;NaptFV%G&~`PxSZ1^3v^ z*k{k88egMFc733-Ih~YEWUH%cjlXCq|5tMrR_dI14|gfbUkO>eB}Z^g^_zH!9PVYB z6xqa=BzbxacQA;Ksxzv9+96+9i^gDE+kRjg7#fTB%s#wt4%z6`u9#1mfd+a}p_7~# zR7X*qdb_nx`niDUeRQ~WK%+4i=W>DjT+X-9;peHtA-q>HrfI7_;d*8uip0NZ7Gp@p z6n_zW+q~z!?hP<|`4Xfp7YVAL+0E^1E<~M#mN6zBPZ<6Z2+GBH9HR~d!Zb3nh`OrL zqG5wGZwCXwZJa}U?t}U6-wAO(s=;qc!f-elmRSigCD2k;Go?_6#!{!u{4)AsWfq#X zM3GsMU`5=uj(UY0dJu-`_qZOqyO*dCHIX~XrT^k{h)MOM&4U-}E4+nKzOA`ak7k^- zl@eA;Cpm%{XirT8O#`lKqlN^!OITejt!`ivzM{X>9J&{-PdQPa*Wx9Q_VUtv+go*_ zq5+p%@)P};Y40^sg8~h4gO>3+?rN5j1cPcz<~lo2jAAB@N0fdn#;}`CL=*D>^Jst> zix22eJ=-};BirT+stw*4>Z_KCQ(Q^w1bvP&TQM)t2BWZttLprwD}B!`aK^q&za7ek z@i?dNyGI4yt^$jV7$T2(lpq;E;qS87^-WiHMmom;D--ozbvzGTRBcXPqMY6s^h6o# z$2hJX_lZ7&WvaH%jR|5eUBVf-pS#le$esw*5KB;nT+_1fux{eO z!;#_MKi>A#yCk88mo?_w-#tq~C$h&)4)mfYs-)M->@&lBh%0o;e6N%`Pp>&ooWtnv z)ea<@i71G}0)F!&jwf(6_KRIDpV1+4QZdYShKHw{md<(Pp!GV02k{M@3*pYDy$E(+ zdIzs?ftbst9!S!nBQk62Hlzd|q!ZIW4|@M|5}n@!n(o6hF@0rm*`%U@ZI)Ohn){fK zedBVun{}Eg4Q2P~cWJqI8LqB^;Q&7NrRTDveXAU|QDCdTc>FP6W-Pwvd-Nre#d|e& z+eda%J<6T1&!J=KapHdO`L;Udfs_xn%Ex@>Z7%*u{Qnx`cZ%X`#E8i5=at+>&vy#z z=BZa@z0qS+0FSWC9HI$X4GIZ#3d=b=s`Jk}mUGY`$46hPacM8a1}^myB>!2#Mo1{V zksRqpJ^?!JL6qbrs2duL$9SD~1de+)E~IZF4yV2CLRM<;(PucTmf{$v1Zu^d7R~Aw zN;1bpzNQI|t)=scQr8#-Hb?vorNlo`;dNmI_HE=h81+7=6`oE*j3^#^@as$EzaWP(|}k&@F>r>iuwS zEVaL+&hfvG)#{#pNd;+zXy8~0Qchrmsv!T@T&{OcQQU0===Da0&+7G={^E<6&>ElixgF5OndDZ6X7*S*u3aj!u7M0xKLHi#1 za$i$5|9MmrfH?|PZN*4`v(?${-KBo`F0=%t?NidaXu_{C-c02npI$4W)($;S?xTa1 z4tcaQRcXD=C&MD)>9pDT0}*^-Rw13zPzv{yFuM<~Ldz+O?I;CZO&N;TS!my(pMqvL z8kkar=R2ySxV=ohA@0Y>{lZfVp%I=Y7K}-}79$VWQ*Pbyq_xYIrLk_BT43|tn@C&D zO#a&*3DkE>r&mW``T{LoKMixf=1g}H*3HTd3AX%|IXflmw(2zbO{So+l7;u@!EY=G z&&;rY1Z{nrwre#T=Jf0Rhy(d;zQ5t zZOE6t3(CwBFW$@<&Z+(ZHqJZl2vDW36Q0J}FHn&3;(dM+*4`j3Tgb7%4A84-Qff=* zI*(D`3Z=Bz+u+yXPJZGNIPI>Zy>1nHpMg$pAe_aawSpQpudw&svY4W2)^yx6CIAHW+==fB_!(-=q+<-|EVgNBETWHPR@TC8h=UH z-U>@>N18*6%z(%_4CVJ}ukc%(7TZvY6VzNg+?2tPR`njdppNF9!TUlX)H1(5i1MXI zYf^o}hfq}z$Tt4S>Eia6CWUFpW6on+kai+U1$>FQOzA*2uc9f%3vfstB%f$*J?et< z2+75Fx6)b5O1ftva`?FEOqTPj$HhE_INKE^Oe6K2TH_iQm0pC`%?y#&osn;J55Xgn z05OSz0tR}rF~j|nUl|{UA|-tZ)|<5m_VyNYA!c6FDX= zKSm(Rsblup%7Jk>Y0gnG@dlN`O}Uo@7Fpa!OC>ke4sX*CeVWUnG+lN32(axFx<)5? zrTvdiil^&9KcIS`2zJB`3{?wjK5Qq-8$E~|hvXN6Xm5WJd;SbWpQDoM=zAvypXgM3 z9`S*kf{lVaRD9e$N4kZg)Cq57;r>Y3U?-P!qMS6{IljE-AJTekx`uV#Xk~=+)!D=38G1qP9Fhl&I!YOynkB zIAMZ=!91CI(HcAr=S&@m8cuiK?Pe$8@TD*5I;Te}NE5=Ftng?F4>Y zrY#6NXPghyZ`q%Cy)9xdkdI#DUeeOsPAovw@QabYIL}AjwSlg2=V&E$)7A@1TlB+8en28*2SxK|J!bP`adUndL*YkGs9(GY1?jU~eMcR5VH5?3| z3%Nlr2Zg;#-pA$-(a6za^**N^n2ghymwDWG-I35vLVq>f`&gWJr2#B$SCPAZjP)SYIFIv>PhENR$yCUeBE(?K;(0QnF;e9SGYptyFV74ZK0x3 z$^3zVSb*z6d}F`G0Nx(?4zCv%Zjc1#NG=b!AexPvNq0b9{qV62sLUOYa<|B-Ypa7~r(|2g_h&jB{Z?J!>OumcP> zWI9B2UW#*6bW6#3$tIX?844vfyJEMo5`&Cfrb&0GEcg|LcB3*Ir3EFn(iBSzD-$Ye zl_qAF|Fiyll*@K@&U<+--{<>0@B6Ox4r`8S?jt{(&aH3VTDetc<2h&Ji{1IOf#v`RiS%_NW`>9f5mjt=Zq2kT+jFUVjs(aF@v^ zy>ALnaxYh}xQlyFo+V!Vbb?v)>uKT;j?N&!#(tv=wL&mH3Q@+QqQa)0Xyl3Oje zHu1d}Zn^hY%~je(YNKwc;EkSCr)4?u-iOqYDnIW1Qoe)RU|MH7t5!xgVEjg{3>=h?aRQ;7 z0eP9~^lN(M=pz67Ra^J}yo)tHbs~AvI-2t7UfPp5zz971gg6r1Xl?VQr`{IbD)+Ny zo7|)plHE8jZ`a%+3*2V8fcxgaD&d#210O0N9{-2(#Uv$};9y2oSX zpDbT-PX+ds9_Ci7OK5=yp`>rTFH&m{aJO;c(pZ^GtV{FOw+`us1g_P43(4=1zzOeK zbxwdz1`(EMp7kD*j}RRAimMjx)=iD$W>J-Ww$AdDJdvXV0o6m?3ly$Cr1`UZ7fs7X z@61+*CUR=AN*mgdYi#DucMoyzCep4g2e>Q}pHqIaWAo)Pfkmy~Xr{-Rcmxmb)?# z*WFV3iHS~1rYzCA(su$+aj6`gEHC$L@E;hZ8Karag-xsELGNMj6RjroDo!Dk7?`a7 zY1yH6YF0bV>YMT{l`pscE4#=>PWA59RB@HEo$M@~Un_r1?A3jiMZ0d$5rV!qu$+5H zeuVJpOz*wwBAMr|BK@5u|LDEGV~!~-?AUd!>5BU8+&Vh`)J_Efh66*V4(Vpca7C8S zTJNiLaZRn;$*%kRz29g;^3A3_noRE>a=xjQE2oE@;d)i73MN(St$e8ajOp^y6Po?< zZR&(mySds*cj>agt(@Q;D~~NruRP;c$(968@&75bLC#4mZarmjGU0*Aj*6kcTk>X zqH-%82;4Q^b()3hd`*iWc(=)acuVB#xK!E0rKwlYs+DzwGoB&y&XrU9a&^80dHShQ z-p>ed2Q>3lgE~t`We%SU|EN338Q;~qp3~6gsB5`SW=zsFQz;Z}TBNzEb)Wi_2~CRv zeuBx{ElY&!xqd>_2kuaJs24R~sGobUo4lgNtY)iAHM6)rA|T4Sr@SHVqQ#%b zJ*{rk?&m&f-A3cr$!eDp70{y5$RDb&o>IN#O@9Y&kpDTgMsp805;!k+n?l@Td9wVi zhN+uN=c`X^?%=AqhbRe`$Z@p$)fegqfs=tQc^CC-u}qsUc(-~V;Qr-)RU0*5af~(G z+Ipb6oJ$Fe*8L_B@9ZztWyW!D%Ma^bis|-qBeWdN$hU+q=s?W7vlxOO$ zjgbwOp4K-5|04tafcy=2f%`=MH&D(Mc_(t)Di=yOZ6RXk$y2`&+%u?qWm*PYx-syV z{AM7DgrcshRtM$xOvkLjz;m3QGs*i)D@3bs`UW*t9pG;9K0);=zxcg3 zkdfOeCp8@w|X@G%1hNE)k_>~hWfw2vl_EEq#pJrayHWj z`36oWFVWZu`7Ww|T&IcQF0|&5hr7rnl>V%V$mOPGff&x`ROQEoMXKP9mzm^P#2ru6 z@)SpXq|zQnHtzQN_qdsK{$d?>MWx1cJ-5Y@FYCG8UJG$;t+K_rhI`0*pDq|<+EQv( zYvtLTsQK0VD_2*)UXxDj3{~B61Az?g>tWUObhoE*SNHXSP2A>yhcMo8ZyVW-@3|+* z*c!aqx;4D%IW?KI^nPw_;C9m*?nA$NA2A9i0!QW3CcXElW(HR*Kj~e^-Qd0Tbceb? zo>~7nnYu%2uDV+tM{88?p$ZmLzxuDRMNQG|h?Pf5uccLV4+`=ud8lSaX^i(VLizV_ zO`4PH9CbS#r1nAg{U%KyRW0YpcyXH6D`|y5K4mh8xtmJQtCRhN)E|&F+=TAOR0B7G zPQKgZF#TMaAzOOse9F>H??yG2qnb+1H2F1^PCstVRbN+qvMel@UzZnHgWgNH)2Dvr zlI5qVW=QakCwp-vXIEDT_H#42etDE>JNLWhh~!{V zsp?XlU(mSavGPIhN$wB%4f$Q~RP{|d2Uxva-pfs-7T+a*RochxsDDlylejUC)2dGH zuF_)la&MlxoZA!FO0r7(|K)PLI*W5#_IA%B1CQJ_CW*^TSjutTF@z9Ea~|++wv@NV zt0~@o?l(F*XeM`iSU8OaI0ySTGq|Di4@_k zr=tXdflayxVz@JMZ`nl>ml@o0Q-1x;@=@A40zX{7X;(kIAf z9`Mf9beKNk_EgSO%hcOj&uQLOE%gU9SBNusc?oxxvv4)tmvf(ZkH|YT*K&`QPFD|k z*La_%#@oG1bc&RN3ZOt-eol;wCa}uDWzhRZ>!+m+f#z_*-#Z|B@x9k))d;3~K;8heB+ZzchxxavkV z&zsb`o15W%iAqn>N;h%4)yLYCxixaPr9?A_j?nm?!q({lt^9)b=GMEsaolpwz^#;N z)o$XiFb%qZ4 zad|cOh1bzN$@BsN-g*tv!F1otx0+nsJMt^7_a2B6UaLx{aJ284JYHR2e|g{!m5!ZJ zOS?JUvoV?z(ek$YTK5JRb0DG_wiI&DdGF_VueWki`*!s) zvTBFDo4AVZ9qKQE8!RSr5|!LOIaAhg%g9!(>b@ZF_v&SeK)8h(v*t7I2zLizs$6w> zYh`Pqch{~ub*HMFx<~a}0-tN1);t;DRRRIzu%^}@W47wn1bK2`UiT}S9tyH!AaX zV%coXqw)#aDh~%9?RJ{%@+MiL0eaZXW7nLikUV zz9H{Z@07>vnoya+jUk>aN!4;5irKdIt|RGej;=10uT~!-N@O+n%&uO|7pGjBL#6*( z748ahg(>npZ-QUdiJZ+%X!k)JbN^qx_#X??-;Ernl{upu!0a$tw|u=f_tW!y_zRlXR=rE%XXceZ{d z`?-z-%PPMVzSdYPf0GYz$@SCaQf{B-6K>tECA)6%&LUgrrfNPlB)565=w8oV$Bhs^ zJ1EvAQ55sK>NvewEpwKdo~iV&)_fZHpXM{wq$X=#ZmsqnmsusR9xmKUQQ<4{TLDFb z!g#U(=c%Ywr-o4jMxuxW|BQGJ}Vke8XmZIczhJUVdB`)&7l?lTJ=Hyrrbw2$PA zjx#mU&dxMx-DK16_8Pc@yEbrHtwGH}nNBJ6mdYQPJoUc>c8~{2;!2%IxPo1+WQkvP z&fsRq$Zb_=MKIS$9_QWeh$%($7;&bL$!7>Be9xuHDVpdR479-sxdQ)J+=5dfc^!9< zqg_2IH~y`2BDbQuu<{A-!`wTjaomN(PouktOdUgD_oiuzcd@!keYErqZagQF0&sG#x=rKo>f~EYvGS*6ChG*w zdvoB3@PeE;dEPvgPX3`2f@ahCKuc2~B@&zRXKX=Ar;wsg8Iv+5V+xpiI6BXVPW6eN z^D~bw{O?SmrO{)5=$N1A%YOPpjh+=m@6*9Q^XP7>IxqUtY&t`TP8y;=qZiMP{uaFv zJuiAjQ1oWe`_PsDeVVRR>D(cDG5U72W%T!d|Nm=d^ls66&{fn3dJMfvUrSX#eWPEa zkB?qLAEmdcZT~gr|DQ#_(`&O;Lk}1IO!SG-rbfS_t)RD~U7@@GcXm;<;nV@TYH9TU z|KEywPoJZk|JOqLE&4>dYUxsXJ~b)Y2D&SK;J<&=@o3+p-)KnaGt`>sqodD=KJLHn z(*^W9Jt_MC|N9sHNOTONcZ~j{QH(x>-v0k5MjK46pl2r}0Kkam?D;nsa(|6Vs(X!3 zInk(DkP_a^r9dJ;=+QSUW4VGFzq1Obf~6B*A8oPW&auoF53$->=2?js3}QG2YM5&Y z8YO1rK^o@a&$1pEEeyaOso@TYb@t$$iMj|kD$X=kH{er7!3QB0&PVGX zj2{mgu`3onlib;mLXACYXdl3z(yLuKBw5UO%qY}Cg4A|DWLF!&#hPcrM%K0%n|{~! zz=e(;srg#awHt9oh8WSpH>}}q*u`ACVLAgdv`XMFsR5jn=Nv>&o>qZRSgl@aNRaFg zNL4<`upHv7M$k8!@sY&F0sJAE@mff=+91st0zGrwjt^(BmUvc`j_al2K@fU7u~8>> z3HYaB*u~&V5DKeU&m8DxMmK((Tg~HzA6S(Ueq}vo_=D+7{BV)kCIct(di)i&RiG6O z2`DEBEf`E7?;qT!VdWez7{rV;w^Y=`KuUP12d`DzPtyFaj zq?LuGP$i^`!32CZU9`nw){l&z2BVuIl6fiUEMZ7vZEkEy)(*1pjj)P!R>CPMG?DpA zF*~)o4Q^m9^Wi7fbrnv_7VSE?T=Faflcf%OO+pZJu%-=o(Gdd+wS(xNlVE8;K3O#D z_yJK#4Aw&Juo1^(_O{`(#-<*Soi>=qn&-pota&?rnPoBH>5+~$DP#g|V-)YJnv~^u^%MlGa823B|!EX0yU!<|>3utSW#?9&^MKhg7SvmO9{C0}r#VnJ`)kPG?=W zfT{`4sQu>ChMjxKa z79t3yK0OJz$pnZjr#uub1V*e|^ z%FHmT+5s!s;B)w0a@jHv)V2Iu^}CLq!9~;!GMp-P9ILlZt9l?Z1x-^G z#0=HpbBSWJ0IxCI8vHO_tV+grC9x`=42(XOOi5P~zLRa`A;%hqoa!*P|H}r)!&qk( zbW8f{AxZ3y!6H$x!#SqN*plw_8!*?{K7u;Ax(@fsA|C?_q@WEV%ylVUvF`U2_?aSs4BBd~IV7%#!>*2}G-hWT7DjGM#pKn)L`ss|g3vp_El!3a^$K zfll_rzkecQ@Go;Oh0%?AT*lKm^`AN*S+vDrV&;&CpCl_f-9Fy;PF8ym({p-xm?`x? z%o>k1 zS+j_r#W~wx33It|d#czU3&U)%61$CJNQXPK#V!$d=ZNk^7{l!2a8j;zL{jYVC#zco zqucGs>&rl@ZGq(8Fh0X9KFrFnHcPcvFh!3xsk#}bjrf_J!9QY;f=T)&JtUR|rGXSk z6f`7)vc4i_wNjX52c=6ve7IT$IjQbdb>=#*}f@b{LS1SF@^E2(W=-+%wc?gL7gy z2d@F^AdGf4;Fn{?pdK=$o-3Gn5tjrZ_dA#~BGLb-A41&%tMe@shctffc zAdMWrHb!3LXErEEgA*jr<5DnL8^JdXq{=HS`#kU|l?jpiQhZEr#cyLQZc;B&M6!Z0IF6OsAfqfC9XrdX z9&(dm-0>wFoJttSY=S{nYbEv7=aW4eG@wHgYvb_FOx7u|W&>VoWG#C5g4trEfp_6=txu}EN@`mSf@J`{XQ2}0l1Q-) zqQ8r$*=wl8QRy9K5{iB-9%*Wpj52}CE=<&mZE^T)B6Gx1w+CXdj#*r!U-ozy{h&jN zyh`A(a~z67y9=3?KK!Jfxl<%%mE@WNA~OhNv5YX0Rq?ncy~al_tu_gMvkpjI8zI?Z zgm~s}cna4^Y%rchy6~eMZ7rC{#$_?HISN}Q!T>Wk$O<=Tr5*=hherx-X1=@OIo5B5 z3sS_w+~dj6)UG2u0r4bqgS+V?4Mp^%Z~~m~>tyEfFpcS7f$_|<82*%K_k071AlxI> zZfE_o(J!52UGt=t*;0cI5~@4#h15pC#~A_Ao5l_C7-u9vHC5_)o+)`am_@U^B73L` z?rs`E=jh=PDRcvMqy=9}73<>2^fr;sU(H4(kf-Z4zTI#$`3f>80hC=+P7$wmt;3eAO21pP`QuvGX!GTxt z!(_2G4X;lTYvU1rW06EDk}EYo2T@EHJ7gn~4L*f;rIfj(;H{80%#&TOjgy*V3G2Ef z0E-*XYib;Y{ZiF!EEK@GNq(zcs>)`yt8v~1Qkh#>r-JcfO%*fO;_a!!bu{*_Gyq1C zNF4dKBn#l}$@H*f8lbBOnS%seaDh(>-VQOeM3_8mt$>GqWDOLmFvl|T7=zP6Q>I9r zD?l$c$KicR)K}z^DdhORqe1eA%YkQu3DRIJ8K){8j!hFs3^;~q+d2l}oa71+p6W>j zec8zF7HQCqzmA_02fwocJ8%R@wu~WTs*4j9 z13sit#tE#SPNzK|4AB>Q}7ZySteetJ8$-HhY)jS+ZH>d%2hZ3q%AMr?|2w-Xle z6%i<|i^n}i(J>JXGJ{m+$ixr+Wx+YDrvzWtTN?1zMApNz&JEZnG9`_LuZOu(-K}7- z_5c$6i?IelZ)wA!lUk%yv5zvML9@be{QA$h5g&Os@?OQwU>#Yo*X_(!c|fF$Ij| z?g+-jlMvL#LRcDXlp=Q4Q;%;Xuogk0csi{q4E}U2597oEp1Ni9!u_oFGVCx~dGaF^ zuJvR{p$r(yLIT9FIvu3+)vT|sl&x6-)dKh`02>gVqS{GkX_Oj4%`G3`Bg zZ~U+uk~-R8L|mAIqck-5CCOx1XEqJO`yCDVD=mjgfsa_T|ITQXx{)HLhASbFnOES{ zAyzd_vONo2UxXY^o#fs^K)uUAf)V5mO1kdNWaQEzB84e;vK@n3@>4qy9>r9MVuC+#H6O$LDBs^Kn7N+2Er$OAwI8xe@;2!mG|@UgDxI5DPi0FJPMyGR*&Zo@Z>6tV=e zhN{q#Q|-a0O(L285utv5i42jI%0`)JXV8s!fwxmXXel#KP6g zUnk&XS`!O=N~zyp36Sk{SI~2y#1lTozu7kn7}eW?o|m_nO5>9R6$; zg5Y7HkKty?{TyUatPhih_3*Q#U(FP9Jk0k7JjnVlBRT5iG?4SLnL?R z&XmFr!DwqIjH_ALgjVyc&FZqXg4AJ|>ND9yT-y$pJ!hVXPGT<7iVFqMq8(6T|G28a^_nuK{97EQw{& zvW6zC6}6pY)gXh^CXz`!9;{`x26$2GDPx93_;*eg zS`#aCklys@aI}#~->%TStrGWc*uG9Y!}_?ZbOxm_3%k=yktxT!P-I;vyqHCFv;I+Al0)cvdF{G&qkIImIzm4)$dI<(p`r@fWr=Bw00I; zfWPR4Hu8ld4--yM+6agx_P-1dN`~@Znv=6V++psk%hHVBo&af z{r9n~Gl}(U@sO4})Ua7H&LeOYnl0I8L5#MI)gIxm(-S9FB88G5nIbM~qCFW>q8#r_ zTv-rCi!L5UNrSJzSkb7*w*+l4DuM#hz_tEZ%pie_m)Z&dwFVrkBpN=zA+2DC8p&K2 zCAm{*3SFXP%%+Jl^Qcus&t1nnT+Z_bXTZ)KVtjmUvq_$>?Pi=Gj2#VPJnH1@bqSz?XuZou%av`?2AL?1l zI6N35wrF88Gdpm$NYu_v2F44JMiIC>6&fXXA;eSMdPcJ4NrQO=mwoXRnYK7U(_0IH z4W8X*7J7pS6k{C)&m%pMZgIgBDP)0|nl4u7K>rhZk>c%ZDF!W|feMSbPGgOb#x+pe zy9&`7ueCiGfq~%&{K!UPNSJIB=(d!eF7ZJ_!zdOlKr6({R%EhJxBcTmuQSZs=Tiv*ijMpu3kyjIak1T z)}Y5giU@ifEea02<43w}!U!Z$;4TstdD0*Tqg=8hm7YaN?@!jxAhu?}8pd)mju~Vh z6kKT%9Z9%qLaz%A6WK@#kpUi_l&&XA1DLh&3hVL9{7R-I)}0_<-YJvA>bws2GPe$v zN&|)Dj0Odore+KETc1kr66EoGA@$d@o^+g^PV1M5`|dBmCuKs9k41At%bC#vhgf6< z0i4Jo+;fVBQ|S(_0_N7@Qhi4iq!PPykK`OAg0m_c{eKaoPdvP`hTMEZHv<(v`6?q&`HR7gGT(!l4Gs{lKE$Ld^?`<-8T5_ih#jB`5hZllPj!RjcBSj1Y6 zQP;?Ler>W263wHhY>zt*?`6!G4CA!HXw1HVvOJI@^!ss=$r=I^(bHd;#8}GX={@||8U^?7NQPOY7M(hv*kC460D1w!tn)_jPi7%K?6ew*73sMXVkun4 z$as=Ks~C=lPS#wC)f0)1X`g5@U{SJFFY%kDh`{IX!3dpsrZU)RH&I5xUd?0|cX-QjON%hUapf2F%VAiS7O6 zcM4i*{_PZ;HP+&pjP_>yOSX2AloM}hvQpD54ob<@E}#~G2M^~lV>}IXPZ|w!8(~X( zF6-J)<24h1vAejIw0c3A~P{M*)!P&|1f#lvn_R)inriv{SaSl;#JeWjREYS!- z516gN1ce!^h#u|ACzb7qC)UJ9&NX}xBYBNs449qGgaBI>NnJenW0)}ul884LFcbaj z7NX467u17rCRAA+c-q9sW#@@K4CBnivOQ@Q>kJT1=!Bo>@L0S*Ir`^OR<#xElC4g% zCy*-nV1?ARn^ips4@<6oNFCzgnJC)4k=3Q*h_RZOn^9#zSqV3+^;4#VuEc_@Mh{9k zqKg_(Q-$?;)doCf?rUHX6*e%vhZr~4Wl$;^caarfjxEsMSBGQMi2+|NbqqjO2jw3u z{kT8J*#@+?b}<;GP*z_Rye=uzqNX5{79}E{Vk6&01GW1|WqUU9ThEsGMR<^mTUVCk z$Y5bJL5qeRkSjExB|pljRa;p&14w#_Bnr(#Hkk;7Gn467xTe_Y(mzjQQx84Sk=emg2+RUbks_Iqm`6? zK#+n76i+gkh;?~ni?Sw)6pyW9j_H_DEQIj6DPlt!{xnr=*5iO(97)Anr-{w+6t>w_ zc$f7XF^9+rd?t&e_MC~lMl|zOg{jtdBa|~B?7?cE$G3_sZnP9r++IGVn!>TE7VzW8 zQ=@?Q;#6lXg$OO#QfHGCyegV0;_>@b@;r}HRFh9kZV!+5XA{O*k}DYKcE&dB9dBtS z#yB_|E@3@0Ft1Q-OTeRrQ71ZU5_MwjByxaJ_f#Nt#?q{i-7utJAe(Sh*J5U`Au#Xq zS7Uu)qY(}=TM2$qL`)n^wl+g?qX8Eb)6*Z;Tg{S^O`#Q8(K}h_L{!)|qAzdAjBCe> zWJ?IWEXA}5Lw3|o6b*Vn$^LwlZ;z?=P$sy!0mo9%s$)Ihpgmvo#N+2Sp#`6w)M%r` zkIUi5o?^j(qoxiu;P6y>@h;|Cz`tx)M5Tye8Kv>~rXc7nb$D+&3)z`bpc(^n7$MAy*L@N4O%ZIpilEp~&&NG|BlAd`q`9WMgMeK~l;1tm;kRfZfOJo!k z6CvA{tpo-gJnUx?8~z!U_ZLmhFx}C9KVHbM?xeK5F^r89oy2+B+DBj!;}tSz5ht8% za-n#fRb4~b5l=Gl9k?pdLj21z=GlpFGfNOp=8%QEIj=nk3mDWwMIp~dswl(RKL_=N zmM|6-iXh_bU#Lig?6^J;Xrn`%k<>oIzne-7(i&E`iS&UyLWN`_9_b57@l!&fheeK{ zbCRV6pDYp^7`{1KXv6!98;R(iBKirh&R`)I#im_Gd^fFW05WU%j%Iw+B6jMDRu0y~ z^-_ZmCbfs~a1lAi(qg9(ZngH~im8;Z`eACv0Od8^6z?C$wJ9_~4%S&mqHXTOrQ?Mb zxSfOpJ0`U^6VK+MBs&|qlR!Z~jv=O52V& zd-3EH;)ovPc_z-`cP6~_LXAoF9$doXCVRicLL;~9#H2WiqsWL%XOqIfoJ!qQL z5ysOcqN{>(EFjX@)u&s`c&oA6K*{D%KJyvzRSRACeSyVJdOBbr#0N`=GiiGT@0%=` zi41TFSXiv}fX3;=Y2uGx#n{}ZY`gC|)YKwz(?MPXO=B(u|GB>X4F)d&8%>p-blvA=;S&Dy6a)wYhS&YQM z7uG6VUK~xWZYqw#P56z@p2r>kvMv+re1RCxP%61(N{nb(+h+Vex6i=p-ov^A5+*<8 z% zt$;#dgq(ZN3fz?EJx!M0#>WYWK;IPuMJPx8;zJWjiN++YgA(u)#CIIN?q?jCJBXyc^dJr z9J+6_pON%S`9$kN0hy(S36$G0+L(j#p$jm-kTN2L)kXrA`Y%Y!96G803E`w0u63lSDfg@Q%F0y{+%ZT%;OGmGjo=jo;M2*I<^6x=B_4wCH}$-`|XZ4Vplf`_P*iAadHcrv3dqJsO}sN2J=jrIr#_^#iQvaN+WNG8w@M zqB)uJB>FDGz+o+Pv93koGJ9+HN?-DB;`HH zcNOF`)=>po*DY8)zSm4851k9~XPaOoNZ(lwA4da_L009&cZ!7ws#7cmTt9^w&16K3 z2G%(hSBus<=6joTpy4xO7>9g#*Cf%MMi|8}5((zo05CZUIOkntyj`M_ps~?x-fLol9vrSdsoG`wz?s$Qdv zRfLL+_(Dnupe4Pg3NlGfrnA8zf(e~(!y4w-n_+@fOK@N%IS=y!yx!VtBUr86jENW6 zK!#LjBP<-z;bp1OO1-0*Lms-`oj^#LQQ-ExG;)AMov=h?JgJ3N>bwK2WVY7B?CpVBK6nOr%+LVv4SFRe`p_GUu+qHiW(orPir5++UbpMte+t^ z#GrL1LAc79LJ*tIMFZ1OMEftK56@_8+Hca=donL|&0KSN2wWjgC`M&)sO&JAtZN)gA!-I%Lf zqEW#j7z=Kgpgdjr`tN`Hm)aDdBRZ5qWnB3+Grs<%P^fdPn56vI!@wjZ`K5WMZcF~Y zgu8_ok88CNW2*AMUq36mI-IQy=j19kQv2>G$yYREuerjeMEktuV4*@?{c(|@NSR9y zI5IL>(8tvlE2-RZ$1}xB`b26W$COOEq)W>5D_lGuxFSm!m@~(uP>00hmycI|zN4gg z<@5I@Q3~_;kMe=ok8Vr+0}aY zG^4UocIvOoR!-fsAPY6;jU}_CnhPf{76pI zWTo#QeZ@^7iM?#9!abFIXsTUlUN0AdU9iph%dY&@P96UyL7DOO!ls?;MN7k+SJIWU ze;=tG%FR*S(_ZblWnZ4t&Tkp7aBKO!H%$~e@ufni4Yw6h^t7~COT?=%5;xwi6m#8t z)-;8iJNc=%{L_@1X=<1KJWcuSGwu|gFX3Kx4Bvr@&bsG`U-Fnj-=F{B<4mWLGd5dk z`(XamMlN65j8;YS{G2^Dg@mpAn%gHS&ywIA%ch~m$BG3bem2F~hHp<5x^TYTNhKq8 zr;o4FDe~4h=l!XQ=4*T^!{W)2N&b6p+4mHim_tUdI?oy8-^o`>9jKo`Zu%LUvo=Sb zq|lTcI)7sk-D}Ha8l0<&6>lzo;j3axh>xA3ls<(oB?^3SLb~FjVM!cqRBFy#Z2xsz zmJ-#G(kUk8(MRa(c%HIm4L1t%ou0V;1K<1!_1Gjaq++!MKqLtTVpEtaY|^TsQd6*RGf6O=#i zA}zVmMq$c!o8aRQ9xUN1!Q~{3FSVdX#T1HIS*w%dj*P9u++NA(LV%iMu9Gsq+3C_nKMxNBx@LZBYUX`GsZq z6c`DD9sP$BtBtrfjoi=A(I>~4s|U<){af-R&HDVQsBqu&pOwX19Q@cM#bV|~WvQtV zGU>6h;KIMM+iNl1OpQBfA!%D%VDVwHwc4$}+^RIH@;5NX>Y$Q=l1eAYO+*kmNAOz{ zDOEnTeMteq<{zzoqFN_fjCgz^0lT=eF1~e)(yimmzcbbtQC8&CxZ;&Rm(=U=>e1Cc zEQ%8x__*Hcfu!m%juP7)_%7AN;x*~k5R9`#_#vZmAeDbuR@5`e_du5N;rwnd{#zpO zFxtZ7WBO_r&Q59{KniKhxYy9@^W(8`O#nt=5YHH^-TXhYva6ZT&QiE#$*02_<$y78 z8Jd*JaNO5<%C(vR7jI9N<42E@^iWjTP3bsBE~T z^&?DCs=KJhs5x$JhO%szfSF2b9rmr?*O=^1`KAP_I-~&{YKA|i%JQfoz#XwPQpEkHerudc{C+Smg+jZZ+vwZ78Z20V1d$_%dc6JAQ1nVEQBcM9fI$FRpR_v%KPWI zHzAvf-oDCFszXFR+c6>462gW|x(%1rR0p~3A-v9Psl`e8)gF9de6^lGP@tF$c$1Y( z+sjsxb?NgG^#L5dqc4nGtL~A+a9KntA%p?)_j928Bc=O{01WldRURT^Et5UD~ zkdLeXz2vf88)?o$I1vRKu1KNwerTxi5XLv)<8pf!KAh8Jpd#Q9kET58M;^_?p;11hVU(i}ioG7}Gm;G{%^{m|K3D68Jc|c!G`Bb4vu38} zcYA=R7p6)z=4dHO3~n@$4au|A`jJ_xgSaW5v}IaBO=nzzvbal^77PD$7${Qj5~wcA z91G*h^k5{IRTYc3=U6DfHVt{O2`JQGk2O4KwLVC&3}7lFzi}#qrmi-#(Tqpr#yaAt z2q#nSJ&rHBSdvI3DoeON8)!&aHzzrJCgaPDu=Yl&y$xlV0BTlyKNM`}r&Np?mz!&R zIcDWQ*P3ZjXbIltVLs)bcXkf!=4Ot1|MfSdJ=_hO{h{&f^IUuhBz0M2uF)SVd%EoF zZPo;5>%(ou*FISO)wUz9YlY;N| zDc2@Ak1zf@>x)p?Z(}EiR;tSq*DOrA87}5OvN$sP?%7X1Sld>YLS>AC~u>+r=&dUe~D7j~_Bt^CEK|Et{GR^B-8N!k85wmGg& zoLm0LVljsxaN@rEBHl6G3EeBtTF&wv#dD98|NH*pS@xgOUO(DVe_ea-n-9NKf7NjL z-iIp=Uw5JWU9s~V{dni$iubP@F7My*(hj<$>u5*ib;D_!-e3HizvM{yYV0W8de-vO zfdsGK9Md@J>7a&^o!S`j`J^dSt-WB5_JO32N5tZ}otl;tw)d9BO^{){5=7Z4~?o((~gDcbHx=EAAdah_OPwuP*rQii>W*A zNqF$Oto&SfPuHTGb|m8d%#Z=ck4_)hvVYR#&99%nd0oYcqYr)Rui04fHI>t?Z>;!M zeDjL+k5rslwqpbRI4!y&6eE+sZYlGUo{Pg!8IUBR;;o*VFo67acZ|zuLGk4{Vw_aPn zyJGn0%x~9sPx)opB}wUD9x3`oT=(tzzM^6A?bp_~SFHSe&Gz-J75b%ZJ3m!MrTSBT z(Dj>i2jfuD>mIr!Qt_$n+Wn)hI(*MS)lE`l*r@lyyCpLZ`WVnRs4B$ z-+}ATRs3`G-P82rucP~RU4OdbqxgL{Uw^zpxA>h>`oM3?_G+%bS$g1ud&0#BMm@9n z(}AfgXdjrTb-H*hm#E4UW>1N@gJ=@IP4e5@vL=^(Q&wBHzgrh<{n)+hS76^G}3qaJR{3XJ}C$+jSV^3jBC zGYdvPr%uwXG-|nBzrqsTeh-@Y#CNFBM)yudWMQ4pv|`oKms@<+75~inTkf*0(E4}2 zf6k|_NZ7f*c*CLNg09 zX*)mIHFw>Lj4MApuxjIq%$@Y(<`o&o{Pb$oinN`^z=o?8o0Ae7tx{|qyX zZSY`>VG0>rk&&f@?E9W&FvARH?8{(AipCy7mN2%Wq*O|U=(ZU9TJ~M3TUu`2J1VMM z-G1lZ&+q$>m-9OB_cO*h&vV}Ay`0BmRve9~-eX{ApucTtmEZ$|t5}ll-ugqyQji3Q zIu=RzSq3G+M$p$Yrv~s5Xb-27PvV)obsS`*G-+DO^3^ZYa>%NSBesc_B82Ku9{_5L zBZS0UvYSA)Kq5^m(@SP5D`WQ)j}pO45$H7zxD1E{30nju$rVZXzNyVM*)cgVkA;NpH!A7h7Jm^2uiM*{_m_Bs2LZ zuUccY4_7~~OwuA9T%4pQDcJJ7CT){mX>N#~q!Mcs#~t@kx%UNbWJvSW%Uz)@H>-Cr zzV(!SnCG>TC$=j0t;D8;If!H=V5FwgX;cQ7am2fK zQar2Y3|XEOpXzxQYa2z9-zjC$BuRc}5?KBeANhGhmLrGaDL=QJoNMLgcV;e`NOAW2 zWO10F+noE=BOGf2&K@UgHwkCr`9a{mr*XNe!g<&x)~NG8qYITAdWQ}mZl9e?pv-wK zzG9_QsD4Yi`URBGMRh}V0Y&rZ5|W)x3G!RC)nQT`C2kv7>m3q#yzuJ$h;u+SmPzHR z=8b{}#UULl+@~{ohffAsT}#ItdwO6OMcxjWt75Pj1owBKyfbsik*}t>D5kl zD~0QDKI9%&;-vL6Z8`x;Qbs3BVF*_Iz^2AzSFYHz`IK*zX{WunPm#$S`IKAxMaUU` z8-!yLK{BsOv`F<~Q0p$5Tw*_RD-v;uS2>CmdvXw$1pK##ph1$MS(&eA!_9VNC z7VhFb+$Yoq+uN@G!W&a4i7t1A)uUx2_&$xoQ%H3;mzN_3M)2$l&BrVyPs{&4f6Pa< zWKrnju@63_elH2Bu0dxP0oVqWE(UEMi&ZZ1Bg`Bl2A!7w+;~jO32q(w`^bQeI-1fb z3==Ws9nyoTj&r~PEV`Y|_ zHB`U$VSYnuKrDSe}h5+>|N#Y)PrRi?>divaJlaH$E)L=LDv@_cN}jGD$6)k zal9$0fYVzey}!r#vfpoE$64N&sw3gwOM@2jLx{W0zm}s3dwC3g5EWN1IGSz7tmxJE z$S>MDeLqOMa1p$RT|86LNb1CB5Mk`S?TPuIuEh_zCtd~JTm179fbPW)bU=12zW2E> z5_C)6Na|~Zczg9?(}nv%kMfJ)xxMK{eFeHB}DNQAKwEAObTIRut#m94LA6zEn^Y5f-1&_*qWTi0= z4ppBzt5~TJ;!w52y}$@V#71BVQmUogY`9 z+e-6Pobvl@Sm_WP*Zvr;J407rv)!p?^FU<^joK=`vlJ|etu=-5Pa0}Gcw&% z@k#Z$=V_D9Zl#ek2o;6Ly$>^RnkMoGk?){xBYxlj@<;}`*R@yf=MZpbYGQ+AW^Fk! z!C^vQwsl#-PZz%+Pv!=WEOc%5p3%#Nsy>zYV@@ z3|`9ObogHiez*Ad;K|P5KNr8hlH&z$$v>9i@PdP;zrOvt2eyfHz)d=G7 z>Dizuq*qxzSiP+Vg>g4gOEzHT`7WO|z}XIl$~nKbIk_e<5==cqf{Gx)?EnaXVxf#& zlV8=p2rApbKjgDIIAG3sz!(wl*`b|_WzD*cLF@F=uHxDT*+B;KV@M6=2`ce$(o9R!LUmDHM zq*HNALM;HWOQT7El*1zJ9=cHDN(@vRiuPh0y9I9C*AU68R(%s`ez}ei47-NrH=sz! zA`HKQPm;6>gVk~NNh@(fXEK`%cP$Ao7-djZxF|NKnEFj##5c=FT75}`0f2xNsRHDe zY7{0blN#GEya^QW+|a&E9qD$*Fut;>P>E$|FP4M^7EHUSt39w_V#QDbJPWkM1wQFC zJhXIi06jZyp8dP2&WNxmhJK0qq)N2qH*b#UUaZ(cmQTQ=(_%YWJSveZj>+ax_jAQ| ze)A5{!HRWd`H0>-ExHqPiRy_F%}X=YIr!N8z=HvFszhiz7JY*T-8BaDM$#Gr9-k#q zD5!=HOu(!epF8X_X{Uno2ePNBX?C4uwR2RXC5gQ3SJb3xbXWEk)eQT1I(v&lJ99Cu-{aWFq$P-$|y&gX3Ldk=P1x@vC>94A~Z{^lsd9> z_Ytn7T_iz78#^%DX=A|QjadIa6|=kF?E!c%3H=Jrx0&xkmD3%d<>W{oaU`*ub987f zOCj?)4OllU9ga7nd0WoHYjXkTO7p@x!yMW@zLZ(($!%lgY;p%9G$q9afUU=sgyd^USY4H29nKZRTp4a|TV ziQu#H;4COx6#Y+xda@MXqF0Jcx;~TZV;i(2FO-){3t7V2<*iH6xe9sK^|S~QE-$Zv zb}&c57m#5~Sal#mUE;`Z0u2i3dS5P2DlS>73=b~H54_ta(-*HSu`trzBxAY1yN4)`WzvM^=z6R;2!!H&SBr~)Xs`eUn%%5J3suIdiS)O=||6~omFk@niN znQsbaIL{ZC^)YJ<^sLwbqYC;8OAtj_e7!_hj=BR4kq^bFtT-B=l9wpMK74-$U z8cd2WSY%S22>BeET;&Ju%XTO&8o*X(3x10Ke02SkXn7VBcohgchrC0omI!$Tm4WLP z>MaGaA@!s`2LaTQ)E6Yq26C4Oi~^sK^MVAnL_(kzS9B)*^HI*PJi(+x1K81ghhF_P z_?Ujy1z46!F!CMkz^>zQe8=1PFtmY?XiL_?z#wOh&4Tn0AyG~B6S*N5mNe}OD??gH zT6TrSAs0x1%nT7410t-Dpwo9QWi?U_>^9r+pH(eHmm3KrIWO@f@bsWxK}RR^ebO?d z#LX^qSLQj1O9Y)P!{5I)h73Dvw-idNUn70$E9?xp!8QI=NU>}u?GrjpvAoGO{vD9l zNuO>5k*g$a_Wj0?k~4<0szCkJ3ae1U43(KSWwj~<9gl+^K)6^jzB@w1KX;$e>FJOG zXB~$3QpjDbZq@0xA}yi@z4S63f0ln5@$oi zh$)0xE)w&K2%%$3`a?yAp^ujiYyy~A(r*Fe$Py8gtPpz3gV-v zm#fz6-pifNApGa4P*yLLgpv%vKa5Y3f?a`|WaN7&55f%?KkF60=lIGMJBH3;4SkE@ zvI|RwjBb?d63M8gI5t#p5CA=NiEBaYCWkIyEj)`oLua`LnBqvE?*l!wpBABmaAa0~ zqu>=d+)iHx;uP%u;2}=Qkk8Qf5Ps8NEQe0BGu|vt58YVOfl3NOFODA+dR7|Bwnz&V zE)C^R9yGd_ANqVrN1!A<^eM@BC|nl3_TO5u?SaUWZ%PBUEbx9I->GIM@g0@(90k62 zYYmDY^D0qr`cQF*UD6c#mTS^gax3%$_Qz*TPblXv?%^E_&;0}Ta92rd=v%A_yQC)c zLq(H!Nv6hNQJuhdu9~u)@m5e~QZ61+6X6H#6Ds04ByyFo5h9{cN^j^ExBEq>vdDUs zsnNm7&}soQ-!n+Noh9+aGtWc6am}j$d|46?0pvE;jIA{hnq6VK5UU~*bh;Zl!{dZ9 zg+;Tfl(45p9s02QgnZz-z;Z2=gu&51EIw(U;66}GBmZ9VtVMPEnM;~~!j3RPKZoM7 zkL;X*hgDTL%9MUH7Ff2hE0qfq^0%}rl?W54;mDNM7*xqv?40=)in9g^{Lnuw3U8lb ziJa~IM^FAGd|$u5-9~b5d21S<<0S;1P^CpwITp_P1y%K#3BsgSIPN_E1@&R7{G?X$-XBm!k}uhl1p_EEVyr3QBxW$ z5}kj{C=IE9MG$kvg-?2awuqT_WzVpUje6O3kj%23Rjo%@hN~@uQ$`8H`rEaX#fB;Q z+YbT2`P=0I660?xwB!-iJZh&8G$4N)whPcdRm5}iRQ}J^RsXN6OA6NZ7qE41qO9iN zh(0I6+|tMBV`0LmlI^n0FqImImb+NRJqnJ#OtxC*Hk!p@m{iK(-Vj6 z{sD^wciW2c*08waWx(R#goDiA$(mQiPG*<${O5B^ zGs5^{LP9|YjJ%QFynn~pU7iCSGv^19MgGn%$dJ3D^dzIyB3b#+7m2IV!QElRGd`co zd11sFm(9|NFaZfy---t~qvdO!71Ln?lYkrvBPzJ;l>6Hf&p2a(8*yJG%B_=8B2O~L zGUd3azx%#p%=v56oGg1F|J9$ygQXxJGN(XS4(4b>OPn7g>9$3hECvRWF1Xz6hxwjoBi9}c&@@7bT(tQ+s7}Bov#XKLYBnSF|a<*EM z4ShE69K2G;Aq?T0h-JTnq2(l12}k%|FsY2a?=dIG-t%4cFun@zA*YxG-k497D~=@yX6 z5Z)(UcoxQ#--Mva=e?Or;sr2AwcFvwmdXKLTR8>Il$|qr} z=2d$zq`W<`_Q5qkgheMSOf+@J&^vpX-bQST!?3R^Lwwp%o;wj%FEr7ss}H@07YRsj z5Q^wGd8tTVDcu+1Fukh2xj(D&XIB-6v|t0Os#@te6#$y(ElZm0sv7#Us$bq!(i*;y zzYwq9?16k?o z^mS~Y@18c}*qXqhrx~H~3I~UtcGF{*k00H0i@v@Tz`;n*Ik%x6pxq9mc2E;1-3~)n zB%rcg2w4R9$tUGY2BNc=#qE$blB{k_ATs^S)T$@x$^H~Z^>f!0g`leHxAY|LQ-f1) z>8T1qY(TR8DRw|4(Z5W#nm|mHA-8z7LyM@aTd(pZ{|my%B0v!4KPNe~kAp%8z#)tX zpLDYSI5Dabb$s$Y?Dm@G358$`v`zm|9_-7=_s5ld@yY*5zp|(b<02U&)zrK+BqL*4 zHRJeCdM@|NrRVwn^t|8&-EF#xbZ}Sox~B5@`^Lpa)WxCW&yBq>B9O2oY-!hD$N28s zt^%;z$r{-TZF8Q66s8o1#yBU-_@jWv=BhAMd_r2dI*g)a00f4LTnL-1!1%)vh)6M* z9<%eF(@xp`DFV0EVB4vITtiTZ<^yx2TWP z=>~ztHK99P9eAmKn6H)tqe6l1TcabgZ>ij)#*i;zI22f(&s4DBdx`%o%hLR8>@Q9%LUF)J>Eff==hY9Hua@NXy9mN6>5A{n&} zjF;m8DjAhfq){zW@xt;dR7+9Ah(zSYd8o-aMtejhh};_@!_@QyMYEPHFPKKM6N63UHo;Oan(PHq0+>d5F}a#XlmH^Tb8mwm@i9rOA`Id z(svI2rbaLpbD{&*Srf~yd(I%Z+&){U<9x41wX<%E!Fiw%-&LpOb#EE41ZRSH9J_9r z(djQHbz+K9lRb43tVbJ$xC0UA4nDB!bP7ol33Vt~)`OJ;gV=S|2DBdctozadzJu`l9t zd}2f>Q$ZCy`~$a((&uu2nhh+Uo*9x2?s7)f+!9;rb;2i>0T99^(24ANh43yH z=EBf@&4J}-v$@Omx5bZC^t?BuOjTt_?Gsh&MQsSG3F20Rz)0S+bj&U1lgJ_`twWmZ zm0+`{gK`eNcN`kXmz`D;DOnbr;?#F4Kdvd~*Hg6IdrjH(dLmN_6$$kdq3*qvAM3S5 z9{Y>U)SJOdmdm83iyVdq&gC3>V>>$zZ?sp#ob0be?jbCo|R^!bf;1`Uf(#uGLU@ny%q<{;Zbg2M;Tkvv%H-!xhE=a7f|G<##SV_YR+1 zP9D-+mb<3F)jyD~F_H=NZNhI`dk~|r5?<}6E~V*S5#)Q->-Hl8`s5r0m;7-R4UVEK z%NZXFdX!fcQj7{&;kw)u_3ZTU4gX_8=hDOVxhb1jtniE2l&*#z7QyBnc?KGkZR{v6#k;-wdW~Y)FY=CAOD^b z{*>t>y*mMp<7$G<;-EBP&WIs|pgK=7y5B1pau&|@g#T5eh&(?S{&6|Y?));eU6bw$ z;PY~tIw1KqirYZsgM#7Exk-jN)p-%5stBQ*P|_?R?!=O1Jm-8X)p2e2>sc_IX0cfF#Gu3%nrp z{|40BvQ$%9)W}f)`gzDC7|wS*lg_{PMkW}ddnme^{8GpO)jJV_xMiEhL!QXmOm?G6 z1mkEH!$>7UxHi)lkOY**_(}K6p7l;y^T5% zdF5GMl?Nq#Yi?WwR}rUi!PEe@kDeLyPLxjq!3CbQisO6f;}X#xO+Ly`9TTZdln7ek zKh`n?V>Ri#s;0;Y!gStHlc6!nI;p=YHiEz@11v2<%`?$j=Is&MST3W9ApF!3>D6>g z==kI=6-OoMEx0@yMl!-9AferZ3{}28-)^^%+wF!WO?++mi>57^z$Yh_Ta`(>aru~> zoCrBFTlMn%2)Ckq^>U9eIcGp-MC`_85nA612TC4!-ju42uPwgau%WhF|4$bVm<-V5 zX-GW%zbB%7l}C6Z3I*z4uA1t+LzTR6DvJ1S8E1WAS>vO_$v)M}J%oU{kP8hFnkxm2 z3${9hfJ1$%uQWd9r(0ckW%Qkwzv;B0`EF!Z;3~ou1uOIj4-@e}b)g*@0au2_>LTIL zUK->f4J-2fT905s(ARnnRtq=MbfG{A{I2&B(ikory3iJ(VXy0n`C5-{x{#@)RXdFS zS}(;aA1Y(Azt%%4*1$qQ)eBBwe#_5xtyo-^-hiXfz032K?W&qLz-)OApT%F(#5vbZcYzRMhPW6EA>*IZx8(8U^+G>4gfiiPfXpEF$#+NI4`&g@WN zkx!jVHy^+vpADYbym(7`)%i?Uu%+&r?M(kEu8QeOiJgwpu5`qP1w~EOD@zSl#AD!M z2nY*X3@3)bC-ENj;yVsm;n<(tE%#Ule7dEISF))^`ZgC3U!N}PdRRmh@Yz=JC?@`K zx{UoWpJ-c)v}?vI?e+RZY_{C)r>TD z!ex0VlfvBmfv8I4U-`ioFAiwfui$bMq~T{RZe&Q2V0LVvE_vvyC^VA{ z`33XcM=LgkEF(Q@Gi+|lI(V&|wY${0Z`{3-afuT7yLeUArO3!YTs3Fm5;HQe7Bp#* zzfXWppU83dajQ$NkzN6rHn&j@p18A{LS~VE1=>tVp8>;b{}P39Rf1g~@@XoTyGo0G zApC8STW^jW+0d3GxbL8U63vB4 z;vhYz3L{K9=6P%IPDf045v%=^GEf%q(e6N=!w-#i2Sk;fc=m%O-e zg($r0RkV4QGtKrP@~Z)ut#bJF$Lthn|(tRrb}Is7tukszb$59nSAnLCRX& z>7fm6q?Vz$-UR`w4rOdA$!gCY@I_>g!hK2ui!#e)XCEr7x8ewMeD|v>SMv(#N3RE5 z+x*ZSb(4d;j=44(_2RLy;kD@~XWzE2u<58fE5?LBN1|@wuJ2s!iF)dGZRjff=#{0b zEm!{=nDVPC>i>UWdXPR1FM7w6x`Febf-1+Wm)a?=#7BxyvzB~ zzvFs*Z`4G;#@(yB(G>l<7PQKuf3F37Inf&{cQM*br!}{hmu*Og$DHh4M+0E{XfO~X z4-@%cj2wac(+zeGymWO7?XIGpn$LI4(R;VDcI$?O*8Z^>BDp>K15P))cVoY}xcSD7 z2hse1`$9J#ME{91?*$}ETzB@yt?2&2nXL=rT7RspHQmV7^A}sVAk`t|H|SKh>(UmI z1uKFQ`*t-p@;NRe(VuV+@(Smp>&h=TpMGw=QSzWAY(4sGz{8fCAEJK*Jledu9sOek zv|dGjT>*W|(Hm&<=F_Q8bzVSkI{H)Xec#N_k_0$XU&%bN54tP^#fqUHC_x#;;TjSN0e@4Rsd)3<|Vi18mMms)c94njG&LPBz)`ebbC&Zu>WxI;-F+zbnJ0K$v z*elfjGg_b=?<-Ua56!?z329;=y0STU&#p3AKCLXUNa9#ATqPuI~a_z3o7TEI!PD1#^8hpeQ){4 z$OpP)f&@+6s>`ig%ou##@B#qERhK3}Vgp^6KtxV)u!ZRoGriKQSdVTTb0CO;-+d}K4DG=@+&%D&wcqg6N7b-Oi2OL2^SyC#O9 zIJ%ip6q9lqNan;0qej%#(_#Xn60>*hMQg{j@dM|O8tF&xwcr-k_-=F5zHa%p#rPTg+l zgY7YMgQuhsXJK~*&{k;S>2PJJK$}wbyJuQcDlQ!L;}Cn)BX2c6M8}tzOz%aoV>-A=X}T zrm90L)>(0Op+n2sZFP1NfUDwc7a$!KXV^f*R&m;>qd|J6aQlLb&wg8p?b~RV{WD_O z9zR7^%4Wuziy$clNn2?TioePjio3qc6CO^`YV3V?xe)}1_DWs*rTgMv=xU~PsO<|yHT6p zvV5$Kig4*icU0wz5K5EWK{t zr>iWsylh(!ur$T+_7Wcx14m6nmlr<*R&SDqq#eLC2f&t0I=OFx3!RwEFlWL3zU>P& zvEhm)nmOtgRb*Wop$npd_^{Dto zyDBLt^(fS(ghub;piM}!?MO{gQXiCgj&JQ?=P1yoWS=gdCVg$qK3Z{gp{pmhV{BFE z?qICD*EN;9NQ1<{Yg=lAu?efIcGtRNV-;7sy4LM)iKb1b;O(cJ9J9i}g%Ftp)lM$# zY}33^oFp#D4}q_Rg8WA0YYiBF%En2G>%Mo*u=w)zP0stZSlr6`=KG~s{7kmz-RamQ z#l%oQhfw)|Hk-Zv%J`M6Aiw9WFiA|B0*I!XTJE9>s3Eu`J54NU5q+_Qth=vbVWJxs z?|z8gsF>`#TcDY~`s?LgTj!Ijzve(It!`4l{6p+<#SOv6m$Anb6IAa=i3BX}WEQ9) z)WL}-9GQAS!CrSFIDZO?7lBZCKIyYWrQrAS#VbN;B6XokKVsK}y9K(-95U--8rSm~ zbNMX&Ou9x^U94U=?@*3n{ekXfp{zi*ex|?1Tz*8$`iM}bVgaH%bMM;lGlo+8A+>_2 z(#7`umDbPfQ21Bs^iSx1GT#TB!Ly{$EVRja5uqu440Zfyx2Fw7;XI9EOUPS&KJ+wA z_b%$ikZexq2iJo`vdVFHM_%_mRf@|C^bVnHDNqz_y}O%?kL5$pBdEH~c@1!#WAM9u zs15bT95B7zk4V2mf5h{B9QGFpU6GRg3O`d6TG6c)R2b--s95ZHTG3>v+b|A0`1>nP zw^>}(^@|4rf9d6Y=&r2-sdb3Q2<}!Ut1rS zD*-aHUmUC^C_JNr%d?zZdDn>dKm8}P`$n^_&V6Ur2_L6p|{VR|MVrWe_2 zmGcf>%WT>7Nr$pJKcOC5M1+M<6DQo%YH8X7W_=LX@6y4ineP2A5OfC%-ZKKyr9E+( zPcXSkP%V{D(%=1AORH}@qfi#VTKWSwJ_JQ)aDgSTYD^yFY1*i)Ja^d3U1 z6L7JmeD{D0ED_rWLe12kL80o^f}9?t;z8fdmL3VkI>pxuJ-J~6b`A?Y%(%MM_NE?s z+(F;=%$^2^>cALkkEQ5?Jdb8p6JfmIYl6XuFeRf+SwK}13<$c$Hs}L+nU^>q#huI*lJ*q8KeiVF^y2H^Ex?%B*CIZf11YWdF^us!W zCv>EV??vT?A-^E5D6fs!6ubVhV8Qb4D*t2W9xqO@Jg2W#BIFn{7y3;>{FY*FmY;aY z^_ra9D!jOxb$>ASvb-g{|5#WWvFVezlHeYO%qw_R%1VHPO5-_C=*d2q06JhFKM+LM z`m@^ibJo-#dy15dgxu@0_g#NX#JN_-c4$t=b=G}g|MomixiaqM-dAz?{(o-neQT#I z_b23JJQ5mqy}f@QD%9GiS5$o0D?JJL;GfV3%)idZ zzx(&7jHzPe$l`|$XL z2|#Yg-CzB4b0gL>=}Ykz*R{^pE59!Qf@^j>EZSQFbCwMItY3M4V+x&U zd)k-WCW}3Fd&fc|ejsp*aUUNq7kDlQlo5;sp7Xwij~@!$vb!%4FM0NM9`m~FpbzJ? zy5E%kS+e+NiGnOhQ1Q7B<*c?l_02!!V$Jsn2gen?`tRw*Pp+C$`wqt69RI|~wTSl} z`LuKIV7&T->C}B<{B<#}J3w-*PVD9W500KACKz|BZe}nKL9~XQRI%oJb?n!*mhq-= zC1wTGrP{cL({-O2`=6`NDsKBec)&p{tZwH$pvSKS?&Lk7#4oHmdpz)rpH++t+3y%X zUFR>;MirRNTK1qASn67T*9YGmxLr%Fev^mBq#;)&m@HZk%lBcbh9P5|%T+YOqQ@PQ zpbo0>*znHK10A1#EWd0%NRQuG-5AoyiFfe)I;0^Ux3LOHR{TFauR+d(*!VGFwoHeC z#<)Y5x`vuUjI(coDsb-p>kCx<34FV+#$f(v<%7`8X1)*2{SEw{(C#u=n(2W&BK$^v z{O@&X7vf6eXGG!%wUzNOAJ&UaS*18PmVifP`~`(LLPKf%ySz00hXwH)g+yX#nyCnE zcT@Bm_)d-<(Wpa!(=%jIio`v&c{K*rUq+w9^WAj@wCtki_pFaD^TS51Zm! zu^-DHMnYQ7zdG+<4|%t$-F5$Su-0kyvWF`BTd{w$AJ)VR%;fOH8zj~p&8(suLUaZ| z+(AteL{IEAE<;*)$o4R74WnDh_jxHw&Pu-sBaw&$g4Ucvyr8uzn>)X?#Xpz%-XcLV z_@G$$;^BjM{_6M5hfSIv>TEAcw8uZ6{k!WoM}sxYd)q^1dc>UEORyzlvegY`5l|q( z!#9en31VK$O2c6bnNL9SgDMv4KxwOD8`oqXS$h0JYz{I<;y)?=^nFAL-B~sCeKZ~a zsqV)RlN!YNg+RzXnsg1+SH;4TqaZ3Q2hQ4+ugMS0GJ7uLpp=$DQI^p<{LpGv>IxA% zH2-r`>HU$ff&chIZ{rPC{uz3-9sf_@uc1dD;tgs6`6~YF>Oa3Lt;G+?WlLW%lz5nR zdymXAGA(1^xy+Kx-&y|_jeuRT^d=mR?$g_)CBotR90S?2@l(Qq=&;^YQxo@D)fcK{ zcI zhqb?&68@1#&Jg~0Nrwi+&___WuJOGAAp3}4qH+Qh9)GT<|TgM)I)H(!+0UJ`bxrao@n^#NT+>dv0>Mqg#Gp1 zAZaJz<>QB&H@{gE>%}$PMiYqjM_%6iz=?i|78fomh~8fhL^~7q)whJ5Zc8|xDH>jV z9kqLWZ2BQMcnAj9Q*TLyPGCXGcMKB^&GB6vz(K%tJx!0gdtuKf5{e)Rzy9R}Rj8KP z&pJ3FkFM^2n-D#OzRP%%a7YP#Dvfo}SgBS;bveOMNn%)YG67R^51hZI8O#xi$hP@` z@Pg(bV_T3VO8PI&J0UDWy)moagPCt+N|t=xKkay=o-8!**2}V9%6LGUsU094K7eOB zkfBom?8wrWFGw@3>!sv@h($el2Pl}6C5QV9jO0$$!?YvR?d=ZOWg0*KjJ_v=DAk1A zak!Z-zI)>Up0kUy0EO#CN=?bjEDqfAaZ|F{8L$MUU?S`+N9Iu_xyu$F%%kbG*Bs#Cp^PPlF;rrbOH*;6ES+e3v=!;-w{qi zoM=|&IhZbReV7BNOVq)ij{BD6P7RvH_}63Xks};sOVSFIGpg*JfvE;8X-#f8>!+iy z(j|)`Z)UMS2wXNRw+oZJccY*0LZnGqStx@su#^H>)P883CEx2Hia3iI9;8Tl)*h=u z8#;tK%D)~=XX>7Qh#bmgPD-|@3>7oO$O`rVLX=vjf8;Q!^$%a&PGbg<<&CR21`cma zk6|uRq{wR+`2&Yg|5k!oG3UW8VZwr;DlYOwSbU3}n}!Y}XB1u!Iy!_a;i`vPnWQP) z@K7f+ZcXtufS5JhDP$`%QVEwb@L z^ka_il_T96U}nXcR1SmLYzYhxG85O7Qi`UTtoj3t;dSOQ@~+FnADC%t`BTHisI)cE zdc{1ph7TV;6v|SX#)}G3YG`VN2fzGd> z0>sHk@LL=a9OCpfOk5{J401~shlgB9#1+$2L(L&^ke=rDK18-?<&pIW4gEgkjn{}m z;#i-`DNt!wxTZQhVwhO6wnuo>EU|>VXLv*>v5>5KY6PD+mZjo1;z-~EoYn}FMdT*2x$e#M-d-l*pVtZicXnwmW*=PNIp zr;k!V`dwrOfU5d=f`U)t*)=tdQQO4AX-@&5aAfpbY4@buhK-y4;pQE==|^Vql8=L_1y5}fu#hUeb91wDzs zE$+R0q9?JAv^N}cD{-w?TR!ev?A5h9293>$Yo+Qh9**p@wP#6dAVgYo%y|DrsbEqc zTvct|Z6EGRmWjK+AJI;R?(dh)cC|NJia~?6(D>N>{g9%Ddb0;C1XIo7yFlaH7J8DC ze8FP<+iUwSpLFCTbSPEIa8iB!-E_jo*Au(Rx|c!yV)q(o%_sVogv)U}4|UWdE}xuC z1Zgp!1gFLI+$Cklw>1ok&fAsLLR=+iwG2OCt)dFz|+6F@l6P}=RY*s4KL(xAIACiISR^q2cUHh9~ z520#o4D8yKw6e4kRsUCzA*woU4s}4#5eSmNt0h!ncZ0~l)?FG}0>AW0fF9*;M+~39 zCuu3@5BE>_Uvbx893uo?J)?j5Z?(WSvi_;RC;Uyt^{dPANke4fm$0y?{iXk2h{I6? zkpb-PaK~MC65y!n=YzZG3h0GU*bleRqLF<`Uh*v!Z{MJ5AGh>R7$!YlyZmV)-Q+R( z!0<$@No`3<>07Fa*P_1PTMrX%rnCNA2a~waBIrAr5DeX^kR?XFm)GS; zVGcPk1HXRTq?t8?YKBMBe7#``XOfn*TyJ!DGBRmd$tY#gKWSdcu$tkLG(!fWmPt7l zc?Nn@awV>z{Yxmh?a5ulC`ivj`yLlOVIfx=zL#$?s5O+9E5I6G&fziF*GBcZQZYYk zjK55(#B7icYCJAZdPzPM4yr_7u7Or=(uPvs&SYxRPX(S4w|*aIT}kP34l}6$>v;>* z8v45aTWe^NdKx;o7i`pwZB=7-@qMx&5FYvJY&JFFA=i-9G1igu*wxV_(B$&twj?XX z!;6o5l1S*ipB~@RCzXKKtt6{e(03`xWc4hNbnX~C>NZdUrJ8H7i&W~P$ zo`6a@$8n;5knJMh>%AmjX@hFy0jWBhenD&#Te+sjPo|Tmoz23ZtS3EJGOvE}HtD<4 zk;NxlN#E;1>v_`iHPAPoG%aRk{A4t#m9+a4VlYWnj6gGjq4{h7D5Gr`5iogeQ2M8p zgJhvYi}<7q2|g%bL($H{&0GhZeGhQrza_m~KC;-?Mus))!c6hVJg!CcO^IX##WH+K zE*Y^7S|Z6j?1bFZTN-SAY`*Vj(#x77#_@E+f$`b1aJ(HW6I4C#6E(WGh<+#zGW@|h z1=B%?rSaVf$~w)2uM(4qQ4Mm25P1d;V{1v>2XaE$l!{7Hhb* z@b|tzqf)Ea_66=EWGjse{5TXvJ7sEm-&fZFRUL1EdjeRPj`{Ol=y^#zOCOB9yS1>9 zP7r$C`jon5vh+G$ZQ3@H8!ldSzomvs2q8-l#8p*cLr8t~bB9sV-fz$|DN-A_m}FP&nUp1FGQPon@#mEz z)XL_a>CEH}$xA~2WF+ryXcqEqJ+gkresP+a{72dGv%8w?Ij6H{3}TXRz(176&7@@F zVeM!|4NN9D=zxoosOU8_khfkK@_^^%=VHl#>>EL%!8 z#=BL|GF?p8-G*mVUCb!Z3;@%0x66P$gm+7sT~6NZDCIRfooriXdtrBk*>xLpxPlVa zYsVP+g4e|(aO1oAcAD77{fjT#IO$gA>+ZsHNR~{khw&WU#Adxj5BCG*FMq&qj+o@X zct#KR9%VymIWQ-}k_qq-p8J_>zOM1IE#38Tc9v%V3^TqPreuOguo;i$cx8Owv>tufDWWqDD&h3Cy! zVP}snf=*{jfAbuHr6T1OUi3EHZPYV-ju65YNh!a&E%w-AyjMmw!Q8Q-zhpc^b>V!T0VwlSOIp`!b)(qTv1R&PTHR z@xCeZO+aKhv5Mo*N^zrU=P^O-> zPPJc>W9O~YPAw7Gh3g^1ONQ*C^^nV;mA_642Yor~R1F}Ru^#+-F`Z`Z6#QjBQrlK| zd`R;R4#l&~AbghS8PaY9v6>k)M#j| z(b$!JmO>9-rf}F?3ghx}EW4J%IJHb+S5fHp%dYJ7iZJt6FQaTMSON*z9kk`#F6BW9y`-9gBcl1ev#!WWl+CZ1al7hXXoHBs)W ztQ51G*X_Mm(rud8BQ#c6icJ(f;gxjux%K^v%S<-Mpxn=wLYKPk(BUb@r$}aHOCA1i z^!3yy#G$sm(1bXyK9EnlZ{A!T`MRN=ow)+H(`#ho+@ezYTiMqr{k{>v&nh1ZZ^ zye5*u!zX-M{lI&9Uvyq<XSc!8@(_!|*|{%BO^gmemLuz{Jfrjjz+u+zAvlQKa`dc9_r@|cn|3|eCiJEfp+ zxPj@nCY>_A7DcE)5uBn#!Z9W&w3-Oo1chrj%O_oFzkATS*N8eH?Z%nGgDR@*wvu5*ue5z_e}BaPp*z~I9Z1ch)H5_AhCaU$V-+D>tGdl4w5T5gzHA0#}*YkpkMOmUQ{lX_Z^ z@;g4&?`ciSYy9!*|JT-cz%{XLdrty^&}$%|kc1LIQHn^hPUs*gC{+X!ih!bmiiA2L z2~ClMNYeu$@t~mRs8~VoQ3Ha46%Yk1At*?(MMV(nwn}Q zC?|BdH~nK>w*GLE;j#JIv!eXeuT?@bFj;jx^=T1+_}OJ9s( z{;Wd=0PkyEZZ(jct;=Z%AKJ5hp3p3-!}!en*KMx0T~JY;5jd6dxykc z&e1qtp5i4V<|{RJwb+Vz^fvpZcqvm|#8Cv{7_>!P#B0Q#sU5{t99hX!kK)`EFJd0u z2Sh2%S9d`|11665am=emt!M8DMj=tD%KqFzbsJ;#p8yzBS$oGe5OAWgHijUIq>pIX z==0`6&T^C3z~gu%i8=EWx;T=`{JyDhd?bfSjw-SMaUjSdK&3Ii&o68lQKQe)79iCl z3?|#BCgg0*4t?YIF(c1#1d-LF#tFUCtc5+)l2pCBhU%c4Bx|`l!mE-!WGd-)TF0LK zOf%8TnBOaySBi_%p9`2)yuB>|p>Gjy-|X`?rX8=u=|wMd39m%|MH|zGw{HOO7V`F1 z14#>B@c>A7vHPX#^Zm?ZWFT$&44Jy)=2fApwH$Z{41yzBMMGr0{A5WI(?6DFA~E?_ zd!&%x&nz$9W=0+J-J(4d_u?5-*Qm7m#UyjN@oxh!=9sIE%k)Q;GQfebSwO8c{;dV@ zT#QS-dY>^JjfWaQx|s59W|RF))mxFx3neC&uCc5EO-K%brKmpZi>hiIi_ZuX0V+5nNCbG^ z8G)kf*fDeKb-aTEqldK2cy47C^W(PYuQYreBVQI_a$6s~%t(&HJ4OcC$q_@|6)5wCH4EJHxxr2}4?ah(&8OpW@28=v%A-7~s}bbRX$6 zSB!K*Z0c~&aYT`N2snS32VnPOPtzr|gp6(K)eiG6) z)zw}$|D>WM!jn^FJ1sWb)0Xl_Q9pB}`((r9w#?e7#_`FVOny|8#nk@H23~3C6k-r^ zOmw_(st%kcX9Q18G8;sInV-oQ0nxO~TG6q_$!ESJKKmPsRGs!<*4j@eDtX!~;ykW` z2nmv?WKyMc{a0<7r+I%4Od)47|KuU(jt5gtM4hN^S!sKI=-L5nzv8@G(uLVjBnIBJ z+KgBU!&;#@-wdPhP0jkrj`CL+w>9O#4X+sM{}okx^VO%!tD@72uW?!JqGqqxgsdB) zGfwWCGTl1PBmk;I)NBEGLec4QAo+JxZ3{?unHPNC4C97e676U|`(2IBGCL4vQaYsl zSkG{szJ$@v#Rz!~`2BZik2JfeUA%?m&qt}$J5;Ggb!@9Zu8DozaFDnl`dqz?xw1>(H?a*;K8a#_N!Ge zblYLxACD}N@4z{>-;ub{_G)xo4$8V%a-p$dQ`TVA#l|<=vYtknJ$#dqHEi6f|F$@5 z#JF`9P|u>wIsxx-)WyO#ky*ZbFC^R!%KB@chHk^g_B)-MwS#Tc*Tn74P6_V8>2|2l zB0H%sc(JZ;E3;ZdbZ(X%%5u7Ssc^ap1H!~iiIB@JiE6>Gqy9CJcqwat$iHsBRSVwt z=yD@qPJk76S51~`xK82L%B)ddto_?gYX3tO8m$Kxnx9SA+@u6vo}oL=M;Hjw0%sk2 zlv}aIU^AV-#f-DH3loa0O+5LZ-qNT6^6}VrompCCe>=VF&HBWar%$@q%XyY4KlfWH;r1%ecDAKv0NniO=g6D(85U5WIBeuLutg+0mvxDB8< z@Bt?_AuS9GB0H9-m0+yNtGJkW&QOZuovo!BdAc{>WPR7a);RJh>xbx?q9lV!i4s~! z)UxHH+Y%&3*$UBZUVy?P(L(*_8BA#S+W5OqS%${f29P&dsq^zjKi}D!z!?f~Xx&x#51xjoC1n<@S!g_Da3RAO<>Tk}1xJH!vE~gI%vd!ze(?1-_ zHYasEeJIYRkh*5yXJi|ZZq5p~Wry_&8{V56DV6feN1qy0Le9rAIFy~=b+_>2v+VpLK=o!X zsRz8yY};WVc_G_+7^FLzjWfPAj&5a?%^`Fv!}&pXZ$_|xN(U3-qNM`ABs#$HQ*piX zoM>$^L(A9w+T-g|f6roz-SXw6`vV{6vR9LO^rw|_+(^Bl(*`+Sq`vBDs~jIvUpk;X zNWD&gM0#)n@SI@M zLnlB5lKN+-U2^zqAG82Tr*>}0q-~CCci*gurSFHsr{wk<7*Esc-YZ)xfJ21<`V6W; zn;Op2BV#*oh;)ey^Zntvw%w#Dov@*VnYx@^>P*heA*aYvWCJ91KnD?VU79Q+gxz^MWHmlb|3 zfgpe%1eKzt0u}CYBFaa>nmztZonfwNLj{yO=`Rj_u9RDUTWp~SNOXf zTQxjZIETdN9v*&qb1p5ncKBr@h|E+oJeB~M6~m(za~@u{gfP3BIPJZ`ql$BH?7FnD z+%Ok>-))!ne>Tfdt+Z5@UNf!)qR`f{iptD-hpwd<&nffj&+1*v$qkfysPN^2*H+&N zCz6`Rk>QELX9seR)=v%u)aI%o`IDhv4&)9#o3QwzrtvXwqUG3mFFxs^-qP&c_rITg zIX9;~-g`~6?tod5_c~4O5-38ZO@pY(|E0s$oRxx%r#heAR|(cxM@H*RRew32tKT_w z^UH^iyL3_H7xz_p>z?WyE?n7W|Bnt!jV~|~eDM0?4z!H^3!%oE#!JVpfJd_dcd2`{d*Wlj^!e)!*6bq zC(ZW^#tA!>Z1&$+$#}v?M-M$xLH?hnsaEbwyGy&xv4P(w5c@(dD9K0r3!MO&w}@oF{ujEl|u5(%8DxFbJmu|u@)`wkB%}g z?x8)59*yURBLk$F>hDR&6VmL!_Y7p1^jZH$F)~8>JPW92q}dk08zRl5e-B3#HjV~= z@1>P{M|pf-v|J&qw12!p9w{y|qX*NKeyMOds!U+I1`xp6ST^IVAZ%%yN) z{(5kAuICSf)i0voyM3dZhwcwPCm>R(?J)ra=|T?dF9gkCrX)$gPaQqfU6N;Zx%oAB3HD&hyENwW=TJ)e@-G_Nk0dEzDK^+18M}Btp~hb z_p!6)yV(6f=p?XC0)+;6W%!-lL@Vow!yLpaQs9mO}-gx1ft1;v%d&>_}5jd z*>ev0N!os$1W{HiLxUAK7FG;-LwYO)F$RPNXDN%ZUC?5dG96n48M74V7;i|Og{1>Y z3~RNrW;;pj__O|Jizfl|&*5KL3zgEKiIvb3vaQott`_p)q>}5Fved=# z$TYl?rOEHq!}zjv$ha`fMwUL=v=FnIWhhqY!t7zq7b`RYibyt12Rs59=L{sZ_?-%v zRVJ%rFLJb2z!iWDOMVk)UeFSN`qbdStfKmvn$@3%s(T+Jo54N z>v-PcU|~#tBQ%^=nM9uk|1&kklzvGn7Ch>*Ou@9UH$YWgMhi5uU;efob_km%#7=m z#K@8(U{ZjxV|=SSC>kYAM-K-aazt<76c*Tv&j<*lXbbOD|(UAqWKdhxZwKKL~euP5FB7cwAIo82@`U zZcAPSS$`0hnHNna5*7C5G04QvfQlsRw*p=`|9c^j4553QTU}ZcOrP(LD=^qwMAFm= zU)s3O7!x$ACC7r$=WZ;lkB6Tl@UlA9f!NvxVo+ZEAr>|?P<`+x0gcYjt zHj534K(xCpV#6+li+S6{^YDr{@>0a}CIFQzHf#dCM6p34kc=Z++A65~VGim~UwxYV z=>S$jj*GY@x2$Z%Q=qld-N*zb8ccZ%*v|*4zsjFH8-d_`b!tfxhvR0#y@Jv5T4jgg z`8A*J=Iy2%B`S*Ym~`VN#kYCw8l=yk-siR72h__vrWo)Zf!9$$vOCYA`?$EA=qudo z`@vxjqf^U2A5pXTmB(0*ax->AQWL~yGy!Myco2TCtyohf*=2@iC!kN~4QkB2Sob*( zLCEBZV4qFLL%{Y>oz10FiUNr2foGH=yfJ&A4p6#mt{CvZvD&JRv0w}v;gcrTm8~9J zM{1($>ddrN>8RA=OY(rn7kb1^Ad!defteo8FS#*Pcf*Y9WX@l{6 zh+M$zp2H7v78E@_&K~6amePHceZwfu?4p3(avw+@Vo!1q?F;S2I{UgzV`XPK1m;qA ztg@}D@?d&EY;=i|?mWQW4qhTwT_M-QvNus<;@%GyT~t2HZu49?p?sCSN5z_`a*J&- zWbLiOOTNHg#8i3Az98=QRJq5tI0Sg@>^--EQp=32n(;h?!GIanu z53sobdjRkZ^e{S@()(Lr3veM~;%o&%#q zIu7c0j2ui{w-WYmA_iLE8@%{q?yZ&e}} zG<9c6v^bso*kDy{&V8b8h)N{_+_$PO1NW^bws@)gmO;RO+_$9B15+@+c92RycRqkc z1N16zwJkyZ6TD8|LT9D@4KZJSNQl2le#23va&C$3yHp)H_sB+{Rb4>{lD9f)uAKX1 zqX}^Fj@Z5lh;)(P>{4yVm)+&ZsjjlO@0CyZCw3iV0(^^rp@Wq6fLLZztI{Az@V_JE zDGYgY9+1!UAtwSk5BW=(YEz6sx?_{tOSdOvr&jRwnC@5vE)MXQhN-RRoHRURujb1s z+yB2Kg8srx;lZQ_Ud9aRYj8S2*FC^?U!Fm=c5{q+xz0G*{Er|$r}d!y zLG=@ySLEe`>RasJikIUxu5#Y;sSni8a$fO~Wi{#xmbB_DYYGamA1Avo)UgYzwQKD5 z;c&Y0A$Ix@#*8JMgWH;*W=t9g{SAVl#S^taTy8-`vgI@$U<{OLy%+CockSkU6ua6h zh!#xKS0-wRIG^dOCJH7vU&*TnH9l~@@&Pr<`78#!N1SQ#NqdFGW*_;;iZ0iamhZ_1 z7yvRb-BoY|fDC*=K?eT9o`7&u&|?aCD*!@YOX6!4n%Z2BtY}{JxkJywpr7%BZ}-47 z&-Eu6CKBbjSb>$pYgMkifXaET%T*Ym0VG?l0)tlcI?-N!1a^L1`ZP;=+%1CK+;G&5J{iQS0!%+=~6p@ie9tJMUdV<~EjRY#J}fdoo|5RdHt8IjVk zTuBXsK*um?crX`6I>F19>x;{M6R89_Uy3dx!96hc<%K4?Cd1uQYb{ro;gP5n#U(Oh9jO`THCpXBbAj}F*!ssKv_ciotWpZt9dxag%<5C3P&f4XvW{hJr@MS9S zCTg>}!H>N@pJj55MjFmoF_zr8y)^c2(2{=D^bcqJme4xA+ob`-K@eJyyV5J|pBfNZ zkd20GuwSSy2^K5W+E=(l+9?GTR#b9#@qNI%FAYnEZZt~Fx~GNFBuYdr$UV_eIT zPbu1mxx45-MHQGdyW$5+E848Y-T&up8g36XNb`wbvPTgI$sbpo4_r%UO3afx1&Z^j z$-pvQEU6SI%6m4S0{lCaXtbN#HcJ@YZnt~RlMQSHo%G)}>HntbggmMoTJzBNYQIgA zjjcdT(7DAe9PsnjdBk-b@h{R5aUB`{-a7ZVh1GsU9pxxn!Azgc*qVoXuk=@@#{Slm z#`rBv)rL~ud;Yv?_jO>%xzM71-~s3Y9NNp&o8)?j_VftGxc7?Jw(6LKtzZ~M~E zj{MZG^M&ivweGVWg2|@|0-SY~^J$cT&vxIrK1J&WbwbuT*KK&&!A)F2VPDXh;@*jk3c9mt^P4uFypIB~| z?zMDySa)7`i=rYU|L?fkW_nW04|F<8 zKW8b?X-$&gBdmp^%9qU)LaL6H0oa*7XfL&N>LHpxK}%+#g#l8Bwq z3I$+8;X8j@l@+wiR1(8GmFX#Ql<-gik4>oB8ZHQFCG5w(6b8PoivO>K)FHAE9!U z4#dWdgjwpXbv;{@M$lV3Z@FPumof!D2ZKdc=BV!Ya5FmJ@Zr!A@aA5^02W1Cz6X~r zJaypYnfw)-8v68*1$Ns&Wk7`zz{S&EGE2exT>MV8#51nv-t~v!O^$`4yC3&bxOvOVXsz{lI1k2G8pOunlGr z3v=1k&rD}%HH(!RJ95YUlAC|fu|anxWo-kpX)J#*FUpeiCO?}IJ)u97pFIMo$^1cD zRMVyrccuV{_PbxY?iV*gbYii-o9cABOHZcF*HUOh8_#16_i6qHb$&l61&_68w3a+U?f zjBSr*{N%18norMw+`=&-DFkUOZCk=oISdAUgO?95C_pq$xiVYr-8$doZf|x3w?m4T zg%$1v<$}FS4AvK14q=BHYy|J#BRB@PoDK;#*MP5@k%(R3VkLv!xHYigpkS}5foFlA z(q$G?Y_M7G_KnrMbxbj3LVIhuTd?*OL?5_({0&x}o#0Ly*3^{`FARQ<8&$4=hf)&e z8~<4I{EWfQg1Qmif+l8x^YsKgh^c%;Fwfqwyx^!HiD`Ja;3y@@+3+&u2qO`1m|Nh? zNhoUaW7JU+S`DbiKW>ktCRC__xGmtQ{y%YBWaAYFK?He1%h5luvC4>ow(ja1n~Y&* z?Ge*U*~ais%J-QxAsN2N&F(puVFv$j`|{=$-2$#I)5vuE(-{7vd>O`{YXQ$w6E7+w zli{h#v#P1drf@-bP+L>OJXmzFFn^Gf8v?j%4*_tbT^Cgb9hpm!!6w>M;Xm&`1XVDGcV8fU zyKS9nhttA4ug? z_#d&7}gZ|@xM$YKNXV7$h6u2_JC^oXz6h<*e=T?#7 z(-q*tvw1KDg&*BdfwhlbY17|44<=0~hvclK!j`#cmWJ^AY2WaIRzvvf?YG_6*`_dl z~!IYp})Rt zItg$d?SpL>Sn0xVH==!K2%{bFwp&})6Q{^93W?dMK!)d|g9{O1W4$f@AJ=Nbpnt}< zEF{DHVzeu?;RCr}m!-TV!{G0|qV?La8=7Dl1-|@v@Avq0A`BoS5r7#!WrGn1aUI?Q)mwU$)CQ`v5^_jqHq#2sS7;|79+NiPg4*ue{JT>ON{BLwDs^!nQz(RW6vr<3^1W z-fu188{5F>3oT>?joH8<^?w2_F@=$#l^J1)mhc@gLaulJtxF5xGz0}5-A;k^LHmfi z%;73ZXB2&7_;5Oy-!23=2nDGn6Jcx6&ahAdj4TI3(-)-*_nZs=bZMiOY}$zQ zWn-?S1*1J!GN%j6@NqR{^Z2R`ochjrLm0s5o~^UdlOersHh}-G0v0L6Mm7Y&rto0iF3*Y?(_a}|$#iA~1(rhN z4x7UVQ2Qk^hkFlf`r)>5v8sGs|B8yNjc(xAd9FmB#bOL)KK8?~#=rtmf} zSuTQU_2OpDzpCiAFbi!`D;0j42<^ygFoAV}J(KKS2#c^vdr77i@H$wBas7b>9Cs&j zO;@2MEQJuAwSqT;+5Pl}l}tI$TEeNQ2}OD=;Zg;l-YHaAI-Tdp@PIZjHOCgnET9(^ z&b(>0tb8lLEkz-24=k0n+|dTE@dJH&!UZ;~{#lm$)d^lWQ~m5dBvmAa5%*Zx#d-yr9YpQljWhT4T1r9}x z{?BD_BB}(Pb}#@FMtoG;on>plf@N?7nuDJcECl&jbC<#>Nb{K39-iYToSWKUCmUl0 z7a78>jteYZy!`BB%K5}jW{66iU=;6|IpiV(Uv^yzqvis?+zCcC%4~Mouc250lVcHJ z+g+z9GZntLn8&*b89gM3ZFZGD|oNERtsctgH!GrNyeYvN7I9 zfl=__XJ#h9l+Xl5A%Ho28<`u}IKo@3A7MQK(uSZe zZ1t^6Sb&Hb3MpZrol1)G&^9$Zln(wUg8wmUc=;rhvjgP>fGdG&_!UgqjS95q*EhhZ ztWhK!QM4vBD-kpa3Iv7uMEt*nhYc5NNlaClNh|y00I`DtUgm_1`Nt7<-cQLa z2}x`^!m3SLdBfAUTA*h6(vQEvbz@s(sGx{UGxuacywTwM_G~jPGWLRXUy^1lLz_); zrr0m4_Ar-!h`Z&b8G4b6pY@1sHIw(nj1duewxQZ6BOxslgoZAV4;-;HiaJ04 zX;@XQm5Yg2jX`xXAz^`5mAOeu&c+Xk8-g<|!pwwY;Tte9MKP&264D+l3AlSGvFo6w zLSyY8Y)wi`#&CI!e_2i22IGLGAyJ+M`vP+)R)jjEE%hF(@NG0B z+ExjXV;SZz%knSUj#3B)xXkkM=QL5kdXEbH24M!t-Oy`8QbZa>)RW&(0d`dm#eQG)Ssx;4jb(-T%@N zFxvR}zs4M@cD#xe>0!;WM2(pEUAvMj)scI4N8*QaOAXLfz`)ajy8`iQqSBS+glZ)RTN5JYeE9q5*>4{cS z`B_wPCUf@spqZf-O$@C&emXl`CKnj4MggffUDpG7$8?POEhb=AXEfYOQLg z=0+oSVbCOKiD*^P4_XVrMq2_hN9%=1YYtif#DdWOvb;d+K|+u_+IDbVnlq3BTyP!D z1I-o4OaFm}qisk3fGz<^KyA>X(K68Dq|FBc;5R4;{V!`CU{S$Ov?#ROKnk>Jpggp1 z&_<#)2DPAhRcl|zu2XCMLrbruTb0^+OpSWJdi!;3rsC^n0#!JsTm9}jc9-29HNEpH z)Xzc!b?ORul>C3#rT<~As`IX4tuWZ?D;-!PI7n|J_3v&1mDf$M`laSF^~ORgtP~8W z%>eKg#P<4Y$OLE`6|X1hCO`((M1>T__Bh5a;)9m8o!GzSaq-(yc4t&0U0CaCms{9( z82=Wl+t>{X3L(2=z1J_TUVINrL}KiHQ#XdLwe?9#Pw?4hmmKHixivg&eWK5n9SJep zLw3b@+r|00(UQP5+t_W%NpWH8lVdY{9DTfZyGXAu@l6K2J+VpXwOvUuUdc(Z+dMPk zHvrnrH$6VoGb47J%Mxk++czf1ZeN=cWABi(E{T@pzr}x1n!lR^(`UQwE>t)?bSWr& z?dG^`AsMmu$$MhZOx=7k{kG83{5SZzRD1SegRy}gEp>fZ7diY^eFzGmt+)GsnNB9_ diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_metadata.parquet b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_metadata.parquet index 4b59e40381d8d76fd5be15d39cef28783a74a160..108aedd4e1c21cf3b8da9e773bb337047ea4d4a0 100644 GIT binary patch delta 2680 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 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/features_atlas.parquet b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/features_atlas.parquet index 4b59e40381d8d76fd5be15d39cef28783a74a160..108aedd4e1c21cf3b8da9e773bb337047ea4d4a0 100644 GIT binary patch delta 2680 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 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/App.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/App.jsx index d48073d03f..1d79a55533 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/App.jsx +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/App.jsx @@ -190,7 +190,7 @@ export default function App({ title = "Evo 2 SAE Feature Explorer (Mockup)", sub const [selectedFeatureIds, setSelectedFeatureIds] = useState(null) // null = all selected const [mosaicReady, setMosaicReady] = useState(false) const [categoryColumns, setCategoryColumns] = useState([]) - const [selectedCategory, setSelectedCategory] = useState('mean_variant_1bcdwt') + const [selectedCategory, setSelectedCategory] = useState('cluster_id') const [hiddenCategories, setHiddenCategories] = useState(new Set()) const [clickedFeatureId, setClickedFeatureId] = useState(null) const [clusterLabels, setClusterLabels] = useState(null) @@ -208,7 +208,7 @@ export default function App({ title = "Evo 2 SAE Feature Explorer (Mockup)", sub const [showEditedOnly, setShowEditedOnly] = useState(false) // Filter for edited features only const [histMetric1, setHistMetric1] = useState('log_frequency') const [histMetric2, setHistMetric2] = useState('max_activation') - const [histMetric3, setHistMetric3] = useState('mean_variant_1bcdwt') // tracks color-by selection + const [histMetric3, setHistMetric3] = useState('cluster_id') // tracks color-by selection const featureRefs = useRef({}) const featureListRef = useRef(null) const endOfListRef = useRef(null) diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx index 97ec01e178..b32ae8b4e7 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx @@ -173,7 +173,7 @@ const styles = { }, } -const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, forceExpanded, onClick, loadExamples, vocabLogits, featureAnalysis }, ref) { +const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, forceExpanded, onClick, loadExamples }, ref) { const [expanded, setExpanded] = useState(false) const [showDetailPage, setShowDetailPage] = useState(false) const [examples, setExamples] = useState([]) @@ -181,7 +181,6 @@ const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, fo const examplesCacheRef = useRef(null) const [alignMode, setAlignMode] = useState('start') const scrollGroupRef = useRef([]) - const [hoveredCodon, setHoveredCodon] = useState(null) const [editingTitle, setEditingTitle] = useState(false) const [userTitle, setUserTitle] = useState('') const inputRef = useRef(null) @@ -232,16 +231,6 @@ const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, fo const freq = feature.activation_freq || 0 const maxAct = feature.max_activation || 0 - const highScoreFrac = feature.high_score_fraction - const variantDelta = feature.mean_variant_delta - const siteDelta = feature.mean_site_delta - const localDelta = feature.mean_local_delta - const clinvarFrac = feature.clinvar_fraction - const phylop = feature.mean_phylop - const gcMean = feature.gc_mean - const trinucEntropy = feature.trinuc_entropy - const geneEntropy = feature.gene_entropy - const geneNUnique = feature.gene_n_unique const rawDesc = feature.label || feature.description || `Feature ${feature.feature_id}` const description = rawDesc.toLowerCase().includes('common codons') ? 'Unidentified Feature' : rawDesc @@ -297,80 +286,10 @@ const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, fo lines.push(`Max Activation,${maxAct.toFixed(4)}`) lines.push('') - // Vocab logits section - const logits = vocabLogits?.[String(feature.feature_id)] - if (logits) { - lines.push('=== TOP PROMOTED CODONS ===') - lines.push('Codon,Amino Acid,Logit Value') - const CODON_AA = { - 'TTT':'F','TTC':'F','TTA':'L','TTG':'L','TCT':'S','TCC':'S','TCA':'S','TCG':'S', - 'TAT':'Y','TAC':'Y','TAA':'*','TAG':'*','TGT':'C','TGC':'C','TGA':'*','TGG':'W', - 'CTT':'L','CTC':'L','CTA':'L','CTG':'L','CCT':'P','CCC':'P','CCA':'P','CCG':'P', - 'CAT':'H','CAC':'H','CAA':'Q','CAG':'Q','CGT':'R','CGC':'R','CGA':'R','CGG':'R', - 'ATT':'I','ATC':'I','ATA':'I','ATG':'M','ACT':'T','ACC':'T','ACA':'T','ACG':'T', - 'AAT':'N','AAC':'N','AAA':'K','AAG':'K','AGT':'S','AGC':'S','AGA':'R','AGG':'R', - 'GTT':'V','GTC':'V','GTA':'V','GTG':'V','GCT':'A','GCC':'A','GCA':'A','GCG':'A', - 'GAT':'D','GAC':'D','GAA':'E','GAG':'E','GGT':'G','GGC':'G','GGA':'G','GGG':'G', - } - ;(logits.top_positive || []).forEach(([codon, val]) => { - lines.push(`${codon},${CODON_AA[codon] || '?'},${val.toFixed(4)}`) - }) - lines.push('') - - lines.push('=== TOP SUPPRESSED CODONS ===') - lines.push('Codon,Amino Acid,Logit Value') - ;(logits.top_negative || []).forEach(([codon, val]) => { - lines.push(`${codon},${CODON_AA[codon] || '?'},${val.toFixed(4)}`) - }) - lines.push('') - } - - // Codon annotations section - const analysis = featureAnalysis?.[String(feature.feature_id)] - if (analysis?.codon_annotations) { - lines.push('=== CODON ANNOTATIONS ===') - const ann = analysis.codon_annotations - if (ann.amino_acid) { - lines.push(`Amino Acid,${ann.amino_acid.aa}`) - lines.push(`AA Frequency,${(ann.amino_acid.fraction * 100).toFixed(1)}%`) - } - if (ann.codon_usage) { - lines.push(`Codon Usage,${ann.codon_usage.bias}`) - } - if (ann.wobble) { - lines.push(`Wobble Position,${ann.wobble.preference}`) - } - if (ann.cpg) { - lines.push(`CpG Enriched,Yes`) - } - if (ann.position) { - lines.push(`Position,${ann.position.label}`) - } - lines.push('') - } - - // GSEA enrichment section - const gseaCsvFields = [ - { key: 'gsea_overall_best', label: 'GSEA Overall Best' }, - { key: 'gsea_GO_Biological_Process', label: 'GSEA GO Biological Process' }, - { key: 'gsea_GO_Molecular_Function', label: 'GSEA GO Molecular Function' }, - { key: 'gsea_GO_Cellular_Component', label: 'GSEA GO Cellular Component' }, - { key: 'gsea_InterPro_Domains', label: 'GSEA InterPro Domains' }, - { key: 'gsea_GO_Slim', label: 'GSEA GO Slim' }, - ] - const gseaLines = gseaCsvFields - .filter(({ key }) => feature[key] && feature[key] !== 'unlabeled') - .map(({ key, label }) => `${label},${feature[key]}`) - if (gseaLines.length > 0) { - lines.push('=== GSEA ENRICHMENT ===') - gseaLines.forEach(l => lines.push(l)) - lines.push('') - } - // Examples section if (examples && examples.length > 0) { lines.push('=== ACTIVATION EXAMPLES ===') - lines.push('Rank,Protein ID,Max Activation,Sequence') + lines.push('Rank,Region,Max Activation,Sequence') examples.forEach((ex, i) => { lines.push(`${i + 1},${getRegionLabel(ex) || ''},${ex.max_activation?.toFixed(4) || ''},${ex.sequence || ''}`) }) @@ -488,74 +407,6 @@ const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, fo Recon Δ

- {highScoreFrac != null && !isNaN(highScoreFrac) && ( -
- Hi-Score - 0.6 ? '#d32f2f' : highScoreFrac < 0.4 ? '#388e3c' : '#666' }}> - {(highScoreFrac * 100).toFixed(0)}% - -
- )} - {variantDelta != null && !isNaN(variantDelta) && ( -
- Δ Var - 0.5 ? '#1565c0' : '#666' }}> - {variantDelta > 0 ? '+' : ''}{variantDelta.toFixed(2)} - -
- )} - {siteDelta != null && !isNaN(siteDelta) && ( -
- Δ Site - 0.5 ? '#7b1fa2' : '#666' }}> - {siteDelta > 0 ? '+' : ''}{siteDelta.toFixed(2)} - -
- )} - {localDelta != null && !isNaN(localDelta) && ( -
- Δ Local - 0.5 ? '#00695c' : '#666' }}> - {localDelta > 0 ? '+' : ''}{localDelta.toFixed(2)} - -
- )} - {clinvarFrac != null && !isNaN(clinvarFrac) && ( -
- ClinVar - {(clinvarFrac * 100).toFixed(0)}% -
- )} - {phylop != null && !isNaN(phylop) && ( -
- PhyloP - {phylop.toFixed(1)} -
- )} - {gcMean != null && !isNaN(gcMean) && ( -
- GC - 0.1 ? '#e65100' : '#666' }}> - {(gcMean * 100).toFixed(0)}% - -
- )} - {trinucEntropy != null && !isNaN(trinucEntropy) && ( -
- Trinuc H - - {trinucEntropy.toFixed(1)} - -
- )} - {geneNUnique != null && geneNUnique > 0 && ( -
- Genes - - {geneNUnique} - -
- )} {expanded ? '▼' : '▶'}
@@ -587,140 +438,6 @@ const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, fo {expanded && (
- {/* Vocabulary logits - all codons grouped by amino acid */} - {vocabLogits && vocabLogits[String(feature.feature_id)] && (() => { - const logits = vocabLogits[String(feature.feature_id)] - const CODON_AA = { - 'TTT':'F','TTC':'F','TTA':'L','TTG':'L','CTT':'L','CTC':'L','CTA':'L','CTG':'L', - 'ATT':'I','ATC':'I','ATA':'I','ATG':'M','GTT':'V','GTC':'V','GTA':'V','GTG':'V', - 'TCT':'S','TCC':'S','TCA':'S','TCG':'S','CCT':'P','CCC':'P','CCA':'P','CCG':'P', - 'ACT':'T','ACC':'T','ACA':'T','ACG':'T','GCT':'A','GCC':'A','GCA':'A','GCG':'A', - 'TAT':'Y','TAC':'Y','TAA':'*','TAG':'*','CAT':'H','CAC':'H','CAA':'Q','CAG':'Q', - 'AAT':'N','AAC':'N','AAA':'K','AAG':'K','GAT':'D','GAC':'D','GAA':'E','GAG':'E', - 'TGT':'C','TGC':'C','TGA':'*','TGG':'W','CGT':'R','CGC':'R','CGA':'R','CGG':'R', - 'AGT':'S','AGC':'S','AGA':'R','AGG':'R','GGT':'G','GGC':'G','GGA':'G','GGG':'G', - } - // Build codon logit map from all entries, excluding stop codons - const codonLogitMap = {} - for (const [codon, val] of (logits.top_positive || [])) { - if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val - } - for (const [codon, val] of (logits.top_negative || [])) { - if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val - } - const maxAbs = Math.max(...Object.values(codonLogitMap).map(Math.abs), 0.001) - // Group by AA, excluding stop codons - const aaGroups = {} - for (const [codon, aa] of Object.entries(CODON_AA)) { - if (aa === '*') continue - if (!aaGroups[aa]) aaGroups[aa] = [] - aaGroups[aa].push(codon) - } - const aaOrder = Object.keys(aaGroups).sort() - return ( -
-
Decoder Logits
-
- {hoveredCodon && (() => { - const val = codonLogitMap[hoveredCodon] || 0 - const aa = CODON_AA[hoveredCodon] - return ( -
- {hoveredCodon} ({aa}): {val.toFixed(3)} -
- ) - })()} -
- {aaOrder.map(aa => { - const codons = aaGroups[aa] || [] - return ( -
-
{aa}
-
- {codons.sort().map(codon => { - const val = codonLogitMap[codon] || 0 - const h = Math.max(1, (Math.abs(val) / maxAbs) * 24) - const isHovered = hoveredCodon === codon - const barColor = val === 0 ? '#ccc' : val > 0 ? '#76b900' : '#e57373' - return ( -
setHoveredCodon(codon)} - onMouseLeave={() => setHoveredCodon(null)} - > -
-
- ) - })} -
-
- ) - })} -
-
-
- ) - })()} - - {/* Analysis summary tags */} - {featureAnalysis && featureAnalysis[String(feature.feature_id)] && (() => { - const analysis = featureAnalysis[String(feature.feature_id)] - const tags = [] - const ann = analysis.codon_annotations || {} - - if (ann.amino_acid) tags.push({ label: `AA: ${ann.amino_acid.aa} (${(ann.amino_acid.fraction * 100).toFixed(0)}%)`, color: '#e3f2fd' }) - if (ann.codon_usage) tags.push({ label: `${ann.codon_usage.bias} codons`, color: '#fff3e0' }) - if (ann.wobble) tags.push({ label: `wobble ${ann.wobble.preference}`, color: '#f3e5f5' }) - if (ann.cpg) tags.push({ label: `CpG enriched`, color: '#fce4ec' }) - if (ann.position) tags.push({ label: `N-terminal`, color: '#e8f5e9' }) - - // GSEA enrichment tags - const gseaFields = [ - { key: 'gsea_GO_Biological_Process', prefix: 'GO:BP', color: '#e8eaf6' }, - { key: 'gsea_GO_Molecular_Function', prefix: 'GO:MF', color: '#ede7f6' }, - { key: 'gsea_GO_Cellular_Component', prefix: 'GO:CC', color: '#e0f2f1' }, - { key: 'gsea_InterPro_Domains', prefix: 'InterPro', color: '#fff8e1' }, - { key: 'gsea_GO_Slim', prefix: 'GO Slim', color: '#f1f8e9' }, - ] - for (const { key, prefix, color } of gseaFields) { - const val = feature[key] - if (val && val !== 'unlabeled' && val !== 'other') { - tags.push({ label: `${prefix}: ${val}`, color }) - } - } - - // Codon optimality metrics from annotations - if (ann.cai != null) tags.push({ label: `CAI: ${ann.cai.toFixed(3)}`, color: '#e0f7fa' }) - if (ann.tai != null) tags.push({ label: `tAI: ${ann.tai.toFixed(3)}`, color: '#e0f7fa' }) - if (ann.rscu != null) tags.push({ label: `RSCU: ${ann.rscu.toFixed(2)}`, color: '#e0f7fa' }) - - if (tags.length === 0) return null - return ( -
- {tags.map((t, i) => ( - {t.label} - ))} -
- ) - })()} - {/* Sequence examples */}
Top Activating Sequences
@@ -781,8 +498,6 @@ const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, fo setShowDetailPage(false)} /> )} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx index 8e3ec0ce9b..f60f68d373 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx @@ -2,39 +2,6 @@ import React, { useState, useEffect, useRef } from 'react' import SequenceView, { computeAlignInfo } from './SequenceView' import { getRegionLabel } from './utils' -// ── Codon-to-AA lookup for logit chart ────────────────────────────── -const CODON_AA = { - 'TTT':'F','TTC':'F','TTA':'L','TTG':'L','CTT':'L','CTC':'L','CTA':'L','CTG':'L', - 'ATT':'I','ATC':'I','ATA':'I','ATG':'M','GTT':'V','GTC':'V','GTA':'V','GTG':'V', - 'TCT':'S','TCC':'S','TCA':'S','TCG':'S','CCT':'P','CCC':'P','CCA':'P','CCG':'P', - 'ACT':'T','ACC':'T','ACA':'T','ACG':'T','GCT':'A','GCC':'A','GCA':'A','GCG':'A', - 'TAT':'Y','TAC':'Y','TAA':'*','TAG':'*','CAT':'H','CAC':'H','CAA':'Q','CAG':'Q', - 'AAT':'N','AAC':'N','AAA':'K','AAG':'K','GAT':'D','GAC':'D','GAA':'E','GAG':'E', - 'TGT':'C','TGC':'C','TGA':'*','TGG':'W','CGT':'R','CGC':'R','CGA':'R','CGG':'R', - 'AGT':'S','AGC':'S','AGA':'R','AGG':'R','GGT':'G','GGC':'G','GGA':'G','GGG':'G', -} - -// Group codons by amino acid, excluding stop codons -const AA_GROUPS = {} -for (const [codon, aa] of Object.entries(CODON_AA)) { - if (aa === '*') continue - if (!AA_GROUPS[aa]) AA_GROUPS[aa] = [] - AA_GROUPS[aa].push(codon) -} -const AA_ORDER = Object.keys(AA_GROUPS).sort() - -// Color palette for amino acid groups -const AA_COLORS = { - // Nonpolar - 'G': '#e8e8e8', 'A': '#c8c8c8', 'V': '#b0b0b0', 'L': '#a0a0a0', 'I': '#909090', - 'P': '#d0d0a0', 'F': '#c0b0a0', 'W': '#b0a090', 'M': '#a09080', - // Polar - 'S': '#b0d0ff', 'T': '#a0c0f0', 'C': '#90b0e0', 'Y': '#80a0d0', - 'N': '#a0d0b0', 'Q': '#90c0a0', - // Charged - 'D': '#ffb0b0', 'E': '#ffa0a0', 'K': '#b0b0ff', 'R': '#a0a0ff', 'H': '#c0b0ff', -} - const styles = { overlay: { position: 'fixed', @@ -63,10 +30,6 @@ const styles = { fontWeight: '700', color: 'var(--text-heading)', }, - subtitle: { - fontSize: '11px', - color: 'var(--text-secondary)', - }, closeBtn: { background: 'none', border: '1px solid var(--border-input)', @@ -87,42 +50,6 @@ const styles = { color: 'var(--text-heading)', textTransform: 'uppercase', }, - sectionSubtitle: { - fontSize: '9px', - color: 'var(--text-muted)', - marginBottom: '6px', - }, - statsGrid: { - display: 'grid', - gridTemplateColumns: 'repeat(4, 1fr)', - gap: '8px', - }, - statCard: { - background: 'var(--bg-card-expanded)', - borderRadius: '4px', - padding: '6px 8px', - textAlign: 'center', - }, - statNumber: { - fontSize: '14px', - fontWeight: '700', - color: 'var(--text-heading)', - }, - statLabel: { - fontSize: '8px', - color: 'var(--text-tertiary)', - textTransform: 'uppercase', - marginTop: '2px', - }, - tag: { - display: 'inline-block', - padding: '3px 8px', - borderRadius: '4px', - fontSize: '11px', - fontWeight: '500', - marginRight: '6px', - marginBottom: '4px', - }, example: { marginBottom: '6px', padding: '6px 8px', @@ -138,207 +65,52 @@ const styles = { display: 'flex', justifyContent: 'space-between', }, + placeholder: { + border: '1px dashed var(--border)', + borderRadius: '6px', + padding: '24px', + textAlign: 'center', + color: 'var(--text-muted)', + fontSize: '12px', + fontStyle: 'italic', + }, + placeholderLabel: { + fontSize: '13px', + fontWeight: '500', + color: 'var(--text-muted)', + marginBottom: '8px', + }, } - -// ── Vocab Logit Chart Component ───────────────────────────────────── - -function VocabLogitChart({ logits }) { - if (!logits) return null - - // Build codon logit map, excluding stop codons (universally suppressed, not informative) - const codonLogitMap = {} - for (const [codon, val] of logits.top_positive) { - if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val - } - for (const [codon, val] of logits.top_negative) { - if (CODON_AA[codon] !== '*') codonLogitMap[codon] = val - } - - const maxAbs = Math.max(...Object.values(codonLogitMap).map(Math.abs), 0.001) - - return ( -
-
- {AA_ORDER.map(aa => { - const codons = AA_GROUPS[aa] || [] - const aaColor = AA_COLORS[aa] || 'var(--border-light)' - return ( -
-
- {aa} -
-
- {codons.sort().map(codon => { - const val = codonLogitMap[codon] || 0 - const h = Math.max(2, (Math.abs(val) / maxAbs) * 34) - const isPos = val > 0 - return ( -
-
- - {codon} - -
- ) - })} -
-
- ) - })} -
-
- Promoted - Suppressed -
-
- ) -} - - -// ── Codon Annotations Component ───────────────────────────────────── - -function CodonAnnotations({ annotations }) { - if (!annotations || Object.keys(annotations).length === 0) { - return
No significant annotations detected
- } - - const items = [] - - if (annotations.amino_acid) { - items.push({ - label: 'Amino Acid', - value: `${annotations.amino_acid.aa} (${(annotations.amino_acid.fraction * 100).toFixed(0)}% of activations)`, - color: '#e3f2fd', - }) - } - if (annotations.codon_usage) { - items.push({ - label: 'Codon Usage', - value: `Prefers ${annotations.codon_usage.bias} codons (${(annotations.codon_usage.fraction * 100).toFixed(0)}%)`, - color: '#fff3e0', - }) - } - if (annotations.wobble) { - items.push({ - label: 'Wobble Position', - value: `${annotations.wobble.preference} preference (${(annotations.wobble.fraction * 100).toFixed(0)}%)`, - color: '#f3e5f5', - }) - } - if (annotations.cpg) { - items.push({ - label: 'CpG Context', - value: `Enriched (${(annotations.cpg.enrichment * 100).toFixed(0)}% of activations at CpG boundaries)`, - color: '#fce4ec', - }) - } - if (annotations.position) { - items.push({ - label: 'Gene Position', - value: `N-terminal enriched (${annotations.position.enrichment.toFixed(1)}x over expected)`, - color: '#e8f5e9', - }) - } - - return ( -
- {items.map((item, i) => ( -
- - {item.label}: - {' '} - {item.value} -
- ))} -
- ) -} - - -// ── Feature Metrics Component ─────────────────────────────────────── - -function FeatureMetrics({ feature }) { - const metrics = [ - { key: 'mean_variant_1bcdwt', label: 'Mean Variant (1B CDWT)' }, - { key: 'high_score_fraction', label: 'High Score Fraction' }, - { key: 'clinvar_fraction', label: 'ClinVar Fraction' }, - { key: 'mean_phylop', label: 'Mean PhyloP' }, - { key: 'mean_variant_delta', label: 'Mean Variant Delta' }, - { key: 'mean_site_delta', label: 'Mean Site Delta' }, - { key: 'mean_local_delta', label: 'Mean Local Delta' }, - { key: 'gc_mean', label: 'GC Mean' }, - { key: 'gc_std', label: 'GC Std' }, - { key: 'trinuc_entropy', label: 'Trinuc Entropy' }, - { key: 'gene_entropy', label: 'Gene Entropy' }, - { key: 'gene_n_unique', label: 'Gene N Unique' }, - ] - - const available = metrics.filter(m => feature[m.key] != null && !isNaN(feature[m.key])) - if (available.length === 0) return null - - return ( -
- {available.map(m => ( -
-
- {typeof feature[m.key] === 'number' - ? Math.abs(feature[m.key]) >= 100 ? feature[m.key].toFixed(0) - : Math.abs(feature[m.key]) >= 1 ? feature[m.key].toFixed(2) - : feature[m.key].toFixed(4) - : feature[m.key]} -
-
{m.label}
-
- ))} -
- ) -} - - -// ── Main Detail Page ──────────────────────────────────────────────── - -export default function FeatureDetailPage({ feature, examples, vocabLogits, featureAnalysis, onClose }) { +export default function FeatureDetailPage({ feature, examples, onClose }) { const [alignMode, setAlignMode] = useState('max_activation') const scrollGroupRef = useRef(null) - const fid = String(feature.feature_id) - const logits = vocabLogits ? vocabLogits[fid] : null - const analysis = featureAnalysis ? featureAnalysis[fid] : null - const freq = feature.activation_freq || 0 const maxAct = feature.max_activation || 0 - const description = feature.description || `Feature ${feature.feature_id}` + const description = feature.description || feature.label || `Feature ${feature.feature_id}` - // Close on Escape useEffect(() => { const handleKey = (e) => { if (e.key === 'Escape') onClose() } document.addEventListener('keydown', handleKey) return () => document.removeEventListener('keydown', handleKey) }, [onClose]) - const visibleExamples = (examples || []).slice(0, 6) - const { anchor: alignAnchor, totalLength } = computeAlignInfo(visibleExamples, alignMode) + const visibleExamples = (examples || []).slice(0, 30) + const { anchor: alignAnchor, totalLength } = computeAlignInfo(visibleExamples.slice(0, 6), alignMode) return (
{ if (e.target === e.currentTarget) onClose() }}>
- {/* Header + stats in one row */}
-
Feature #{feature.feature_id} {description}
+
+ Feature #{feature.feature_id} + + {description} + +
@@ -349,83 +121,6 @@ export default function FeatureDetailPage({ feature, examples, vocabLogits, feat
- {/* Feature Metrics from color-by columns */} -
-
Feature Metrics
-
- Variant analysis and sequence composition metrics for this feature. -
- -
- - {/* Vocabulary Logits */} -
-
Decoder Logits — Promoted / Suppressed Codons
-
- Projection of this feature's decoder weight through the Encodon LM head, with the mean logit vector subtracted. - This mean-centering removes the model's shared baseline bias (e.g. toward common codons like GCC), so values reflect what this feature specifically promotes (green) or suppresses (red) relative to the average feature. - Stop codons (TAA/TAG/TGA) are excluded — they are uniformly suppressed across all features since the model was trained on coding sequences. -
- -
- - {/* Gene-Level GSEA Enrichment */} - {(() => { - const gseaFields = [ - { key: 'gsea_GO_Biological_Process', label: 'GO Biological Process' }, - { key: 'gsea_GO_Molecular_Function', label: 'GO Molecular Function' }, - { key: 'gsea_GO_Cellular_Component', label: 'GO Cellular Component' }, - { key: 'gsea_InterPro_Domains', label: 'InterPro Domains' }, - { key: 'gsea_GO_Slim', label: 'GO Slim' }, - ] - const gseaEntries = gseaFields - .map(({ key, label }) => ({ label, value: feature[key] })) - .filter(e => e.value && e.value !== 'unlabeled' && e.value !== 'other') - const overallBest = feature.gsea_overall_best - if (gseaEntries.length === 0 && (!overallBest || overallBest === 'unlabeled')) return null - return ( -
-
Gene-Level Enrichment (GSEA)
-
- Genes ranked by activation strength, tested against GO and InterPro databases. -
- {overallBest && overallBest !== 'unlabeled' && ( -
- Best: {overallBest} -
- )} -
- {gseaEntries.map(({ label, value }) => ( -
-
- {label} -
-
{value}
-
- ))} -
-
- ) - })()} - - {/* Codon Annotations */} -
-
Codon-Level Annotations
-
- Computed per-codon properties correlated with this feature's activations. -
- -
- - {/* Top Activating Sequences */}
Top Activating Sequences
@@ -449,69 +144,39 @@ export default function FeatureDetailPage({ feature, examples, vocabLogits, feat
{visibleExamples.length > 0 ? ( - <> - {visibleExamples.map((ex, i) => ( -
-
- - {getRegionLabel(ex)} - - max: {ex.max_activation?.toFixed(3)} -
- + visibleExamples.map((ex, i) => ( +
+
+ {getRegionLabel(ex)} + max: {ex.max_activation?.toFixed(3)}
- ))} - + +
+ )) ) : (
No examples loaded
)}
{/* v2 roadmap placeholders — populated when annotation + conservation pipelines land. */} -
-
- Annotations -
-
+
+
Annotations
+
Annotation overlay (RefSeq, Rfam, JASPAR) — coming in v2
-
-
- Conservation -
-
+
+
Conservation
+
Conservation track (phyloP) — coming in v2
diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py index dc7f72e1cc..2d29167fc6 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py @@ -27,56 +27,53 @@ import pandas as pd -# Plausible biological labels (20 features) — visible motifs in the synthetic sequences. +# DNA-native labels for evo2 features, each with a real central signature spliced into +# the middle of the 200bp window so the mockup features are visually distinguishable. LABELS = [ - "exon-start motif", - "tRNA acceptor stem", - "intergenic GC-rich", - "stop codon context", - "ribosome binding site", - "promoter -10 box", + "Start codon (ATG) context", + "TATA box", + "Polyadenylation signal", + "Bacterial promoter -10 box", "CpG island", - "splice donor", - "polyA signal", - "start codon ATG context", - "transposon repeat", - "rRNA conserved region", - "operon intergenic", - "frameshift-sensitive region", - "high-conservation coding", - "intron branch point", - "TF binding motif", - "phage integrase region", - "origin of replication", "Shine-Dalgarno sequence", + "Bacterial promoter -35 box", + "Splice donor site", + "Splice acceptor site", + "Stop codon (TAA) context", + "Stop codon (TAG) context", ] # Plausible accessions to rotate across examples. SEQ_IDS = ["NC_000913.3", "NC_002695.2", "chr1", "chr17"] -# Central motifs to splice into each feature's top-activating windows. -# Doesn't need biological rigor — just makes features visually distinguishable in the demo. +# Central motif spliced into the middle ~20bp of each top-activating window. CENTRAL_MOTIFS = { - "exon-start motif": "AGGTAAGT", - "tRNA acceptor stem": "CCCGGGT", - "intergenic GC-rich": "GCGCGCGC", - "stop codon context": "TAATAATAA", - "ribosome binding site": "AGGAGG", - "promoter -10 box": "TATAAT", - "CpG island": "CGCGCGCG", - "splice donor": "GTAAGT", - "polyA signal": "AATAAA", - "start codon ATG context": "ATGGCC", - "transposon repeat": "TTAATTAA", - "rRNA conserved region": "GUCAGCUGGUC".replace("U", "T"), - "operon intergenic": "AAATTT", - "frameshift-sensitive region": "AAAAAAA", - "high-conservation coding": "GCAGCAGCA", - "intron branch point": "TACTAAC", - "TF binding motif": "TGACTCA", - "phage integrase region": "GCTAGGTGT", - "origin of replication": "ATCGATCG", + "Start codon (ATG) context": "GCCACCATGGCC", + "TATA box": "TATAAA", + "Polyadenylation signal": "AATAAA", + "Bacterial promoter -10 box": "TATAAT", + "CpG island": "CGCGCGCGCGCGCGCG", "Shine-Dalgarno sequence": "AGGAGGT", + "Bacterial promoter -35 box": "TTGACA", + "Splice donor site": "GTAAGT", # GT at exon-intron boundary, with consensus context + "Splice acceptor site": "TTTTCAGG", # AG at intron-exon boundary, with pyrimidine tract + "Stop codon (TAA) context": "GCCTAAGCC", # TAA in coding context + "Stop codon (TAG) context": "GCCTAGGCC", # TAG in coding context +} + +# Annotation-database source for each feature label. +DB_SOURCES = { + "Start codon (ATG) context": "RefSeq", + "TATA box": "JASPAR / ENCODE", + "Polyadenylation signal": "RefSeq UTR", + "Bacterial promoter -10 box": "bacterial annotation", + "CpG island": "ENCODE / RefSeq", + "Shine-Dalgarno sequence": "bacterial annotation", + "Bacterial promoter -35 box": "bacterial annotation", + "Splice donor site": "RefSeq", + "Splice acceptor site": "RefSeq", + "Stop codon (TAA) context": "RefSeq", + "Stop codon (TAG) context": "RefSeq", } @@ -133,6 +130,7 @@ def _make_features(rng: np.random.Generator) -> list[dict]: "feature_id": fid, "description": label, "label": label, + "db_source": DB_SOURCES[label], "activation_freq": round(activation_freq, 6), "max_activation": round(max_activation, 4), "top_positive_logits": [], @@ -144,15 +142,46 @@ def _make_features(rng: np.random.Generator) -> list[dict]: def _make_atlas(rng: np.random.Generator, features: list[dict]) -> pd.DataFrame: - """Build features_atlas.parquet — synthetic UMAP coords with 4 visible clusters of 5 features each.""" - n_clusters = 4 - cluster_centers = rng.uniform(-5.0, 5.0, size=(n_clusters, 2)) + """Build features_atlas.parquet — UMAP coords grouped into thematic clusters. + + Labeled features sit in 3 clusters: eukaryotic regulatory (0), bacterial regulatory (1), + codon context (2). Unlabeled features (label==None) land in a 4th "uninterpreted" cluster (3) + spread more diffusely between the others — mimicking what a real SAE would look like. + """ + cluster_assignments = { + "Start codon (ATG) context": 2, + "TATA box": 0, + "Polyadenylation signal": 0, + "Bacterial promoter -10 box": 1, + "CpG island": 0, + "Shine-Dalgarno sequence": 1, + "Bacterial promoter -35 box": 1, + "Splice donor site": 0, + "Splice acceptor site": 0, + "Stop codon (TAA) context": 2, + "Stop codon (TAG) context": 2, + } + cluster_centers = { + 0: (-3.0, 1.5), + 1: (3.0, 1.5), + 2: (0.0, -3.0), + 3: (0.0, 0.5), # uninterpreted: between the other clusters + } + coords = [] - for fid in range(len(features)): - cluster_idx = fid // (len(features) // n_clusters) - center = cluster_centers[cluster_idx] - xy = center + rng.normal(0, 0.5, size=2) - coords.append(xy) + cluster_ids = [] + for f in features: + if f["label"] is None: + cid = 3 + sigma = 1.4 # diffuse for the unlabeled cloud + else: + cid = cluster_assignments[f["label"]] + sigma = 0.4 + cx, cy = cluster_centers[cid] + x = cx + rng.normal(0, sigma) + y = cy + rng.normal(0, sigma) + coords.append((x, y)) + cluster_ids.append(cid) coords = np.array(coords) return pd.DataFrame( @@ -161,14 +190,63 @@ def _make_atlas(rng: np.random.Generator, features: list[dict]) -> pd.DataFrame: "x": coords[:, 0].round(4), "y": coords[:, 1].round(4), "label": [f["label"] for f in features], + "db_source": [f["db_source"] for f in features], "activation_freq": [f["activation_freq"] for f in features], "log_frequency": [round(float(np.log10(f["activation_freq"])), 4) for f in features], "max_activation": [f["max_activation"] for f in features], - "cluster": [fid // (len(features) // n_clusters) for fid in range(len(features))], + "cluster_id": cluster_ids, } ) +def _make_unlabeled_example(rng: np.random.Generator, feature_max: float, window: int = 200) -> dict: + """A top-activating example for an unlabeled feature: random sequence + gaussian activation bump.""" + seq = _random_dna(rng, window) + bump_center = int(rng.integers(60, 141)) + sigma = 8.0 + peak = float(feature_max * rng.uniform(0.5, 1.0)) + positions = np.arange(window) + activations = peak * np.exp(-((positions - bump_center) ** 2) / (2 * sigma**2)) + activations[activations < 0.01] = 0.0 + + seq_id = SEQ_IDS[int(rng.integers(0, len(SEQ_IDS)))] + start = int(rng.integers(1, 5_000_001)) + + return { + "sequence_id": seq_id, + "start": start, + "end": start + window, + "sequence": seq, + "activations": [round(float(a), 3) for a in activations], + "max_activation": round(float(activations.max()), 4), + "max_activation_position": int(activations.argmax()), + } + + +def _make_unlabeled_features(rng: np.random.Generator, n: int, start_id: int) -> list[dict]: + """Build n unlabeled features — no semantic label, random top-activator sequences.""" + out = [] + for i in range(n): + fid = start_id + i + activation_freq = float(np.exp(rng.uniform(np.log(0.001), np.log(0.1)))) + max_activation = float(rng.uniform(5.0, 30.0)) + examples = [_make_unlabeled_example(rng, max_activation) for _ in range(30)] + out.append( + { + "feature_id": fid, + "description": None, + "label": None, + "db_source": None, + "activation_freq": round(activation_freq, 6), + "max_activation": round(max_activation, 4), + "top_positive_logits": [], + "top_negative_logits": [], + "examples": examples, + } + ) + return out + + def _make_examples_table(features: list[dict]) -> pd.DataFrame: """Flatten per-feature examples into a long table for feature_examples.parquet. @@ -188,7 +266,7 @@ def _make_examples_table(features: list[dict]) -> pd.DataFrame: "activations": ex["activations"], "max_activation": ex["max_activation"], "max_activation_position": ex["max_activation_position"], - "best_annotation": None, + "best_annotation": feature["db_source"], } ) return pd.DataFrame(rows) @@ -208,6 +286,7 @@ def main(): action="store_true", help="Also write features.json (only useful if you point the dashboard at the legacy JSON path)", ) + p.add_argument("--n-unlabeled", type=int, default=9, help="How many unlabeled features to add alongside the labeled ones") p.add_argument("--seed", type=int, default=42) args = p.parse_args() @@ -215,6 +294,7 @@ def main(): args.output_dir.mkdir(parents=True, exist_ok=True) features = _make_features(rng) + features += _make_unlabeled_features(rng, n=args.n_unlabeled, start_id=len(features)) atlas = _make_atlas(rng, features) atlas.to_parquet(args.output_dir / "features_atlas.parquet", index=False) From c36ed2fae732c1d23c45ba0874a3c539c58613c7 Mon Sep 17 00:00:00 2001 From: Polina Binder Date: Wed, 27 May 2026 18:02:40 +0000 Subject: [PATCH 06/12] evo2 dashboard mockup: per-feature WebLogo PNGs via logomaker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each of the 11 labeled features now ships with a PWM-driven sequence logo rendered into public/logos/feature_{id}.png by logomaker. Central signatures are spec'd per label (Kozak ATG, TATA, polyA, CpG, Shine- Dalgarno, bacterial -10/-35, splice donor/acceptor, stop TAA/TAG); flanks are uniform 0-bit so the logos read as clean motif summaries rather than noisy speckle. Unlabeled features get no logo — their cards skip the section entirely. make_mockup_features.py grows _build_pwm() and _render_logo(); the metadata/atlas parquets carry a logo_path column; App.jsx detects it optionally and excludes it from category detection; FeatureCard's expanded view and FeatureDetailPage display the logo above the top- activating-sequences list. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../public/feature_metadata.parquet | Bin 7048 -> 7705 bytes .../public/features_atlas.parquet | Bin 7048 -> 7705 bytes .../public/logos/feature_0.png | Bin 0 -> 21798 bytes .../public/logos/feature_1.png | Bin 0 -> 17353 bytes .../public/logos/feature_10.png | Bin 0 -> 19788 bytes .../public/logos/feature_2.png | Bin 0 -> 17994 bytes .../public/logos/feature_3.png | Bin 0 -> 16410 bytes .../public/logos/feature_4.png | Bin 0 -> 22419 bytes .../public/logos/feature_5.png | Bin 0 -> 19657 bytes .../public/logos/feature_6.png | Bin 0 -> 17391 bytes .../public/logos/feature_7.png | Bin 0 -> 16672 bytes .../public/logos/feature_8.png | Bin 0 -> 18396 bytes .../public/logos/feature_9.png | Bin 0 -> 19370 bytes .../evo2/evo2_dashboard_mockup/src/App.jsx | 8 +- .../evo2_dashboard_mockup/src/FeatureCard.jsx | 10 ++ .../src/FeatureDetailPage.jsx | 11 ++ .../evo2/scripts/make_mockup_features.py | 160 ++++++++++++++++++ 17 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_0.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_1.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_10.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_2.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_3.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_4.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_5.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_6.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_7.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_8.png create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_9.png diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_metadata.parquet b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/feature_metadata.parquet index 108aedd4e1c21cf3b8da9e773bb337047ea4d4a0..8a4669579943588c39d3cd5daf05d2c58c55e710 100644 GIT binary patch delta 1212 zcmaJ>OHUI~6uy+w00E>;?>M8VSfQE3#%T-XVMxdw>I~0@5+0q237Nj8mbNq$3bN@| z7jB%58rQB!)UY$g7=M9Vjs62;Si3NubK4T!aMONs9`}6bJNHieWb)!F_zqLg;+-I|imS^Ecjx$W@1YQXtsni0G+h3c0dH{mxPMt0CGq>Joc!fbFWaUl=9JLs%$FL(<8q*z>cq5hSol ziV@GCbYUZP39|5`OZejozP=Oudi$cvww%jFN+IfoQC$RJ5FRtahfc{O1$_bv_$~`_ zuv_>tGC-t|=&4$jtW^`=^q%(juehDFfxeM*&4JKxApa;=%5GPzaxQRxIB=eFhOelO z={@ZJ>{oD2IN!Xpo!X)1T=xYASXfOmrZQM_hIYE-`_$!>uX_7x>1ei|8dD2d-FANa z#s34x{w=3ReAdvhE~9G)rmh`>xrF{Wdw>>js$mA?Yv`*<@Z%ZGR}u6>#4rMHt`+Yp z$`p7HHefddd7hi-GPVO>^`a{9z444vSCqo)q@v*dh^w zi23yvKPZ7TTP`|9>6SbWrn+yW3VCBI5w=n$%v-9bfnloNBDLc+rS80!ZpaBNOzYE? zRMdQIrnHE;6)WbDZY~W6i|QBH!m8o~rJD`ZqiaQ=iyEo5YC0Oro0Y{Era+=3^te0cCLm>+Mwl?6H>Q^UQ+@2fz^_#K+W+3PyReh5Ro2fPo%?x}tmkk+cJ_qB&yTRfZ zZ8mS_lM9@0k$c?aR(K8xbh8Af70Hx0o7cu{B!C7PBy25>Kb_g@Bk~FSQZMfgc5VceqB|?ovQzEA_AS$RT72$j+3XwoCcI?oUrb(nYwmCU=u$$UdMASI# zC08z-d;;|+a6k&@p1E-3$S;83fSB1hC_-Xnk7vC*^WK};4^Q7!J`a=W+@~_fC&son z2&~(iQ91Q7k=@G)xvTll)Q>ej`+Fz5x0}pQReyDai~P!Gdt;;A^`xs@T#rM*SD_Mqu1N-XSgaz=4luuC1^_NyZk*G}tJ z1&Pv@N)FCjmFR_VcjjVTFL(pB>KUcZ$O+WE)vKNZ)GlHi8ICXaMezw9RBFf)DUc(= zOCyTXxL&)-}H$G?|13a%HeCxYQ~-2ve3v$PjG^H+Pvhqu0z^y6HJ}f717> zfgNa5P~Tz>As>JiT?_YSGPR)IInhhaiK91$Cas%8JhczY`s$(?|MrFH?$^~5v&Z^? z{M(DZ9bU#Lu|A24uIeMH66u*i@vop-cL^8^qUo*uv(m%hwoI)rQv=t4*# z&`lsThKk{Guyi|C>)~J@1DJv4IWM&fQ(H_Hhk*qUAf$q^b=mh>^zF`rhgSl}{qN!U K49B&gQ}_d>H`eO_ diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/features_atlas.parquet b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/features_atlas.parquet index 108aedd4e1c21cf3b8da9e773bb337047ea4d4a0..8a4669579943588c39d3cd5daf05d2c58c55e710 100644 GIT binary patch delta 1212 zcmaJ>OHUI~6uy+w00E>;?>M8VSfQE3#%T-XVMxdw>I~0@5+0q237Nj8mbNq$3bN@| z7jB%58rQB!)UY$g7=M9Vjs62;Si3NubK4T!aMONs9`}6bJNHieWb)!F_zqLg;+-I|imS^Ecjx$W@1YQXtsni0G+h3c0dH{mxPMt0CGq>Joc!fbFWaUl=9JLs%$FL(<8q*z>cq5hSol ziV@GCbYUZP39|5`OZejozP=Oudi$cvww%jFN+IfoQC$RJ5FRtahfc{O1$_bv_$~`_ zuv_>tGC-t|=&4$jtW^`=^q%(juehDFfxeM*&4JKxApa;=%5GPzaxQRxIB=eFhOelO z={@ZJ>{oD2IN!Xpo!X)1T=xYASXfOmrZQM_hIYE-`_$!>uX_7x>1ei|8dD2d-FANa z#s34x{w=3ReAdvhE~9G)rmh`>xrF{Wdw>>js$mA?Yv`*<@Z%ZGR}u6>#4rMHt`+Yp z$`p7HHefddd7hi-GPVO>^`a{9z444vSCqo)q@v*dh^w zi23yvKPZ7TTP`|9>6SbWrn+yW3VCBI5w=n$%v-9bfnloNBDLc+rS80!ZpaBNOzYE? zRMdQIrnHE;6)WbDZY~W6i|QBH!m8o~rJD`ZqiaQ=iyEo5YC0Oro0Y{Era+=3^te0cCLm>+Mwl?6H>Q^UQ+@2fz^_#K+W+3PyReh5Ro2fPo%?x}tmkk+cJ_qB&yTRfZ zZ8mS_lM9@0k$c?aR(K8xbh8Af70Hx0o7cu{B!C7PBy25>Kb_g@Bk~FSQZMfgc5VceqB|?ovQzEA_AS$RT72$j+3XwoCcI?oUrb(nYwmCU=u$$UdMASI# zC08z-d;;|+a6k&@p1E-3$S;83fSB1hC_-Xnk7vC*^WK};4^Q7!J`a=W+@~_fC&son z2&~(iQ91Q7k=@G)xvTll)Q>ej`+Fz5x0}pQReyDai~P!Gdt;;A^`xs@T#rM*SD_Mqu1N-XSgaz=4luuC1^_NyZk*G}tJ z1&Pv@N)FCjmFR_VcjjVTFL(pB>KUcZ$O+WE)vKNZ)GlHi8ICXaMezw9RBFf)DUc(= zOCyTXxL&)-}H$G?|13a%HeCxYQ~-2ve3v$PjG^H+Pvhqu0z^y6HJ}f717> zfgNa5P~Tz>As>JiT?_YSGPR)IInhhaiK91$Cas%8JhczY`s$(?|MrFH?$^~5v&Z^? z{M(DZ9bU#Lu|A24uIeMH66u*i@vop-cL^8^qUo*uv(m%hwoI)rQv=t4*# z&`lsThKk{Guyi|C>)~J@1DJv4IWM&fQ(H_Hhk*qUAf$q^b=mh>^zF`rhgSl}{qN!U K49B&gQ}_d>H`eO_ diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_0.png b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa768bcfadf2425ef91ed53e020d57a832beed9 GIT binary patch literal 21798 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 Sx8YkgP|EUZas@J`FaHnK>bXq- literal 0 HcmV?d00001 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_10.png b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_10.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea17e2517f7162c61afcf8d071a4f923d349416 GIT binary patch literal 19788 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 TPJ654ZNz-m$S*+ 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࿐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 literal 0 HcmV?d00001 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_5.png b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_5.png new file mode 100644 index 0000000000000000000000000000000000000000..778ce71ced8a3640db506cd28bac46b45684302e GIT binary patch literal 19657 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 LMZ6m!l0$z05OoQ6 literal 0 HcmV?d00001 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_6.png b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_6.png new file mode 100644 index 0000000000000000000000000000000000000000..51ee2ab9d124925b3f19841340d4f1fdc8cacbb7 GIT binary patch literal 17391 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 literal 0 HcmV?d00001 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_7.png b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_7.png new file mode 100644 index 0000000000000000000000000000000000000000..f17f231dcde63d449bd3a772fa22cabf3283d849 GIT binary patch literal 16672 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 literal 0 HcmV?d00001 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_8.png b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_8.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6e2d4c5791853671270cc7ca653c24e8e57470 GIT binary patch literal 18396 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 literal 0 HcmV?d00001 diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_9.png b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/logos/feature_9.png new file mode 100644 index 0000000000000000000000000000000000000000..65a7c91cc895be317387e996e8f09726e623b008 GIT binary patch literal 19370 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 `"${c.name}"`) .join(', ') const extraSelect = categorySelectCols ? `, ${categorySelectCols}` : '' + // logo_path is optional — older parquets won't have it, so detect and + // include it only if the column exists. + const hasLogoPath = columns.some(c => c.name === 'logo_path') + const logoSelect = hasLogoPath ? ', logo_path' : '' const featuresResult = await vg.coordinator().query(` SELECT feature_id, @@ -605,6 +609,7 @@ export default function App({ title = "Evo 2 SAE Feature Explorer (Mockup)", sub max_activation, x, y + ${logoSelect} ${extraSelect} FROM features ORDER BY feature_id @@ -618,6 +623,7 @@ export default function App({ title = "Evo 2 SAE Feature Explorer (Mockup)", sub max_activation: row.max_activation, x: row.x, y: row.y, + logo_path: row.logo_path, } for (const col of detectedCategories) { if (col.type === 'string' || col.type === 'integer') { diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx index b32ae8b4e7..d45bc121df 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureCard.jsx @@ -438,6 +438,16 @@ const FeatureCard = forwardRef(function FeatureCard({ feature, isHighlighted, fo {expanded && (
+ {feature.logo_path && ( +
+
Sequence Logo
+ {`Sequence +
+ )} {/* Sequence examples */}
Top Activating Sequences
diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx index f60f68d373..b70fdcdbde 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/FeatureDetailPage.jsx @@ -121,6 +121,17 @@ export default function FeatureDetailPage({ feature, examples, onClose }) {
+ {feature.logo_path && ( +
+
Sequence Logo
+ {`Sequence +
+ )} +
Top Activating Sequences
diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py index 2d29167fc6..f3ccbccc99 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/make_mockup_features.py @@ -61,6 +61,73 @@ "Stop codon (TAG) context": "GCCTAGGCC", # TAG in coding context } +# 19bp PWM window centered on the activation peak (positions -9..+9). +PWM_WINDOW = 19 +PWM_PEAK = 9 +PWM_BASES = ["A", "C", "G", "T"] + + +# Per-position base probabilities for each feature's central signature. Positions +# outside the signature are filled with near-uniform (low information) draws so +# real-looking logos have low-info flanks. +PWM_SIGNATURES: dict[str, list[dict[str, float]]] = { + # Kozak-like GCCACCATGG — ATG at signature positions 6..8. + "Start codon (ATG) context": [ + {"G": 0.70}, {"C": 0.70}, {"C": 0.70}, {"A": 0.60}, {"C": 0.65}, + {"C": 0.60}, {"A": 0.95}, {"T": 0.95}, {"G": 0.95}, {"G": 0.75}, + ], + "TATA box": [ # TATAAA + {"T": 0.90}, {"A": 0.90}, {"T": 0.90}, + {"A": 0.70, "G": 0.20}, {"A": 0.95}, {"A": 0.80, "T": 0.15}, + ], + "Polyadenylation signal": [ # AATAAA + {"A": 0.90}, {"A": 0.90}, {"T": 0.85}, + {"A": 0.85}, {"A": 0.85}, {"A": 0.80}, + ], + "Bacterial promoter -10 box": [ # TATAAT + {"T": 0.90}, {"A": 0.85}, {"T": 0.85}, + {"A": 0.75}, {"A": 0.75}, {"T": 0.85}, + ], + # CpG-rich: alternating GC bias across 12 positions, no sharp single peak. + "CpG island": [ + {"C": 0.55, "G": 0.35}, {"G": 0.55, "C": 0.35}, + {"C": 0.55, "G": 0.35}, {"G": 0.55, "C": 0.35}, + {"C": 0.55, "G": 0.35}, {"G": 0.55, "C": 0.35}, + {"C": 0.55, "G": 0.35}, {"G": 0.55, "C": 0.35}, + {"C": 0.55, "G": 0.35}, {"G": 0.55, "C": 0.35}, + {"C": 0.55, "G": 0.35}, {"G": 0.55, "C": 0.35}, + ], + "Shine-Dalgarno sequence": [ # AGGAGGT + {"A": 0.80}, {"G": 0.90}, {"G": 0.90}, + {"A": 0.75}, {"G": 0.90}, {"G": 0.85}, {"T": 0.60}, + ], + "Bacterial promoter -35 box": [ # TTGACA + {"T": 0.90}, {"T": 0.85}, {"G": 0.85}, + {"A": 0.80}, {"C": 0.85}, {"A": 0.80}, + ], + # GT at the exon|intron boundary is essentially invariant. + "Splice donor site": [ # GT.AAGT + {"G": 0.99}, {"T": 0.99}, {"A": 0.60}, + {"A": 0.70}, {"G": 0.80}, {"T": 0.60}, + ], + # Pyrimidine tract leading into an invariant AG at the intron|exon boundary. + "Splice acceptor site": [ + {"T": 0.80}, {"T": 0.80}, {"T": 0.80}, {"T": 0.80}, + {"C": 0.70}, {"A": 0.99}, {"G": 0.99}, {"G": 0.55}, + ], + "Stop codon (TAA) context": [ # GCC.TAA.GCC — coding-context flanks + {"G": 0.45, "C": 0.40}, {"C": 0.55, "G": 0.30}, {"C": 0.50, "G": 0.35}, + {"T": 0.95}, {"A": 0.90}, {"A": 0.90}, + {"G": 0.45, "C": 0.40}, {"C": 0.55, "G": 0.30}, {"C": 0.50, "G": 0.35}, + ], + "Stop codon (TAG) context": [ + {"G": 0.45, "C": 0.40}, {"C": 0.55, "G": 0.30}, {"C": 0.50, "G": 0.35}, + {"T": 0.95}, {"A": 0.90}, {"G": 0.90}, + {"G": 0.45, "C": 0.40}, {"C": 0.55, "G": 0.30}, {"C": 0.50, "G": 0.35}, + ], +} + + # Annotation-database source for each feature label. DB_SOURCES = { "Start codon (ATG) context": "RefSeq", @@ -82,6 +149,80 @@ def _random_dna(rng: np.random.Generator, length: int) -> str: return "".join(rng.choice(list("ACGT"), size=length)) +def _build_pwm(rng: np.random.Generator, label: str | None) -> np.ndarray: + """Build a (PWM_WINDOW, 4) probability PWM for one feature label. + + Central signature pulled from PWM_SIGNATURES (or near-uniform for unlabeled + features). Flanks are exactly uniform (0 bits — blank logomaker columns) + so the logo reads as "this is the motif, everything else is background" + instead of a sea of tiny speckle letters. + """ + pwm = np.zeros((PWM_WINDOW, 4)) + uniform = np.full(4, 0.25) + signature = PWM_SIGNATURES.get(label) if label else None + + if signature is None: + # Unlabeled feature: essentially uniform — a very tight Dirichlet draw + # produces a flat, mostly-blank logo with no spurious consensus. + return np.tile(uniform, (PWM_WINDOW, 1)) + + sig_len = len(signature) + sig_start = PWM_PEAK - sig_len // 2 # center the signature on the activation peak + for i in range(PWM_WINDOW): + sig_idx = i - sig_start + if 0 <= sig_idx < sig_len: + spec = signature[sig_idx] + row = np.zeros(4) + for base, prob in spec.items(): + row[PWM_BASES.index(base)] = prob + # Distribute the remainder evenly across unspecified bases — no + # randomness, so secondary letters stay symmetric and quiet. + remainder = max(0.0, 1.0 - sum(spec.values())) + unspec = [b for b in PWM_BASES if b not in spec] + if unspec and remainder > 0: + share = remainder / len(unspec) + for b in unspec: + row[PWM_BASES.index(b)] = share + row = np.clip(row, 1e-6, None) + row /= row.sum() + pwm[i] = row + else: + # Flank: exactly uniform -> 0 bits -> blank column in the logo. + pwm[i] = uniform + + return pwm + + +def _render_logo(pwm: np.ndarray, feature_id: int, out_dir: Path) -> Path: + """Render a WebLogo-style PNG for one feature's PWM using logomaker. + + The information transform produces letter heights in bits (0..2). Position + labels are relative to the activation peak (-PWM_PEAK..+PWM_PEAK). + """ + import matplotlib + + matplotlib.use("Agg") # headless backend — safe for cron/CI + import logomaker + import matplotlib.pyplot as plt + + df = pd.DataFrame(pwm, columns=PWM_BASES) + info_df = logomaker.transform_matrix(df, from_type="probability", to_type="information") + + fig, ax = plt.subplots(figsize=(6, 1.8)) + logomaker.Logo(info_df, ax=ax, color_scheme="classic") + ax.set_xticks(range(PWM_WINDOW)) + ax.set_xticklabels([str(i - PWM_PEAK) for i in range(PWM_WINDOW)], fontsize=8) + ax.set_ylabel("Bits") + ax.set_ylim(0, 2) + ax.set_xlabel("Position relative to peak") + fig.tight_layout() + + out_path = out_dir / f"feature_{feature_id}.png" + fig.savefig(out_path, dpi=120, bbox_inches="tight") + plt.close(fig) + return out_path + + def _make_example(rng: np.random.Generator, label: str, feature_max: float, window: int = 200) -> dict: """Build one top-activating example: 200bp window with a central motif + a gaussian activation bump.""" seq = list(_random_dna(rng, window)) @@ -136,6 +277,7 @@ def _make_features(rng: np.random.Generator) -> list[dict]: "top_positive_logits": [], "top_negative_logits": [], "examples": examples, + "logo_path": f"/logos/feature_{fid}.png", } ) return features @@ -195,6 +337,7 @@ def _make_atlas(rng: np.random.Generator, features: list[dict]) -> pd.DataFrame: "log_frequency": [round(float(np.log10(f["activation_freq"])), 4) for f in features], "max_activation": [f["max_activation"] for f in features], "cluster_id": cluster_ids, + "logo_path": [f["logo_path"] for f in features], } ) @@ -242,6 +385,9 @@ def _make_unlabeled_features(rng: np.random.Generator, n: int, start_id: int) -> "top_positive_logits": [], "top_negative_logits": [], "examples": examples, + # No motif means no logo — the UI will fall back to its + # "no logo available" empty-state for unlabeled features. + "logo_path": None, } ) return out @@ -296,6 +442,20 @@ def main(): features = _make_features(rng) features += _make_unlabeled_features(rng, n=args.n_unlabeled, start_id=len(features)) + # Render one WebLogo PNG per labeled feature into /logos/. Unlabeled + # features get no logo — an empty WebLogo reads as a render bug, so we let + # the dashboard show its "no logo" empty state instead. + logo_dir = args.output_dir / "logos" + logo_dir.mkdir(parents=True, exist_ok=True) + rendered = 0 + for f in features: + if f["label"] is None: + continue + pwm = _build_pwm(rng, f["label"]) + _render_logo(pwm, f["feature_id"], logo_dir) + rendered += 1 + print(f"Wrote {rendered} logo PNGs -> {logo_dir}") + atlas = _make_atlas(rng, features) atlas.to_parquet(args.output_dir / "features_atlas.parquet", index=False) # feature_metadata is the same shape as the atlas for the mockup — the dashboard From 736571ddcf06fddcabca061c099beef4560a6824 Mon Sep 17 00:00:00 2001 From: Polina Binder Date: Wed, 27 May 2026 23:48:40 +0000 Subject: [PATCH 07/12] evo2 dashboard: ColoredSequence + GeneUMAPView + 500-gene precompute Two new visualizations for the SAE interpretability dashboard, plus the offline pipeline that produces the gene-UMAP precompute bundle. scripts/generate_fake_genes.py 500-row genes.tsv stand-in (gene_symbol, species, sequence) until a real curated catalog lands. Realistic-ish distributions across 7 species. scripts/gene_umap_precompute.py End-to-end offline pipeline: genes.tsv -> Evo2 1B layer-20 -> TopK SAE encode -> mean per gene -> UMAP (cosine) -> HDBSCAN clusters -> per-feature firing stats. Writes G.npz, genes_umap.parquet, feature_stats.parquet, manifest.json. Reuses predict_evo2 via torchrun subprocess; aggregates .pt files by seq_idx + pad_mask. Idempotent (skips predict if .pt files exist). src/ColoredSequence.jsx React component: paste a DNA sequence -> each base background-colored by its top-firing SAE feature, opacity scaled by activation strength. Two modes: top-feature (default), single-feature lookup. Builds mock activations internally when no `analysis` prop is supplied so the component works standalone before the /analyze backend is wired. Tableau-10 colorblind palette, hover tooltip with top-5 features, legend sorted by per-color position count. src/GeneUMAPView.jsx Renders the 500-gene UMAP via canvas. Loads G.bin (raw float32), genes_meta.json, feature_stats.json from public/gene_umap/. Click a feature in the sidebar -> instant recolor by activation strength (no recompute). Click Reorganize -> re-runs UMAP client-side with feature-weighted vectors (umap-js, ~2-5s at N=500), animates the transition with ease-in-out cubic. Hover shows gene metadata + top 5 firing features. src/Preview.jsx + src/index.jsx Tabbed entry at /#preview: "Main" (the existing dashboard, untouched), "ColoredSequence", "Gene UMAP". Hash-gated so / still goes to the unchanged production layout. The ColoredSequence tab includes a paste textarea so users can drop their own sequences in. public/gene_umap/ Precomputed bundle for the GeneUMAPView (G.bin 30 MB, plus small JSON metadata + per-feature stats filtered to n_firing >= 10). Dep change: umap-js for client-side reorganize. Generated genes are synthetic; replace fake_genes.tsv with a real curated 500-gene list and re-run the precompute when one is available. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../evo2/evo2_dashboard_mockup/package.json | 3 +- .../public/gene_umap/feature_stats.json | 1 + .../public/gene_umap/genes_meta.json | 1 + .../src/ColoredSequence.jsx | 422 ++++++++++++++ .../src/GeneUMAPView.jsx | 526 ++++++++++++++++++ .../evo2_dashboard_mockup/src/Preview.jsx | 262 +++++++++ .../evo2/evo2_dashboard_mockup/src/index.jsx | 7 +- .../evo2/scripts/gene_umap_precompute.py | 289 ++++++++++ .../evo2/scripts/generate_fake_genes.py | 104 ++++ 9 files changed, 1613 insertions(+), 2 deletions(-) create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/feature_stats.json create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/genes_meta.json create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/ColoredSequence.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/GeneUMAPView.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Preview.jsx create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/gene_umap_precompute.py create mode 100644 bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/scripts/generate_fake_genes.py diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json index 82810c8cd0..53674056a3 100644 --- a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/package.json @@ -15,7 +15,8 @@ "embedding-atlas": "^0.16.1", "lucide-react": "^0.577.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "umap-js": "^1.4.0" }, "devDependencies": { "@vitejs/plugin-react": "^4.2.0", diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/feature_stats.json b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/feature_stats.json new file mode 100644 index 0000000000..5c01d6f51e --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/feature_stats.json @@ -0,0 +1 @@ +[{"feature_id": 854, "n_firing": 500, "mean_act_when_firing": 0.5735225219726563}, {"feature_id": 14158, "n_firing": 500, "mean_act_when_firing": 0.422054931640625}, {"feature_id": 14972, "n_firing": 500, "mean_act_when_firing": 0.0019399394989013672}, {"feature_id": 753, "n_firing": 500, "mean_act_when_firing": 0.012941115379333496}, {"feature_id": 14430, "n_firing": 500, "mean_act_when_firing": 0.13240908813476562}, {"feature_id": 14445, "n_firing": 500, "mean_act_when_firing": 0.02097833824157715}, {"feature_id": 10134, "n_firing": 500, "mean_act_when_firing": 0.016052560806274416}, {"feature_id": 9808, "n_firing": 500, "mean_act_when_firing": 3.533483154296875}, {"feature_id": 9914, "n_firing": 500, "mean_act_when_firing": 4.035355712890625}, {"feature_id": 14640, "n_firing": 500, "mean_act_when_firing": 1.9735660400390624}, {"feature_id": 9995, "n_firing": 500, "mean_act_when_firing": 0.8867225341796875}, {"feature_id": 10022, "n_firing": 500, "mean_act_when_firing": 0.0025175206661224364}, {"feature_id": 10116, "n_firing": 500, "mean_act_when_firing": 0.0028858809471130373}, {"feature_id": 2367, "n_firing": 500, "mean_act_when_firing": 0.20003378295898439}, {"feature_id": 1903, "n_firing": 500, "mean_act_when_firing": 0.18634963989257813}, {"feature_id": 1949, "n_firing": 500, "mean_act_when_firing": 0.011851570129394532}, {"feature_id": 2042, "n_firing": 500, "mean_act_when_firing": 0.58524609375}, {"feature_id": 2249, "n_firing": 500, "mean_act_when_firing": 0.1594332733154297}, {"feature_id": 2255, "n_firing": 500, "mean_act_when_firing": 0.17579888916015626}, {"feature_id": 2278, "n_firing": 500, "mean_act_when_firing": 0.19216311645507814}, {"feature_id": 2302, "n_firing": 500, "mean_act_when_firing": 5.93609912109375}, {"feature_id": 2308, "n_firing": 500, "mean_act_when_firing": 0.5622594604492187}, {"feature_id": 2350, "n_firing": 500, "mean_act_when_firing": 4.20250927734375}, {"feature_id": 2362, "n_firing": 500, "mean_act_when_firing": 0.47245526123046877}, {"feature_id": 2363, "n_firing": 500, "mean_act_when_firing": 1.7555294189453126}, {"feature_id": 2735, "n_firing": 500, "mean_act_when_firing": 0.023078073501586915}, {"feature_id": 2868, "n_firing": 500, "mean_act_when_firing": 0.09518548583984375}, {"feature_id": 2451, "n_firing": 500, "mean_act_when_firing": 4.8780849609375}, {"feature_id": 13239, "n_firing": 500, "mean_act_when_firing": 3.9962861328125}, {"feature_id": 13257, "n_firing": 500, "mean_act_when_firing": 3.22142822265625}, {"feature_id": 12795, "n_firing": 500, "mean_act_when_firing": 0.691869384765625}, {"feature_id": 12847, "n_firing": 500, "mean_act_when_firing": 0.0026408610343933107}, {"feature_id": 12898, "n_firing": 500, "mean_act_when_firing": 0.04365055465698242}, {"feature_id": 12914, "n_firing": 500, "mean_act_when_firing": 3.97002197265625}, {"feature_id": 13018, "n_firing": 500, "mean_act_when_firing": 1.7331953125}, {"feature_id": 5480, "n_firing": 500, "mean_act_when_firing": 0.111423828125}, {"feature_id": 5628, "n_firing": 500, "mean_act_when_firing": 2.102603515625}, {"feature_id": 5915, "n_firing": 500, "mean_act_when_firing": 6.15371240234375}, {"feature_id": 5355, "n_firing": 500, "mean_act_when_firing": 0.6938885498046875}, {"feature_id": 3639, "n_firing": 500, "mean_act_when_firing": 0.003081073522567749}, {"feature_id": 3174, "n_firing": 500, "mean_act_when_firing": 4.3912158203125}, {"feature_id": 5445, "n_firing": 500, "mean_act_when_firing": 0.39828192138671875}, {"feature_id": 3758, "n_firing": 500, "mean_act_when_firing": 0.0669632339477539}, {"feature_id": 3938, "n_firing": 500, "mean_act_when_firing": 0.013493783950805664}, {"feature_id": 3455, "n_firing": 500, "mean_act_when_firing": 0.06545015716552735}, {"feature_id": 3624, "n_firing": 500, "mean_act_when_firing": 0.0040143651962280275}, {"feature_id": 4098, "n_firing": 500, "mean_act_when_firing": 5.1214970703125}, {"feature_id": 4195, "n_firing": 500, "mean_act_when_firing": 0.13430619812011718}, {"feature_id": 4213, "n_firing": 500, "mean_act_when_firing": 6.6485302734375}, {"feature_id": 10369, "n_firing": 500, "mean_act_when_firing": 0.6779512939453125}, {"feature_id": 10384, "n_firing": 500, "mean_act_when_firing": 2.208253662109375}, {"feature_id": 10411, "n_firing": 500, "mean_act_when_firing": 0.32022418212890624}, {"feature_id": 10192, "n_firing": 500, "mean_act_when_firing": 0.14324404907226562}, {"feature_id": 10226, "n_firing": 500, "mean_act_when_firing": 3.924589599609375}, {"feature_id": 10233, "n_firing": 500, "mean_act_when_firing": 4.179666015625}, {"feature_id": 10266, "n_firing": 500, "mean_act_when_firing": 3.879857421875}, {"feature_id": 8876, "n_firing": 500, "mean_act_when_firing": 7.14671435546875}, {"feature_id": 8444, "n_firing": 500, "mean_act_when_firing": 0.4030851135253906}, {"feature_id": 8532, "n_firing": 500, "mean_act_when_firing": 2.16598828125}, {"feature_id": 10331, "n_firing": 500, "mean_act_when_firing": 0.2119825134277344}, {"feature_id": 9242, "n_firing": 500, "mean_act_when_firing": 0.12972608947753905}, {"feature_id": 9425, "n_firing": 500, "mean_act_when_firing": 1.908638427734375}, {"feature_id": 9652, "n_firing": 500, "mean_act_when_firing": 12.7199365234375}, {"feature_id": 8887, "n_firing": 500, "mean_act_when_firing": 0.00249324893951416}, {"feature_id": 9106, "n_firing": 500, "mean_act_when_firing": 0.06010870742797852}, {"feature_id": 10925, "n_firing": 500, "mean_act_when_firing": 0.01358707618713379}, {"feature_id": 10928, "n_firing": 500, "mean_act_when_firing": 0.38553839111328125}, {"feature_id": 10508, "n_firing": 500, "mean_act_when_firing": 4.01555517578125}, {"feature_id": 10710, "n_firing": 500, "mean_act_when_firing": 0.011418463706970215}, {"feature_id": 11235, "n_firing": 500, "mean_act_when_firing": 4.213216796875}, {"feature_id": 11248, "n_firing": 500, "mean_act_when_firing": 0.0024393203258514405}, {"feature_id": 10940, "n_firing": 500, "mean_act_when_firing": 0.201283203125}, {"feature_id": 10954, "n_firing": 500, "mean_act_when_firing": 0.27410980224609377}, {"feature_id": 11017, "n_firing": 500, "mean_act_when_firing": 0.08304788208007813}, {"feature_id": 11023, "n_firing": 500, "mean_act_when_firing": 0.06686308288574219}, {"feature_id": 7187, "n_firing": 500, "mean_act_when_firing": 0.13520997619628905}, {"feature_id": 7203, "n_firing": 500, "mean_act_when_firing": 0.3245879821777344}, {"feature_id": 11153, "n_firing": 500, "mean_act_when_firing": 0.06109197235107422}, {"feature_id": 7353, "n_firing": 500, "mean_act_when_firing": 0.0889943389892578}, {"feature_id": 7674, "n_firing": 500, "mean_act_when_firing": 0.2676626892089844}, {"feature_id": 7183, "n_firing": 500, "mean_act_when_firing": 0.22184539794921876}, {"feature_id": 11426, "n_firing": 500, "mean_act_when_firing": 0.06673358154296875}, {"feature_id": 11437, "n_firing": 500, "mean_act_when_firing": 0.024420690536499024}, {"feature_id": 11514, "n_firing": 500, "mean_act_when_firing": 4.99950341796875}, {"feature_id": 11694, "n_firing": 500, "mean_act_when_firing": 3.62335009765625}, {"feature_id": 4465, "n_firing": 500, "mean_act_when_firing": 0.028810102462768553}, {"feature_id": 12566, "n_firing": 500, "mean_act_when_firing": 0.5402396240234375}, {"feature_id": 4901, "n_firing": 500, "mean_act_when_firing": 0.23247758483886719}, {"feature_id": 5028, "n_firing": 500, "mean_act_when_firing": 0.4753810729980469}, {"feature_id": 5094, "n_firing": 500, "mean_act_when_firing": 0.1700968017578125}, {"feature_id": 4288, "n_firing": 500, "mean_act_when_firing": 2.30087646484375}, {"feature_id": 4432, "n_firing": 500, "mean_act_when_firing": 0.09498374938964843}, {"feature_id": 7731, "n_firing": 500, "mean_act_when_firing": 0.004602519035339356}, {"feature_id": 7935, "n_firing": 500, "mean_act_when_firing": 0.5945326538085938}, {"feature_id": 7988, "n_firing": 500, "mean_act_when_firing": 3.0742138671875}, {"feature_id": 8091, "n_firing": 500, "mean_act_when_firing": 1.094202880859375}, {"feature_id": 6067, "n_firing": 500, "mean_act_when_firing": 4.18124365234375}, {"feature_id": 6094, "n_firing": 500, "mean_act_when_firing": 5.29808251953125}, {"feature_id": 6104, "n_firing": 500, "mean_act_when_firing": 0.43280953979492187}, {"feature_id": 8162, "n_firing": 500, "mean_act_when_firing": 0.07211083984375}, {"feature_id": 8192, "n_firing": 500, "mean_act_when_firing": 0.01568732166290283}, {"feature_id": 6716, "n_firing": 500, "mean_act_when_firing": 0.034960830688476566}, {"feature_id": 6760, "n_firing": 500, "mean_act_when_firing": 1.7310479736328126}, {"feature_id": 6375, "n_firing": 500, "mean_act_when_firing": 0.8084906616210937}, {"feature_id": 6384, "n_firing": 500, "mean_act_when_firing": 4.1115439453125}, {"feature_id": 11572, "n_firing": 500, "mean_act_when_firing": 0.204605712890625}, {"feature_id": 6875, "n_firing": 500, "mean_act_when_firing": 0.047212669372558594}, {"feature_id": 6898, "n_firing": 500, "mean_act_when_firing": 0.0032473230361938477}, {"feature_id": 6664, "n_firing": 500, "mean_act_when_firing": 0.27039529418945313}, {"feature_id": 1158, "n_firing": 500, "mean_act_when_firing": 0.006617843151092529}, {"feature_id": 1187, "n_firing": 500, "mean_act_when_firing": 63.96623828125}, {"feature_id": 1334, "n_firing": 500, "mean_act_when_firing": 0.06435319519042969}, {"feature_id": 810, "n_firing": 500, "mean_act_when_firing": 5.1905380859375}, {"feature_id": 829, "n_firing": 500, "mean_act_when_firing": 0.010755337715148926}, {"feature_id": 1427, "n_firing": 500, "mean_act_when_firing": 0.4896015930175781}, {"feature_id": 1497, "n_firing": 500, "mean_act_when_firing": 0.823124755859375}, {"feature_id": 1525, "n_firing": 500, "mean_act_when_firing": 0.2836512756347656}, {"feature_id": 1101, "n_firing": 500, "mean_act_when_firing": 4.6172197265625}, {"feature_id": 1685, "n_firing": 500, "mean_act_when_firing": 0.08255694580078125}, {"feature_id": 1734, "n_firing": 500, "mean_act_when_firing": 0.569169677734375}, {"feature_id": 1747, "n_firing": 500, "mean_act_when_firing": 0.28335430908203124}, {"feature_id": 1751, "n_firing": 500, "mean_act_when_firing": 0.012232295989990235}, {"feature_id": 1843, "n_firing": 500, "mean_act_when_firing": 0.1127149429321289}, {"feature_id": 13911, "n_firing": 500, "mean_act_when_firing": 5.11314453125}, {"feature_id": 13949, "n_firing": 500, "mean_act_when_firing": 0.4750253295898437}, {"feature_id": 14068, "n_firing": 500, "mean_act_when_firing": 1.8702066650390625}, {"feature_id": 14117, "n_firing": 500, "mean_act_when_firing": 0.18847988891601564}, {"feature_id": 13480, "n_firing": 500, "mean_act_when_firing": 3.31414208984375}, {"feature_id": 13226, "n_firing": 500, "mean_act_when_firing": 3.19839697265625}, {"feature_id": 13845, "n_firing": 500, "mean_act_when_firing": 0.19181057739257812}, {"feature_id": 13882, "n_firing": 500, "mean_act_when_firing": 0.08952278900146485}, {"feature_id": 13282, "n_firing": 500, "mean_act_when_firing": 1.1516104736328125}, {"feature_id": 13289, "n_firing": 500, "mean_act_when_firing": 4.22202001953125}, {"feature_id": 500, "n_firing": 500, "mean_act_when_firing": 1.0333017578125}, {"feature_id": 514, "n_firing": 500, "mean_act_when_firing": 4.8961572265625}, {"feature_id": 15020, "n_firing": 500, "mean_act_when_firing": 0.42861654663085935}, {"feature_id": 606, "n_firing": 500, "mean_act_when_firing": 0.006999518871307373}, {"feature_id": 216, "n_firing": 500, "mean_act_when_firing": 3.153514892578125}, {"feature_id": 3734, "n_firing": 499, "mean_act_when_firing": 0.02271640754653839}, {"feature_id": 1367, "n_firing": 499, "mean_act_when_firing": 0.006764267155068193}, {"feature_id": 14476, "n_firing": 499, "mean_act_when_firing": 0.016911344203299178}, {"feature_id": 13168, "n_firing": 498, "mean_act_when_firing": 0.020956763301987247}, {"feature_id": 765, "n_firing": 497, "mean_act_when_firing": 0.01082635933244732}, {"feature_id": 7228, "n_firing": 497, "mean_act_when_firing": 0.010697171002086739}, {"feature_id": 7339, "n_firing": 497, "mean_act_when_firing": 0.013628653597304039}, {"feature_id": 1739, "n_firing": 497, "mean_act_when_firing": 0.028229832409373233}, {"feature_id": 8581, "n_firing": 496, "mean_act_when_firing": 0.014545630062780073}, {"feature_id": 12781, "n_firing": 496, "mean_act_when_firing": 0.014818499165196572}, {"feature_id": 3069, "n_firing": 494, "mean_act_when_firing": 0.0799724486192711}, {"feature_id": 11140, "n_firing": 493, "mean_act_when_firing": 0.015918688164763228}, {"feature_id": 13033, "n_firing": 492, "mean_act_when_firing": 0.00204226883446298}, {"feature_id": 4683, "n_firing": 492, "mean_act_when_firing": 0.012019124457506629}, {"feature_id": 4794, "n_firing": 492, "mean_act_when_firing": 0.0075459620816920835}, {"feature_id": 11819, "n_firing": 491, "mean_act_when_firing": 0.00712790217273347}, {"feature_id": 8071, "n_firing": 489, "mean_act_when_firing": 0.010386510860700549}, {"feature_id": 12633, "n_firing": 489, "mean_act_when_firing": 0.023825109126865255}, {"feature_id": 125, "n_firing": 487, "mean_act_when_firing": 0.05128534618589178}, {"feature_id": 10381, "n_firing": 486, "mean_act_when_firing": 0.015825618932276596}, {"feature_id": 15209, "n_firing": 485, "mean_act_when_firing": 0.012986192015028491}, {"feature_id": 5606, "n_firing": 485, "mean_act_when_firing": 0.008145089001999688}, {"feature_id": 10306, "n_firing": 484, "mean_act_when_firing": 0.006224683986222448}, {"feature_id": 12839, "n_firing": 479, "mean_act_when_firing": 0.0744943877600429}, {"feature_id": 11797, "n_firing": 478, "mean_act_when_firing": 0.006056869877930964}, {"feature_id": 14256, "n_firing": 478, "mean_act_when_firing": 0.010469570319522874}, {"feature_id": 11161, "n_firing": 477, "mean_act_when_firing": 0.005913607979220664}, {"feature_id": 12175, "n_firing": 476, "mean_act_when_firing": 0.005259366596446317}, {"feature_id": 7705, "n_firing": 474, "mean_act_when_firing": 0.006229148635381385}, {"feature_id": 5428, "n_firing": 471, "mean_act_when_firing": 0.004586233961101297}, {"feature_id": 10315, "n_firing": 468, "mean_act_when_firing": 0.009625910693763668}, {"feature_id": 986, "n_firing": 468, "mean_act_when_firing": 0.010421775345109466}, {"feature_id": 1564, "n_firing": 467, "mean_act_when_firing": 0.004179315852914684}, {"feature_id": 6234, "n_firing": 465, "mean_act_when_firing": 0.00929755344185778}, {"feature_id": 5132, "n_firing": 464, "mean_act_when_firing": 0.00393989142672769}, {"feature_id": 15111, "n_firing": 459, "mean_act_when_firing": 0.004985471696375762}, {"feature_id": 1080, "n_firing": 454, "mean_act_when_firing": 0.010308459991925614}, {"feature_id": 9810, "n_firing": 453, "mean_act_when_firing": 0.004050280874138636}, {"feature_id": 10937, "n_firing": 452, "mean_act_when_firing": 0.006604978468565815}, {"feature_id": 12149, "n_firing": 451, "mean_act_when_firing": 0.0035292216785202534}, {"feature_id": 314, "n_firing": 449, "mean_act_when_firing": 0.005674140225009026}, {"feature_id": 3890, "n_firing": 442, "mean_act_when_firing": 0.05514664024249461}, {"feature_id": 762, "n_firing": 440, "mean_act_when_firing": 0.009910039468245074}, {"feature_id": 70, "n_firing": 438, "mean_act_when_firing": 0.007185917466742808}, {"feature_id": 1801, "n_firing": 436, "mean_act_when_firing": 0.0033438306882840776}, {"feature_id": 9262, "n_firing": 432, "mean_act_when_firing": 0.009619835350248549}, {"feature_id": 15141, "n_firing": 431, "mean_act_when_firing": 0.00870187763824817}, {"feature_id": 14779, "n_firing": 424, "mean_act_when_firing": 0.0029517814235867196}, {"feature_id": 4648, "n_firing": 419, "mean_act_when_firing": 0.009544324761074313}, {"feature_id": 14798, "n_firing": 414, "mean_act_when_firing": 0.0029553071312282395}, {"feature_id": 14339, "n_firing": 408, "mean_act_when_firing": 0.0026268018226997523}, {"feature_id": 3094, "n_firing": 405, "mean_act_when_firing": 0.0048770822124716675}, {"feature_id": 5095, "n_firing": 405, "mean_act_when_firing": 0.002592545379827052}, {"feature_id": 10793, "n_firing": 399, "mean_act_when_firing": 0.0025310528308227845}, {"feature_id": 6731, "n_firing": 389, "mean_act_when_firing": 0.007097347230102225}, {"feature_id": 13660, "n_firing": 389, "mean_act_when_firing": 0.004613883697588217}, {"feature_id": 6015, "n_firing": 388, "mean_act_when_firing": 0.001550126782397634}, {"feature_id": 12269, "n_firing": 387, "mean_act_when_firing": 0.004664520576634764}, {"feature_id": 2298, "n_firing": 382, "mean_act_when_firing": 0.00256067545626176}, {"feature_id": 9412, "n_firing": 371, "mean_act_when_firing": 0.0035337193635596098}, {"feature_id": 14198, "n_firing": 370, "mean_act_when_firing": 0.018175574895497915}, {"feature_id": 10590, "n_firing": 369, "mean_act_when_firing": 0.003862740870736802}, {"feature_id": 5985, "n_firing": 363, "mean_act_when_firing": 0.0022673014110113307}, {"feature_id": 4097, "n_firing": 361, "mean_act_when_firing": 0.002282968023146949}, {"feature_id": 14489, "n_firing": 355, "mean_act_when_firing": 0.002409536401990434}, {"feature_id": 3998, "n_firing": 355, "mean_act_when_firing": 0.002871796110985984}, {"feature_id": 11413, "n_firing": 352, "mean_act_when_firing": 0.003173629329963164}, {"feature_id": 7212, "n_firing": 350, "mean_act_when_firing": 0.015448658806937082}, {"feature_id": 8949, "n_firing": 344, "mean_act_when_firing": 0.0025373343811478724}, {"feature_id": 8689, "n_firing": 337, "mean_act_when_firing": 0.007267711424332344}, {"feature_id": 11736, "n_firing": 337, "mean_act_when_firing": 0.02384892415575882}, {"feature_id": 2607, "n_firing": 328, "mean_act_when_firing": 0.002561441100225216}, {"feature_id": 8646, "n_firing": 327, "mean_act_when_firing": 0.0018391944581944643}, {"feature_id": 14458, "n_firing": 323, "mean_act_when_firing": 0.0019098086622846384}, {"feature_id": 8449, "n_firing": 323, "mean_act_when_firing": 0.003111676904070119}, {"feature_id": 13466, "n_firing": 317, "mean_act_when_firing": 0.002328946763408673}, {"feature_id": 8740, "n_firing": 314, "mean_act_when_firing": 0.0022128632493839144}, {"feature_id": 10550, "n_firing": 311, "mean_act_when_firing": 0.0033058955355089194}, {"feature_id": 6572, "n_firing": 305, "mean_act_when_firing": 0.0028469255713165784}, {"feature_id": 7744, "n_firing": 298, "mean_act_when_firing": 0.007026701965588051}, {"feature_id": 746, "n_firing": 297, "mean_act_when_firing": 0.001744125226531366}, {"feature_id": 11715, "n_firing": 292, "mean_act_when_firing": 0.0019252077765660744}, {"feature_id": 10364, "n_firing": 290, "mean_act_when_firing": 0.002215587065137666}, {"feature_id": 15244, "n_firing": 266, "mean_act_when_firing": 0.0018196876784016315}, {"feature_id": 10091, "n_firing": 263, "mean_act_when_firing": 0.006911740103601956}, {"feature_id": 11825, "n_firing": 257, "mean_act_when_firing": 0.002897840065714914}, {"feature_id": 391, "n_firing": 250, "mean_act_when_firing": 0.0023526887893676757}, {"feature_id": 4913, "n_firing": 247, "mean_act_when_firing": 0.0025098857126737897}, {"feature_id": 6367, "n_firing": 242, "mean_act_when_firing": 0.00964975160015516}, {"feature_id": 12060, "n_firing": 239, "mean_act_when_firing": 0.003957772354700575}, {"feature_id": 8369, "n_firing": 238, "mean_act_when_firing": 0.0017966768320868997}, {"feature_id": 1399, "n_firing": 237, "mean_act_when_firing": 0.0025697936488606257}, {"feature_id": 2806, "n_firing": 237, "mean_act_when_firing": 0.004518885149734433}, {"feature_id": 14611, "n_firing": 233, "mean_act_when_firing": 0.026943706135893072}, {"feature_id": 2879, "n_firing": 229, "mean_act_when_firing": 0.012622292905915773}, {"feature_id": 6768, "n_firing": 228, "mean_act_when_firing": 0.001621008180735404}, {"feature_id": 9209, "n_firing": 221, "mean_act_when_firing": 0.0031373196058143856}, {"feature_id": 2437, "n_firing": 220, "mean_act_when_firing": 0.0013827941634438254}, {"feature_id": 298, "n_firing": 219, "mean_act_when_firing": 0.001999304991334541}, {"feature_id": 238, "n_firing": 219, "mean_act_when_firing": 0.002063433193180659}, {"feature_id": 7621, "n_firing": 217, "mean_act_when_firing": 0.0015359435762677873}, {"feature_id": 5363, "n_firing": 216, "mean_act_when_firing": 0.007661571105321248}, {"feature_id": 11676, "n_firing": 213, "mean_act_when_firing": 0.00142241014001515}, {"feature_id": 14207, "n_firing": 210, "mean_act_when_firing": 0.0014531341337022327}, {"feature_id": 11770, "n_firing": 202, "mean_act_when_firing": 0.0015034654943069609}, {"feature_id": 8816, "n_firing": 202, "mean_act_when_firing": 0.002027369224198974}, {"feature_id": 10750, "n_firing": 198, "mean_act_when_firing": 0.0024423346374974108}, {"feature_id": 3324, "n_firing": 183, "mean_act_when_firing": 0.0014866339704378054}, {"feature_id": 11081, "n_firing": 175, "mean_act_when_firing": 0.0014025568110602243}, {"feature_id": 14857, "n_firing": 172, "mean_act_when_firing": 0.0015310191137846126}, {"feature_id": 6640, "n_firing": 171, "mean_act_when_firing": 0.0017495310445975142}, {"feature_id": 3090, "n_firing": 159, "mean_act_when_firing": 0.001583650052172583}, {"feature_id": 7077, "n_firing": 153, "mean_act_when_firing": 0.0015358527501424153}, {"feature_id": 10096, "n_firing": 150, "mean_act_when_firing": 0.0015647408366203307}, {"feature_id": 3230, "n_firing": 150, "mean_act_when_firing": 0.0015894257028897603}, {"feature_id": 3707, "n_firing": 147, "mean_act_when_firing": 0.001162024582324385}, {"feature_id": 3401, "n_firing": 146, "mean_act_when_firing": 0.0016731323852930983}, {"feature_id": 4090, "n_firing": 143, "mean_act_when_firing": 0.0022512405485540002}, {"feature_id": 8352, "n_firing": 142, "mean_act_when_firing": 0.001324941784563199}, {"feature_id": 5181, "n_firing": 142, "mean_act_when_firing": 0.0028971036974812896}, {"feature_id": 2674, "n_firing": 142, "mean_act_when_firing": 0.0015158900912378875}, {"feature_id": 13123, "n_firing": 140, "mean_act_when_firing": 0.022012025969369072}, {"feature_id": 10991, "n_firing": 138, "mean_act_when_firing": 0.004291046356809312}, {"feature_id": 8164, "n_firing": 137, "mean_act_when_firing": 0.007364804727317643}, {"feature_id": 14083, "n_firing": 133, "mean_act_when_firing": 0.0014357175818063262}, {"feature_id": 15000, "n_firing": 130, "mean_act_when_firing": 0.001447685521382552}, {"feature_id": 1048, "n_firing": 129, "mean_act_when_firing": 0.0012509318054184434}, {"feature_id": 10695, "n_firing": 128, "mean_act_when_firing": 0.00236949953250587}, {"feature_id": 6592, "n_firing": 126, "mean_act_when_firing": 0.001525854780560448}, {"feature_id": 2407, "n_firing": 124, "mean_act_when_firing": 0.0012246691171200045}, {"feature_id": 13456, "n_firing": 116, "mean_act_when_firing": 0.001078779584374921}, {"feature_id": 12161, "n_firing": 115, "mean_act_when_firing": 0.0016832426838252856}, {"feature_id": 12160, "n_firing": 114, "mean_act_when_firing": 0.020467467475355716}, {"feature_id": 14080, "n_firing": 113, "mean_act_when_firing": 0.0016044734326084104}, {"feature_id": 15226, "n_firing": 112, "mean_act_when_firing": 0.0014244158353124345}, {"feature_id": 2467, "n_firing": 108, "mean_act_when_firing": 0.0020333735479248893}, {"feature_id": 14141, "n_firing": 108, "mean_act_when_firing": 0.0019038509991433886}, {"feature_id": 149, "n_firing": 107, "mean_act_when_firing": 0.009717263908029716}, {"feature_id": 14819, "n_firing": 106, "mean_act_when_firing": 0.0012545982059442773}, {"feature_id": 9216, "n_firing": 105, "mean_act_when_firing": 0.0036060929298400877}, {"feature_id": 2563, "n_firing": 104, "mean_act_when_firing": 0.0015235951600166468}, {"feature_id": 13314, "n_firing": 98, "mean_act_when_firing": 0.0013946530466177026}, {"feature_id": 6140, "n_firing": 95, "mean_act_when_firing": 0.001337725237796181}, {"feature_id": 9763, "n_firing": 92, "mean_act_when_firing": 0.001572741924420647}, {"feature_id": 9665, "n_firing": 92, "mean_act_when_firing": 0.001999588440293851}, {"feature_id": 1355, "n_firing": 91, "mean_act_when_firing": 0.0015736099455382797}, {"feature_id": 9894, "n_firing": 88, "mean_act_when_firing": 0.0015995346687056801}, {"feature_id": 14540, "n_firing": 86, "mean_act_when_firing": 0.0017363962739012963}, {"feature_id": 3957, "n_firing": 86, "mean_act_when_firing": 0.0016680202165315317}, {"feature_id": 7381, "n_firing": 85, "mean_act_when_firing": 0.0012972778257201699}, {"feature_id": 13305, "n_firing": 84, "mean_act_when_firing": 0.0011454156289498012}, {"feature_id": 1098, "n_firing": 84, "mean_act_when_firing": 0.001896130187170846}, {"feature_id": 9220, "n_firing": 84, "mean_act_when_firing": 0.001862375686566035}, {"feature_id": 10108, "n_firing": 84, "mean_act_when_firing": 0.0013216443005062285}, {"feature_id": 3395, "n_firing": 82, "mean_act_when_firing": 0.002453010983583404}, {"feature_id": 9372, "n_firing": 81, "mean_act_when_firing": 0.004834923479292128}, {"feature_id": 13366, "n_firing": 80, "mean_act_when_firing": 0.0022164754569530486}, {"feature_id": 4183, "n_firing": 78, "mean_act_when_firing": 0.0011907993600918697}, {"feature_id": 14196, "n_firing": 70, "mean_act_when_firing": 0.0013796769082546235}, {"feature_id": 8733, "n_firing": 68, "mean_act_when_firing": 0.001339703907861429}, {"feature_id": 13549, "n_firing": 68, "mean_act_when_firing": 0.0048263550681226395}, {"feature_id": 8658, "n_firing": 64, "mean_act_when_firing": 0.001164671266451478}, {"feature_id": 14176, "n_firing": 63, "mean_act_when_firing": 0.001303031567543272}, {"feature_id": 487, "n_firing": 63, "mean_act_when_firing": 0.0014924777169076223}, {"feature_id": 13260, "n_firing": 61, "mean_act_when_firing": 0.0014285390250018386}, {"feature_id": 12223, "n_firing": 60, "mean_act_when_firing": 0.0016835833589235942}, {"feature_id": 5381, "n_firing": 60, "mean_act_when_firing": 0.0024873442947864533}, {"feature_id": 10723, "n_firing": 60, "mean_act_when_firing": 0.0013345750669638316}, {"feature_id": 8671, "n_firing": 58, "mean_act_when_firing": 0.0024716908047939168}, {"feature_id": 839, "n_firing": 57, "mean_act_when_firing": 0.002221825352886267}, {"feature_id": 11383, "n_firing": 56, "mean_act_when_firing": 0.001322049115385328}, {"feature_id": 5930, "n_firing": 56, "mean_act_when_firing": 0.002214514251266207}, {"feature_id": 13140, "n_firing": 56, "mean_act_when_firing": 0.0011701747508985655}, {"feature_id": 3329, "n_firing": 56, "mean_act_when_firing": 0.0013117584000740732}, {"feature_id": 13900, "n_firing": 55, "mean_act_when_firing": 0.0013619261709126558}, {"feature_id": 1350, "n_firing": 54, "mean_act_when_firing": 0.0014501225065301966}, {"feature_id": 6792, "n_firing": 54, "mean_act_when_firing": 0.001213554016969822}, {"feature_id": 8424, "n_firing": 54, "mean_act_when_firing": 0.005345810894612913}, {"feature_id": 7850, "n_firing": 53, "mean_act_when_firing": 0.0014503880772950514}, {"feature_id": 589, "n_firing": 53, "mean_act_when_firing": 0.001108573222497724}, {"feature_id": 9766, "n_firing": 52, "mean_act_when_firing": 0.004224673773233707}, {"feature_id": 36, "n_firing": 52, "mean_act_when_firing": 0.0017819543584034992}, {"feature_id": 11410, "n_firing": 52, "mean_act_when_firing": 0.0013812085470327963}, {"feature_id": 10759, "n_firing": 52, "mean_act_when_firing": 0.001059243670449807}, {"feature_id": 2952, "n_firing": 49, "mean_act_when_firing": 0.020978093147277832}, {"feature_id": 12383, "n_firing": 48, "mean_act_when_firing": 0.0010885520217319329}, {"feature_id": 9294, "n_firing": 47, "mean_act_when_firing": 0.001805792305063694}, {"feature_id": 8148, "n_firing": 47, "mean_act_when_firing": 0.0011451829304086401}, {"feature_id": 5228, "n_firing": 47, "mean_act_when_firing": 0.002470020759612956}, {"feature_id": 3936, "n_firing": 46, "mean_act_when_firing": 0.0014711791730445364}, {"feature_id": 10877, "n_firing": 44, "mean_act_when_firing": 0.0013298321176658976}, {"feature_id": 4029, "n_firing": 43, "mean_act_when_firing": 0.001208920031785965}, {"feature_id": 10874, "n_firing": 43, "mean_act_when_firing": 0.00460942851942639}, {"feature_id": 6327, "n_firing": 42, "mean_act_when_firing": 0.004349881339640845}, {"feature_id": 12677, "n_firing": 42, "mean_act_when_firing": 0.003980021746385665}, {"feature_id": 9779, "n_firing": 41, "mean_act_when_firing": 0.0010773477757849345}, {"feature_id": 7016, "n_firing": 40, "mean_act_when_firing": 0.0010607047937810422}, {"feature_id": 6910, "n_firing": 39, "mean_act_when_firing": 0.0021032975652278997}, {"feature_id": 2576, "n_firing": 39, "mean_act_when_firing": 0.0014999813567369413}, {"feature_id": 4280, "n_firing": 38, "mean_act_when_firing": 0.0037471471648467215}, {"feature_id": 14330, "n_firing": 37, "mean_act_when_firing": 0.0028551891446113586}, {"feature_id": 1495, "n_firing": 36, "mean_act_when_firing": 0.0019485033634636137}, {"feature_id": 9434, "n_firing": 36, "mean_act_when_firing": 0.0011237126050723924}, {"feature_id": 7459, "n_firing": 35, "mean_act_when_firing": 0.001453557504074914}, {"feature_id": 692, "n_firing": 35, "mean_act_when_firing": 0.0012505073632512775}, {"feature_id": 6774, "n_firing": 35, "mean_act_when_firing": 0.0018546792013304574}, {"feature_id": 11162, "n_firing": 34, "mean_act_when_firing": 0.0015174833071582457}, {"feature_id": 3424, "n_firing": 34, "mean_act_when_firing": 0.0017430637689197764}, {"feature_id": 6925, "n_firing": 34, "mean_act_when_firing": 0.0010097537408856785}, {"feature_id": 6866, "n_firing": 33, "mean_act_when_firing": 0.001578286967494271}, {"feature_id": 8716, "n_firing": 32, "mean_act_when_firing": 0.0013406232465058565}, {"feature_id": 8335, "n_firing": 31, "mean_act_when_firing": 0.01844257116317749}, {"feature_id": 2550, "n_firing": 31, "mean_act_when_firing": 0.003950389642869273}, {"feature_id": 3399, "n_firing": 31, "mean_act_when_firing": 0.005420509845979752}, {"feature_id": 5168, "n_firing": 30, "mean_act_when_firing": 0.0019929313411315283}, {"feature_id": 4690, "n_firing": 29, "mean_act_when_firing": 0.0011308493799176709}, {"feature_id": 3276, "n_firing": 29, "mean_act_when_firing": 0.0059295872162128315}, {"feature_id": 9762, "n_firing": 27, "mean_act_when_firing": 0.0013189789045740057}, {"feature_id": 2858, "n_firing": 27, "mean_act_when_firing": 0.0013936638004249996}, {"feature_id": 15070, "n_firing": 27, "mean_act_when_firing": 0.0020049312324435624}, {"feature_id": 4873, "n_firing": 26, "mean_act_when_firing": 0.0014597982741319216}, {"feature_id": 10958, "n_firing": 26, "mean_act_when_firing": 0.0013434607535600662}, {"feature_id": 10899, "n_firing": 26, "mean_act_when_firing": 0.0012764621239442092}, {"feature_id": 90, "n_firing": 25, "mean_act_when_firing": 0.0015975993871688843}, {"feature_id": 8473, "n_firing": 25, "mean_act_when_firing": 0.0014503616094589233}, {"feature_id": 10323, "n_firing": 25, "mean_act_when_firing": 0.0011034577339887619}, {"feature_id": 4254, "n_firing": 25, "mean_act_when_firing": 0.004635807275772095}, {"feature_id": 10148, "n_firing": 25, "mean_act_when_firing": 0.00457607090473175}, {"feature_id": 11647, "n_firing": 25, "mean_act_when_firing": 0.0013325878977775575}, {"feature_id": 13857, "n_firing": 24, "mean_act_when_firing": 0.0028955585633714995}, {"feature_id": 5959, "n_firing": 24, "mean_act_when_firing": 0.003032777147988478}, {"feature_id": 4188, "n_firing": 23, "mean_act_when_firing": 0.0018509551882743835}, {"feature_id": 10671, "n_firing": 22, "mean_act_when_firing": 0.0014136481860821898}, {"feature_id": 8218, "n_firing": 22, "mean_act_when_firing": 0.007383473217487335}, {"feature_id": 3175, "n_firing": 21, "mean_act_when_firing": 0.0010656971661817459}, {"feature_id": 6594, "n_firing": 20, "mean_act_when_firing": 0.0017796210944652558}, {"feature_id": 11061, "n_firing": 20, "mean_act_when_firing": 0.002016366831958294}, {"feature_id": 12339, "n_firing": 19, "mean_act_when_firing": 0.0012959990846483332}, {"feature_id": 8498, "n_firing": 19, "mean_act_when_firing": 0.0072976876246301755}, {"feature_id": 7211, "n_firing": 19, "mean_act_when_firing": 0.0011102319940140372}, {"feature_id": 12965, "n_firing": 19, "mean_act_when_firing": 0.0016903708639897797}, {"feature_id": 10410, "n_firing": 18, "mean_act_when_firing": 0.02146742906835344}, {"feature_id": 5709, "n_firing": 18, "mean_act_when_firing": 0.0025433446798059675}, {"feature_id": 6114, "n_firing": 17, "mean_act_when_firing": 0.001438343130490359}, {"feature_id": 12929, "n_firing": 17, "mean_act_when_firing": 0.0028594901018282946}, {"feature_id": 12613, "n_firing": 17, "mean_act_when_firing": 0.0010316185653209686}, {"feature_id": 5150, "n_firing": 16, "mean_act_when_firing": 0.0014484168495982885}, {"feature_id": 307, "n_firing": 15, "mean_act_when_firing": 0.0013014269371827444}, {"feature_id": 11018, "n_firing": 15, "mean_act_when_firing": 0.0011279966682195663}, {"feature_id": 10269, "n_firing": 14, "mean_act_when_firing": 0.0017449081476245607}, {"feature_id": 14122, "n_firing": 14, "mean_act_when_firing": 0.002281892778617995}, {"feature_id": 13534, "n_firing": 14, "mean_act_when_firing": 0.002424021118453571}, {"feature_id": 5810, "n_firing": 14, "mean_act_when_firing": 0.0009567428912435259}, {"feature_id": 1948, "n_firing": 14, "mean_act_when_firing": 0.003929501931582179}, {"feature_id": 10088, "n_firing": 14, "mean_act_when_firing": 0.0010149836806314333}, {"feature_id": 14825, "n_firing": 14, "mean_act_when_firing": 0.0017890379365001405}, {"feature_id": 14265, "n_firing": 13, "mean_act_when_firing": 0.0015570100110310775}, {"feature_id": 1490, "n_firing": 13, "mean_act_when_firing": 0.0011140485652364218}, {"feature_id": 6519, "n_firing": 13, "mean_act_when_firing": 0.0010853140400006222}, {"feature_id": 7323, "n_firing": 12, "mean_act_when_firing": 0.001109818151841561}, {"feature_id": 2435, "n_firing": 11, "mean_act_when_firing": 0.0017147673801942306}, {"feature_id": 3081, "n_firing": 11, "mean_act_when_firing": 0.0009917299347844992}, {"feature_id": 9312, "n_firing": 11, "mean_act_when_firing": 0.0010924664410677824}, {"feature_id": 6516, "n_firing": 11, "mean_act_when_firing": 0.0036377371712164445}, {"feature_id": 4824, "n_firing": 11, "mean_act_when_firing": 0.0012595796618949282}, {"feature_id": 1664, "n_firing": 10, "mean_act_when_firing": 0.0009836881421506406}, {"feature_id": 7812, "n_firing": 10, "mean_act_when_firing": 0.004282350838184357}, {"feature_id": 12308, "n_firing": 10, "mean_act_when_firing": 0.0010312773287296296}, {"feature_id": 11584, "n_firing": 10, "mean_act_when_firing": 0.0011694559827446938}, {"feature_id": 11403, "n_firing": 10, "mean_act_when_firing": 0.0016946651041507721}, {"feature_id": 3614, "n_firing": 10, "mean_act_when_firing": 0.002039950527250767}, {"feature_id": 13528, "n_firing": 10, "mean_act_when_firing": 0.0008264539763331413}] \ No newline at end of file diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/genes_meta.json b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/genes_meta.json new file mode 100644 index 0000000000..daedacd030 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/public/gene_umap/genes_meta.json @@ -0,0 +1 @@ +{"n_genes": 500, "n_features": 15360, "genes": [{"gene_symbol": "EZH4", "species": "Homo sapiens", "x": 8.686056137084961, "y": -3.382347583770752, "cluster_id": 3}, {"gene_symbol": "TGFB2", "species": "Homo sapiens", "x": -2.1197595596313477, "y": 12.551924705505371, "cluster_id": 2}, {"gene_symbol": "CASP14", "species": "Caenorhabditis elegans", "x": 3.101996421813965, "y": -3.1551201343536377, "cluster_id": 5}, {"gene_symbol": "STAT29", "species": "Homo sapiens", "x": -2.018878221511841, "y": 0.7703155875205994, "cluster_id": -1}, {"gene_symbol": "KRAS30", "species": "Homo sapiens", "x": 12.761982917785645, "y": -2.5256834030151367, "cluster_id": 4}, {"gene_symbol": "IL27", "species": "Homo sapiens", "x": -2.1882669925689697, "y": 12.515768051147461, "cluster_id": 2}, {"gene_symbol": "BAX11", "species": "Escherichia coli", "x": -1.8673677444458008, "y": 6.5785322189331055, "cluster_id": 18}, {"gene_symbol": "CDK4", "species": "Homo sapiens", "x": 1.7296525239944458, "y": -1.6460984945297241, "cluster_id": 12}, {"gene_symbol": "DNMT8", "species": "Homo sapiens", "x": 11.791657447814941, "y": 15.538337707519531, "cluster_id": 0}, {"gene_symbol": "INS15", "species": "Escherichia coli", "x": 8.917778968811035, "y": -3.4308087825775146, "cluster_id": 3}, {"gene_symbol": "BAX18", "species": "Saccharomyces cerevisiae", "x": 12.28604793548584, "y": -2.650383472442627, "cluster_id": 4}, {"gene_symbol": "RB18", "species": "Mus musculus", "x": 1.833503007888794, "y": -2.6132335662841797, "cluster_id": 12}, {"gene_symbol": "SOX13", "species": "Homo sapiens", "x": 1.443180799484253, "y": -1.9665391445159912, "cluster_id": 12}, {"gene_symbol": "MYC30", "species": "Homo sapiens", "x": -0.5166020393371582, "y": 1.2250268459320068, "cluster_id": 11}, {"gene_symbol": "ERK12", "species": "Saccharomyces cerevisiae", "x": -2.390974283218384, "y": 5.051380157470703, "cluster_id": 19}, {"gene_symbol": "MDM19", "species": "Homo sapiens", "x": 1.573317289352417, "y": -2.5225296020507812, "cluster_id": 12}, {"gene_symbol": "BCL26", "species": "Homo sapiens", "x": 1.7290312051773071, "y": -2.540867567062378, "cluster_id": 12}, {"gene_symbol": "STAT2", "species": "Homo sapiens", "x": 1.825354814529419, "y": -2.167093276977539, "cluster_id": 12}, {"gene_symbol": "SRC1", "species": "Saccharomyces cerevisiae", "x": 4.763230800628662, "y": -4.377385139465332, "cluster_id": 6}, {"gene_symbol": "P5311", "species": "Homo sapiens", "x": 3.288541555404663, "y": -3.3086509704589844, "cluster_id": 5}, {"gene_symbol": "EIF4", "species": "Saccharomyces cerevisiae", "x": 9.826370239257812, "y": -2.9052846431732178, "cluster_id": 3}, {"gene_symbol": "TGFB3", "species": "Homo sapiens", "x": -2.494426727294922, "y": 11.271780014038086, "cluster_id": 7}, {"gene_symbol": "WNT8", "species": "Caenorhabditis elegans", "x": -2.9195122718811035, "y": 4.414793014526367, "cluster_id": 20}, {"gene_symbol": "HSP28", "species": "Drosophila melanogaster", "x": 0.29078903794288635, "y": -0.18883155286312103, "cluster_id": -1}, {"gene_symbol": "IL20", "species": "Saccharomyces cerevisiae", "x": -2.1236720085144043, "y": 14.1758451461792, "cluster_id": 1}, {"gene_symbol": "DNMT4", "species": "Escherichia coli", "x": 4.9168620109558105, "y": -4.340261459350586, "cluster_id": 6}, {"gene_symbol": "MLH22", "species": "Saccharomyces cerevisiae", "x": 8.838552474975586, "y": -3.4661686420440674, "cluster_id": 3}, {"gene_symbol": "HLA25", "species": "Homo sapiens", "x": -1.8830333948135376, "y": 5.901905059814453, "cluster_id": 17}, {"gene_symbol": "ERK29", "species": "Mus musculus", "x": -2.3305420875549316, "y": 1.324470043182373, "cluster_id": -1}, {"gene_symbol": "VEGF24", "species": "Homo sapiens", "x": 11.561120986938477, "y": -2.529949903488159, "cluster_id": 4}, {"gene_symbol": "HLA17", "species": "Homo sapiens", "x": 1.9663249254226685, "y": -2.2155041694641113, "cluster_id": 12}, {"gene_symbol": "TET5", "species": "Homo sapiens", "x": 8.669573783874512, "y": -3.0497896671295166, "cluster_id": 3}, {"gene_symbol": "BRCA20", "species": "Homo sapiens", "x": 0.420705109834671, "y": -1.4558930397033691, "cluster_id": 13}, {"gene_symbol": "FOX28", "species": "Homo sapiens", "x": -2.019847869873047, "y": 0.5717804431915283, "cluster_id": -1}, {"gene_symbol": "DNMT1", "species": "Homo sapiens", "x": 11.781070709228516, "y": 15.510361671447754, "cluster_id": 0}, {"gene_symbol": "ACTB4", "species": "Homo sapiens", "x": 12.099775314331055, "y": 16.119617462158203, "cluster_id": 0}, {"gene_symbol": "FGF1", "species": "Mus musculus", "x": 4.985507488250732, "y": -4.308346271514893, "cluster_id": 6}, {"gene_symbol": "APC11", "species": "Homo sapiens", "x": -2.296978235244751, "y": 3.347386598587036, "cluster_id": 15}, {"gene_symbol": "AKT27", "species": "Homo sapiens", "x": -1.8104009628295898, "y": 1.731593370437622, "cluster_id": 11}, {"gene_symbol": "IFN11", "species": "Homo sapiens", "x": -0.2079419046640396, "y": -1.3093763589859009, "cluster_id": 13}, {"gene_symbol": "TNF20", "species": "Homo sapiens", "x": -2.0759620666503906, "y": 2.0768449306488037, "cluster_id": 11}, {"gene_symbol": "EIF14", "species": "Escherichia coli", "x": -2.3316872119903564, "y": 12.847744941711426, "cluster_id": 2}, {"gene_symbol": "RB12", "species": "Mus musculus", "x": -2.9628746509552, "y": 10.812135696411133, "cluster_id": 8}, {"gene_symbol": "HSP17", "species": "Homo sapiens", "x": 11.989855766296387, "y": -2.3469347953796387, "cluster_id": 4}, {"gene_symbol": "HOX25", "species": "Homo sapiens", "x": 5.716818809509277, "y": -4.127655029296875, "cluster_id": 6}, {"gene_symbol": "HSP22", "species": "Mus musculus", "x": -0.21570681035518646, "y": 0.655602753162384, "cluster_id": -1}, {"gene_symbol": "CDK13", "species": "Drosophila melanogaster", "x": -2.114326000213623, "y": 14.166088104248047, "cluster_id": 1}, {"gene_symbol": "NFKB15", "species": "Homo sapiens", "x": 12.095250129699707, "y": 16.0933780670166, "cluster_id": 0}, {"gene_symbol": "CCND23", "species": "Saccharomyces cerevisiae", "x": 0.7219798564910889, "y": -0.7640831470489502, "cluster_id": 10}, {"gene_symbol": "CASP4", "species": "Escherichia coli", "x": 1.0914490222930908, "y": -1.0595548152923584, "cluster_id": 10}, {"gene_symbol": "MHC23", "species": "Homo sapiens", "x": -2.8609228134155273, "y": 11.079012870788574, "cluster_id": 8}, {"gene_symbol": "AKT4", "species": "Drosophila melanogaster", "x": 12.325141906738281, "y": 16.615652084350586, "cluster_id": 0}, {"gene_symbol": "TGFB28", "species": "Mus musculus", "x": -0.7717772126197815, "y": 0.5816206932067871, "cluster_id": 11}, {"gene_symbol": "KRAS26", "species": "Mus musculus", "x": -2.007917642593384, "y": 7.485544681549072, "cluster_id": 16}, {"gene_symbol": "CDK26", "species": "Escherichia coli", "x": -1.519393801689148, "y": 1.5172868967056274, "cluster_id": 11}, {"gene_symbol": "VEGF1", "species": "Homo sapiens", "x": 2.914349317550659, "y": -3.007750988006592, "cluster_id": 5}, {"gene_symbol": "TP6", "species": "Homo sapiens", "x": 11.809076309204102, "y": -2.580944776535034, "cluster_id": 4}, {"gene_symbol": "ERK5", "species": "Homo sapiens", "x": -1.7344367504119873, "y": 3.3122923374176025, "cluster_id": 14}, {"gene_symbol": "VEGF5", "species": "Mus musculus", "x": 1.3354965448379517, "y": -2.6285078525543213, "cluster_id": 12}, {"gene_symbol": "FAS21", "species": "Mus musculus", "x": -2.777817964553833, "y": 3.4481465816497803, "cluster_id": 20}, {"gene_symbol": "TUBB25", "species": "Saccharomyces cerevisiae", "x": -0.08313918113708496, "y": -1.781172513961792, "cluster_id": 13}, {"gene_symbol": "SRC28", "species": "Drosophila melanogaster", "x": -0.3773117661476135, "y": -0.9408912658691406, "cluster_id": 13}, {"gene_symbol": "HOX12", "species": "Mus musculus", "x": 5.55472993850708, "y": -4.143551349639893, "cluster_id": 6}, {"gene_symbol": "BCL18", "species": "Escherichia coli", "x": 0.514963686466217, "y": -0.9834804534912109, "cluster_id": 10}, {"gene_symbol": "JAK21", "species": "Saccharomyces cerevisiae", "x": -1.260306715965271, "y": 1.3949525356292725, "cluster_id": 11}, {"gene_symbol": "HSP27", "species": "Homo sapiens", "x": 4.67875337600708, "y": -3.853543519973755, "cluster_id": 6}, {"gene_symbol": "EIF21", "species": "Homo sapiens", "x": 4.674148082733154, "y": -4.321938514709473, "cluster_id": 6}, {"gene_symbol": "CCND14", "species": "Escherichia coli", "x": -1.9976667165756226, "y": 2.0025761127471924, "cluster_id": 11}, {"gene_symbol": "APC16", "species": "Escherichia coli", "x": -1.3392695188522339, "y": 2.882632255554199, "cluster_id": 14}, {"gene_symbol": "TLR8", "species": "Mus musculus", "x": 12.347750663757324, "y": -2.607823371887207, "cluster_id": 4}, {"gene_symbol": "AKT29", "species": "Homo sapiens", "x": 0.517358124256134, "y": -0.5450191497802734, "cluster_id": 10}, {"gene_symbol": "RPL1", "species": "Homo sapiens", "x": 12.188591957092285, "y": 16.36788558959961, "cluster_id": 0}, {"gene_symbol": "EIF16", "species": "Escherichia coli", "x": -2.9341251850128174, "y": 4.2425384521484375, "cluster_id": 20}, {"gene_symbol": "APC4", "species": "Drosophila melanogaster", "x": -0.4798320531845093, "y": -0.45146092772483826, "cluster_id": 13}, {"gene_symbol": "HOX28", "species": "Escherichia coli", "x": -2.9802420139312744, "y": 3.969156265258789, "cluster_id": 20}, {"gene_symbol": "ACTB2", "species": "Saccharomyces cerevisiae", "x": -2.503650188446045, "y": 4.866827011108398, "cluster_id": 19}, {"gene_symbol": "TLR27", "species": "Mus musculus", "x": -2.9975926876068115, "y": 10.819330215454102, "cluster_id": 8}, {"gene_symbol": "TP7", "species": "Homo sapiens", "x": -1.5865164995193481, "y": 3.612936019897461, "cluster_id": 14}, {"gene_symbol": "TNF26", "species": "Mus musculus", "x": 0.5465888381004333, "y": -2.0325260162353516, "cluster_id": 13}, {"gene_symbol": "STAT23", "species": "Homo sapiens", "x": -1.4760860204696655, "y": 0.7252259850502014, "cluster_id": -1}, {"gene_symbol": "TUBB11", "species": "Saccharomyces cerevisiae", "x": -1.0868511199951172, "y": 1.2115905284881592, "cluster_id": 11}, {"gene_symbol": "MLH8", "species": "Homo sapiens", "x": 10.841089248657227, "y": -2.696033239364624, "cluster_id": 4}, {"gene_symbol": "EZH11", "species": "Caenorhabditis elegans", "x": -0.9153007864952087, "y": 1.1161718368530273, "cluster_id": 11}, {"gene_symbol": "APC30", "species": "Escherichia coli", "x": -2.269096612930298, "y": 1.0608575344085693, "cluster_id": -1}, {"gene_symbol": "VEGF17", "species": "Homo sapiens", "x": -2.5137341022491455, "y": 11.577188491821289, "cluster_id": 7}, {"gene_symbol": "PDGF18", "species": "Homo sapiens", "x": -1.0074814558029175, "y": 0.8197771310806274, "cluster_id": 11}, {"gene_symbol": "NFKB22", "species": "Homo sapiens", "x": 12.274123191833496, "y": 16.578094482421875, "cluster_id": 0}, {"gene_symbol": "IL9", "species": "Homo sapiens", "x": 11.225854873657227, "y": -2.6722066402435303, "cluster_id": 4}, {"gene_symbol": "RPL22", "species": "Homo sapiens", "x": 5.922083377838135, "y": -3.9385037422180176, "cluster_id": 6}, {"gene_symbol": "AKT13", "species": "Homo sapiens", "x": 8.939040184020996, "y": -3.149292230606079, "cluster_id": 3}, {"gene_symbol": "NFKB7", "species": "Homo sapiens", "x": -2.362208366394043, "y": 12.35729694366455, "cluster_id": 2}, {"gene_symbol": "DNMT20", "species": "Saccharomyces cerevisiae", "x": 0.1921061873435974, "y": -1.8013864755630493, "cluster_id": 13}, {"gene_symbol": "GLUT20", "species": "Escherichia coli", "x": -1.3323421478271484, "y": -0.3247939348220825, "cluster_id": 9}, {"gene_symbol": "PDGF26", "species": "Mus musculus", "x": -1.9169797897338867, "y": 5.162289619445801, "cluster_id": 19}, {"gene_symbol": "EZH2", "species": "Mus musculus", "x": -2.235435724258423, "y": 14.07812786102295, "cluster_id": 1}, {"gene_symbol": "GATA7", "species": "Homo sapiens", "x": 11.70507526397705, "y": 15.424822807312012, "cluster_id": 0}, {"gene_symbol": "AKT21", "species": "Mus musculus", "x": 1.3218190670013428, "y": -1.6981101036071777, "cluster_id": 12}, {"gene_symbol": "PDGF6", "species": "Homo sapiens", "x": 0.5552341938018799, "y": -1.732494592666626, "cluster_id": 13}, {"gene_symbol": "CCND25", "species": "Mus musculus", "x": 8.234841346740723, "y": -3.2317867279052734, "cluster_id": 3}, {"gene_symbol": "PTEN17", "species": "Escherichia coli", "x": 9.748619079589844, "y": -2.940746545791626, "cluster_id": 3}, {"gene_symbol": "BRCA2", "species": "Saccharomyces cerevisiae", "x": -2.5672221183776855, "y": 11.069994926452637, "cluster_id": 7}, {"gene_symbol": "HDAC15", "species": "Escherichia coli", "x": 9.885348320007324, "y": -2.855318069458008, "cluster_id": 3}, {"gene_symbol": "SOX24", "species": "Arabidopsis thaliana", "x": -0.32585039734840393, "y": -0.6705582737922668, "cluster_id": 13}, {"gene_symbol": "HOX9", "species": "Homo sapiens", "x": 4.9678568840026855, "y": -3.962541103363037, "cluster_id": 6}, {"gene_symbol": "INS7", "species": "Homo sapiens", "x": -2.3713366985321045, "y": 5.011290073394775, "cluster_id": 19}, {"gene_symbol": "TUBB9", "species": "Escherichia coli", "x": 8.800268173217773, "y": -3.5119881629943848, "cluster_id": 3}, {"gene_symbol": "TUBB24", "species": "Homo sapiens", "x": -1.4484339952468872, "y": 1.0933479070663452, "cluster_id": 11}, {"gene_symbol": "EZH3", "species": "Saccharomyces cerevisiae", "x": -1.446484088897705, "y": -0.18179234862327576, "cluster_id": 9}, {"gene_symbol": "P533", "species": "Homo sapiens", "x": 1.7166569232940674, "y": -2.7308902740478516, "cluster_id": 12}, {"gene_symbol": "FGF27", "species": "Saccharomyces cerevisiae", "x": 0.7084491848945618, "y": -0.8725659847259521, "cluster_id": 10}, {"gene_symbol": "NRAS30", "species": "Homo sapiens", "x": 1.6290816068649292, "y": -1.6250182390213013, "cluster_id": 12}, {"gene_symbol": "DNMT11", "species": "Homo sapiens", "x": 0.20842769742012024, "y": -0.3076656758785248, "cluster_id": -1}, {"gene_symbol": "STAT17", "species": "Homo sapiens", "x": -2.886993646621704, "y": 10.79282283782959, "cluster_id": 8}, {"gene_symbol": "TET22", "species": "Homo sapiens", "x": -2.2028448581695557, "y": 6.780586242675781, "cluster_id": 18}, {"gene_symbol": "FGF8", "species": "Homo sapiens", "x": 2.9540915489196777, "y": -3.028604030609131, "cluster_id": 5}, {"gene_symbol": "INS1", "species": "Homo sapiens", "x": 0.5448627471923828, "y": -0.6909799575805664, "cluster_id": 10}, {"gene_symbol": "DNMT19", "species": "Homo sapiens", "x": 11.855180740356445, "y": -2.506866216659546, "cluster_id": 4}, {"gene_symbol": "VEGF28", "species": "Homo sapiens", "x": -2.081996202468872, "y": 0.6042914986610413, "cluster_id": -1}, {"gene_symbol": "NOTCH18", "species": "Drosophila melanogaster", "x": 5.864218235015869, "y": -3.8955085277557373, "cluster_id": 6}, {"gene_symbol": "RB20", "species": "Mus musculus", "x": 1.8066303730010986, "y": -1.9774506092071533, "cluster_id": 12}, {"gene_symbol": "HDAC7", "species": "Homo sapiens", "x": -1.988029956817627, "y": 1.9964442253112793, "cluster_id": 11}, {"gene_symbol": "PDGF29", "species": "Arabidopsis thaliana", "x": 12.228616714477539, "y": 16.427494049072266, "cluster_id": 0}, {"gene_symbol": "HDAC24", "species": "Mus musculus", "x": 5.657820224761963, "y": -4.102843761444092, "cluster_id": 6}, {"gene_symbol": "AKT6", "species": "Homo sapiens", "x": -1.8507897853851318, "y": 7.582164764404297, "cluster_id": 16}, {"gene_symbol": "TET3", "species": "Drosophila melanogaster", "x": 12.040778160095215, "y": -2.4842817783355713, "cluster_id": 4}, {"gene_symbol": "AKT14", "species": "Homo sapiens", "x": 11.778403282165527, "y": 15.507030487060547, "cluster_id": 0}, {"gene_symbol": "KRAS13", "species": "Homo sapiens", "x": 9.344560623168945, "y": -2.887242078781128, "cluster_id": 3}, {"gene_symbol": "PDGF8", "species": "Saccharomyces cerevisiae", "x": 9.55671501159668, "y": -3.2641239166259766, "cluster_id": 3}, {"gene_symbol": "BCL23", "species": "Escherichia coli", "x": 9.046865463256836, "y": -3.0078811645507812, "cluster_id": 3}, {"gene_symbol": "DNMT21", "species": "Homo sapiens", "x": -2.1750333309173584, "y": 12.512475967407227, "cluster_id": 2}, {"gene_symbol": "HDAC13", "species": "Homo sapiens", "x": 12.009971618652344, "y": -2.5776352882385254, "cluster_id": 4}, {"gene_symbol": "EIF18", "species": "Homo sapiens", "x": -2.127040147781372, "y": 14.045008659362793, "cluster_id": 1}, {"gene_symbol": "ATM24", "species": "Homo sapiens", "x": 12.385010719299316, "y": 16.568891525268555, "cluster_id": 0}, {"gene_symbol": "BAX5", "species": "Escherichia coli", "x": 5.769580841064453, "y": -4.1321940422058105, "cluster_id": 6}, {"gene_symbol": "P5318", "species": "Homo sapiens", "x": 11.35728931427002, "y": -2.528390407562256, "cluster_id": 4}, {"gene_symbol": "EZH20", "species": "Homo sapiens", "x": -2.0442099571228027, "y": 7.369801998138428, "cluster_id": 16}, {"gene_symbol": "NOTCH16", "species": "Homo sapiens", "x": -0.7134388089179993, "y": -0.822248637676239, "cluster_id": -1}, {"gene_symbol": "PDGF19", "species": "Escherichia coli", "x": 4.609805107116699, "y": -4.347930908203125, "cluster_id": 6}, {"gene_symbol": "ERK2", "species": "Homo sapiens", "x": -0.9608291387557983, "y": -0.4804249405860901, "cluster_id": 9}, {"gene_symbol": "BRCA15", "species": "Mus musculus", "x": -2.6098499298095703, "y": 11.424154281616211, "cluster_id": 7}, {"gene_symbol": "SRC22", "species": "Caenorhabditis elegans", "x": 9.814495086669922, "y": -2.8581602573394775, "cluster_id": 3}, {"gene_symbol": "DNMT25", "species": "Drosophila melanogaster", "x": 8.708667755126953, "y": -3.5028138160705566, "cluster_id": 3}, {"gene_symbol": "INS27", "species": "Arabidopsis thaliana", "x": 8.940403938293457, "y": -3.5187735557556152, "cluster_id": 3}, {"gene_symbol": "RB21", "species": "Drosophila melanogaster", "x": -0.421002596616745, "y": 1.12440025806427, "cluster_id": 11}, {"gene_symbol": "EIF12", "species": "Mus musculus", "x": -2.2496190071105957, "y": 14.074962615966797, "cluster_id": 1}, {"gene_symbol": "HRAS26", "species": "Homo sapiens", "x": -2.286520004272461, "y": 13.599424362182617, "cluster_id": 1}, {"gene_symbol": "MDM15", "species": "Saccharomyces cerevisiae", "x": -0.27294713258743286, "y": -0.6330478191375732, "cluster_id": 13}, {"gene_symbol": "ATM14", "species": "Homo sapiens", "x": 2.8979687690734863, "y": -2.9874255657196045, "cluster_id": 5}, {"gene_symbol": "ATM17", "species": "Arabidopsis thaliana", "x": 11.803741455078125, "y": -2.772616386413574, "cluster_id": 4}, {"gene_symbol": "FGF5", "species": "Escherichia coli", "x": -1.3569741249084473, "y": -0.1644657999277115, "cluster_id": 9}, {"gene_symbol": "EIF1", "species": "Mus musculus", "x": 1.8093414306640625, "y": -1.666821837425232, "cluster_id": 12}, {"gene_symbol": "NOTCH26", "species": "Escherichia coli", "x": 3.207029104232788, "y": -3.2463955879211426, "cluster_id": 5}, {"gene_symbol": "FOX29", "species": "Homo sapiens", "x": -0.34927311539649963, "y": 0.776653528213501, "cluster_id": 11}, {"gene_symbol": "ERK24", "species": "Homo sapiens", "x": 11.5920991897583, "y": -2.44161057472229, "cluster_id": 4}, {"gene_symbol": "VEGF21", "species": "Escherichia coli", "x": 0.8822225332260132, "y": -1.0289928913116455, "cluster_id": 10}, {"gene_symbol": "IFN3", "species": "Saccharomyces cerevisiae", "x": 10.710122108459473, "y": -2.7211968898773193, "cluster_id": 4}, {"gene_symbol": "PDGF24", "species": "Escherichia coli", "x": -2.3436973094940186, "y": 12.492042541503906, "cluster_id": 2}, {"gene_symbol": "P5324", "species": "Homo sapiens", "x": -2.178513526916504, "y": 14.12584400177002, "cluster_id": 1}, {"gene_symbol": "IFN4", "species": "Escherichia coli", "x": 9.867905616760254, "y": -2.971817970275879, "cluster_id": 3}, {"gene_symbol": "MLH16", "species": "Homo sapiens", "x": -2.9620614051818848, "y": 4.193241119384766, "cluster_id": 20}, {"gene_symbol": "ATM6", "species": "Escherichia coli", "x": 0.6963013410568237, "y": -1.5976605415344238, "cluster_id": 13}, {"gene_symbol": "TGFB24", "species": "Homo sapiens", "x": 1.3724366426467896, "y": -1.5157945156097412, "cluster_id": 12}, {"gene_symbol": "FGF16", "species": "Saccharomyces cerevisiae", "x": -2.0972039699554443, "y": 3.305467367172241, "cluster_id": 15}, {"gene_symbol": "CDK7", "species": "Homo sapiens", "x": 5.181347846984863, "y": -3.8800318241119385, "cluster_id": 6}, {"gene_symbol": "P5322", "species": "Homo sapiens", "x": 11.200946807861328, "y": -2.7828593254089355, "cluster_id": 4}, {"gene_symbol": "TNF10", "species": "Homo sapiens", "x": -1.9087365865707397, "y": 6.303761959075928, "cluster_id": 18}, {"gene_symbol": "EZH25", "species": "Saccharomyces cerevisiae", "x": 12.859424591064453, "y": -2.3967537879943848, "cluster_id": 4}, {"gene_symbol": "NOTCH28", "species": "Homo sapiens", "x": 8.640909194946289, "y": -3.4146015644073486, "cluster_id": 3}, {"gene_symbol": "HRAS15", "species": "Mus musculus", "x": 11.952046394348145, "y": -2.756303071975708, "cluster_id": 4}, {"gene_symbol": "AKT8", "species": "Homo sapiens", "x": -2.201904773712158, "y": 2.4433271884918213, "cluster_id": 11}, {"gene_symbol": "ATM30", "species": "Arabidopsis thaliana", "x": -0.7913845181465149, "y": 0.7638826370239258, "cluster_id": 11}, {"gene_symbol": "MLH2", "species": "Homo sapiens", "x": 11.27224063873291, "y": -2.56136417388916, "cluster_id": 4}, {"gene_symbol": "ATM19", "species": "Arabidopsis thaliana", "x": 4.413844585418701, "y": -4.079471111297607, "cluster_id": 6}, {"gene_symbol": "NOTCH25", "species": "Homo sapiens", "x": 12.190030097961426, "y": 16.400611877441406, "cluster_id": 0}, {"gene_symbol": "EZH10", "species": "Mus musculus", "x": -0.31647342443466187, "y": -0.5495778918266296, "cluster_id": 13}, {"gene_symbol": "ATM21", "species": "Escherichia coli", "x": -0.6307758092880249, "y": -0.8063395619392395, "cluster_id": -1}, {"gene_symbol": "NRAS2", "species": "Homo sapiens", "x": -1.8206866979599, "y": 5.733725070953369, "cluster_id": 17}, {"gene_symbol": "CDK8", "species": "Escherichia coli", "x": -1.5447317361831665, "y": 1.4414094686508179, "cluster_id": 11}, {"gene_symbol": "SRC21", "species": "Homo sapiens", "x": 12.42117977142334, "y": -2.5460610389709473, "cluster_id": 4}, {"gene_symbol": "TGFB11", "species": "Homo sapiens", "x": 1.298333764076233, "y": -2.581429958343506, "cluster_id": 12}, {"gene_symbol": "ERK3", "species": "Mus musculus", "x": 0.0808321014046669, "y": -1.6735643148422241, "cluster_id": 13}, {"gene_symbol": "ACTB9", "species": "Homo sapiens", "x": -2.853914260864258, "y": 4.567544460296631, "cluster_id": 20}, {"gene_symbol": "TNF19", "species": "Homo sapiens", "x": -1.8022831678390503, "y": 5.2621989250183105, "cluster_id": -1}, {"gene_symbol": "EIF5", "species": "Saccharomyces cerevisiae", "x": -2.0796642303466797, "y": 6.299337387084961, "cluster_id": 18}, {"gene_symbol": "STAT10", "species": "Homo sapiens", "x": -2.815162420272827, "y": 11.551407814025879, "cluster_id": -1}, {"gene_symbol": "HDAC9", "species": "Homo sapiens", "x": -1.8841153383255005, "y": 2.538163185119629, "cluster_id": 11}, {"gene_symbol": "HRAS7", "species": "Homo sapiens", "x": 11.494244575500488, "y": -2.70436429977417, "cluster_id": 4}, {"gene_symbol": "HOX3", "species": "Homo sapiens", "x": 4.747611999511719, "y": -3.9486289024353027, "cluster_id": 6}, {"gene_symbol": "AKT1", "species": "Saccharomyces cerevisiae", "x": 11.633973121643066, "y": -2.7142035961151123, "cluster_id": 4}, {"gene_symbol": "PTEN16", "species": "Arabidopsis thaliana", "x": 1.8585501909255981, "y": -2.515660524368286, "cluster_id": 12}, {"gene_symbol": "AKT17", "species": "Saccharomyces cerevisiae", "x": -2.9544951915740967, "y": 3.8031251430511475, "cluster_id": 20}, {"gene_symbol": "FOX1", "species": "Mus musculus", "x": 0.29707643389701843, "y": -1.4585176706314087, "cluster_id": 13}, {"gene_symbol": "FOX7", "species": "Saccharomyces cerevisiae", "x": 11.749370574951172, "y": 15.472522735595703, "cluster_id": 0}, {"gene_symbol": "TNF22", "species": "Mus musculus", "x": 12.808260917663574, "y": -2.330486297607422, "cluster_id": 4}, {"gene_symbol": "TLR16", "species": "Saccharomyces cerevisiae", "x": -1.5891681909561157, "y": 1.6041768789291382, "cluster_id": 11}, {"gene_symbol": "INS8", "species": "Mus musculus", "x": 0.6891156435012817, "y": -2.10821270942688, "cluster_id": 13}, {"gene_symbol": "ATM13", "species": "Mus musculus", "x": -1.8334959745407104, "y": 5.87106466293335, "cluster_id": 17}, {"gene_symbol": "IFN23", "species": "Homo sapiens", "x": -1.9538333415985107, "y": 1.851405382156372, "cluster_id": 11}, {"gene_symbol": "NRAS9", "species": "Escherichia coli", "x": -1.4668173789978027, "y": 3.044217109680176, "cluster_id": 14}, {"gene_symbol": "RAS29", "species": "Homo sapiens", "x": -0.961961030960083, "y": 1.0777201652526855, "cluster_id": 11}, {"gene_symbol": "MDM6", "species": "Homo sapiens", "x": -2.9515113830566406, "y": 10.870030403137207, "cluster_id": 8}, {"gene_symbol": "EIF26", "species": "Homo sapiens", "x": -2.2374939918518066, "y": 13.00311279296875, "cluster_id": 2}, {"gene_symbol": "STAT1", "species": "Homo sapiens", "x": 4.811089515686035, "y": -3.889197826385498, "cluster_id": 6}, {"gene_symbol": "RPL5", "species": "Mus musculus", "x": -1.9858030080795288, "y": 7.309084892272949, "cluster_id": 16}, {"gene_symbol": "TNF2", "species": "Escherichia coli", "x": 11.729337692260742, "y": 15.456581115722656, "cluster_id": 0}, {"gene_symbol": "HRAS10", "species": "Homo sapiens", "x": -2.3379392623901367, "y": 12.640414237976074, "cluster_id": 2}, {"gene_symbol": "BRCA14", "species": "Escherichia coli", "x": 9.422066688537598, "y": -3.343301296234131, "cluster_id": 3}, {"gene_symbol": "TGFB27", "species": "Mus musculus", "x": 8.450946807861328, "y": -3.1702606678009033, "cluster_id": 3}, {"gene_symbol": "IFN2", "species": "Homo sapiens", "x": 0.3555164635181427, "y": -0.18126188218593597, "cluster_id": -1}, {"gene_symbol": "TUBB7", "species": "Homo sapiens", "x": -0.9925283789634705, "y": 0.6219179034233093, "cluster_id": 11}, {"gene_symbol": "MYC29", "species": "Arabidopsis thaliana", "x": 1.4225417375564575, "y": -2.5899298191070557, "cluster_id": 12}, {"gene_symbol": "IL5", "species": "Homo sapiens", "x": -1.4950634241104126, "y": 1.1111502647399902, "cluster_id": 11}, {"gene_symbol": "SOX16", "species": "Mus musculus", "x": -1.9103516340255737, "y": 7.5017571449279785, "cluster_id": 16}, {"gene_symbol": "BCL3", "species": "Arabidopsis thaliana", "x": 8.916119575500488, "y": -2.918823003768921, "cluster_id": 3}, {"gene_symbol": "FAS6", "species": "Drosophila melanogaster", "x": 0.27346551418304443, "y": -1.8390902280807495, "cluster_id": 13}, {"gene_symbol": "BRCA8", "species": "Mus musculus", "x": 0.21098081767559052, "y": 0.08334800601005554, "cluster_id": -1}, {"gene_symbol": "CCND18", "species": "Escherichia coli", "x": -2.4359495639801025, "y": 3.3592071533203125, "cluster_id": 15}, {"gene_symbol": "KRAS29", "species": "Escherichia coli", "x": -1.9807285070419312, "y": 6.520287990570068, "cluster_id": 18}, {"gene_symbol": "WNT17", "species": "Arabidopsis thaliana", "x": 0.5082578063011169, "y": -1.4948921203613281, "cluster_id": 13}, {"gene_symbol": "TP23", "species": "Homo sapiens", "x": -0.1720283478498459, "y": -1.0351444482803345, "cluster_id": 13}, {"gene_symbol": "EGFR4", "species": "Saccharomyces cerevisiae", "x": -2.791043758392334, "y": 4.6088361740112305, "cluster_id": 20}, {"gene_symbol": "BAX4", "species": "Escherichia coli", "x": 0.26472124457359314, "y": -1.124525785446167, "cluster_id": -1}, {"gene_symbol": "STAT3", "species": "Escherichia coli", "x": -2.835488796234131, "y": 10.498222351074219, "cluster_id": -1}, {"gene_symbol": "MDM5", "species": "Escherichia coli", "x": -1.7913401126861572, "y": 5.216190338134766, "cluster_id": 19}, {"gene_symbol": "PIK318", "species": "Homo sapiens", "x": 1.6648221015930176, "y": -1.8733296394348145, "cluster_id": 12}, {"gene_symbol": "NRAS28", "species": "Caenorhabditis elegans", "x": 4.053716659545898, "y": -3.727766275405884, "cluster_id": 6}, {"gene_symbol": "CCND12", "species": "Homo sapiens", "x": -1.0778003931045532, "y": -0.3161737620830536, "cluster_id": 9}, {"gene_symbol": "GLUT18", "species": "Homo sapiens", "x": 9.482860565185547, "y": -2.9726154804229736, "cluster_id": 3}, {"gene_symbol": "RAS19", "species": "Homo sapiens", "x": -1.5605887174606323, "y": 3.430974245071411, "cluster_id": 14}, {"gene_symbol": "RPL17", "species": "Drosophila melanogaster", "x": 12.491379737854004, "y": -2.451519250869751, "cluster_id": 4}, {"gene_symbol": "MDM29", "species": "Mus musculus", "x": 12.217156410217285, "y": 16.514354705810547, "cluster_id": 0}, {"gene_symbol": "KRAS24", "species": "Homo sapiens", "x": -2.8884458541870117, "y": 10.688182830810547, "cluster_id": 8}, {"gene_symbol": "ACTB13", "species": "Arabidopsis thaliana", "x": -2.7273433208465576, "y": 4.913877010345459, "cluster_id": 19}, {"gene_symbol": "VEGF18", "species": "Saccharomyces cerevisiae", "x": -2.553403615951538, "y": 4.604945659637451, "cluster_id": 20}, {"gene_symbol": "FGF14", "species": "Mus musculus", "x": -2.628645420074463, "y": 5.019226551055908, "cluster_id": 19}, {"gene_symbol": "RB30", "species": "Escherichia coli", "x": -2.166029214859009, "y": 3.1540210247039795, "cluster_id": 15}, {"gene_symbol": "CCND28", "species": "Homo sapiens", "x": -2.030823230743408, "y": 7.546586513519287, "cluster_id": 16}, {"gene_symbol": "HRAS21", "species": "Mus musculus", "x": -2.423959970474243, "y": 12.76978874206543, "cluster_id": 2}, {"gene_symbol": "TLR19", "species": "Arabidopsis thaliana", "x": 0.22438152134418488, "y": -0.35144203901290894, "cluster_id": -1}, {"gene_symbol": "APC10", "species": "Mus musculus", "x": 5.411617755889893, "y": -4.087241172790527, "cluster_id": 6}, {"gene_symbol": "RPL3", "species": "Homo sapiens", "x": -2.371588706970215, "y": 4.042613983154297, "cluster_id": -1}, {"gene_symbol": "PIK326", "species": "Mus musculus", "x": -1.8254430294036865, "y": 4.912686824798584, "cluster_id": 19}, {"gene_symbol": "MYC7", "species": "Mus musculus", "x": 12.395360946655273, "y": -2.540512800216675, "cluster_id": 4}, {"gene_symbol": "TNF14", "species": "Homo sapiens", "x": 12.745461463928223, "y": -2.462756395339966, "cluster_id": 4}, {"gene_symbol": "SOX11", "species": "Drosophila melanogaster", "x": 11.986740112304688, "y": 15.832141876220703, "cluster_id": 0}, {"gene_symbol": "HOX6", "species": "Arabidopsis thaliana", "x": -2.2296433448791504, "y": 14.100004196166992, "cluster_id": 1}, {"gene_symbol": "ATM5", "species": "Mus musculus", "x": -1.8844138383865356, "y": 1.6025075912475586, "cluster_id": 11}, {"gene_symbol": "MDM21", "species": "Caenorhabditis elegans", "x": -1.8899024724960327, "y": 7.667996406555176, "cluster_id": 16}, {"gene_symbol": "TUBB8", "species": "Drosophila melanogaster", "x": 12.687666893005371, "y": -2.47119402885437, "cluster_id": 4}, {"gene_symbol": "BAX2", "species": "Mus musculus", "x": 11.806111335754395, "y": -2.6888692378997803, "cluster_id": 4}, {"gene_symbol": "IFN18", "species": "Homo sapiens", "x": -2.3108386993408203, "y": 13.884174346923828, "cluster_id": 1}, {"gene_symbol": "MYC24", "species": "Mus musculus", "x": -2.6885898113250732, "y": 5.167254447937012, "cluster_id": 19}, {"gene_symbol": "MHC13", "species": "Homo sapiens", "x": -2.382655620574951, "y": 11.458664894104004, "cluster_id": 7}, {"gene_symbol": "RB25", "species": "Saccharomyces cerevisiae", "x": -2.029008150100708, "y": 7.932364463806152, "cluster_id": 16}, {"gene_symbol": "GATA3", "species": "Homo sapiens", "x": -2.374194860458374, "y": 12.772513389587402, "cluster_id": 2}, {"gene_symbol": "PDGF7", "species": "Homo sapiens", "x": 5.246522903442383, "y": -3.920459032058716, "cluster_id": 6}, {"gene_symbol": "EGFR3", "species": "Homo sapiens", "x": 12.262648582458496, "y": 16.50978660583496, "cluster_id": 0}, {"gene_symbol": "HDAC28", "species": "Mus musculus", "x": -2.353079080581665, "y": 12.32398796081543, "cluster_id": 2}, {"gene_symbol": "RPL8", "species": "Homo sapiens", "x": 12.447563171386719, "y": -2.479816436767578, "cluster_id": 4}, {"gene_symbol": "BAX29", "species": "Homo sapiens", "x": 5.987661361694336, "y": -4.067470073699951, "cluster_id": 6}, {"gene_symbol": "JAK15", "species": "Escherichia coli", "x": -1.9064610004425049, "y": 7.404027938842773, "cluster_id": 16}, {"gene_symbol": "ACTB26", "species": "Caenorhabditis elegans", "x": -2.321314573287964, "y": 13.52058219909668, "cluster_id": 1}, {"gene_symbol": "PAX11", "species": "Drosophila melanogaster", "x": 2.017094135284424, "y": -2.3755757808685303, "cluster_id": 12}, {"gene_symbol": "PIK329", "species": "Saccharomyces cerevisiae", "x": 11.648215293884277, "y": -2.8273134231567383, "cluster_id": 4}, {"gene_symbol": "BCL4", "species": "Homo sapiens", "x": 12.135156631469727, "y": -2.4725301265716553, "cluster_id": 4}, {"gene_symbol": "HRAS8", "species": "Homo sapiens", "x": 1.298715353012085, "y": -2.4093828201293945, "cluster_id": 12}, {"gene_symbol": "IFN17", "species": "Mus musculus", "x": 5.745761394500732, "y": -4.033037185668945, "cluster_id": 6}, {"gene_symbol": "APC25", "species": "Mus musculus", "x": -2.4401566982269287, "y": 4.977734565734863, "cluster_id": 19}, {"gene_symbol": "RAS30", "species": "Saccharomyces cerevisiae", "x": -2.5619523525238037, "y": 11.098912239074707, "cluster_id": 7}, {"gene_symbol": "PTEN25", "species": "Homo sapiens", "x": 5.37931489944458, "y": -4.276216983795166, "cluster_id": 6}, {"gene_symbol": "CASP1", "species": "Saccharomyces cerevisiae", "x": 12.135750770568848, "y": 16.206357955932617, "cluster_id": 0}, {"gene_symbol": "EGFR19", "species": "Homo sapiens", "x": 0.704992949962616, "y": -0.7001365423202515, "cluster_id": 10}, {"gene_symbol": "EIF2", "species": "Escherichia coli", "x": -2.287745714187622, "y": 3.5069315433502197, "cluster_id": 15}, {"gene_symbol": "MHC21", "species": "Saccharomyces cerevisiae", "x": 1.7089229822158813, "y": -1.7063590288162231, "cluster_id": 12}, {"gene_symbol": "TGFB20", "species": "Escherichia coli", "x": -2.9395785331726074, "y": 10.817459106445312, "cluster_id": 8}, {"gene_symbol": "EGFR27", "species": "Homo sapiens", "x": -1.0962876081466675, "y": 0.6943862438201904, "cluster_id": 11}, {"gene_symbol": "HOX20", "species": "Arabidopsis thaliana", "x": 9.923555374145508, "y": -2.841400384902954, "cluster_id": 3}, {"gene_symbol": "IL25", "species": "Mus musculus", "x": -2.0020854473114014, "y": 2.2158610820770264, "cluster_id": 11}, {"gene_symbol": "BMP27", "species": "Homo sapiens", "x": -1.4280288219451904, "y": 2.9593405723571777, "cluster_id": 14}, {"gene_symbol": "KRAS22", "species": "Drosophila melanogaster", "x": 1.3310081958770752, "y": -2.649549961090088, "cluster_id": 12}, {"gene_symbol": "IL3", "species": "Homo sapiens", "x": -2.205669403076172, "y": 12.481493949890137, "cluster_id": 2}, {"gene_symbol": "PAX30", "species": "Homo sapiens", "x": 1.2826615571975708, "y": -1.5765533447265625, "cluster_id": 12}, {"gene_symbol": "EZH13", "species": "Mus musculus", "x": 9.315628051757812, "y": -3.349541425704956, "cluster_id": 3}, {"gene_symbol": "GLUT8", "species": "Arabidopsis thaliana", "x": 0.12863260507583618, "y": -1.8311426639556885, "cluster_id": 13}, {"gene_symbol": "BMP6", "species": "Mus musculus", "x": -2.194685220718384, "y": 2.6343138217926025, "cluster_id": 11}, {"gene_symbol": "EGFR1", "species": "Mus musculus", "x": -2.2544119358062744, "y": 4.857911109924316, "cluster_id": 19}, {"gene_symbol": "PIK38", "species": "Arabidopsis thaliana", "x": -1.8103365898132324, "y": 5.539713382720947, "cluster_id": 17}, {"gene_symbol": "PAX7", "species": "Drosophila melanogaster", "x": 5.56559419631958, "y": -4.238306045532227, "cluster_id": 6}, {"gene_symbol": "CDK5", "species": "Arabidopsis thaliana", "x": -0.945885181427002, "y": 1.5925906896591187, "cluster_id": 11}, {"gene_symbol": "PAX21", "species": "Caenorhabditis elegans", "x": -2.859004497528076, "y": 3.5112621784210205, "cluster_id": 20}, {"gene_symbol": "RPS19", "species": "Mus musculus", "x": -0.06061055138707161, "y": -1.3472198247909546, "cluster_id": 13}, {"gene_symbol": "RB4", "species": "Saccharomyces cerevisiae", "x": -2.4483048915863037, "y": 11.452116012573242, "cluster_id": 7}, {"gene_symbol": "PAX25", "species": "Homo sapiens", "x": -1.8867919445037842, "y": 6.80327033996582, "cluster_id": 18}, {"gene_symbol": "TLR24", "species": "Mus musculus", "x": -2.2280077934265137, "y": 13.775141716003418, "cluster_id": 1}, {"gene_symbol": "WNT30", "species": "Mus musculus", "x": 5.641376495361328, "y": -4.367223262786865, "cluster_id": 6}, {"gene_symbol": "INS4", "species": "Homo sapiens", "x": -2.7371809482574463, "y": 3.0711236000061035, "cluster_id": -1}, {"gene_symbol": "BAX14", "species": "Escherichia coli", "x": -2.2501060962677, "y": 2.848109006881714, "cluster_id": 11}, {"gene_symbol": "WNT24", "species": "Homo sapiens", "x": -1.7595100402832031, "y": 5.684347152709961, "cluster_id": 17}, {"gene_symbol": "TGFB4", "species": "Drosophila melanogaster", "x": 12.787814140319824, "y": -2.4044766426086426, "cluster_id": 4}, {"gene_symbol": "NOTCH1", "species": "Homo sapiens", "x": 8.64522647857666, "y": -3.5626351833343506, "cluster_id": 3}, {"gene_symbol": "TNF6", "species": "Escherichia coli", "x": 1.0261402130126953, "y": -1.5806028842926025, "cluster_id": 12}, {"gene_symbol": "KRAS10", "species": "Homo sapiens", "x": -1.5725051164627075, "y": 3.191899061203003, "cluster_id": 14}, {"gene_symbol": "MYC19", "species": "Mus musculus", "x": 12.031854629516602, "y": 16.004926681518555, "cluster_id": 0}, {"gene_symbol": "MHC11", "species": "Escherichia coli", "x": -2.2475411891937256, "y": 3.6146161556243896, "cluster_id": 15}, {"gene_symbol": "TNF8", "species": "Escherichia coli", "x": -2.1703407764434814, "y": 6.86012601852417, "cluster_id": 18}, {"gene_symbol": "EIF19", "species": "Homo sapiens", "x": 11.425939559936523, "y": -2.7936344146728516, "cluster_id": 4}, {"gene_symbol": "PTEN15", "species": "Mus musculus", "x": 8.339500427246094, "y": -3.1806187629699707, "cluster_id": 3}, {"gene_symbol": "HSP18", "species": "Saccharomyces cerevisiae", "x": -1.2301063537597656, "y": -0.3672206401824951, "cluster_id": 9}, {"gene_symbol": "NFKB13", "species": "Saccharomyces cerevisiae", "x": -1.9784826040267944, "y": 7.414867877960205, "cluster_id": 16}, {"gene_symbol": "MYC8", "species": "Homo sapiens", "x": -1.527510643005371, "y": -0.06260401755571365, "cluster_id": 9}, {"gene_symbol": "RB14", "species": "Homo sapiens", "x": 5.696619510650635, "y": -4.27359676361084, "cluster_id": 6}, {"gene_symbol": "STAT28", "species": "Saccharomyces cerevisiae", "x": -2.3362019062042236, "y": 1.0900708436965942, "cluster_id": -1}, {"gene_symbol": "JAK24", "species": "Drosophila melanogaster", "x": -2.3373160362243652, "y": 11.405168533325195, "cluster_id": 7}, {"gene_symbol": "WNT29", "species": "Drosophila melanogaster", "x": 12.317334175109863, "y": 16.602066040039062, "cluster_id": 0}, {"gene_symbol": "PAX3", "species": "Arabidopsis thaliana", "x": 3.5092086791992188, "y": -3.4530835151672363, "cluster_id": 5}, {"gene_symbol": "FGF30", "species": "Mus musculus", "x": -2.227541208267212, "y": 4.8581342697143555, "cluster_id": 19}, {"gene_symbol": "MLH7", "species": "Homo sapiens", "x": -1.4826732873916626, "y": 2.572045087814331, "cluster_id": -1}, {"gene_symbol": "FGF15", "species": "Escherichia coli", "x": -2.368241548538208, "y": 11.537382125854492, "cluster_id": 7}, {"gene_symbol": "EZH15", "species": "Mus musculus", "x": -1.8514671325683594, "y": 6.60349702835083, "cluster_id": 18}, {"gene_symbol": "TUBB15", "species": "Homo sapiens", "x": -1.8774877786636353, "y": 7.775237083435059, "cluster_id": 16}, {"gene_symbol": "TNF7", "species": "Mus musculus", "x": -2.1412811279296875, "y": 7.249080181121826, "cluster_id": 16}, {"gene_symbol": "EZH1", "species": "Homo sapiens", "x": -2.3990113735198975, "y": 1.4277105331420898, "cluster_id": -1}, {"gene_symbol": "ERK16", "species": "Homo sapiens", "x": -2.0252034664154053, "y": 7.526595592498779, "cluster_id": 16}, {"gene_symbol": "PTEN4", "species": "Homo sapiens", "x": -0.916095495223999, "y": 0.7403568029403687, "cluster_id": 11}, {"gene_symbol": "CASP27", "species": "Homo sapiens", "x": -2.322216510772705, "y": 4.919223308563232, "cluster_id": 19}, {"gene_symbol": "RPS2", "species": "Mus musculus", "x": 12.352757453918457, "y": 16.61075210571289, "cluster_id": 0}, {"gene_symbol": "FAS12", "species": "Homo sapiens", "x": -2.3702094554901123, "y": 3.5246152877807617, "cluster_id": 15}, {"gene_symbol": "JAK22", "species": "Mus musculus", "x": 12.263385772705078, "y": 16.605653762817383, "cluster_id": 0}, {"gene_symbol": "CASP29", "species": "Mus musculus", "x": 9.875143051147461, "y": -2.8084397315979004, "cluster_id": 3}, {"gene_symbol": "MHC25", "species": "Homo sapiens", "x": 5.603955268859863, "y": -3.8478353023529053, "cluster_id": 6}, {"gene_symbol": "JAK7", "species": "Caenorhabditis elegans", "x": -0.9171473383903503, "y": 1.5440961122512817, "cluster_id": 11}, {"gene_symbol": "JAK30", "species": "Homo sapiens", "x": 4.751215934753418, "y": -4.365277290344238, "cluster_id": 6}, {"gene_symbol": "CASP22", "species": "Drosophila melanogaster", "x": 12.8395414352417, "y": -2.469000816345215, "cluster_id": 4}, {"gene_symbol": "SOX4", "species": "Homo sapiens", "x": 8.663067817687988, "y": -3.3786261081695557, "cluster_id": 3}, {"gene_symbol": "KRAS3", "species": "Homo sapiens", "x": 0.2568955719470978, "y": -2.1139659881591797, "cluster_id": 13}, {"gene_symbol": "WNT14", "species": "Homo sapiens", "x": -1.682133436203003, "y": 1.7795805931091309, "cluster_id": 11}, {"gene_symbol": "HDAC22", "species": "Escherichia coli", "x": 11.66909408569336, "y": 15.40828800201416, "cluster_id": 0}, {"gene_symbol": "HSP23", "species": "Escherichia coli", "x": -2.5297117233276367, "y": 5.348387718200684, "cluster_id": -1}, {"gene_symbol": "MDM11", "species": "Drosophila melanogaster", "x": -1.9904966354370117, "y": 4.935967445373535, "cluster_id": 19}, {"gene_symbol": "RPS10", "species": "Caenorhabditis elegans", "x": -2.254964828491211, "y": 14.041788101196289, "cluster_id": 1}, {"gene_symbol": "ERK14", "species": "Saccharomyces cerevisiae", "x": -2.2735466957092285, "y": 3.8499062061309814, "cluster_id": 15}, {"gene_symbol": "RAS14", "species": "Homo sapiens", "x": -1.565682291984558, "y": 3.1449403762817383, "cluster_id": 14}, {"gene_symbol": "PDGF13", "species": "Drosophila melanogaster", "x": -2.4532992839813232, "y": 12.19118595123291, "cluster_id": 2}, {"gene_symbol": "RPL27", "species": "Saccharomyces cerevisiae", "x": -1.981092929840088, "y": 3.711609363555908, "cluster_id": -1}, {"gene_symbol": "MLH15", "species": "Saccharomyces cerevisiae", "x": 9.138568878173828, "y": -2.9304566383361816, "cluster_id": 3}, {"gene_symbol": "FOX30", "species": "Saccharomyces cerevisiae", "x": -0.2706231474876404, "y": -0.5014426708221436, "cluster_id": 13}, {"gene_symbol": "FOX18", "species": "Escherichia coli", "x": 0.8372709155082703, "y": -2.058058738708496, "cluster_id": 13}, {"gene_symbol": "MYC25", "species": "Homo sapiens", "x": 1.6601181030273438, "y": -1.687624216079712, "cluster_id": 12}, {"gene_symbol": "DNMT22", "species": "Homo sapiens", "x": 0.6447403430938721, "y": -1.1495139598846436, "cluster_id": 10}, {"gene_symbol": "TP8", "species": "Escherichia coli", "x": -2.554887294769287, "y": 11.963700294494629, "cluster_id": -1}, {"gene_symbol": "MDM7", "species": "Homo sapiens", "x": -2.4065139293670654, "y": 3.583012819290161, "cluster_id": 15}, {"gene_symbol": "ACTB16", "species": "Homo sapiens", "x": 9.06811809539795, "y": -3.0684094429016113, "cluster_id": 3}, {"gene_symbol": "ATM23", "species": "Arabidopsis thaliana", "x": -1.2593601942062378, "y": -0.3033737540245056, "cluster_id": 9}, {"gene_symbol": "PTEN19", "species": "Escherichia coli", "x": 9.607903480529785, "y": -3.04567813873291, "cluster_id": 3}, {"gene_symbol": "PAX1", "species": "Homo sapiens", "x": 8.15026569366455, "y": -3.2436015605926514, "cluster_id": 3}, {"gene_symbol": "HOX4", "species": "Arabidopsis thaliana", "x": -2.059603691101074, "y": 1.6117370128631592, "cluster_id": 11}, {"gene_symbol": "TUBB21", "species": "Mus musculus", "x": 5.403550624847412, "y": -4.213639259338379, "cluster_id": 6}, {"gene_symbol": "HSP13", "species": "Escherichia coli", "x": -2.4628665447235107, "y": 3.163872480392456, "cluster_id": 15}, {"gene_symbol": "RPL25", "species": "Homo sapiens", "x": -2.314645290374756, "y": 13.322044372558594, "cluster_id": 1}, {"gene_symbol": "TUBB19", "species": "Homo sapiens", "x": -1.453840732574463, "y": 1.8697855472564697, "cluster_id": 11}, {"gene_symbol": "IL21", "species": "Escherichia coli", "x": -1.9440345764160156, "y": 8.05229377746582, "cluster_id": -1}, {"gene_symbol": "BMP23", "species": "Mus musculus", "x": 0.6534833908081055, "y": -2.1115338802337646, "cluster_id": 13}, {"gene_symbol": "CCND29", "species": "Homo sapiens", "x": 9.085267066955566, "y": -3.1667120456695557, "cluster_id": 3}, {"gene_symbol": "FAS18", "species": "Arabidopsis thaliana", "x": 8.806229591369629, "y": -3.4196150302886963, "cluster_id": 3}, {"gene_symbol": "PDGF15", "species": "Homo sapiens", "x": 0.07369173318147659, "y": -0.1990709751844406, "cluster_id": -1}, {"gene_symbol": "TET19", "species": "Homo sapiens", "x": -1.6288079023361206, "y": 1.7464674711227417, "cluster_id": 11}, {"gene_symbol": "EZH30", "species": "Escherichia coli", "x": -2.263658046722412, "y": 0.9236772060394287, "cluster_id": -1}, {"gene_symbol": "MDM27", "species": "Saccharomyces cerevisiae", "x": 3.281522750854492, "y": -3.2913029193878174, "cluster_id": 5}, {"gene_symbol": "WNT23", "species": "Homo sapiens", "x": -2.8506734371185303, "y": 10.724823951721191, "cluster_id": 8}, {"gene_symbol": "FOX8", "species": "Saccharomyces cerevisiae", "x": -1.1348967552185059, "y": 1.2764493227005005, "cluster_id": 11}, {"gene_symbol": "RAS17", "species": "Homo sapiens", "x": -1.3183367252349854, "y": 1.6498154401779175, "cluster_id": 11}, {"gene_symbol": "MYC17", "species": "Homo sapiens", "x": 4.557959079742432, "y": -3.884601593017578, "cluster_id": 6}, {"gene_symbol": "APC15", "species": "Homo sapiens", "x": 9.90494155883789, "y": -2.9255847930908203, "cluster_id": 3}, {"gene_symbol": "MLH13", "species": "Homo sapiens", "x": -2.225314140319824, "y": 4.924657821655273, "cluster_id": 19}, {"gene_symbol": "RPS11", "species": "Homo sapiens", "x": -1.3972307443618774, "y": -0.272353857755661, "cluster_id": 9}, {"gene_symbol": "MHC4", "species": "Homo sapiens", "x": -1.444991946220398, "y": 1.8514125347137451, "cluster_id": 11}, {"gene_symbol": "HLA12", "species": "Saccharomyces cerevisiae", "x": -2.018049955368042, "y": 6.825042724609375, "cluster_id": 18}, {"gene_symbol": "RPS16", "species": "Mus musculus", "x": -1.9728957414627075, "y": 8.093416213989258, "cluster_id": -1}, {"gene_symbol": "PTEN5", "species": "Homo sapiens", "x": -1.848472237586975, "y": 5.815123558044434, "cluster_id": 17}, {"gene_symbol": "JAK28", "species": "Escherichia coli", "x": -2.3481833934783936, "y": 5.662327289581299, "cluster_id": -1}, {"gene_symbol": "APC24", "species": "Mus musculus", "x": -2.039728879928589, "y": 5.735055446624756, "cluster_id": 17}, {"gene_symbol": "HOX16", "species": "Homo sapiens", "x": -1.4303290843963623, "y": 2.9763576984405518, "cluster_id": 14}, {"gene_symbol": "AKT23", "species": "Saccharomyces cerevisiae", "x": 0.20305047929286957, "y": 0.1666095107793808, "cluster_id": -1}, {"gene_symbol": "CCND8", "species": "Homo sapiens", "x": -1.1811895370483398, "y": -0.13028965890407562, "cluster_id": 9}, {"gene_symbol": "JAK6", "species": "Homo sapiens", "x": 11.217554092407227, "y": -2.6370351314544678, "cluster_id": 4}, {"gene_symbol": "FOX22", "species": "Saccharomyces cerevisiae", "x": -2.092318534851074, "y": 7.646719455718994, "cluster_id": 16}, {"gene_symbol": "ATM11", "species": "Caenorhabditis elegans", "x": 12.834979057312012, "y": -2.392963171005249, "cluster_id": 4}, {"gene_symbol": "ATM7", "species": "Homo sapiens", "x": 1.7023601531982422, "y": -1.909488558769226, "cluster_id": 12}, {"gene_symbol": "HLA1", "species": "Homo sapiens", "x": -2.251148223876953, "y": 3.3033363819122314, "cluster_id": 15}, {"gene_symbol": "SOX12", "species": "Homo sapiens", "x": 3.0303187370300293, "y": -3.094717502593994, "cluster_id": 5}, {"gene_symbol": "PTEN1", "species": "Escherichia coli", "x": 9.027831077575684, "y": -3.1307308673858643, "cluster_id": 3}, {"gene_symbol": "IL7", "species": "Homo sapiens", "x": 1.751697301864624, "y": -1.5614105463027954, "cluster_id": 12}, {"gene_symbol": "ATM29", "species": "Saccharomyces cerevisiae", "x": -2.0802664756774902, "y": 7.3072896003723145, "cluster_id": 16}, {"gene_symbol": "PDGF27", "species": "Escherichia coli", "x": -1.4586420059204102, "y": 1.501885175704956, "cluster_id": 11}, {"gene_symbol": "ERK11", "species": "Homo sapiens", "x": 12.110633850097656, "y": 16.28456687927246, "cluster_id": 0}, {"gene_symbol": "IL23", "species": "Mus musculus", "x": 2.11608624458313, "y": -2.543349266052246, "cluster_id": 12}, {"gene_symbol": "P5323", "species": "Homo sapiens", "x": 4.15736198425293, "y": -3.849648952484131, "cluster_id": 6}, {"gene_symbol": "IFN7", "species": "Mus musculus", "x": -2.165921449661255, "y": 7.244141101837158, "cluster_id": 16}, {"gene_symbol": "P5310", "species": "Homo sapiens", "x": -2.3674681186676025, "y": 11.486665725708008, "cluster_id": 7}, {"gene_symbol": "RPL18", "species": "Mus musculus", "x": -2.085153341293335, "y": 1.8141274452209473, "cluster_id": 11}, {"gene_symbol": "NOTCH19", "species": "Mus musculus", "x": -0.06512749195098877, "y": -1.5819061994552612, "cluster_id": 13}, {"gene_symbol": "PIK330", "species": "Mus musculus", "x": -0.21560324728488922, "y": -0.6695181131362915, "cluster_id": 13}, {"gene_symbol": "RPL10", "species": "Mus musculus", "x": -2.1181480884552, "y": 12.79330825805664, "cluster_id": 2}, {"gene_symbol": "MLH24", "species": "Homo sapiens", "x": -2.770458936691284, "y": 3.396446704864502, "cluster_id": 20}, {"gene_symbol": "CCND13", "species": "Escherichia coli", "x": 6.036362171173096, "y": -3.8529164791107178, "cluster_id": 6}, {"gene_symbol": "PTEN21", "species": "Homo sapiens", "x": 5.459688663482666, "y": -4.294772148132324, "cluster_id": 6}, {"gene_symbol": "TGFB21", "species": "Homo sapiens", "x": -0.3632626235485077, "y": 0.9006938338279724, "cluster_id": 11}, {"gene_symbol": "TP5", "species": "Mus musculus", "x": -2.3842110633850098, "y": 3.6362898349761963, "cluster_id": 15}, {"gene_symbol": "AKT7", "species": "Homo sapiens", "x": -1.9771641492843628, "y": 6.85146427154541, "cluster_id": 18}, {"gene_symbol": "INS21", "species": "Homo sapiens", "x": 0.4994983673095703, "y": -1.7574212551116943, "cluster_id": 13}, {"gene_symbol": "PTEN2", "species": "Mus musculus", "x": 9.135838508605957, "y": -3.4400076866149902, "cluster_id": 3}, {"gene_symbol": "MHC15", "species": "Saccharomyces cerevisiae", "x": -1.5146104097366333, "y": 3.337970018386841, "cluster_id": 14}, {"gene_symbol": "NRAS15", "species": "Escherichia coli", "x": 1.9897656440734863, "y": -1.9399408102035522, "cluster_id": 12}, {"gene_symbol": "CDK25", "species": "Homo sapiens", "x": -2.7356374263763428, "y": 11.496256828308105, "cluster_id": 7}, {"gene_symbol": "GLUT30", "species": "Arabidopsis thaliana", "x": -2.7311036586761475, "y": 3.4825210571289062, "cluster_id": 20}, {"gene_symbol": "BRCA3", "species": "Drosophila melanogaster", "x": -1.4267224073410034, "y": 2.9472265243530273, "cluster_id": 14}, {"gene_symbol": "WNT13", "species": "Mus musculus", "x": -0.8561587929725647, "y": 1.1436034440994263, "cluster_id": 11}, {"gene_symbol": "ACTB17", "species": "Homo sapiens", "x": -2.4322969913482666, "y": 4.201406478881836, "cluster_id": -1}, {"gene_symbol": "HOX5", "species": "Arabidopsis thaliana", "x": 12.247084617614746, "y": -2.7368664741516113, "cluster_id": 4}, {"gene_symbol": "BRCA17", "species": "Homo sapiens", "x": -2.6466546058654785, "y": 11.825262069702148, "cluster_id": -1}, {"gene_symbol": "WNT18", "species": "Escherichia coli", "x": 0.8699114918708801, "y": -0.8570531606674194, "cluster_id": 10}, {"gene_symbol": "BRCA21", "species": "Homo sapiens", "x": -2.165923833847046, "y": 13.932768821716309, "cluster_id": 1}, {"gene_symbol": "BRCA23", "species": "Saccharomyces cerevisiae", "x": -2.9824209213256836, "y": 10.869850158691406, "cluster_id": 8}, {"gene_symbol": "MDM8", "species": "Homo sapiens", "x": -1.8181127309799194, "y": 7.688022613525391, "cluster_id": 16}, {"gene_symbol": "RPL15", "species": "Homo sapiens", "x": 1.4305682182312012, "y": -2.3358078002929688, "cluster_id": 12}, {"gene_symbol": "BMP21", "species": "Homo sapiens", "x": 6.054245948791504, "y": -3.882145643234253, "cluster_id": 6}, {"gene_symbol": "IL26", "species": "Homo sapiens", "x": 12.763406753540039, "y": -2.3832716941833496, "cluster_id": 4}, {"gene_symbol": "EZH14", "species": "Mus musculus", "x": -2.65403151512146, "y": 4.642581462860107, "cluster_id": 20}, {"gene_symbol": "EGFR6", "species": "Mus musculus", "x": -0.3317595422267914, "y": -1.141339659690857, "cluster_id": 13}, {"gene_symbol": "INS24", "species": "Arabidopsis thaliana", "x": 0.2007601112127304, "y": 0.1546020656824112, "cluster_id": -1}, {"gene_symbol": "KRAS6", "species": "Mus musculus", "x": -1.942853569984436, "y": 4.997447490692139, "cluster_id": 19}, {"gene_symbol": "EGFR26", "species": "Saccharomyces cerevisiae", "x": 11.692094802856445, "y": -2.656066417694092, "cluster_id": 4}, {"gene_symbol": "PDGF9", "species": "Escherichia coli", "x": -1.063647747039795, "y": 0.17778711020946503, "cluster_id": -1}, {"gene_symbol": "KRAS7", "species": "Caenorhabditis elegans", "x": -2.2714853286743164, "y": 14.001300811767578, "cluster_id": 1}, {"gene_symbol": "TP3", "species": "Saccharomyces cerevisiae", "x": 11.815690994262695, "y": 15.552386283874512, "cluster_id": 0}, {"gene_symbol": "HRAS9", "species": "Saccharomyces cerevisiae", "x": -2.0904502868652344, "y": 6.702287197113037, "cluster_id": 18}, {"gene_symbol": "INS25", "species": "Mus musculus", "x": -0.09071663022041321, "y": -1.7619798183441162, "cluster_id": 13}, {"gene_symbol": "MYC12", "species": "Homo sapiens", "x": 11.254627227783203, "y": -2.715535879135132, "cluster_id": 4}, {"gene_symbol": "CDK1", "species": "Homo sapiens", "x": -2.2955875396728516, "y": 12.966838836669922, "cluster_id": 2}, {"gene_symbol": "JAK5", "species": "Homo sapiens", "x": 1.8117425441741943, "y": -1.7067705392837524, "cluster_id": 12}, {"gene_symbol": "TP24", "species": "Mus musculus", "x": 11.559488296508789, "y": -2.528815507888794, "cluster_id": 4}, {"gene_symbol": "EIF11", "species": "Caenorhabditis elegans", "x": -0.6356302499771118, "y": 1.214198112487793, "cluster_id": 11}, {"gene_symbol": "BMP4", "species": "Homo sapiens", "x": -2.4308836460113525, "y": 11.337994575500488, "cluster_id": 7}, {"gene_symbol": "IFN20", "species": "Drosophila melanogaster", "x": 4.600085258483887, "y": -4.350321292877197, "cluster_id": 6}, {"gene_symbol": "NOTCH27", "species": "Homo sapiens", "x": 0.9192132949829102, "y": -1.107689619064331, "cluster_id": 10}, {"gene_symbol": "BRCA16", "species": "Mus musculus", "x": -2.9819746017456055, "y": 4.522992134094238, "cluster_id": 20}, {"gene_symbol": "JAK1", "species": "Mus musculus", "x": 4.641239166259766, "y": -4.3184027671813965, "cluster_id": 6}, {"gene_symbol": "EGFR11", "species": "Homo sapiens", "x": -2.2071542739868164, "y": 13.925884246826172, "cluster_id": 1}, {"gene_symbol": "INS2", "species": "Mus musculus", "x": -0.6606081128120422, "y": 1.3960140943527222, "cluster_id": 11}, {"gene_symbol": "SRC24", "species": "Homo sapiens", "x": -1.2609095573425293, "y": 1.7086783647537231, "cluster_id": 11}, {"gene_symbol": "IL2", "species": "Homo sapiens", "x": -1.3682656288146973, "y": -0.3128076493740082, "cluster_id": 9}, {"gene_symbol": "BCL10", "species": "Homo sapiens", "x": -1.8539385795593262, "y": 5.535323619842529, "cluster_id": 17}, {"gene_symbol": "RPS14", "species": "Escherichia coli", "x": -1.1819548606872559, "y": 0.7880225777626038, "cluster_id": 11}, {"gene_symbol": "STAT30", "species": "Mus musculus", "x": -2.4654762744903564, "y": 11.35851001739502, "cluster_id": 7}, {"gene_symbol": "RAS5", "species": "Homo sapiens", "x": 12.202054023742676, "y": 16.44851303100586, "cluster_id": 0}, {"gene_symbol": "PAX20", "species": "Homo sapiens", "x": -2.8779919147491455, "y": 10.928924560546875, "cluster_id": 8}, {"gene_symbol": "AKT20", "species": "Escherichia coli", "x": -2.249835729598999, "y": 12.962248802185059, "cluster_id": 2}, {"gene_symbol": "NRAS17", "species": "Homo sapiens", "x": 3.117199420928955, "y": -3.171549081802368, "cluster_id": 5}, {"gene_symbol": "RB15", "species": "Mus musculus", "x": 1.883636474609375, "y": -2.1227593421936035, "cluster_id": 12}, {"gene_symbol": "APC27", "species": "Homo sapiens", "x": -2.9607295989990234, "y": 10.921377182006836, "cluster_id": 8}, {"gene_symbol": "AKT24", "species": "Homo sapiens", "x": -0.5355374813079834, "y": 1.2764369249343872, "cluster_id": 11}, {"gene_symbol": "PDGF23", "species": "Drosophila melanogaster", "x": -2.927840232849121, "y": 4.442086696624756, "cluster_id": 20}, {"gene_symbol": "IL19", "species": "Mus musculus", "x": -2.939394950866699, "y": 10.965659141540527, "cluster_id": 8}, {"gene_symbol": "AKT9", "species": "Escherichia coli", "x": 11.717731475830078, "y": 15.440200805664062, "cluster_id": 0}, {"gene_symbol": "ACTB19", "species": "Homo sapiens", "x": -2.897886037826538, "y": 4.0307769775390625, "cluster_id": 20}, {"gene_symbol": "SOX10", "species": "Homo sapiens", "x": 5.598886489868164, "y": -4.369646072387695, "cluster_id": 6}, {"gene_symbol": "FOX15", "species": "Homo sapiens", "x": -0.8189882636070251, "y": 1.5467078685760498, "cluster_id": 11}, {"gene_symbol": "WNT5", "species": "Escherichia coli", "x": 12.727445602416992, "y": -2.4251868724823, "cluster_id": 4}, {"gene_symbol": "FOX24", "species": "Homo sapiens", "x": 5.62635612487793, "y": -4.34910249710083, "cluster_id": 6}, {"gene_symbol": "BMP12", "species": "Escherichia coli", "x": 11.218042373657227, "y": -2.604750633239746, "cluster_id": 4}, {"gene_symbol": "HSP26", "species": "Mus musculus", "x": 3.3213083744049072, "y": -3.2874317169189453, "cluster_id": 5}, {"gene_symbol": "BMP14", "species": "Homo sapiens", "x": -2.1267380714416504, "y": 12.530715942382812, "cluster_id": 2}, {"gene_symbol": "RB22", "species": "Mus musculus", "x": 0.24657681584358215, "y": -0.16453740000724792, "cluster_id": -1}, {"gene_symbol": "CCND24", "species": "Escherichia coli", "x": -0.024257974699139595, "y": -1.2062755823135376, "cluster_id": 13}, {"gene_symbol": "HLA8", "species": "Arabidopsis thaliana", "x": -1.875869631767273, "y": 7.714907646179199, "cluster_id": 16}, {"gene_symbol": "CCND7", "species": "Homo sapiens", "x": 4.512342929840088, "y": -4.0389404296875, "cluster_id": 6}, {"gene_symbol": "BCL2", "species": "Escherichia coli", "x": 12.360760688781738, "y": 16.630420684814453, "cluster_id": 0}, {"gene_symbol": "APC5", "species": "Homo sapiens", "x": -2.082448959350586, "y": 12.62865161895752, "cluster_id": 2}, {"gene_symbol": "NFKB19", "species": "Homo sapiens", "x": 9.9354829788208, "y": -2.7545366287231445, "cluster_id": 3}, {"gene_symbol": "CDK27", "species": "Saccharomyces cerevisiae", "x": -1.9054126739501953, "y": 6.431123733520508, "cluster_id": 18}, {"gene_symbol": "BMP19", "species": "Homo sapiens", "x": 0.2952423393726349, "y": -1.6231878995895386, "cluster_id": 13}, {"gene_symbol": "CASP20", "species": "Mus musculus", "x": -2.136423110961914, "y": 7.693643569946289, "cluster_id": 16}, {"gene_symbol": "NOTCH17", "species": "Homo sapiens", "x": 1.9715027809143066, "y": -2.1648330688476562, "cluster_id": 12}, {"gene_symbol": "TUBB3", "species": "Mus musculus", "x": -2.9274423122406006, "y": 3.633326768875122, "cluster_id": 20}, {"gene_symbol": "BMP22", "species": "Homo sapiens", "x": -1.754164457321167, "y": 5.8159499168396, "cluster_id": 17}, {"gene_symbol": "STAT5", "species": "Homo sapiens", "x": 5.200573444366455, "y": -4.373445510864258, "cluster_id": 6}, {"gene_symbol": "PDGF1", "species": "Escherichia coli", "x": -2.2635602951049805, "y": 3.441624641418457, "cluster_id": 15}, {"gene_symbol": "IFN10", "species": "Drosophila melanogaster", "x": -2.3249409198760986, "y": 13.338892936706543, "cluster_id": 1}, {"gene_symbol": "IL13", "species": "Saccharomyces cerevisiae", "x": 1.5776240825653076, "y": -1.7245346307754517, "cluster_id": 12}, {"gene_symbol": "SOX6", "species": "Saccharomyces cerevisiae", "x": 0.940380334854126, "y": -2.373828649520874, "cluster_id": -1}, {"gene_symbol": "PIK35", "species": "Drosophila melanogaster", "x": -1.6441000699996948, "y": 3.4560630321502686, "cluster_id": 14}, {"gene_symbol": "SOX22", "species": "Escherichia coli", "x": 8.983061790466309, "y": -3.2110300064086914, "cluster_id": 3}, {"gene_symbol": "VEGF3", "species": "Escherichia coli", "x": -1.8818421363830566, "y": 5.850708484649658, "cluster_id": 17}, {"gene_symbol": "ERK7", "species": "Escherichia coli", "x": -0.6577836871147156, "y": 1.291436791419983, "cluster_id": 11}, {"gene_symbol": "NOTCH20", "species": "Saccharomyces cerevisiae", "x": 1.4435938596725464, "y": -2.739870309829712, "cluster_id": 12}, {"gene_symbol": "HOX14", "species": "Mus musculus", "x": -2.1256144046783447, "y": 7.13798189163208, "cluster_id": 16}, {"gene_symbol": "RB19", "species": "Homo sapiens", "x": -1.8379857540130615, "y": 1.7883915901184082, "cluster_id": 11}, {"gene_symbol": "NFKB14", "species": "Escherichia coli", "x": 8.513481140136719, "y": -3.1021852493286133, "cluster_id": 3}, {"gene_symbol": "RPL16", "species": "Homo sapiens", "x": -1.8401623964309692, "y": 6.060258865356445, "cluster_id": 17}, {"gene_symbol": "P538", "species": "Arabidopsis thaliana", "x": 1.5242985486984253, "y": -1.4720219373703003, "cluster_id": 12}]} \ No newline at end of file diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/ColoredSequence.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/ColoredSequence.jsx new file mode 100644 index 0000000000..a6c9a6d4ca --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/ColoredSequence.jsx @@ -0,0 +1,422 @@ +import React, { useMemo, useState } from 'react' + +// Tableau 10 colorblind-friendlier palette. Feature IDs map to colors by +// (feature_id % palette.length). Same feature -> same color, deterministically. +const PALETTE = [ + '#4E79A7', // blue + '#F28E2B', // orange + '#E15759', // red + '#76B7B2', // teal + '#59A14F', // green + '#EDC948', // yellow + '#B07AA1', // purple + '#FF9DA7', // pink + '#9C755F', // brown + '#BAB0AC', // gray + '#499894', // dark teal + '#D37295', // dark pink +] + +// Show plain text (no background) when the top feature's activation is below +// this fraction of the sequence-wide max. Tweak if "interesting" regions +// look too sparse or too noisy. +const ACTIVATION_FLOOR_FRAC = 0.10 + +// Opacity floor + ceiling. Keep ceiling well below 1 so the base letter +// stays readable against the colored background. +const OPACITY_FLOOR = 0.15 +const OPACITY_CEILING = 0.85 + +// Line-wrap at 60 bases — standard biology convention (FASTA, GenBank). +const BASES_PER_LINE = 60 + + +function colorForFeature(featureId) { + if (featureId == null || featureId < 0) return null + return PALETTE[featureId % PALETTE.length] +} + + +function labelForFeature(featureId, catalog) { + if (!catalog || featureId == null || featureId < 0) return `feature_${featureId}` + const entry = catalog[featureId] || catalog.get?.(featureId) + if (!entry) return `feature_${featureId}` + return entry.label || entry.description || `feature_${featureId}` +} + + +// Build mock /analyze-shaped data for development without the backend. +function buildMockAnalysis(sequence) { + const length = sequence.length + // 5 hand-rolled features with locality patterns so colored regions are + // visible. Real backend output will have ~10 top features per position. + const FEATURES = [101, 207, 314, 422, 588] + const topk_features = [] + const topk_activations = [] + for (let i = 0; i < length; i++) { + const acts = [0, 0, 0, 0, 0] + // Feature 101: peaks around bases 50-100 + acts[0] = Math.max(0, 0.8 - Math.abs(i - 75) / 30) + // Feature 207: peaks at start codon-ish positions (every 90 bases) + acts[1] = Math.exp(-Math.pow((i % 90) - 5, 2) / 10) * 0.6 + // Feature 314: peaks in middle third + acts[2] = i > length / 3 && i < (2 * length) / 3 ? 0.4 + 0.3 * Math.sin(i / 7) : 0 + // Feature 422: low baseline + occasional spikes + acts[3] = i % 17 === 3 ? 0.7 : 0.05 + // Feature 588: tapering toward end + acts[4] = Math.max(0, (i - length / 2) / (length / 2)) * 0.5 + // Sort descending, keep top 10 (or all 5 here) + const pairs = FEATURES.map((f, k) => [f, acts[k]]).sort((a, b) => b[1] - a[1]) + topk_features.push(pairs.map((p) => p[0])) + topk_activations.push(pairs.map((p) => p[1])) + } + return { length, topk_features, topk_activations } +} + + +export default function ColoredSequence({ + sequence, + analysis, + featureCatalog, + mode = 'top', // 'top' | 'single' + singleFeatureId = null, + onBaseClick, + baseFontSize = 13, +}) { + // Fall back to mock data when no analysis prop is supplied. Pluggable: pass + // a real /analyze response and the component renders the real signal. + const data = useMemo(() => analysis ?? buildMockAnalysis(sequence), [sequence, analysis]) + + // Sequence-wide max activation across top-1 per position. Used to normalize + // each position's opacity into [OPACITY_FLOOR, OPACITY_CEILING]. + const maxAct = useMemo(() => { + if (mode === 'single' && singleFeatureId != null) { + let m = 0 + for (let i = 0; i < sequence.length; i++) { + const feats = data.topk_features[i] || [] + const acts = data.topk_activations[i] || [] + const idx = feats.indexOf(singleFeatureId) + if (idx >= 0 && acts[idx] > m) m = acts[idx] + } + return m + } + let m = 0 + for (let i = 0; i < sequence.length; i++) { + const a = data.topk_activations[i]?.[0] ?? 0 + if (a > m) m = a + } + return m + }, [sequence, data, mode, singleFeatureId]) + + // Count how many positions each color shows up at — drives the legend. + const colorUsage = useMemo(() => { + const counts = new Map() // featureId -> count + for (let i = 0; i < sequence.length; i++) { + const feats = data.topk_features[i] || [] + const acts = data.topk_activations[i] || [] + if (mode === 'single') { + if (singleFeatureId == null) continue + const idx = feats.indexOf(singleFeatureId) + if (idx < 0 || acts[idx] < ACTIVATION_FLOOR_FRAC * maxAct) continue + counts.set(singleFeatureId, (counts.get(singleFeatureId) || 0) + 1) + } else { + const f = feats[0] + const a = acts[0] ?? 0 + if (f == null || a < ACTIVATION_FLOOR_FRAC * maxAct) continue + counts.set(f, (counts.get(f) || 0) + 1) + } + } + return [...counts.entries()].sort((a, b) => b[1] - a[1]) + }, [sequence, data, mode, singleFeatureId, maxAct]) + + // Pre-compute per-base styling + tooltip data. Keeps render fast even on + // long sequences (e.g. 5 kb genes). + const baseStyles = useMemo(() => { + const styles = [] + for (let i = 0; i < sequence.length; i++) { + const feats = data.topk_features[i] || [] + const acts = data.topk_activations[i] || [] + let featureId = null + let activation = 0 + if (mode === 'single' && singleFeatureId != null) { + const idx = feats.indexOf(singleFeatureId) + if (idx >= 0) { + featureId = singleFeatureId + activation = acts[idx] + } + } else { + featureId = feats[0] + activation = acts[0] ?? 0 + } + const color = colorForFeature(featureId) + const threshold = ACTIVATION_FLOOR_FRAC * maxAct + let bg = 'transparent' + if (color && activation >= threshold && maxAct > 0) { + const t = Math.min(1, activation / maxAct) + const alpha = OPACITY_FLOOR + t * (OPACITY_CEILING - OPACITY_FLOOR) + bg = hexWithAlpha(color, alpha) + } + styles.push({ bg, featureId, activation }) + } + return styles + }, [sequence, data, mode, singleFeatureId, maxAct]) + + // Split the sequence into lines of BASES_PER_LINE for the standard + // sequence-view layout (position numbers at line breaks). + const lines = [] + for (let start = 0; start < sequence.length; start += BASES_PER_LINE) { + const end = Math.min(start + BASES_PER_LINE, sequence.length) + lines.push({ start, end, bases: sequence.slice(start, end) }) + } + + return ( +
+
+ {lines.map((line) => ( +
+ + {String(line.start + 1).padStart(6, ' ')} + + + {[...line.bases].map((base, j) => { + const i = line.start + j + const { bg, featureId, activation } = baseStyles[i] + return ( + + ) + })} + +
+ ))} +
+ + +
+ ) +} + + +function Base({ + base, + position, + background, + featureId, + activation, + topFeatures, + topActivations, + featureCatalog, + onClick, +}) { + const [hover, setHover] = useState(false) + const handleClick = (e) => { + e.stopPropagation() + onClick?.({ position, base, topFeatures, topActivations }) + } + return ( + setHover(true)} + onMouseLeave={() => setHover(false)} + onClick={handleClick} + style={{ + background, + padding: '0 1px', + borderRadius: '2px', + cursor: 'pointer', + position: 'relative', + }} + > + {base} + {hover && ( + + )} + + ) +} + + +function Tooltip({ position, base, topFeatures, topActivations, featureCatalog }) { + const rows = topFeatures.slice(0, 5).map((f, k) => ({ + featureId: f, + label: labelForFeature(f, featureCatalog), + activation: topActivations[k] ?? 0, + color: colorForFeature(f), + })) + return ( +
+
+ pos {position + 1} (base {base}) +
+ + + {rows.map((r) => ( + + + + + ))} + +
+ {r.label} + {r.activation.toFixed(3)}
+
+ ) +} + + +function Legend({ usage, catalog, maxAct }) { + if (usage.length === 0) { + return
No features above activation threshold
+ } + return ( +
+
Colors in this sequence (by # of positions):
+
+ {usage.map(([fid, n]) => ( + + + {labelForFeature(fid, catalog)} + ×{n} + + ))} +
+
max activation in sequence: {maxAct.toFixed(3)}
+
+ ) +} + + +// Add an alpha channel to a 6-digit hex color. Keeps the palette source as +// plain hex so palette swaps don't have to redo opacity math. +function hexWithAlpha(hex, alpha) { + const a = Math.round(alpha * 255).toString(16).padStart(2, '0') + return `${hex}${a}` +} + + +const styles = { + container: { + fontFamily: 'monospace', + background: 'var(--bg-card-expanded)', + border: '1px solid var(--border-light)', + borderRadius: '6px', + padding: '10px 12px', + }, + sequenceBlock: { + whiteSpace: 'pre-wrap', + lineHeight: '1.5', + color: 'var(--text)', + }, + line: { + display: 'flex', + gap: '8px', + alignItems: 'baseline', + }, + position: { + color: 'var(--text-muted)', + userSelect: 'none', + fontFamily: 'monospace', + minWidth: '50px', + textAlign: 'right', + }, + bases: { + fontFamily: 'monospace', + letterSpacing: '0.5px', + }, + tooltip: { + position: 'absolute', + top: '110%', + left: '50%', + transform: 'translateX(-50%)', + zIndex: 100, + background: 'var(--bg-card)', + border: '1px solid var(--border)', + borderRadius: '4px', + padding: '6px 8px', + fontSize: '11px', + minWidth: '220px', + boxShadow: '0 2px 8px rgba(0,0,0,0.2)', + pointerEvents: 'none', + fontFamily: 'system-ui, sans-serif', + }, + tooltipHeader: { + fontWeight: 600, + marginBottom: '4px', + paddingBottom: '4px', + borderBottom: '1px solid var(--border-light)', + color: 'var(--text-heading)', + }, + tooltipTable: { + width: '100%', + borderCollapse: 'collapse', + }, + tooltipActCell: { + textAlign: 'right', + fontFamily: 'monospace', + color: 'var(--text-secondary)', + }, + colorDot: { + display: 'inline-block', + width: '8px', + height: '8px', + borderRadius: '2px', + marginRight: '6px', + verticalAlign: 'middle', + }, + legend: { + marginTop: '10px', + paddingTop: '8px', + borderTop: '1px solid var(--border-light)', + fontSize: '11px', + fontFamily: 'system-ui, sans-serif', + color: 'var(--text-secondary)', + }, + legendTitle: { + fontSize: '10px', + textTransform: 'uppercase', + color: 'var(--text-tertiary)', + marginBottom: '6px', + }, + legendItems: { + display: 'flex', + flexWrap: 'wrap', + gap: '12px', + }, + legendItem: { + display: 'inline-flex', + alignItems: 'center', + fontSize: '11px', + }, + legendCount: { + marginLeft: '4px', + fontFamily: 'monospace', + color: 'var(--text-muted)', + }, + legendMeta: { + marginTop: '6px', + fontSize: '10px', + color: 'var(--text-muted)', + }, + legendEmpty: { + fontSize: '11px', + fontStyle: 'italic', + color: 'var(--text-muted)', + marginTop: '8px', + }, +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/GeneUMAPView.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/GeneUMAPView.jsx new file mode 100644 index 0000000000..c7c54e7dd4 --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/GeneUMAPView.jsx @@ -0,0 +1,526 @@ +import React, { useEffect, useMemo, useRef, useState } from 'react' +import { UMAP } from 'umap-js' + +// 500-gene UMAP view with feature-conditional re-embedding. +// +// Loads three precomputed files from /gene_umap/ (in the dashboard's public/): +// - G.bin: float32 [n_genes * n_features] raw bytes +// - genes_meta.json: per-gene metadata + base UMAP coords + HDBSCAN cluster +// - feature_stats.json: features with n_firing >= 10 (clickable list) +// +// Interactions: +// - Click a feature -> recolor every gene point by G[gene_idx, feature_idx]. +// - Click "Reorganize" -> re-run UMAP client-side on feature-weighted vectors +// (G[i, :] * (1 + lambda * indicator(feature == clicked))). Animate transition. +// - Hover gene -> tooltip with symbol, species, cluster, top 5 firing features. + +const LAMBDA = 5.0 +const REORG_ANIM_MS = 800 + +// Tableau-10-ish palette used for HDBSCAN cluster coloring. Index -1 (noise) +// maps to grey at the end. +const CLUSTER_PALETTE = [ + '#4E79A7', '#F28E2B', '#E15759', '#76B7B2', '#59A14F', + '#EDC948', '#B07AA1', '#FF9DA7', '#9C755F', '#499894', + '#D37295', '#86BCB6', '#FABFD2', '#D7B5A6', '#BA9582', + '#A0CBE8', '#FFBE7D', '#8CD17D', '#B6992D', '#79706E', + '#D4A6C8', +] +const NOISE_COLOR = '#BAB0AC' + + +function colorForCluster(cid) { + if (cid == null || cid < 0) return NOISE_COLOR + return CLUSTER_PALETTE[cid % CLUSTER_PALETTE.length] +} + + +// Linear viridis-ish ramp for activation-strength coloring. +function colorForActivation(t) { + // t in [0, 1]. Dark blue at 0 -> yellow at 1. + const stops = [ + [0.0, [68, 1, 84]], + [0.25, [59, 82, 139]], + [0.5, [33, 145, 140]], + [0.75, [94, 201, 98]], + [1.0, [253, 231, 37]], + ] + for (let i = 1; i < stops.length; i++) { + if (t <= stops[i][0]) { + const [t0, c0] = stops[i - 1] + const [t1, c1] = stops[i] + const u = (t - t0) / (t1 - t0) + const r = Math.round(c0[0] + u * (c1[0] - c0[0])) + const g = Math.round(c0[1] + u * (c1[1] - c0[1])) + const b = Math.round(c0[2] + u * (c1[2] - c0[2])) + return `rgb(${r}, ${g}, ${b})` + } + } + const [, c] = stops[stops.length - 1] + return `rgb(${c[0]}, ${c[1]}, ${c[2]})` +} + + +// Load the precomputed gene-UMAP bundle: G.bin (binary float32), genes_meta.json, +// feature_stats.json. Returns { G, genes, featureStats, n_genes, n_features }. +async function loadGeneUMAPBundle(baseURL = '/gene_umap') { + const [gMetaResp, fStatsResp, gBinResp] = await Promise.all([ + fetch(`${baseURL}/genes_meta.json`), + fetch(`${baseURL}/feature_stats.json`), + fetch(`${baseURL}/G.bin`), + ]) + const genesMeta = await gMetaResp.json() + const featureStats = await fStatsResp.json() + const gBuffer = await gBinResp.arrayBuffer() + // float32 little-endian (assumes precompute ran on a little-endian host; + // x86/ARM both fit). + const G = new Float32Array(gBuffer) + return { + G, + genes: genesMeta.genes, + n_genes: genesMeta.n_genes, + n_features: genesMeta.n_features, + featureStats, + } +} + + +export default function GeneUMAPView({ height = 600, bundleURL = '/gene_umap' }) { + const [bundle, setBundle] = useState(null) + const [error, setError] = useState(null) + const [selectedFeature, setSelectedFeature] = useState(null) + const [reorgCoords, setReorgCoords] = useState(null) // null = use base coords + const [reorgFeatureId, setReorgFeatureId] = useState(null) + const [reorgRunning, setReorgRunning] = useState(false) + const [animFrame, setAnimFrame] = useState(1.0) // 0 -> 1 transition factor + const [hoverIdx, setHoverIdx] = useState(null) + const canvasRef = useRef(null) + + useEffect(() => { + loadGeneUMAPBundle(bundleURL) + .then((b) => setBundle(b)) + .catch((e) => setError(e.message)) + }, [bundleURL]) + + // Build the per-point color array based on current selection mode. + const pointColors = useMemo(() => { + if (!bundle) return null + const { G, n_features, genes } = bundle + if (selectedFeature == null) { + return genes.map((g) => colorForCluster(g.cluster_id)) + } + // Feature-strength coloring. + let maxAct = 0 + for (let i = 0; i < genes.length; i++) { + const v = G[i * n_features + selectedFeature] + if (v > maxAct) maxAct = v + } + return genes.map((g, i) => { + const v = G[i * n_features + selectedFeature] + if (maxAct <= 0) return NOISE_COLOR + return colorForActivation(v / maxAct) + }) + }, [bundle, selectedFeature]) + + // Resolve current displayed coords with smooth interpolation between base + // and reorg coords during the transition window. + const displayCoords = useMemo(() => { + if (!bundle) return null + const base = bundle.genes.map((g) => [g.x, g.y]) + if (reorgCoords == null) return base + return base.map((b, i) => { + const r = reorgCoords[i] + const t = animFrame + return [b[0] + (r[0] - b[0]) * t, b[1] + (r[1] - b[1]) * t] + }) + }, [bundle, reorgCoords, animFrame]) + + // Draw to canvas whenever coords or colors change. + useEffect(() => { + if (!bundle || !displayCoords || !pointColors) return + const canvas = canvasRef.current + if (!canvas) return + const ctx = canvas.getContext('2d') + const w = canvas.width + const h = canvas.height + ctx.clearRect(0, 0, w, h) + // Scale displayCoords -> canvas pixels. + let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity + for (const [x, y] of displayCoords) { + if (x < minX) minX = x + if (x > maxX) maxX = x + if (y < minY) minY = y + if (y > maxY) maxY = y + } + const pad = 30 + const sx = (w - 2 * pad) / Math.max(1e-9, maxX - minX) + const sy = (h - 2 * pad) / Math.max(1e-9, maxY - minY) + const s = Math.min(sx, sy) + const ox = pad + ((w - 2 * pad) - s * (maxX - minX)) / 2 + const oy = pad + ((h - 2 * pad) - s * (maxY - minY)) / 2 + for (let i = 0; i < displayCoords.length; i++) { + const [x, y] = displayCoords[i] + const px = ox + (x - minX) * s + const py = oy + (y - minY) * s + ctx.fillStyle = pointColors[i] + ctx.globalAlpha = hoverIdx != null && i !== hoverIdx ? 0.4 : 1.0 + ctx.beginPath() + ctx.arc(px, py, hoverIdx === i ? 6 : 4, 0, Math.PI * 2) + ctx.fill() + } + ctx.globalAlpha = 1.0 + }, [bundle, displayCoords, pointColors, hoverIdx]) + + // Animate from base coords -> new reorg coords with requestAnimationFrame. + useEffect(() => { + if (reorgCoords == null) { + setAnimFrame(1.0) + return + } + let raf + const start = performance.now() + const tick = (now) => { + const t = Math.min(1, (now - start) / REORG_ANIM_MS) + // Ease-in-out cubic. + const eased = t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2 + setAnimFrame(eased) + if (t < 1) raf = requestAnimationFrame(tick) + } + setAnimFrame(0) + raf = requestAnimationFrame(tick) + return () => cancelAnimationFrame(raf) + }, [reorgCoords]) + + const handleClickFeature = (fid) => { + setSelectedFeature(fid === selectedFeature ? null : fid) + } + + const handleReorganize = async () => { + if (!bundle || selectedFeature == null) return + setReorgRunning(true) + setReorgFeatureId(selectedFeature) + // Build feature-weighted vectors (umap-js doesn't accept precomputed + // distances, so encode the weighting into the vector itself). + const { G, n_features, n_genes } = bundle + const vecs = new Array(n_genes) + for (let i = 0; i < n_genes; i++) { + const row = new Float32Array(n_features) + const base = i * n_features + for (let f = 0; f < n_features; f++) row[f] = G[base + f] + // Amplify the selected feature: row[f] *= (1 + LAMBDA) if f == selected + // This pulls points with high activation of the clicked feature closer. + row[selectedFeature] *= 1 + LAMBDA + vecs[i] = Array.from(row) + } + // Defer to next tick so the spinner renders before the heavy compute. + await new Promise((r) => setTimeout(r, 16)) + const reducer = new UMAP({ nComponents: 2, nNeighbors: 15, minDist: 0.1 }) + const coords = reducer.fit(vecs) + setReorgCoords(coords) + setReorgRunning(false) + } + + const handleResetLayout = () => { + setReorgCoords(null) + setReorgFeatureId(null) + } + + if (error) { + return
Failed to load gene UMAP bundle: {error}
+ } + if (!bundle) { + return
Loading 500-gene UMAP…
+ } + + return ( +
+
+ Gene UMAP — {bundle.n_genes} genes × {bundle.n_features} features +
+ + {reorgCoords && ( + + )} +
+
+ +
+
+ { + if (!displayCoords) return + const rect = e.currentTarget.getBoundingClientRect() + const mx = ((e.clientX - rect.left) / rect.width) * 700 + const my = ((e.clientY - rect.top) / rect.height) * (height - 20) + // Re-derive transform (same as draw effect). + let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity + for (const [x, y] of displayCoords) { + if (x < minX) minX = x + if (x > maxX) maxX = x + if (y < minY) minY = y + if (y > maxY) maxY = y + } + const pad = 30 + const w = 700, h = height - 20 + const sx = (w - 2 * pad) / Math.max(1e-9, maxX - minX) + const sy = (h - 2 * pad) / Math.max(1e-9, maxY - minY) + const s = Math.min(sx, sy) + const ox = pad + ((w - 2 * pad) - s * (maxX - minX)) / 2 + const oy = pad + ((h - 2 * pad) - s * (maxY - minY)) / 2 + let best = null + let bestD2 = 100 // pixel² threshold for "hover" + for (let i = 0; i < displayCoords.length; i++) { + const [x, y] = displayCoords[i] + const px = ox + (x - minX) * s + const py = oy + (y - minY) * s + const d2 = (px - mx) ** 2 + (py - my) ** 2 + if (d2 < bestD2) { + bestD2 = d2 + best = i + } + } + setHoverIdx(best) + }} + onMouseLeave={() => setHoverIdx(null)} + /> + {hoverIdx != null && bundle.genes[hoverIdx] && ( + + )} + {reorgCoords && reorgFeatureId != null && ( +
+ layout: feature {reorgFeatureId} emphasized +
+ )} +
+ +
+
+ Features (n_firing ≥ 10) · {bundle.featureStats.length} +
+
+ {bundle.featureStats.slice(0, 80).map((fs) => ( +
handleClickFeature(fs.feature_id)} + style={{ + ...styles.featureRow, + background: + selectedFeature === fs.feature_id ? 'var(--bg-card-expanded)' : 'transparent', + borderLeft: + selectedFeature === fs.feature_id + ? '3px solid var(--accent)' + : '3px solid transparent', + }} + > + #{fs.feature_id} + + {fs.n_firing} genes · μ={fs.mean_act_when_firing.toFixed(2)} + +
+ ))} + {bundle.featureStats.length > 80 && ( +
… + {bundle.featureStats.length - 80} more
+ )} +
+
+
+
+ ) +} + + +function HoverTooltip({ gene, G, idx, bundle }) { + // Compute top 5 firing features for this gene (no per-gene cache for brevity). + const top5 = useMemo(() => { + const base = idx * bundle.n_features + const pairs = [] + for (let f = 0; f < bundle.n_features; f++) { + const v = G[base + f] + if (v > 0) pairs.push([f, v]) + } + pairs.sort((a, b) => b[1] - a[1]) + return pairs.slice(0, 5) + }, [G, idx, bundle]) + return ( +
+
{gene.gene_symbol}
+
{gene.species}
+
+ cluster: {gene.cluster_id < 0 ? 'noise' : gene.cluster_id} +
+
top 5 features
+ {top5.map(([f, v]) => ( +
+ #{f} + {v.toFixed(3)} +
+ ))} +
+ ) +} + + +const styles = { + container: { + background: 'var(--bg-card)', + border: '1px solid var(--border)', + borderRadius: '8px', + padding: '12px', + }, + toolbar: { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: '10px', + }, + title: { + fontSize: '13px', + fontWeight: 600, + color: 'var(--text-heading)', + }, + toolbarActions: { display: 'flex', gap: '8px' }, + btn: { + padding: '4px 12px', + border: '1px solid var(--border-input)', + borderRadius: '4px', + background: 'var(--bg-input)', + fontSize: '11px', + cursor: 'pointer', + color: 'var(--text-secondary)', + }, + btnPrimary: { + padding: '4px 12px', + border: '1px solid var(--accent)', + borderRadius: '4px', + background: 'var(--accent)', + fontSize: '11px', + cursor: 'pointer', + color: 'white', + fontWeight: 500, + }, + btnDisabled: { + padding: '4px 12px', + border: '1px solid var(--border-light)', + borderRadius: '4px', + background: 'var(--bg-input)', + fontSize: '11px', + color: 'var(--text-muted)', + cursor: 'not-allowed', + }, + canvasWrap: { + flex: 1, + position: 'relative', + background: 'var(--bg-card-expanded)', + border: '1px solid var(--border-light)', + borderRadius: '6px', + overflow: 'hidden', + }, + reorgBadge: { + position: 'absolute', + top: '8px', + left: '8px', + background: 'rgba(0,0,0,0.6)', + color: '#fff', + padding: '3px 8px', + borderRadius: '3px', + fontSize: '10px', + fontFamily: 'monospace', + }, + sidebar: { + width: '240px', + flexShrink: 0, + display: 'flex', + flexDirection: 'column', + background: 'var(--bg-card-expanded)', + border: '1px solid var(--border-light)', + borderRadius: '6px', + overflow: 'hidden', + }, + sidebarTitle: { + fontSize: '10px', + fontWeight: 600, + textTransform: 'uppercase', + color: 'var(--text-tertiary)', + padding: '8px 12px', + borderBottom: '1px solid var(--border-light)', + }, + featureList: { + overflow: 'auto', + flex: 1, + fontSize: '11px', + fontFamily: 'monospace', + }, + featureRow: { + display: 'flex', + justifyContent: 'space-between', + padding: '4px 9px', + cursor: 'pointer', + userSelect: 'none', + }, + featureId: { color: 'var(--text-heading)' }, + featureCount: { color: 'var(--text-muted)' }, + featureMore: { + padding: '6px 9px', + color: 'var(--text-muted)', + fontStyle: 'italic', + fontSize: '10px', + }, + tooltip: { + position: 'absolute', + pointerEvents: 'none', + top: '10px', + right: '10px', + background: 'var(--bg-card)', + border: '1px solid var(--border)', + borderRadius: '4px', + padding: '8px 10px', + fontSize: '11px', + fontFamily: 'system-ui, sans-serif', + minWidth: '180px', + boxShadow: '0 2px 8px rgba(0,0,0,0.2)', + color: 'var(--text)', + }, + tooltipTitle: { fontWeight: 600, fontSize: '13px', color: 'var(--text-heading)' }, + tooltipMeta: { color: 'var(--text-secondary)', fontSize: '11px' }, + tooltipSection: { + fontSize: '10px', + textTransform: 'uppercase', + color: 'var(--text-tertiary)', + marginTop: '8px', + paddingTop: '6px', + borderTop: '1px solid var(--border-light)', + }, + tooltipRow: { + display: 'flex', + justifyContent: 'space-between', + fontFamily: 'monospace', + fontSize: '11px', + }, + tooltipAct: { color: 'var(--text-secondary)' }, + loading: { + padding: '40px', + textAlign: 'center', + color: 'var(--text-muted)', + fontStyle: 'italic', + }, + error: { + padding: '20px', + color: '#c34', + background: '#fee', + borderRadius: '4px', + fontFamily: 'monospace', + fontSize: '12px', + }, +} diff --git a/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Preview.jsx b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Preview.jsx new file mode 100644 index 0000000000..b46360146b --- /dev/null +++ b/bionemo-recipes/interpretability/sparse_autoencoders/recipes/evo2/evo2_dashboard_mockup/src/Preview.jsx @@ -0,0 +1,262 @@ +import React, { useState } from 'react' +import App from './App' +import ColoredSequence from './ColoredSequence' +import GeneUMAPView from './GeneUMAPView' + +// Hit http://localhost:5176/#preview to see all three views side by side. +// Tabs switch between the existing dashboard ("Main") and the two new +// components (ColoredSequence, GeneUMAPView) without restructuring the +// existing layout. + +const MOCK_500BP = ( + 'ATGCGCAATCGTAGCTTAGCATCGATCGTAGCTATCGATCGTACGTACGTAGCTAGCTAGCTAGCTAGCAATCGTAGCATCGTAG' + + 'CTAGCATCGTAGCTAGCTACGTACGTAGCTAGCTAGCTAATCGGGGGGGGGGGCATCGCGCGCGCGCGCGCATCGTAGCTAGCTA' + + 'GCATCGTAGCTAGCATGCTAGCATGCTAGCTAGCTAGCATCGATGCTAGCATGCTAGCATGCTAGCATCGTAGCATCGTAGCATC' + + 'GTAGCTAGCTAATCGATCGTAGCTAGCATCGATCGTAGCTAGCAATCGTAGCTAGCTAGCTAGCATCGTAGCTAGCTAGCTAGCT' + + 'AGCTAGCATCGTAGCATGCTAGCATGCTAGCATCGTAGCTAGCATGCTAGCAATCGGGGGCATCGCGCGCGCGCATCGTAGCATC' + + 'GTAGCTAGCTAGCTAGCATCGATCGTAGCATCGTAGCAATCGTAGCATCGATCGAATCGTAGCAATCGTAGCATCGTACGTACGT' + + 'AGCTAGCTAGCTAATCGATCGATCGTAGCATCGTACGTACGTACGT' +).slice(0, 500) + +const FAKE_FEATURE_CATALOG = { + 101: { label: 'TATA-box-like' }, + 207: { label: 'start-codon (ATG)' }, + 314: { label: 'GC-rich exon' }, + 422: { label: 'splice donor' }, + 588: { label: 'polyA signal' }, +} + +const TABS = [ + { id: 'main', label: 'Main dashboard (features + atlas + WebLogos)' }, + { id: 'sequence', label: 'ColoredSequence (mock 500bp)' }, + { id: 'genes', label: 'Gene UMAP (500 genes, precomputed)' }, +] + +const styles = { + container: { + fontFamily: 'system-ui, sans-serif', + color: 'var(--text, #222)', + background: 'var(--bg, #fafafa)', + minHeight: '100vh', + display: 'flex', + flexDirection: 'column', + }, + tabBar: { + display: 'flex', + gap: '4px', + padding: '8px 16px', + background: 'var(--bg-card, #fff)', + borderBottom: '1px solid var(--border, #ddd)', + flexShrink: 0, + }, + tab: (active) => ({ + padding: '6px 14px', + border: '1px solid', + borderColor: active ? 'var(--accent, #76b900)' : 'var(--border, #ddd)', + background: active ? 'var(--bg-card-expanded, #f0f8e8)' : '#fff', + borderRadius: '4px', + cursor: 'pointer', + fontSize: '12px', + fontWeight: active ? 600 : 400, + color: active ? 'var(--accent, #76b900)' : 'var(--text-secondary, #555)', + }), + tabContent: { + flex: 1, + overflow: 'auto', + background: 'var(--bg, #fafafa)', + }, + sequenceWrap: { padding: '24px' }, + genesWrap: { padding: '24px' }, + title: { fontSize: '20px', fontWeight: 600, marginBottom: '4px' }, + subtitle: { fontSize: '12px', color: 'var(--text-secondary, #666)', marginBottom: '16px' }, + toggleRow: { + display: 'flex', + gap: '8px', + marginBottom: '12px', + alignItems: 'center', + fontSize: '12px', + }, + inputRow: { + marginBottom: '12px', + padding: '10px 12px', + background: 'var(--bg-card, #fff)', + border: '1px solid var(--border, #ddd)', + borderRadius: '6px', + }, + seqInput: { + width: '100%', + fontFamily: 'monospace', + fontSize: '12px', + padding: '8px', + border: '1px solid var(--border, #ddd)', + borderRadius: '4px', + resize: 'vertical', + boxSizing: 'border-box', + }, + inputActions: { + display: 'flex', + gap: '8px', + alignItems: 'center', + marginTop: '8px', + fontSize: '11px', + }, + btnPrimary: { + padding: '5px 14px', + border: '1px solid var(--accent, #76b900)', + background: 'var(--accent, #76b900)', + color: '#fff', + borderRadius: '4px', + cursor: 'pointer', + fontSize: '11px', + fontWeight: 600, + }, + btnSecondary: { + padding: '5px 12px', + border: '1px solid var(--border, #ddd)', + background: '#fff', + color: 'var(--text-secondary, #555)', + borderRadius: '4px', + cursor: 'pointer', + fontSize: '11px', + }, + seqMeta: { + marginLeft: 'auto', + color: 'var(--text-secondary, #666)', + fontSize: '11px', + fontFamily: 'monospace', + }, + toggle: (active) => ({ + padding: '4px 10px', + border: `1px solid ${active ? 'var(--accent, #76b900)' : 'var(--border, #ddd)'}`, + background: active ? 'var(--bg-card-expanded, #f0f8e8)' : '#fff', + borderRadius: '4px', + cursor: 'pointer', + fontSize: '11px', + fontWeight: active ? 600 : 400, + color: active ? 'var(--accent, #76b900)' : 'var(--text, #555)', + }), +} + + +export default function Preview() { + const [tab, setTab] = useState('main') + const [mode, setMode] = useState('top') + const [singleFeatureId, setSingleFeatureId] = useState(101) + const [pastedSeq, setPastedSeq] = useState('') // user-entered sequence, raw + const [activeSeq, setActiveSeq] = useState(MOCK_500BP) // sequence currently rendered + + // Strip whitespace + newlines + numbers (typical when pasting from FASTA), + // uppercase, then keep only A/C/G/T/N. Falls back to mock if input is empty. + const cleanSeq = (raw) => { + const cleaned = (raw || '').toUpperCase().replace(/[^ACGTN]/g, '') + return cleaned.length > 0 ? cleaned : MOCK_500BP + } + + return ( +
+
+ {TABS.map((t) => ( + + ))} +
+ +
+ {tab === 'main' && ( + // The full existing dashboard — feature catalog, UMAP atlas, FeatureCard + // expansions with WebLogo PNGs, histograms. Untouched. +
+ +
+ )} + + {tab === 'sequence' && ( +
+
ColoredSequence
+
+ Paste a DNA sequence below — each base background-colored by its top-firing + SAE feature. Mock activations (real backend not wired yet); swap the + analysis prop with a real /analyze response to use live inference. + Defaults to a 500 bp example if input is empty. +
+ +
+