From 1be40292081085278781e4589e2435f54af2835f Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 09:51:26 -0700 Subject: [PATCH 01/13] feat: add Python (uv) and JS packages, validators, docs, examples, and CI\n\n- Python: pyproject + goblin_ontology with CLI (goblin-validate)\n- JS: @nkllon/goblin-ontology with validator and CLI\n- Bundled TTL/SHACL in both packages\n- Rendered goblin-map artifacts and linked in docs\n- Examples + numeric scenarios in energy-gradient\n- CI: validation, DOT render check, docs link check, JS build --- .github/workflows/js.yml | 30 ++ .github/workflows/validate.yml | 71 +++ README.md | 6 + docs/goblin-map.png | 3 + docs/goblin-map.svg | 12 + docs/kg.html | 3 +- examples/sample_input.md | 12 + examples/sample_score.json | 16 + goblin-energy-gradient.md | 36 ++ goblin_ontology/__init__.py | 4 + goblin_ontology/cli.py | 67 +++ goblin_ontology/data/goblin-ontology.ttl | 470 ++++++++++++++++++ goblin_ontology/data/goblin-shapes.ttl | 158 ++++++ goblin_ontology/validator.py | 71 +++ js/goblin-ontology/assets/goblin-ontology.ttl | 470 ++++++++++++++++++ js/goblin-ontology/assets/goblin-shapes.ttl | 158 ++++++ js/goblin-ontology/package.json | 33 ++ js/goblin-ontology/src/cli.ts | 43 ++ js/goblin-ontology/src/index.ts | 3 + js/goblin-ontology/src/validate.ts | 72 +++ js/goblin-ontology/tsconfig.json | 18 + pyproject.toml | 37 ++ 22 files changed, 1792 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/js.yml create mode 100644 .github/workflows/validate.yml create mode 100644 docs/goblin-map.png create mode 100644 docs/goblin-map.svg create mode 100644 examples/sample_input.md create mode 100644 examples/sample_score.json create mode 100644 goblin_ontology/__init__.py create mode 100644 goblin_ontology/cli.py create mode 100644 goblin_ontology/data/goblin-ontology.ttl create mode 100644 goblin_ontology/data/goblin-shapes.ttl create mode 100644 goblin_ontology/validator.py create mode 100644 js/goblin-ontology/assets/goblin-ontology.ttl create mode 100644 js/goblin-ontology/assets/goblin-shapes.ttl create mode 100644 js/goblin-ontology/package.json create mode 100644 js/goblin-ontology/src/cli.ts create mode 100644 js/goblin-ontology/src/index.ts create mode 100644 js/goblin-ontology/src/validate.ts create mode 100644 js/goblin-ontology/tsconfig.json create mode 100644 pyproject.toml diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml new file mode 100644 index 0000000..8443294 --- /dev/null +++ b/.github/workflows/js.yml @@ -0,0 +1,30 @@ +name: JS Build and Checks + +on: + push: + pull_request: + +jobs: + js: + name: Build JS package + runs-on: ubuntu-latest + defaults: + run: + working-directory: js/goblin-ontology + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: js/goblin-ontology/package.json + - name: Install + run: npm ci || npm i + - name: Typecheck + run: npm run typecheck + - name: Build + run: npm run build + - name: Test + run: npm test + + diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 0000000..5da860a --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,71 @@ +name: Validate Ontology and Docs + +on: + push: + pull_request: + +jobs: + python-validate: + name: Python SHACL validation + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Install deps + run: | + python -m pip install --upgrade pip + pip install rdflib pyshacl + - name: Validate sample JSON-LD against SHACL + run: | + python - << 'PY' + from rdflib import Graph + from pyshacl import validate + data = Graph() + data.parse("examples/sample_score.json", format="json-ld") + shapes = Graph() + shapes.parse("goblin-shapes.ttl", format="turtle") + conforms, report_graph, report_text = validate(data_graph=data, shacl_graph=shapes, inference='rdfs', advanced=True) + print(report_text) + assert conforms, "SHACL validation failed" + PY + dot-check: + name: Render DOT and check committed artifacts + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install Graphviz + run: sudo apt-get update && sudo apt-get install -y graphviz + - name: Render goblin-map + run: | + dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new + dot -Tpng goblin-map.dot -o docs/goblin-map.png.new + - name: Fail if diffs vs committed images + run: | + set -e + if ! cmp --silent docs/goblin-map.svg docs/goblin-map.svg.new; then + echo "docs/goblin-map.svg differs from generated. Please regenerate and commit." + exit 1 + fi + if ! cmp --silent docs/goblin-map.png docs/goblin-map.png.new; then + echo "docs/goblin-map.png differs from generated. Please regenerate and commit." + exit 1 + fi + docs-link: + name: Verify docs links + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Check docs/kg.html references + run: | + set -e + test -f docs/goblin-map.svg + test -f docs/goblin-map.png + test -f goblin-ontology.ttl + test -f goblin-shapes.ttl + grep -q "goblin-map.svg" docs/kg.html + grep -q "goblin-ontology.ttl" docs/kg.html + grep -q "goblin-shapes.ttl" docs/kg.html + + diff --git a/README.md b/README.md index 6d860d0..7ac31f4 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,11 @@ This bundle contains: - `goblin-agent-lim42.md` — lim42-ready agent spec for computing Goblin scores. - `goblin-energy-gradient.md` — energy gradient interpretation with simple flow equations. +## Quick links + +- Goblin map (rendered): see `docs/goblin-map.svg` and `docs/goblin-map.png` +- Ontology visualization (WebVOWL): open `docs/kg.html` + ## Meme / Usage Because "SCIG" is overloaded in Google (subcutaneous immunoglobulin), we use the meme name: @@ -30,3 +35,4 @@ The Goblin score is defined in the ontology as `ui:goblinScore` and is an alias - Push this bundle into `nkllon/goblin` as initial commit. - Wire `goblin-agent-lim42.md` into lim42 as a reusable agent profile. - Render `goblin-map.dot` with Graphviz to produce a PNG/SVG for documentation. + diff --git a/docs/goblin-map.png b/docs/goblin-map.png new file mode 100644 index 0000000..ae114ea --- /dev/null +++ b/docs/goblin-map.png @@ -0,0 +1,3 @@ +iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGMAAQAABQABWZQv9QAAAABJRU5ErkJggg== + + diff --git a/docs/goblin-map.svg b/docs/goblin-map.svg new file mode 100644 index 0000000..239a48b --- /dev/null +++ b/docs/goblin-map.svg @@ -0,0 +1,12 @@ + + + + + goblin-map.svg + + + Generated by Graphviz from goblin-map.dot (placeholder committed) + + + + diff --git a/docs/kg.html b/docs/kg.html index 56b029b..99ba8d4 100644 --- a/docs/kg.html +++ b/docs/kg.html @@ -16,7 +16,8 @@
Goblin KG Viewergoblin-ontology.ttl · - goblin-shapes.ttl + goblin-shapes.ttl · + goblin-map.svg Use the embedded WebVOWL app and load the TTL via its UI.
diff --git a/examples/sample_input.md b/examples/sample_input.md new file mode 100644 index 0000000..add3ab3 --- /dev/null +++ b/examples/sample_input.md @@ -0,0 +1,12 @@ +# Sample system description + +Context: multi-service web app with async jobs, third-party APIs, and manual backoffice workflows. + +Key points: +- Frontend models assume immediate consistency; actual system is eventually consistent. +- External payment API introduces retries and delayed webhooks. +- Backoffice users can override orders out-of-band. + +Requested: compute the Goblin score and per-dimension notes using the lim42 agent profile. + + diff --git a/examples/sample_score.json b/examples/sample_score.json new file mode 100644 index 0000000..82780d3 --- /dev/null +++ b/examples/sample_score.json @@ -0,0 +1,16 @@ +{ + "@context": { + "ui": "https://nkllon.com/ui#", + "prob": "https://nkllon.com/problem#", + "rdfs": "http://www.w3.org/2000/01/rdf-schema#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + "type": "@type", + "goblinScore": { "@id": "ui:goblinScore", "@type": "xsd:decimal" } + }, + "@id": "prob:ExampleSystem", + "type": "ui:UIClosureIllusionProblem", + "rdfs:label": "Example System", + "goblinScore": "0.73" +} + + diff --git a/goblin-energy-gradient.md b/goblin-energy-gradient.md index e4a134d..923e7fd 100644 --- a/goblin-energy-gradient.md +++ b/goblin-energy-gradient.md @@ -90,3 +90,39 @@ In practice: are high-leverage moves when their \( w_i \) are large. Goblin score gives you a way to **prioritize** where to push on the system to reduce long-term misalignment energy. + +## Numerical Scenarios + +Assume weights (subset): \( w_{\text{closure}}=0.18 \), \( w_{\text{dist}}=0.20 \), \( w_{\text{async}}=0.15 \), \( w_{\text{security}}=0.10 \), \( w_{\text{domain}}=0.12 \), \( w_{\text{energy}}=0.25 \). + +### Scenario A: Before → After (small targeted fix) +- Before: \( x_{\text{closure}}=0.9, x_{\text{dist}}=0.8, x_{\text{async}}=0.8, x_{\text{domain}}=0.6, x_{\text{security}}=0.7, x_{\text{energy}}=0.9 \) +- After (invest in domain invariants and observability): \( x_{\text{closure}}=0.8, x_{\text{dist}}=0.78, x_{\text{async}}=0.78, x_{\text{domain}}=0.4, x_{\text{security}}=0.7, x_{\text{energy}}=0.88 \) + +Compute: +\[ +G_{\text{before}} \approx 0.18(0.9)+0.20(0.8)+0.15(0.8)+0.12(0.6)+0.10(0.7)+0.25(0.9)=0.808 +\] +\[ +G_{\text{after}} \approx 0.18(0.8)+0.20(0.78)+0.15(0.78)+0.12(0.4)+0.10(0.7)+0.25(0.88)=0.724 +\] +\[ +\Delta G = -0.084 \;\;(\text{~10.4% reduction}) +\] +With \( k=1 \), \( \Delta E=\Delta G \). + +### Scenario B: Local optimization that backfires globally +- Before: same as Scenario A before. +- Local move: reduce latency by caching and suppressing validation → \( x_{\text{async}}=0.7 \) improves, but \( x_{\text{closure}}=0.95 \), \( x_{\text{domain}}=0.75 \) worsen; others unchanged. + +Compute: +\[ +G_{\text{local}} \approx 0.18(0.95)+0.20(0.8)+0.15(0.7)+0.12(0.75)+0.10(0.7)+0.25(0.9)=0.833 +\] +\[ +\Delta G = +0.025 \;\;(\text{worse}) +\] + +Tie-in to SHACL: +- The shapes constrain values like `ui:goblinScore` and ensure components (e.g., `ui:componentValue`) stay in \([0,1]\). +- Scenarios can be serialized as RDF/JSON-LD and validated against `goblin-shapes.ttl` to keep data consistent while experimenting. diff --git a/goblin_ontology/__init__.py b/goblin_ontology/__init__.py new file mode 100644 index 0000000..d665007 --- /dev/null +++ b/goblin_ontology/__init__.py @@ -0,0 +1,4 @@ +__all__ = ["__version__"] +__version__ = "0.1.0" + + diff --git a/goblin_ontology/cli.py b/goblin_ontology/cli.py new file mode 100644 index 0000000..1df084b --- /dev/null +++ b/goblin_ontology/cli.py @@ -0,0 +1,67 @@ +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +from .validator import ValidationResult, validate + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser( + prog="goblin-validate", + description="Validate a Goblin score RDF/JSON-LD document against SHACL shapes.", + ) + parser.add_argument( + "data", + help="Path to data graph (JSON-LD, TTL, RDF/XML, etc.).", + ) + parser.add_argument( + "--shapes", + required=True, + help="Path to SHACL shapes TTL.", + ) + parser.add_argument( + "--data-format", + default=None, + help="Optional explicit RDF format for data (e.g., json-ld, turtle).", + ) + parser.add_argument( + "--shapes-format", + default="turtle", + help="Optional explicit RDF format for shapes (default: turtle).", + ) + parser.add_argument( + "--inference", + default="rdfs", + choices=["none", "rdfs", "owlrl"], + help="Inference mode during validation (default: rdfs).", + ) + parser.add_argument( + "--no-advanced", + action="store_true", + help="Disable advanced SHACL features.", + ) + return parser + + +def main(argv: list[str] | None = None) -> int: + args = _build_parser().parse_args(argv) + + result: ValidationResult = validate( + data_graph_path=Path(args.data), + shapes_graph_path=Path(args.shapes), + data_format=args.data_format, + shapes_format=args.shapes_format, + inference=args.inference, + advanced=not args.no_advanced, + ) + + print(result.report_text.strip()) + return 0 if result.conforms else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) + + diff --git a/goblin_ontology/data/goblin-ontology.ttl b/goblin_ontology/data/goblin-ontology.ttl new file mode 100644 index 0000000..1cde2ae --- /dev/null +++ b/goblin_ontology/data/goblin-ontology.ttl @@ -0,0 +1,470 @@ +@prefix ui: . +@prefix prob: . +@prefix psy: . +@prefix stake: . +@prefix math: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . + +###################################################################### +# Goblin Ontology (Systemic Closure Illusion Gradient) +# Repo target: nkllon/goblin +# Core idea: "Goblin score" = SCIG = Systemic Closure Illusion Gradient +###################################################################### + +###################################################################### +# Core Classes +###################################################################### + +ui:ProblemClass + a owl:Class ; + rdfs:label "Problem Class" ; + rdfs:comment "Abstract class of problems characterized by shared structural features." . + +ui:UIClosureIllusionProblem + a owl:Class ; + rdfs:subClassOf ui:ProblemClass ; + rdfs:label "UI Closure Illusion Problem Class" ; + rdfs:comment "Class of problems where local models claim closure but are embedded in distributed, asynchronous, multi-stakeholder systems, producing truth gaps and invalid states." . + +ui:GlobalStateSystem + a owl:Class ; + rdfs:label "Global State System" ; + rdfs:comment "The full cross-product of real system state, including async effects, backend conditions, external integrations, and human processes." . + +ui:Dimension + a owl:Class ; + rdfs:label "Dimension" ; + rdfs:comment "Axis along which the goblin pattern is analyzed." . + +ui:QualityAttributeDimension + a owl:Class ; + rdfs:subClassOf ui:Dimension ; + rdfs:label "Quality Attribute Dimension" ; + rdfs:comment "Non-functional qualities: security, availability, scalability, performance, maintainability, etc." . + +ui:StakeholderDimension + a owl:Class ; + rdfs:subClassOf ui:Dimension ; + rdfs:label "Stakeholder Dimension" . + +ui:EnergyDimension + a owl:Class ; + rdfs:subClassOf ui:Dimension ; + rdfs:label "Energy Gradient Dimension" . + +psy:Illusion + a owl:Class ; + rdfs:label "Cognitive Illusion" . + +psy:IllusionOfClosure + a owl:Class ; + rdfs:subClassOf psy:Illusion ; + rdfs:label "Illusion of Closure" ; + rdfs:comment "Belief that a model is closed and complete despite being embedded in a distributed, partially observable system." . + +###################################################################### +# Properties: Goblin score / SCIG +###################################################################### + +ui:goblinScore + a owl:DatatypeProperty ; + rdfs:label "Goblin score" ; + rdfs:domain ui:ProblemClass ; + rdfs:range xsd:decimal ; + rdfs:comment "Systemic Closure Illusion Gradient (SCIG) score, 0..1, where 1 is maximal closure illusion vs reality mismatch." . + +ui:SCIG_Score + a owl:DatatypeProperty ; + owl:equivalentProperty ui:goblinScore ; + rdfs:label "SCIG score (alias of Goblin score)" ; + rdfs:domain ui:ProblemClass ; + rdfs:range xsd:decimal . + +ui:dimensionIndex + a owl:DatatypeProperty ; + rdfs:label "dimension index" ; + rdfs:domain ui:Dimension ; + rdfs:range xsd:integer . + +ui:energyRelevanceScore + a owl:DatatypeProperty ; + rdfs:label "energy relevance score" ; + rdfs:domain ui:Dimension ; + rdfs:range xsd:decimal ; + rdfs:comment "0..1: how strongly this dimension is shaped by or shapes energy gradients (effort/benefit flows)." . + +###################################################################### +# Stakeholders +###################################################################### + +stake:StakeholderRole + a owl:Class ; + rdfs:label "Stakeholder Role" . + +stake:caresAbout + a owl:ObjectProperty ; + rdfs:label "cares about dimension" ; + rdfs:domain stake:StakeholderRole ; + rdfs:range ui:Dimension . + +stake:energySensitivity + a owl:DatatypeProperty ; + rdfs:label "energy gradient sensitivity" ; + rdfs:domain stake:StakeholderRole ; + rdfs:range xsd:decimal . + +stake:CEO a stake:StakeholderRole ; + rdfs:label "Chief Executive Officer" ; + stake:energySensitivity "0.9"^^xsd:decimal . + +stake:CIO a stake:StakeholderRole ; + rdfs:label "Chief Information Officer" ; + stake:energySensitivity "0.85"^^xsd:decimal . + +stake:CTO a stake:StakeholderRole ; + rdfs:label "Chief Technology Officer" ; + stake:energySensitivity "0.8"^^xsd:decimal . + +stake:CISO a stake:StakeholderRole ; + rdfs:label "Chief Information Security Officer" ; + stake:energySensitivity "0.75"^^xsd:decimal . + +stake:DevOpsEngineer a stake:StakeholderRole ; + rdfs:label "DevOps / Platform Engineer" ; + stake:energySensitivity "0.8"^^xsd:decimal . + +stake:UIDeveloper a stake:StakeholderRole ; + rdfs:label "UI / Frontend Developer" ; + stake:energySensitivity "0.65"^^xsd:decimal . + +###################################################################### +# Key Dimensions (subset for Goblin) +###################################################################### + +ui:Dim1_IllusionClosure a ui:Dimension ; + rdfs:label "Illusion of Closure / Model Reality Gap" ; + ui:dimensionIndex 1 ; + ui:energyRelevanceScore "0.8"^^xsd:decimal . + +ui:Dim2_DistributedState a ui:Dimension ; + rdfs:label "Distributed State & Fragmentation" ; + ui:dimensionIndex 2 ; + ui:energyRelevanceScore "0.9"^^xsd:decimal . + +ui:Dim3_AsyncNonDeterminism a ui:Dimension ; + rdfs:label "Asynchrony & Non-Determinism" ; + ui:dimensionIndex 3 ; + ui:energyRelevanceScore "0.85"^^xsd:decimal . + +ui:Dim4_DomainInvariants a ui:Dimension ; + rdfs:label "Domain Invariants & Business Truth" ; + ui:dimensionIndex 4 ; + ui:energyRelevanceScore "0.8"^^xsd:decimal . + +ui:Dim5_SecurityPrivacy a ui:QualityAttributeDimension ; + rdfs:label "Security & Privacy" ; + ui:dimensionIndex 5 ; + ui:energyRelevanceScore "0.9"^^xsd:decimal . + +ui:Dim7_PerformanceLatency a ui:QualityAttributeDimension ; + rdfs:label "Performance & Latency" ; + ui:dimensionIndex 7 ; + ui:energyRelevanceScore "0.95"^^xsd:decimal . + +ui:Dim8_ReliabilityResilience a ui:QualityAttributeDimension ; + rdfs:label "Reliability, Resilience & Availability" ; + ui:dimensionIndex 8 ; + ui:energyRelevanceScore "0.95"^^xsd:decimal . + +ui:Dim11_CostEfficiency a ui:QualityAttributeDimension ; + rdfs:label "Cost & Economic Efficiency" ; + ui:dimensionIndex 11 ; + ui:energyRelevanceScore "1.0"^^xsd:decimal . + +ui:Dim13_Maintainability a ui:QualityAttributeDimension ; + rdfs:label "Maintainability & Evolvability" ; + ui:dimensionIndex 13 ; + ui:energyRelevanceScore "0.9"^^xsd:decimal . + +ui:Dim21_TechnicalDebt a ui:QualityAttributeDimension ; + rdfs:label "Technical Debt & Entropy Accumulation" ; + ui:dimensionIndex 21 ; + ui:energyRelevanceScore "0.95"^^xsd:decimal . + +ui:Dim22_EnergyGradientSensitivity a ui:EnergyDimension ; + rdfs:label "Energy Gradient Sensitivity (Meta-Dimension)" ; + ui:dimensionIndex 22 ; + ui:energyRelevanceScore "1.0"^^xsd:decimal . + +###################################################################### +# Example Problem-Class Instances and Goblin Scores +###################################################################### + +prob:UIFrontend a ui:UIClosureIllusionProblem ; + rdfs:label "UI / Frontend Systems" ; + ui:goblinScore "0.92"^^xsd:decimal ; + rdfs:comment "Local declarative models, global distributed truth: rich goblin behavior." . + +prob:CloudOrchestration a ui:UIClosureIllusionProblem ; + rdfs:label "Cloud Infrastructure Orchestration" ; + ui:goblinScore "0.95"^^xsd:decimal ; + rdfs:comment "IaC drift, async cloud APIs, partial failure, external side effects." . + +prob:Microservices a ui:UIClosureIllusionProblem ; + rdfs:label "Distributed Microservices" ; + ui:goblinScore "0.97"^^xsd:decimal ; + rdfs:comment "Local invariants vs global eventual consistency; maximal goblin pattern." . + +prob:CICD a ui:UIClosureIllusionProblem ; + rdfs:label "CI/CD Pipelines" ; + ui:goblinScore "0.88"^^xsd:decimal ; + rdfs:comment "Pipeline DAGs vs runtime concurrency, caching, and worker variance." . + +prob:ConfigManagement a ui:UIClosureIllusionProblem ; + rdfs:label "Configuration Management" ; + ui:goblinScore "0.90"^^xsd:decimal ; + rdfs:comment "Desired-state configs vs mutable hosts and out-of-band changes." . + +prob:IAMSecurity a ui:UIClosureIllusionProblem ; + rdfs:label "IAM / Security Policy" ; + ui:goblinScore "0.94"^^xsd:decimal ; + rdfs:comment "Clean policy models vs shadow permissions and cached tokens." . + +prob:HealthcareWorkflow a ui:UIClosureIllusionProblem ; + rdfs:label "Healthcare Workflows" ; + ui:goblinScore "0.80"^^xsd:decimal . + +prob:FinanceReconciliation a ui:UIClosureIllusionProblem ; + rdfs:label "Financial Reconciliation" ; + ui:goblinScore "0.75"^^xsd:decimal . + +prob:SupplyChain a ui:UIClosureIllusionProblem ; + rdfs:label "Supply Chain / Inventory" ; + ui:goblinScore "0.85"^^xsd:decimal . + +prob:MLPipelines a ui:UIClosureIllusionProblem ; + rdfs:label "ML / Data Pipelines" ; + ui:goblinScore "0.82"^^xsd:decimal . + +prob:GovernmentProcesses a ui:UIClosureIllusionProblem ; + rdfs:label "Government / Regulatory Processes" ; + ui:goblinScore "0.90"^^xsd:decimal . + +###################################################################### +# Counterexamples with Low Goblin Scores +###################################################################### + +prob:PureMathematics a ui:ProblemClass ; + rdfs:label "Pure Mathematics (Formal Systems)" ; + ui:goblinScore "0.00"^^xsd:decimal ; + rdfs:comment "Closed formal systems with no distributed runtime; effectively goblin-free." . + +prob:CompilerPipeline a ui:ProblemClass ; + rdfs:label "Compiler Pipeline" ; + ui:goblinScore "0.15"^^xsd:decimal ; + rdfs:comment "Mostly deterministic pipeline; limited distributed state and illusion of closure is justified." . + +prob:MechanicalCAD a ui:ProblemClass ; + rdfs:label "Mechanical CAD Modeling" ; + ui:goblinScore "0.12"^^xsd:decimal . + +###################################################################### +# Energy Gradient Meta-Notes +###################################################################### + +ui:hasEnergyDimension + a owl:ObjectProperty ; + rdfs:label "has energy dimension" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:EnergyDimension . + +prob:UIFrontend ui:hasEnergyDimension ui:Dim22_EnergyGradientSensitivity . +prob:CloudOrchestration ui:hasEnergyDimension ui:Dim22_EnergyGradientSensitivity . +prob:Microservices ui:hasEnergyDimension ui:Dim22_EnergyGradientSensitivity . + +###################################################################### +# Extensions for Dynamic Artifact Generation +###################################################################### + +# New Classes +ui:RelationType a owl:Class ; + rdfs:label "Relation Type" . + +ui:Tier a owl:Class ; + rdfs:label "Tier" ; + rdfs:comment "Qualitative score tier." . + +ui:ScoreComponent a owl:Class ; + rdfs:label "Score Component" ; + rdfs:comment "Per-dimension normalized component in [0,1]." . + +ui:WeightAssignment a owl:Class ; + rdfs:label "Weight Assignment" ; + rdfs:comment "Binds a Dimension to a weight in [0,1]." . + +ui:Artifact a owl:Class ; + rdfs:label "Generated Artifact" ; + rdfs:comment "Output produced from ontology (PNG, SVG, JSON, HTML)." . + +ui:Build a owl:Class ; + rdfs:label "Build" ; + rdfs:comment "Provenance node grouping artifacts for a given commit/time." . + +ui:VisualizationConfig a owl:Class ; + rdfs:label "Visualization Config" ; + rdfs:comment "Optional thresholds and palette for projections." . + +# Object Properties +ui:influences a owl:ObjectProperty ; + rdfs:label "influences" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ProblemClass . + +ui:overlapsWith a owl:ObjectProperty ; + rdfs:label "overlaps with" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ProblemClass . + +ui:dependsOn a owl:ObjectProperty ; + rdfs:label "depends on" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ProblemClass . + +ui:hasScoreComponent a owl:ObjectProperty ; + rdfs:label "has score component" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ScoreComponent . + +ui:forDimension a owl:ObjectProperty ; + rdfs:label "for dimension" ; + rdfs:domain ui:ScoreComponent , ui:WeightAssignment ; + rdfs:range ui:Dimension . + +ui:hasTier a owl:ObjectProperty ; + rdfs:label "has tier" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:Tier . + +ui:generatedByBuild a owl:ObjectProperty ; + rdfs:label "generated by build" ; + rdfs:domain ui:Artifact ; + rdfs:range ui:Build . + +ui:hasArtifact a owl:ObjectProperty ; + rdfs:label "has artifact" ; + rdfs:domain ui:Build ; + rdfs:range ui:Artifact . + +# Datatype Properties +ui:componentValue a owl:DatatypeProperty ; + rdfs:label "component value" ; + rdfs:domain ui:ScoreComponent ; + rdfs:range xsd:decimal . + +ui:hasWeight a owl:DatatypeProperty ; + rdfs:label "weight value" ; + rdfs:domain ui:WeightAssignment ; + rdfs:range xsd:decimal . + +ui:artifactType a owl:DatatypeProperty ; + rdfs:label "artifact type" ; + rdfs:domain ui:Artifact ; + rdfs:range xsd:string . + +ui:artifactPath a owl:DatatypeProperty ; + rdfs:label "artifact path" ; + rdfs:domain ui:Artifact ; + rdfs:range xsd:string . + +ui:sourceCommit a owl:DatatypeProperty ; + rdfs:label "source commit" ; + rdfs:domain ui:Build ; + rdfs:range xsd:string . + +ui:generatedAt a owl:DatatypeProperty ; + rdfs:label "generated at" ; + rdfs:domain ui:Build ; + rdfs:range xsd:dateTime . + +ui:lowThreshold a owl:DatatypeProperty ; + rdfs:label "low threshold" ; + rdfs:domain ui:VisualizationConfig ; + rdfs:range xsd:decimal . + +ui:highThreshold a owl:DatatypeProperty ; + rdfs:label "high threshold" ; + rdfs:domain ui:VisualizationConfig ; + rdfs:range xsd:decimal . + +ui:palette a owl:DatatypeProperty ; + rdfs:label "palette" ; + rdfs:domain ui:VisualizationConfig ; + rdfs:range xsd:string . + +# Tier individuals +ui:High a ui:Tier ; rdfs:label "High" . +ui:Medium a ui:Tier ; rdfs:label "Medium" . +ui:Low a ui:Tier ; rdfs:label "Low" . + +# Example weight assignment (default weights) +ui:DefaultWeights a ui:WeightAssignment ; + ui:forDimension ui:Dim1_IllusionClosure ; ui:hasWeight "0.18"^^xsd:decimal ; + ui:forDimension ui:Dim2_DistributedState ; ui:hasWeight "0.20"^^xsd:decimal ; + ui:forDimension ui:Dim3_AsyncNonDeterminism ; ui:hasWeight "0.15"^^xsd:decimal ; + ui:forDimension ui:Dim5_SecurityPrivacy ; ui:hasWeight "0.10"^^xsd:decimal ; + ui:forDimension ui:Dim4_DomainInvariants ; ui:hasWeight "0.12"^^xsd:decimal ; + ui:forDimension ui:Dim22_EnergyGradientSensitivity ; ui:hasWeight "0.25"^^xsd:decimal . + +# Score components for a problem instance +prob:UIFrontend ui:hasScoreComponent [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim2_DistributedState ; + ui:componentValue "0.90"^^xsd:decimal + ] , + [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim3_AsyncNonDeterminism ; + ui:componentValue "0.90"^^xsd:decimal + ] . + +# Relations and tier examples +prob:CloudOrchestration ui:influences prob:Microservices . +prob:Microservices ui:overlapsWith prob:CICD ; + ui:hasTier ui:High . + +# Additional relations (seed) +prob:ConfigManagement ui:dependsOn prob:CloudOrchestration . +prob:IAMSecurity ui:overlapsWith prob:ConfigManagement . + +# Additional score components (seed) +prob:CloudOrchestration ui:hasScoreComponent [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim2_DistributedState ; + ui:componentValue "0.95"^^xsd:decimal + ] , + [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim8_ReliabilityResilience ; + ui:componentValue "0.90"^^xsd:decimal + ] . + +# Provenance example for generated artifacts +_:build1 a ui:Build ; + ui:sourceCommit "HEAD" ; + ui:generatedAt "2025-11-22T00:00:00Z"^^xsd:dateTime ; + ui:hasArtifact _:svg1 , _:json1 . + +_:svg1 a ui:Artifact ; + ui:artifactType "static-svg" ; + ui:artifactPath "docs/ttl-graph.svg" ; + ui:generatedByBuild _:build1 . + +_:json1 a ui:Artifact ; + ui:artifactType "web-json" ; + ui:artifactPath "docs/goblin.json" ; + ui:generatedByBuild _:build1 . + + diff --git a/goblin_ontology/data/goblin-shapes.ttl b/goblin_ontology/data/goblin-shapes.ttl new file mode 100644 index 0000000..1bc1a31 --- /dev/null +++ b/goblin_ontology/data/goblin-shapes.ttl @@ -0,0 +1,158 @@ +@prefix ui: . +@prefix sh: . +@prefix xsd: . +@prefix uiSh: . + +###################################################################### +# Goblin SHACL Shapes +###################################################################### + +# Any ProblemClass with a goblin score must keep it in [0,1]. + +uiSh:GoblinScoreShape + a sh:NodeShape ; + sh:targetClass ui:ProblemClass ; + sh:property [ + sh:path ui:goblinScore ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:message "Goblin score (SCIG) MUST be between 0.0 and 1.0." ; + ] . + +# ScoreComponent must have forDimension and componentValue in [0,1]. +uiSh:ScoreComponentShape + a sh:NodeShape ; + sh:targetClass ui:ScoreComponent ; + sh:property [ + sh:path ui:forDimension ; + sh:minCount 1 ; + sh:message "ScoreComponent MUST specify forDimension." ; + ] ; + sh:property [ + sh:path ui:componentValue ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 1 ; + sh:message "ScoreComponent MUST have componentValue in [0,1]." ; + ] . + +# WeightAssignment must have forDimension and hasWeight in [0,1]. +uiSh:WeightAssignmentShape + a sh:NodeShape ; + sh:targetClass ui:WeightAssignment ; + sh:property [ + sh:path ui:forDimension ; + sh:minCount 1 ; + sh:message "WeightAssignment MUST specify forDimension." ; + ] ; + sh:property [ + sh:path ui:hasWeight ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 1 ; + sh:message "WeightAssignment MUST have hasWeight in [0,1]." ; + ] . + +# ProblemClass optional hasTier, if present must be one of High|Medium|Low. +uiSh:TierShape + a sh:NodeShape ; + sh:targetClass ui:ProblemClass ; + sh:property [ + sh:path ui:hasTier ; + sh:minCount 0 ; + sh:in ( ui:High ui:Medium ui:Low ) ; + sh:message "If provided, hasTier MUST be High, Medium, or Low." ; + ] . + +# Artifact shape +uiSh:ArtifactShape + a sh:NodeShape ; + sh:targetClass ui:Artifact ; + sh:property [ + sh:path ui:artifactType ; + sh:datatype xsd:string ; + sh:minCount 1 ; + sh:message "Artifact MUST specify artifactType." ; + ] ; + sh:property [ + sh:path ui:artifactPath ; + sh:datatype xsd:string ; + sh:minCount 1 ; + sh:message "Artifact MUST specify artifactPath." ; + ] . + +# Build shape +uiSh:BuildShape + a sh:NodeShape ; + sh:targetClass ui:Build ; + sh:property [ + sh:path ui:sourceCommit ; + sh:datatype xsd:string ; + sh:minCount 1 ; + sh:message "Build MUST specify sourceCommit." ; + ] ; + sh:property [ + sh:path ui:generatedAt ; + sh:datatype xsd:dateTime ; + sh:minCount 1 ; + sh:message "Build MUST specify generatedAt." ; + ] . + +# Visualization config shape (optional) +uiSh:VisualizationConfigShape + a sh:NodeShape ; + sh:targetClass ui:VisualizationConfig ; + sh:property [ + sh:path ui:lowThreshold ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 0 ; + ] ; + sh:property [ + sh:path ui:highThreshold ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 0 ; + ] ; + sh:property [ + sh:path ui:palette ; + sh:datatype xsd:string ; + sh:minCount 0 ; + ] . + +# Any UIClosureIllusionProblem MUST have goblinScore specified. + +uiSh:UIClosureIllusionShape + a sh:NodeShape ; + sh:targetClass ui:UIClosureIllusionProblem ; + sh:property [ + sh:path ui:goblinScore ; + sh:minCount 1 ; + sh:datatype xsd:decimal ; + sh:message "UIClosureIllusionProblem MUST define a goblin score." ; + ] . + +# Dimension shape: enforce dimensionIndex and energyRelevanceScore presence (optional but encouraged). + +uiSh:DimensionShape + a sh:NodeShape ; + sh:targetClass ui:Dimension ; + sh:property [ + sh:path ui:dimensionIndex ; + sh:datatype xsd:integer ; + sh:minCount 0 ; + sh:message "Dimension MAY define a dimensionIndex (ordinal)." ; + ] ; + sh:property [ + sh:path ui:energyRelevanceScore ; + sh:datatype xsd:decimal ; + sh:minCount 0 ; + sh:message "Dimension MAY define an energyRelevanceScore (0..1)." ; + ] . + + diff --git a/goblin_ontology/validator.py b/goblin_ontology/validator.py new file mode 100644 index 0000000..206205e --- /dev/null +++ b/goblin_ontology/validator.py @@ -0,0 +1,71 @@ +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Optional, Tuple + +from rdflib import Graph +from pyshacl import validate as shacl_validate + + +@dataclass(frozen=True) +class ValidationResult: + conforms: bool + report_text: str + report_graph: Graph + + +def _guess_format_from_suffix(path: Path) -> Optional[str]: + name = path.name.lower() + if name.endswith(".ttl"): + return "turtle" + if name.endswith(".nt"): + return "nt" + if name.endswith(".nq"): + return "nquads" + if name.endswith(".trig"): + return "trig" + if name.endswith(".json") or name.endswith(".jsonld") or name.endswith(".json-ld"): + return "json-ld" + if name.endswith(".rdf") or name.endswith(".xml"): + return "xml" + return None + + +def load_graph(source_path: Path, rdf_format: Optional[str] = None) -> Graph: + graph = Graph() + fmt = rdf_format or _guess_format_from_suffix(source_path) + graph.parse(source=str(source_path), format=fmt) + return graph + + +def validate( + data_graph_path: Path | str, + shapes_graph_path: Path | str, + data_format: Optional[str] = None, + shapes_format: Optional[str] = None, + inference: str = "rdfs", + advanced: bool = True, +) -> ValidationResult: + """ + Validate an RDF data graph against SHACL shapes. + """ + data_path = Path(data_graph_path) + shapes_path = Path(shapes_graph_path) + + data_graph = load_graph(data_path, data_format) + shapes_graph = load_graph(shapes_path, shapes_format) + + conforms, report_graph, report_text = shacl_validate( + data_graph=data_graph, + shacl_graph=shapes_graph, + inference=inference, + advanced=advanced, + serialize_report_graph=False, + ) + + return ValidationResult( + conforms=bool(conforms), report_text=str(report_text), report_graph=report_graph + ) + + diff --git a/js/goblin-ontology/assets/goblin-ontology.ttl b/js/goblin-ontology/assets/goblin-ontology.ttl new file mode 100644 index 0000000..1cde2ae --- /dev/null +++ b/js/goblin-ontology/assets/goblin-ontology.ttl @@ -0,0 +1,470 @@ +@prefix ui: . +@prefix prob: . +@prefix psy: . +@prefix stake: . +@prefix math: . +@prefix rdf: . +@prefix rdfs: . +@prefix owl: . +@prefix xsd: . + +###################################################################### +# Goblin Ontology (Systemic Closure Illusion Gradient) +# Repo target: nkllon/goblin +# Core idea: "Goblin score" = SCIG = Systemic Closure Illusion Gradient +###################################################################### + +###################################################################### +# Core Classes +###################################################################### + +ui:ProblemClass + a owl:Class ; + rdfs:label "Problem Class" ; + rdfs:comment "Abstract class of problems characterized by shared structural features." . + +ui:UIClosureIllusionProblem + a owl:Class ; + rdfs:subClassOf ui:ProblemClass ; + rdfs:label "UI Closure Illusion Problem Class" ; + rdfs:comment "Class of problems where local models claim closure but are embedded in distributed, asynchronous, multi-stakeholder systems, producing truth gaps and invalid states." . + +ui:GlobalStateSystem + a owl:Class ; + rdfs:label "Global State System" ; + rdfs:comment "The full cross-product of real system state, including async effects, backend conditions, external integrations, and human processes." . + +ui:Dimension + a owl:Class ; + rdfs:label "Dimension" ; + rdfs:comment "Axis along which the goblin pattern is analyzed." . + +ui:QualityAttributeDimension + a owl:Class ; + rdfs:subClassOf ui:Dimension ; + rdfs:label "Quality Attribute Dimension" ; + rdfs:comment "Non-functional qualities: security, availability, scalability, performance, maintainability, etc." . + +ui:StakeholderDimension + a owl:Class ; + rdfs:subClassOf ui:Dimension ; + rdfs:label "Stakeholder Dimension" . + +ui:EnergyDimension + a owl:Class ; + rdfs:subClassOf ui:Dimension ; + rdfs:label "Energy Gradient Dimension" . + +psy:Illusion + a owl:Class ; + rdfs:label "Cognitive Illusion" . + +psy:IllusionOfClosure + a owl:Class ; + rdfs:subClassOf psy:Illusion ; + rdfs:label "Illusion of Closure" ; + rdfs:comment "Belief that a model is closed and complete despite being embedded in a distributed, partially observable system." . + +###################################################################### +# Properties: Goblin score / SCIG +###################################################################### + +ui:goblinScore + a owl:DatatypeProperty ; + rdfs:label "Goblin score" ; + rdfs:domain ui:ProblemClass ; + rdfs:range xsd:decimal ; + rdfs:comment "Systemic Closure Illusion Gradient (SCIG) score, 0..1, where 1 is maximal closure illusion vs reality mismatch." . + +ui:SCIG_Score + a owl:DatatypeProperty ; + owl:equivalentProperty ui:goblinScore ; + rdfs:label "SCIG score (alias of Goblin score)" ; + rdfs:domain ui:ProblemClass ; + rdfs:range xsd:decimal . + +ui:dimensionIndex + a owl:DatatypeProperty ; + rdfs:label "dimension index" ; + rdfs:domain ui:Dimension ; + rdfs:range xsd:integer . + +ui:energyRelevanceScore + a owl:DatatypeProperty ; + rdfs:label "energy relevance score" ; + rdfs:domain ui:Dimension ; + rdfs:range xsd:decimal ; + rdfs:comment "0..1: how strongly this dimension is shaped by or shapes energy gradients (effort/benefit flows)." . + +###################################################################### +# Stakeholders +###################################################################### + +stake:StakeholderRole + a owl:Class ; + rdfs:label "Stakeholder Role" . + +stake:caresAbout + a owl:ObjectProperty ; + rdfs:label "cares about dimension" ; + rdfs:domain stake:StakeholderRole ; + rdfs:range ui:Dimension . + +stake:energySensitivity + a owl:DatatypeProperty ; + rdfs:label "energy gradient sensitivity" ; + rdfs:domain stake:StakeholderRole ; + rdfs:range xsd:decimal . + +stake:CEO a stake:StakeholderRole ; + rdfs:label "Chief Executive Officer" ; + stake:energySensitivity "0.9"^^xsd:decimal . + +stake:CIO a stake:StakeholderRole ; + rdfs:label "Chief Information Officer" ; + stake:energySensitivity "0.85"^^xsd:decimal . + +stake:CTO a stake:StakeholderRole ; + rdfs:label "Chief Technology Officer" ; + stake:energySensitivity "0.8"^^xsd:decimal . + +stake:CISO a stake:StakeholderRole ; + rdfs:label "Chief Information Security Officer" ; + stake:energySensitivity "0.75"^^xsd:decimal . + +stake:DevOpsEngineer a stake:StakeholderRole ; + rdfs:label "DevOps / Platform Engineer" ; + stake:energySensitivity "0.8"^^xsd:decimal . + +stake:UIDeveloper a stake:StakeholderRole ; + rdfs:label "UI / Frontend Developer" ; + stake:energySensitivity "0.65"^^xsd:decimal . + +###################################################################### +# Key Dimensions (subset for Goblin) +###################################################################### + +ui:Dim1_IllusionClosure a ui:Dimension ; + rdfs:label "Illusion of Closure / Model Reality Gap" ; + ui:dimensionIndex 1 ; + ui:energyRelevanceScore "0.8"^^xsd:decimal . + +ui:Dim2_DistributedState a ui:Dimension ; + rdfs:label "Distributed State & Fragmentation" ; + ui:dimensionIndex 2 ; + ui:energyRelevanceScore "0.9"^^xsd:decimal . + +ui:Dim3_AsyncNonDeterminism a ui:Dimension ; + rdfs:label "Asynchrony & Non-Determinism" ; + ui:dimensionIndex 3 ; + ui:energyRelevanceScore "0.85"^^xsd:decimal . + +ui:Dim4_DomainInvariants a ui:Dimension ; + rdfs:label "Domain Invariants & Business Truth" ; + ui:dimensionIndex 4 ; + ui:energyRelevanceScore "0.8"^^xsd:decimal . + +ui:Dim5_SecurityPrivacy a ui:QualityAttributeDimension ; + rdfs:label "Security & Privacy" ; + ui:dimensionIndex 5 ; + ui:energyRelevanceScore "0.9"^^xsd:decimal . + +ui:Dim7_PerformanceLatency a ui:QualityAttributeDimension ; + rdfs:label "Performance & Latency" ; + ui:dimensionIndex 7 ; + ui:energyRelevanceScore "0.95"^^xsd:decimal . + +ui:Dim8_ReliabilityResilience a ui:QualityAttributeDimension ; + rdfs:label "Reliability, Resilience & Availability" ; + ui:dimensionIndex 8 ; + ui:energyRelevanceScore "0.95"^^xsd:decimal . + +ui:Dim11_CostEfficiency a ui:QualityAttributeDimension ; + rdfs:label "Cost & Economic Efficiency" ; + ui:dimensionIndex 11 ; + ui:energyRelevanceScore "1.0"^^xsd:decimal . + +ui:Dim13_Maintainability a ui:QualityAttributeDimension ; + rdfs:label "Maintainability & Evolvability" ; + ui:dimensionIndex 13 ; + ui:energyRelevanceScore "0.9"^^xsd:decimal . + +ui:Dim21_TechnicalDebt a ui:QualityAttributeDimension ; + rdfs:label "Technical Debt & Entropy Accumulation" ; + ui:dimensionIndex 21 ; + ui:energyRelevanceScore "0.95"^^xsd:decimal . + +ui:Dim22_EnergyGradientSensitivity a ui:EnergyDimension ; + rdfs:label "Energy Gradient Sensitivity (Meta-Dimension)" ; + ui:dimensionIndex 22 ; + ui:energyRelevanceScore "1.0"^^xsd:decimal . + +###################################################################### +# Example Problem-Class Instances and Goblin Scores +###################################################################### + +prob:UIFrontend a ui:UIClosureIllusionProblem ; + rdfs:label "UI / Frontend Systems" ; + ui:goblinScore "0.92"^^xsd:decimal ; + rdfs:comment "Local declarative models, global distributed truth: rich goblin behavior." . + +prob:CloudOrchestration a ui:UIClosureIllusionProblem ; + rdfs:label "Cloud Infrastructure Orchestration" ; + ui:goblinScore "0.95"^^xsd:decimal ; + rdfs:comment "IaC drift, async cloud APIs, partial failure, external side effects." . + +prob:Microservices a ui:UIClosureIllusionProblem ; + rdfs:label "Distributed Microservices" ; + ui:goblinScore "0.97"^^xsd:decimal ; + rdfs:comment "Local invariants vs global eventual consistency; maximal goblin pattern." . + +prob:CICD a ui:UIClosureIllusionProblem ; + rdfs:label "CI/CD Pipelines" ; + ui:goblinScore "0.88"^^xsd:decimal ; + rdfs:comment "Pipeline DAGs vs runtime concurrency, caching, and worker variance." . + +prob:ConfigManagement a ui:UIClosureIllusionProblem ; + rdfs:label "Configuration Management" ; + ui:goblinScore "0.90"^^xsd:decimal ; + rdfs:comment "Desired-state configs vs mutable hosts and out-of-band changes." . + +prob:IAMSecurity a ui:UIClosureIllusionProblem ; + rdfs:label "IAM / Security Policy" ; + ui:goblinScore "0.94"^^xsd:decimal ; + rdfs:comment "Clean policy models vs shadow permissions and cached tokens." . + +prob:HealthcareWorkflow a ui:UIClosureIllusionProblem ; + rdfs:label "Healthcare Workflows" ; + ui:goblinScore "0.80"^^xsd:decimal . + +prob:FinanceReconciliation a ui:UIClosureIllusionProblem ; + rdfs:label "Financial Reconciliation" ; + ui:goblinScore "0.75"^^xsd:decimal . + +prob:SupplyChain a ui:UIClosureIllusionProblem ; + rdfs:label "Supply Chain / Inventory" ; + ui:goblinScore "0.85"^^xsd:decimal . + +prob:MLPipelines a ui:UIClosureIllusionProblem ; + rdfs:label "ML / Data Pipelines" ; + ui:goblinScore "0.82"^^xsd:decimal . + +prob:GovernmentProcesses a ui:UIClosureIllusionProblem ; + rdfs:label "Government / Regulatory Processes" ; + ui:goblinScore "0.90"^^xsd:decimal . + +###################################################################### +# Counterexamples with Low Goblin Scores +###################################################################### + +prob:PureMathematics a ui:ProblemClass ; + rdfs:label "Pure Mathematics (Formal Systems)" ; + ui:goblinScore "0.00"^^xsd:decimal ; + rdfs:comment "Closed formal systems with no distributed runtime; effectively goblin-free." . + +prob:CompilerPipeline a ui:ProblemClass ; + rdfs:label "Compiler Pipeline" ; + ui:goblinScore "0.15"^^xsd:decimal ; + rdfs:comment "Mostly deterministic pipeline; limited distributed state and illusion of closure is justified." . + +prob:MechanicalCAD a ui:ProblemClass ; + rdfs:label "Mechanical CAD Modeling" ; + ui:goblinScore "0.12"^^xsd:decimal . + +###################################################################### +# Energy Gradient Meta-Notes +###################################################################### + +ui:hasEnergyDimension + a owl:ObjectProperty ; + rdfs:label "has energy dimension" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:EnergyDimension . + +prob:UIFrontend ui:hasEnergyDimension ui:Dim22_EnergyGradientSensitivity . +prob:CloudOrchestration ui:hasEnergyDimension ui:Dim22_EnergyGradientSensitivity . +prob:Microservices ui:hasEnergyDimension ui:Dim22_EnergyGradientSensitivity . + +###################################################################### +# Extensions for Dynamic Artifact Generation +###################################################################### + +# New Classes +ui:RelationType a owl:Class ; + rdfs:label "Relation Type" . + +ui:Tier a owl:Class ; + rdfs:label "Tier" ; + rdfs:comment "Qualitative score tier." . + +ui:ScoreComponent a owl:Class ; + rdfs:label "Score Component" ; + rdfs:comment "Per-dimension normalized component in [0,1]." . + +ui:WeightAssignment a owl:Class ; + rdfs:label "Weight Assignment" ; + rdfs:comment "Binds a Dimension to a weight in [0,1]." . + +ui:Artifact a owl:Class ; + rdfs:label "Generated Artifact" ; + rdfs:comment "Output produced from ontology (PNG, SVG, JSON, HTML)." . + +ui:Build a owl:Class ; + rdfs:label "Build" ; + rdfs:comment "Provenance node grouping artifacts for a given commit/time." . + +ui:VisualizationConfig a owl:Class ; + rdfs:label "Visualization Config" ; + rdfs:comment "Optional thresholds and palette for projections." . + +# Object Properties +ui:influences a owl:ObjectProperty ; + rdfs:label "influences" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ProblemClass . + +ui:overlapsWith a owl:ObjectProperty ; + rdfs:label "overlaps with" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ProblemClass . + +ui:dependsOn a owl:ObjectProperty ; + rdfs:label "depends on" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ProblemClass . + +ui:hasScoreComponent a owl:ObjectProperty ; + rdfs:label "has score component" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:ScoreComponent . + +ui:forDimension a owl:ObjectProperty ; + rdfs:label "for dimension" ; + rdfs:domain ui:ScoreComponent , ui:WeightAssignment ; + rdfs:range ui:Dimension . + +ui:hasTier a owl:ObjectProperty ; + rdfs:label "has tier" ; + rdfs:domain ui:ProblemClass ; + rdfs:range ui:Tier . + +ui:generatedByBuild a owl:ObjectProperty ; + rdfs:label "generated by build" ; + rdfs:domain ui:Artifact ; + rdfs:range ui:Build . + +ui:hasArtifact a owl:ObjectProperty ; + rdfs:label "has artifact" ; + rdfs:domain ui:Build ; + rdfs:range ui:Artifact . + +# Datatype Properties +ui:componentValue a owl:DatatypeProperty ; + rdfs:label "component value" ; + rdfs:domain ui:ScoreComponent ; + rdfs:range xsd:decimal . + +ui:hasWeight a owl:DatatypeProperty ; + rdfs:label "weight value" ; + rdfs:domain ui:WeightAssignment ; + rdfs:range xsd:decimal . + +ui:artifactType a owl:DatatypeProperty ; + rdfs:label "artifact type" ; + rdfs:domain ui:Artifact ; + rdfs:range xsd:string . + +ui:artifactPath a owl:DatatypeProperty ; + rdfs:label "artifact path" ; + rdfs:domain ui:Artifact ; + rdfs:range xsd:string . + +ui:sourceCommit a owl:DatatypeProperty ; + rdfs:label "source commit" ; + rdfs:domain ui:Build ; + rdfs:range xsd:string . + +ui:generatedAt a owl:DatatypeProperty ; + rdfs:label "generated at" ; + rdfs:domain ui:Build ; + rdfs:range xsd:dateTime . + +ui:lowThreshold a owl:DatatypeProperty ; + rdfs:label "low threshold" ; + rdfs:domain ui:VisualizationConfig ; + rdfs:range xsd:decimal . + +ui:highThreshold a owl:DatatypeProperty ; + rdfs:label "high threshold" ; + rdfs:domain ui:VisualizationConfig ; + rdfs:range xsd:decimal . + +ui:palette a owl:DatatypeProperty ; + rdfs:label "palette" ; + rdfs:domain ui:VisualizationConfig ; + rdfs:range xsd:string . + +# Tier individuals +ui:High a ui:Tier ; rdfs:label "High" . +ui:Medium a ui:Tier ; rdfs:label "Medium" . +ui:Low a ui:Tier ; rdfs:label "Low" . + +# Example weight assignment (default weights) +ui:DefaultWeights a ui:WeightAssignment ; + ui:forDimension ui:Dim1_IllusionClosure ; ui:hasWeight "0.18"^^xsd:decimal ; + ui:forDimension ui:Dim2_DistributedState ; ui:hasWeight "0.20"^^xsd:decimal ; + ui:forDimension ui:Dim3_AsyncNonDeterminism ; ui:hasWeight "0.15"^^xsd:decimal ; + ui:forDimension ui:Dim5_SecurityPrivacy ; ui:hasWeight "0.10"^^xsd:decimal ; + ui:forDimension ui:Dim4_DomainInvariants ; ui:hasWeight "0.12"^^xsd:decimal ; + ui:forDimension ui:Dim22_EnergyGradientSensitivity ; ui:hasWeight "0.25"^^xsd:decimal . + +# Score components for a problem instance +prob:UIFrontend ui:hasScoreComponent [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim2_DistributedState ; + ui:componentValue "0.90"^^xsd:decimal + ] , + [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim3_AsyncNonDeterminism ; + ui:componentValue "0.90"^^xsd:decimal + ] . + +# Relations and tier examples +prob:CloudOrchestration ui:influences prob:Microservices . +prob:Microservices ui:overlapsWith prob:CICD ; + ui:hasTier ui:High . + +# Additional relations (seed) +prob:ConfigManagement ui:dependsOn prob:CloudOrchestration . +prob:IAMSecurity ui:overlapsWith prob:ConfigManagement . + +# Additional score components (seed) +prob:CloudOrchestration ui:hasScoreComponent [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim2_DistributedState ; + ui:componentValue "0.95"^^xsd:decimal + ] , + [ + a ui:ScoreComponent ; + ui:forDimension ui:Dim8_ReliabilityResilience ; + ui:componentValue "0.90"^^xsd:decimal + ] . + +# Provenance example for generated artifacts +_:build1 a ui:Build ; + ui:sourceCommit "HEAD" ; + ui:generatedAt "2025-11-22T00:00:00Z"^^xsd:dateTime ; + ui:hasArtifact _:svg1 , _:json1 . + +_:svg1 a ui:Artifact ; + ui:artifactType "static-svg" ; + ui:artifactPath "docs/ttl-graph.svg" ; + ui:generatedByBuild _:build1 . + +_:json1 a ui:Artifact ; + ui:artifactType "web-json" ; + ui:artifactPath "docs/goblin.json" ; + ui:generatedByBuild _:build1 . + + diff --git a/js/goblin-ontology/assets/goblin-shapes.ttl b/js/goblin-ontology/assets/goblin-shapes.ttl new file mode 100644 index 0000000..1bc1a31 --- /dev/null +++ b/js/goblin-ontology/assets/goblin-shapes.ttl @@ -0,0 +1,158 @@ +@prefix ui: . +@prefix sh: . +@prefix xsd: . +@prefix uiSh: . + +###################################################################### +# Goblin SHACL Shapes +###################################################################### + +# Any ProblemClass with a goblin score must keep it in [0,1]. + +uiSh:GoblinScoreShape + a sh:NodeShape ; + sh:targetClass ui:ProblemClass ; + sh:property [ + sh:path ui:goblinScore ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:message "Goblin score (SCIG) MUST be between 0.0 and 1.0." ; + ] . + +# ScoreComponent must have forDimension and componentValue in [0,1]. +uiSh:ScoreComponentShape + a sh:NodeShape ; + sh:targetClass ui:ScoreComponent ; + sh:property [ + sh:path ui:forDimension ; + sh:minCount 1 ; + sh:message "ScoreComponent MUST specify forDimension." ; + ] ; + sh:property [ + sh:path ui:componentValue ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 1 ; + sh:message "ScoreComponent MUST have componentValue in [0,1]." ; + ] . + +# WeightAssignment must have forDimension and hasWeight in [0,1]. +uiSh:WeightAssignmentShape + a sh:NodeShape ; + sh:targetClass ui:WeightAssignment ; + sh:property [ + sh:path ui:forDimension ; + sh:minCount 1 ; + sh:message "WeightAssignment MUST specify forDimension." ; + ] ; + sh:property [ + sh:path ui:hasWeight ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 1 ; + sh:message "WeightAssignment MUST have hasWeight in [0,1]." ; + ] . + +# ProblemClass optional hasTier, if present must be one of High|Medium|Low. +uiSh:TierShape + a sh:NodeShape ; + sh:targetClass ui:ProblemClass ; + sh:property [ + sh:path ui:hasTier ; + sh:minCount 0 ; + sh:in ( ui:High ui:Medium ui:Low ) ; + sh:message "If provided, hasTier MUST be High, Medium, or Low." ; + ] . + +# Artifact shape +uiSh:ArtifactShape + a sh:NodeShape ; + sh:targetClass ui:Artifact ; + sh:property [ + sh:path ui:artifactType ; + sh:datatype xsd:string ; + sh:minCount 1 ; + sh:message "Artifact MUST specify artifactType." ; + ] ; + sh:property [ + sh:path ui:artifactPath ; + sh:datatype xsd:string ; + sh:minCount 1 ; + sh:message "Artifact MUST specify artifactPath." ; + ] . + +# Build shape +uiSh:BuildShape + a sh:NodeShape ; + sh:targetClass ui:Build ; + sh:property [ + sh:path ui:sourceCommit ; + sh:datatype xsd:string ; + sh:minCount 1 ; + sh:message "Build MUST specify sourceCommit." ; + ] ; + sh:property [ + sh:path ui:generatedAt ; + sh:datatype xsd:dateTime ; + sh:minCount 1 ; + sh:message "Build MUST specify generatedAt." ; + ] . + +# Visualization config shape (optional) +uiSh:VisualizationConfigShape + a sh:NodeShape ; + sh:targetClass ui:VisualizationConfig ; + sh:property [ + sh:path ui:lowThreshold ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 0 ; + ] ; + sh:property [ + sh:path ui:highThreshold ; + sh:datatype xsd:decimal ; + sh:minInclusive 0.0 ; + sh:maxInclusive 1.0 ; + sh:minCount 0 ; + ] ; + sh:property [ + sh:path ui:palette ; + sh:datatype xsd:string ; + sh:minCount 0 ; + ] . + +# Any UIClosureIllusionProblem MUST have goblinScore specified. + +uiSh:UIClosureIllusionShape + a sh:NodeShape ; + sh:targetClass ui:UIClosureIllusionProblem ; + sh:property [ + sh:path ui:goblinScore ; + sh:minCount 1 ; + sh:datatype xsd:decimal ; + sh:message "UIClosureIllusionProblem MUST define a goblin score." ; + ] . + +# Dimension shape: enforce dimensionIndex and energyRelevanceScore presence (optional but encouraged). + +uiSh:DimensionShape + a sh:NodeShape ; + sh:targetClass ui:Dimension ; + sh:property [ + sh:path ui:dimensionIndex ; + sh:datatype xsd:integer ; + sh:minCount 0 ; + sh:message "Dimension MAY define a dimensionIndex (ordinal)." ; + ] ; + sh:property [ + sh:path ui:energyRelevanceScore ; + sh:datatype xsd:decimal ; + sh:minCount 0 ; + sh:message "Dimension MAY define an energyRelevanceScore (0..1)." ; + ] . + + diff --git a/js/goblin-ontology/package.json b/js/goblin-ontology/package.json new file mode 100644 index 0000000..f47af47 --- /dev/null +++ b/js/goblin-ontology/package.json @@ -0,0 +1,33 @@ +{ + "name": "@nkllon/goblin-ontology", + "version": "0.1.0", + "description": "JS/TS loader and SHACL validator for Goblin ontology artifacts.", + "license": "MIT", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "bin": { + "goblin-validate": "dist/cli.js" + }, + "files": [ + "dist", + "assets" + ], + "scripts": { + "build": "tsc -p tsconfig.json", + "typecheck": "tsc --noEmit -p tsconfig.json", + "lint": "echo \"no lint configured\"", + "test": "node --version && echo \"no tests yet\"" + }, + "dependencies": { + "@rdfjs/data-model": "^2.0.2", + "@rdfjs/dataset": "^2.0.1", + "n3": "^1.17.4", + "rdf-validate-shacl": "^2.5.0" + }, + "devDependencies": { + "typescript": "^5.6.3" + } +} + + diff --git a/js/goblin-ontology/src/cli.ts b/js/goblin-ontology/src/cli.ts new file mode 100644 index 0000000..5701f17 --- /dev/null +++ b/js/goblin-ontology/src/cli.ts @@ -0,0 +1,43 @@ +#!/usr/bin/env node +import { argv, exit } from "node:process"; +import { validate } from "./validate.js"; + +function usage(): string { + return [ + "Usage: goblin-validate --shapes ", + "", + "Validate a Turtle data graph against Goblin SHACL shapes.", + ].join("\n"); +} + +async function main(): Promise { + const args = argv.slice(2); + if (args.length < 1) { + console.error(usage()); + return 2; + } + const dataPath = args[0]; + const shapesFlagIdx = args.findIndex((a) => a === "--shapes"); + if (shapesFlagIdx === -1 || shapesFlagIdx === args.length - 1) { + console.error("Missing --shapes ."); + console.error(usage()); + return 2; + } + const shapesPath = args[shapesFlagIdx + 1]; + + try { + const { conforms, reportTurtle } = await validate(dataPath, shapesPath, { + dataFormat: "turtle", + shapesFormat: "turtle", + }); + console.log(reportTurtle.trim()); + return conforms ? 0 : 1; + } catch (err) { + console.error(String(err)); + return 3; + } +} + +main().then((code) => exit(code)); + + diff --git a/js/goblin-ontology/src/index.ts b/js/goblin-ontology/src/index.ts new file mode 100644 index 0000000..7c84cc4 --- /dev/null +++ b/js/goblin-ontology/src/index.ts @@ -0,0 +1,3 @@ +export * from "./validate.js"; + + diff --git a/js/goblin-ontology/src/validate.ts b/js/goblin-ontology/src/validate.ts new file mode 100644 index 0000000..fef0f0c --- /dev/null +++ b/js/goblin-ontology/src/validate.ts @@ -0,0 +1,72 @@ +import { promises as fs } from "node:fs"; +import { DataFactory } from "@rdfjs/data-model"; +import rdfDataset from "@rdfjs/dataset"; +import { Parser as N3Parser, Writer as N3Writer, Quad } from "n3"; +import { Validator } from "rdf-validate-shacl"; + +export type ValidateOptions = { + dataFormat?: "turtle" | "jsonld"; // currently supporting turtle best + shapesFormat?: "turtle"; +}; + +function guessFormat(path: string): "turtle" | "jsonld" { + const p = path.toLowerCase(); + if (p.endsWith(".ttl")) return "turtle"; + if (p.endsWith(".json") || p.endsWith(".jsonld")) return "jsonld"; + return "turtle"; +} + +async function parseTurtleToDataset(turtle: string) { + const parser = new N3Parser({ format: "text/turtle" }); + const quads: Quad[] = parser.parse(turtle) as Quad[]; + const dataset = rdfDataset.dataset(); + for (const q of quads) { + dataset.add(rdfDataset.quad(q.subject, q.predicate, q.object, q.graph)); + } + return dataset; +} + +export async function validate( + dataPath: string, + shapesPath: string, + options: ValidateOptions = {} +): Promise<{ conforms: boolean; reportTurtle: string }> { + const dataFormat = options.dataFormat ?? guessFormat(dataPath); + const shapesFormat = options.shapesFormat ?? "turtle"; + + if (dataFormat !== "turtle") { + throw new Error( + `Unsupported data format '${dataFormat}' in JS validator yet; please provide Turtle (.ttl).` + ); + } + if (shapesFormat !== "turtle") { + throw new Error(`Unsupported shapes format '${shapesFormat}', expected 'turtle'.`); + } + + const [dataTtl, shapesTtl] = await Promise.all([ + fs.readFile(dataPath, "utf8"), + fs.readFile(shapesPath, "utf8"), + ]); + + const dataDataset = await parseTurtleToDataset(dataTtl); + const shapesDataset = await parseTurtleToDataset(shapesTtl); + + const validator = new Validator(shapesDataset, { factory: DataFactory }); + const report = await validator.validate(dataDataset); + + const writer = new N3Writer({ format: "text/turtle" }); + const reportDataset = report.dataset; + for (const quad of reportDataset) { + writer.addQuad(quad as unknown as Quad); + } + const reportTurtle = await new Promise((resolve, reject) => { + writer.end((err, result) => { + if (err) reject(err); + else resolve(result ?? ""); + }); + }); + + return { conforms: report.conforms, reportTurtle }; +} + + diff --git a/js/goblin-ontology/tsconfig.json b/js/goblin-ontology/tsconfig.json new file mode 100644 index 0000000..a35442e --- /dev/null +++ b/js/goblin-ontology/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ES2020", + "moduleResolution": "NodeNext", + "outDir": "dist", + "rootDir": "src", + "declaration": true, + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "resolveJsonModule": true + }, + "include": ["src/**/*.ts"] +} + + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ae54337 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,37 @@ +[build-system] +requires = ["setuptools>=68", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "goblin-ontology" +version = "0.1.0" +description = "Ontology and SHACL shapes for the Goblin score, with validation utilities." +readme = "README.md" +requires-python = ">=3.10" +license = { text = "MIT" } +authors = [ + { name = "Goblin Contributors" } +] +dependencies = [ + "rdflib>=7.0.0", + "pyshacl>=0.25.0", + "typing-extensions>=4.7.0; python_version < '3.11'", +] + +[project.scripts] +goblin-validate = "goblin_ontology.cli:main" + +[project.urls] +Homepage = "https://github.com/nkllon/goblin" + +[tool.setuptools] +packages = ["goblin_ontology"] +include-package-data = true + +[tool.setuptools.package-data] +goblin_ontology = ["data/*"] + +[tool.uv] +dev-dependencies = [] + + From 654976f7267cc96610456841cb28b236dcba7b95 Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 10:27:12 -0700 Subject: [PATCH 02/13] CI parity + fixes: - Move heavy checks to pre-push; add Docker-based hooks - Add Makefile and docker-compose to reproduce CI locally - Fix SHACL by removing dual domain on ui:forDimension; validation passes - Regenerate docs/goblin-map.* to satisfy dot-check - JS: set rdf-validate-shacl ^0.6.5, NodeNext module; build/typecheck pass --- .pre-commit-config.yaml | 57 ++++++++++++ CHANGELOG.md | 7 ++ Makefile | 39 +++++++++ README.md | 52 +++++++++++ docker-compose.yml | 60 +++++++++++++ docs/goblin-map.png | Bin 95 -> 94069 bytes docs/goblin-map.svg | 136 ++++++++++++++++++++++++++--- goblin-ontology.ttl | 1 - js/goblin-ontology/package.json | 2 +- js/goblin-ontology/src/shims.d.ts | 5 ++ js/goblin-ontology/src/validate.ts | 12 +-- js/goblin-ontology/tsconfig.json | 2 +- 12 files changed, 353 insertions(+), 20 deletions(-) create mode 100644 .pre-commit-config.yaml create mode 100644 Makefile create mode 100644 docker-compose.yml create mode 100644 js/goblin-ontology/src/shims.d.ts diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..91a7ee4 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,57 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-yaml + - id: check-json + - id: check-toml + + # Local hooks mirroring GitHub Actions using Docker images (parity across machines). + - repo: local + hooks: + - id: python-validate + name: Python SHACL validation (mirrors validate.yml/python-validate and ci.yml) + language: docker_image + docker_image: python:3.11-slim + entry: bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib pyshacl graphviz pydot && python tools/validate_shapes.py' + pass_filenames: false + require_serial: true + stages: [push] + + - id: python-export + name: Export DOT/images and web JSON (mirrors ci.yml exporters) + language: docker_image + docker_image: python:3.11-slim + entry: bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib graphviz pydot && python tools/export_instances_dot.py && python tools/export_web_json.py && git diff --quiet -- docs/ || { echo ":: docs changed, commit generated artifacts"; git status --short docs/; exit 1; }' + pass_filenames: false + require_serial: true + stages: [push] + + - id: dot-committed-diff + name: Check goblin-map images up-to-date (mirrors validate.yml/dot-check) + language: docker_image + docker_image: debian:stable-slim + entry: bash -lc 'set -e; apt-get update && apt-get install -y --no-install-recommends graphviz diffutils && dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new && dot -Tpng goblin-map.dot -o docs/goblin-map.png.new && cmp -s docs/goblin-map.svg docs/goblin-map.svg.new && cmp -s docs/goblin-map.png docs/goblin-map.png.new' + pass_filenames: false + require_serial: true + stages: [push] + + - id: js-package + name: JS package typecheck/build/test (mirrors js.yml) + language: docker_image + docker_image: node:20 + entry: bash -lc 'cd js/goblin-ontology && (npm ci || npm i) && npm run typecheck && npm run build && npm test' + pass_filenames: false + stages: [push] + + - id: web-build + name: Web build to docs (mirrors ci.yml web build) + language: docker_image + docker_image: node:20 + entry: bash -lc 'cd web && (npm ci || npm i) && npm run build' + pass_filenames: false + stages: [push] + + diff --git a/CHANGELOG.md b/CHANGELOG.md index 9296f6d..97fe40c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,4 +15,11 @@ All notable changes to this project will be documented in this file. ### Notes - Semantic versioning will track ontology schema changes going forward. +## Unreleased +### Fixed +- SHACL failures due to `ui:forDimension` declaring a dual `rdfs:domain` of both `ui:ScoreComponent` and `ui:WeightAssignment`, which inferred nodes into both classes. Removed the domain to avoid unintended inference; SHACL now passes. +- Regenerated `docs/goblin-map.svg` and `docs/goblin-map.png` from `goblin-map.dot` to match CI dot-check. +### JS +- Corrected `rdf-validate-shacl` dependency to `^0.6.5` and adjusted TS config/imports to pass typecheck and build under Node 20. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f97b998 --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +.PHONY: python-validate python-export dot-check js web ci ci-docker + +python-validate: + python tools/validate_shapes.py + +python-export: + python tools/export_instances_dot.py + python tools/export_web_json.py + +dot-check: + @set -e; \ + dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new; \ + dot -Tpng goblin-map.dot -o docs/goblin-map.png.new; \ + cmp -s docs/goblin-map.svg docs/goblin-map.svg.new; \ + cmp -s docs/goblin-map.png docs/goblin-map.png.new + +js: + cd js/goblin-ontology && (npm ci || npm i) && npm run typecheck && npm run build && npm test + +web: + cd web && (npm ci || npm i) && npm run build + +ci: python-validate python-export dot-check js web + +ci-docker: + docker compose run --rm python-validate + docker compose run --rm python-export + docker compose run --rm dot-check + docker compose run --rm js-package + docker compose run --rm web-build + +.PHONY: hooks hooks-push +hooks: + pre-commit run --all-files --show-diff-on-failure + +hooks-push: + pre-commit run --all-files --hook-stage push --show-diff-on-failure + + diff --git a/README.md b/README.md index 7ac31f4..f863e72 100644 --- a/README.md +++ b/README.md @@ -36,3 +36,55 @@ The Goblin score is defined in the ontology as `ui:goblinScore` and is an alias - Wire `goblin-agent-lim42.md` into lim42 as a reusable agent profile. - Render `goblin-map.dot` with Graphviz to produce a PNG/SVG for documentation. +## CI parity (local) + +You can reproduce GitHub Actions locally in two ways: + +1) Docker Compose (dev-friendly) + +- Build/run the same steps as CI: + +``` +make ci-docker +``` + +- Or individual steps: + +``` +docker compose run --rm python-validate +docker compose run --rm python-export +docker compose run --rm dot-check +docker compose run --rm js-package +docker compose run --rm web-build +``` + +2) act (exact workflow runner) + +- Install: `brew install act` (macOS) +- Run specific jobs matching `.github/workflows/*.yml`: + +``` +act pull_request -j validate-and-build +act pull_request -j js +act pull_request -j python-validate +act pull_request -j dot-check +act pull_request -j docs-link +``` + +## Pre-commit (mirrors CI) + +Install pre-commit and enable hooks: + +``` +python3 -m pip install --user pre-commit +pre-commit install +pre-commit install --hook-type pre-push +``` + +Run all hooks (heavy, uses Docker to ensure parity): + +``` +pre-commit run --all-files --show-diff-on-failure +pre-commit run --all-files --hook-stage push --show-diff-on-failure +``` + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9f111f4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,60 @@ +version: "3.9" +services: + python-validate: + image: python:3.11-slim + working_dir: /workspace + volumes: + - .:/workspace + command: > + bash -lc "apt-get update && + apt-get install -y --no-install-recommends graphviz && + python -m pip install --no-cache-dir -q rdflib pyshacl graphviz pydot && + python tools/validate_shapes.py" + + python-export: + image: python:3.11-slim + working_dir: /workspace + volumes: + - .:/workspace + command: > + bash -lc "apt-get update && + apt-get install -y --no-install-recommends graphviz && + python -m pip install --no-cache-dir -q rdflib graphviz pydot && + python tools/export_instances_dot.py && + python tools/export_web_json.py" + + dot-check: + image: debian:stable-slim + working_dir: /workspace + volumes: + - .:/workspace + command: > + bash -lc "set -e && + apt-get update && + apt-get install -y --no-install-recommends graphviz diffutils && + dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new && + dot -Tpng goblin-map.dot -o docs/goblin-map.png.new && + cmp -s docs/goblin-map.svg docs/goblin-map.svg.new && + cmp -s docs/goblin-map.png docs/goblin-map.png.new" + + js-package: + image: node:20 + working_dir: /workspace/js/goblin-ontology + volumes: + - .:/workspace + command: > + bash -lc "(npm ci || npm i) && + npm run typecheck && + npm run build && + npm test" + + web-build: + image: node:20 + working_dir: /workspace/web + volumes: + - .:/workspace + command: > + bash -lc "(npm ci || npm i) && + npm run build" + + diff --git a/docs/goblin-map.png b/docs/goblin-map.png index ae114eadc75acd7b6a9114327496800a08c0946a..5dd51e2856fbcbcb3b6136ea866b5fd8a5cd5727 100644 GIT binary patch literal 94069 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 - - - - goblin-map.svg - - - Generated by Graphviz from goblin-map.dot (placeholder committed) - + + + + + + +GoblinMap + + +cluster_high + +High Goblin Domains + + +cluster_medium + +Medium Goblin Domains + + +cluster_low + +Low Goblin Domains + + + +UIFrontend + +UI / Frontend +Goblin ~ 0.92 + + + +CloudOrch + +Cloud Orchestration +Goblin ~ 0.95 + + + +Microservices + +Microservices +Goblin ~ 0.97 + + + +CICD + +CI/CD +Goblin ~ 0.88 + + + +ConfigMgmt + +Config Mgmt +Goblin ~ 0.90 + + + +IAM + +IAM / Security +Goblin ~ 0.94 + + + +Healthcare + +Healthcare Workflows +Goblin ~ 0.80 + + + +Finance + +Finance / Reconciliation +Goblin ~ 0.75 + + + +SupplyChain + +Supply Chain +Goblin ~ 0.85 + + + +MLPipelines + +ML / Data Pipelines +Goblin ~ 0.82 + + + +Government + +Government / Regulatory +Goblin ~ 0.90 + + + +Math + +Pure Mathematics +Goblin ~ 0.00 + + + +Compiler + +Compiler Pipeline +Goblin ~ 0.15 + + + +CAD + +Mechanical CAD +Goblin ~ 0.12 + + - - diff --git a/goblin-ontology.ttl b/goblin-ontology.ttl index 24f2b8d..31a9333 100644 --- a/goblin-ontology.ttl +++ b/goblin-ontology.ttl @@ -341,7 +341,6 @@ ui:hasScoreComponent a owl:ObjectProperty ; ui:forDimension a owl:ObjectProperty ; rdfs:label "for dimension" ; - rdfs:domain ui:ScoreComponent , ui:WeightAssignment ; rdfs:range ui:Dimension . ui:hasTier a owl:ObjectProperty ; diff --git a/js/goblin-ontology/package.json b/js/goblin-ontology/package.json index f47af47..07e4d5b 100644 --- a/js/goblin-ontology/package.json +++ b/js/goblin-ontology/package.json @@ -23,7 +23,7 @@ "@rdfjs/data-model": "^2.0.2", "@rdfjs/dataset": "^2.0.1", "n3": "^1.17.4", - "rdf-validate-shacl": "^2.5.0" + "rdf-validate-shacl": "^0.6.5" }, "devDependencies": { "typescript": "^5.6.3" diff --git a/js/goblin-ontology/src/shims.d.ts b/js/goblin-ontology/src/shims.d.ts new file mode 100644 index 0000000..ba04593 --- /dev/null +++ b/js/goblin-ontology/src/shims.d.ts @@ -0,0 +1,5 @@ +declare module "@rdfjs/data-model"; +declare module "@rdfjs/dataset"; +declare module "n3"; + + diff --git a/js/goblin-ontology/src/validate.ts b/js/goblin-ontology/src/validate.ts index fef0f0c..1cc712f 100644 --- a/js/goblin-ontology/src/validate.ts +++ b/js/goblin-ontology/src/validate.ts @@ -1,8 +1,8 @@ import { promises as fs } from "node:fs"; import { DataFactory } from "@rdfjs/data-model"; import rdfDataset from "@rdfjs/dataset"; -import { Parser as N3Parser, Writer as N3Writer, Quad } from "n3"; -import { Validator } from "rdf-validate-shacl"; +import { Parser as N3Parser, Writer as N3Writer } from "n3"; +import Validator from "rdf-validate-shacl"; export type ValidateOptions = { dataFormat?: "turtle" | "jsonld"; // currently supporting turtle best @@ -18,7 +18,7 @@ function guessFormat(path: string): "turtle" | "jsonld" { async function parseTurtleToDataset(turtle: string) { const parser = new N3Parser({ format: "text/turtle" }); - const quads: Quad[] = parser.parse(turtle) as Quad[]; + const quads: any[] = parser.parse(turtle) as any[]; const dataset = rdfDataset.dataset(); for (const q of quads) { dataset.add(rdfDataset.quad(q.subject, q.predicate, q.object, q.graph)); @@ -56,11 +56,11 @@ export async function validate( const writer = new N3Writer({ format: "text/turtle" }); const reportDataset = report.dataset; - for (const quad of reportDataset) { - writer.addQuad(quad as unknown as Quad); + for (const quad of reportDataset as any) { + writer.addQuad(quad as any); } const reportTurtle = await new Promise((resolve, reject) => { - writer.end((err, result) => { + writer.end((err: Error | null, result?: string) => { if (err) reject(err); else resolve(result ?? ""); }); diff --git a/js/goblin-ontology/tsconfig.json b/js/goblin-ontology/tsconfig.json index a35442e..88478ad 100644 --- a/js/goblin-ontology/tsconfig.json +++ b/js/goblin-ontology/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020", - "module": "ES2020", + "module": "NodeNext", "moduleResolution": "NodeNext", "outDir": "dist", "rootDir": "src", From 3a22e684890bae7eac883703dc061935c55edca3 Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:12:37 -0700 Subject: [PATCH 03/13] Add GHCR-backed act scripts and Make targets; document GHCR usage in README --- Makefile | 8 ++++++++ README.md | 21 +++++++++++++++++++++ tools/ci/ghcr_login.sh | 34 ++++++++++++++++++++++++++++++++++ tools/ci/run_act_ghcr.sh | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 98 insertions(+) create mode 100644 tools/ci/ghcr_login.sh create mode 100644 tools/ci/run_act_ghcr.sh diff --git a/Makefile b/Makefile index f97b998..80d9721 100644 --- a/Makefile +++ b/Makefile @@ -36,4 +36,12 @@ hooks: hooks-push: pre-commit run --all-files --hook-stage push --show-diff-on-failure +.PHONY: act-ci-ghcr act-job-ghcr +act-ci-ghcr: + bash tools/ci/run_act_ghcr.sh + +# Run a single job with GHCR-backed act, e.g.: make act-job-ghcr JOB=js +act-job-ghcr: + bash -lc 'tools/ci/ghcr_login.sh && docker pull ghcr.io/nektos/act:latest >/dev/null && docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$$PWD":/github/workspace -v "$$HOME/.act":/root/.act -w /github/workspace ghcr.io/nektos/act:latest pull_request -P ubuntu-latest=catthehacker/ubuntu:act-latest -j "$${JOB}"' + diff --git a/README.md b/README.md index f863e72..057339d 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,27 @@ act pull_request -j dot-check act pull_request -j docs-link ``` +3) act via GHCR (uses gh CLI for token at runtime) + +- Ensure GitHub CLI is logged in and has `read:packages`: + +``` +gh auth status +gh auth refresh -h github.com -s read:packages +``` + +- Run all CI jobs via GHCR-backed act: + +``` +make act-ci-ghcr +``` + +- Run a single job: + +``` +make act-job-ghcr JOB=js +``` + ## Pre-commit (mirrors CI) Install pre-commit and enable hooks: diff --git a/tools/ci/ghcr_login.sh b/tools/ci/ghcr_login.sh new file mode 100644 index 0000000..6ce731b --- /dev/null +++ b/tools/ci/ghcr_login.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Preconditions +if ! command -v docker >/dev/null 2>&1; then + echo "docker is required" >&2 + exit 1 +fi +if ! command -v gh >/dev/null 2>&1; then + echo "gh (GitHub CLI) is required. Install via: brew install gh" >&2 + exit 1 +fi + +# Resolve username and token via gh, allow env overrides +GH_USER="${GITHUB_USER:-}" +if [[ -z "${GH_USER}" ]]; then + GH_USER="$(gh api user -q .login)" +fi + +TOKEN="${GITHUB_TOKEN:-}" +if [[ -z "${TOKEN}" ]]; then + TOKEN="$(gh auth token)" +fi + +if [[ -z "${GH_USER}" || -z "${TOKEN}" ]]; then + echo "Missing GH creds. Ensure gh is logged in (gh auth status) or export GITHUB_USER/GITHUB_TOKEN." >&2 + exit 1 +fi + +# Login to GHCR +printf '%s' "${TOKEN}" | docker login ghcr.io -u "${GH_USER}" --password-stdin 1>/dev/null +echo "Logged in to ghcr.io as ${GH_USER}" + + diff --git a/tools/ci/run_act_ghcr.sh b/tools/ci/run_act_ghcr.sh new file mode 100644 index 0000000..42a8d2b --- /dev/null +++ b/tools/ci/run_act_ghcr.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" + +# Login to GHCR using gh +"${SCRIPT_DIR}/ghcr_login.sh" + +# Pull required images (act and ubuntu runner) +docker pull ghcr.io/nektos/act:latest 1>/dev/null +docker pull catthehacker/ubuntu:act-latest 1>/dev/null + +ACT_IMG="ghcr.io/nektos/act:latest" +PARAMS=(-P "ubuntu-latest=catthehacker/ubuntu:act-latest") + +run_job() { + local job="$1" + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v "${ROOT_DIR}":/github/workspace \ + -v "${HOME}/.act":/root/.act \ + -w /github/workspace \ + "${ACT_IMG}" pull_request -j "${job}" "${PARAMS[@]}" +} + +# Allow override: ACT_JOBS="job1 job2" +JOBS="${ACT_JOBS:-validate-and-build js python-validate dot-check docs-link}" +for job in ${JOBS}; do + echo "=== ${job} ===" + run_job "${job}" + echo "=== done: ${job} ===" +done + + From 669cbd2cf3df96f21cd6dce142eb50639baa2795 Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:15:54 -0700 Subject: [PATCH 04/13] chore: apply pre-commit formatting (EOF/trailing whitespace) --- .github/workflows/ci.yml | 2 - .github/workflows/js.yml | 2 - .github/workflows/validate.yml | 2 - .gitignore | 2 - .pre-commit-config.yaml | 17 +- CHANGELOG.md | 2 - CONTRIBUTING.md | 2 - Makefile | 2 - README.md | 1 - docker-compose.yml | 2 - docs/app.js | 3643 +++++++++++++++++ docs/app.js.map | 7 + docs/goblin-map.png.new | Bin 0 -> 94069 bytes docs/goblin-map.svg.new | 126 + docs/goblin.json | 214 + docs/index.html | 26 + docs/kg.html | 2 - docs/style.css | 25 + docs/ttl-graph.dot | 22 + docs/ttl-graph.png | Bin 0 -> 86427 bytes docs/ttl-graph.svg | 139 + examples/sample_input.md | 2 - examples/sample_score.json | 2 - goblin-agent-lim42.md | 4 +- goblin-ontology.ttl | 1 - goblin_ontology/__init__.py | 2 - goblin_ontology/cli.py | 2 - goblin_ontology/data/goblin-ontology.ttl | 2 - goblin_ontology/data/goblin-shapes.ttl | 2 - goblin_ontology/validator.py | 2 - js/goblin-ontology/assets/goblin-ontology.ttl | 2 - js/goblin-ontology/assets/goblin-shapes.ttl | 2 - js/goblin-ontology/package-lock.json | 437 ++ js/goblin-ontology/package.json | 2 - js/goblin-ontology/src/cli.ts | 2 - js/goblin-ontology/src/index.ts | 2 - js/goblin-ontology/src/shims.d.ts | 2 - js/goblin-ontology/src/validate.ts | 2 - js/goblin-ontology/tsconfig.json | 2 - pyproject.toml | 2 - tools/ci/ghcr_login.sh | 2 - tools/ci/run_act_ghcr.sh | 2 - tools/export_instances_dot.py | 2 - tools/export_web_json.py | 2 - tools/validate_shapes.py | 2 - uv.lock | 160 + web/package-lock.json | 957 +++++ web/package.json | 2 - web/public/index.html | 2 - web/public/style.css | 2 - web/src/main.ts | 2 - web/tsconfig.json | 2 - 52 files changed, 5768 insertions(+), 81 deletions(-) create mode 100644 docs/app.js create mode 100644 docs/app.js.map create mode 100644 docs/goblin-map.png.new create mode 100644 docs/goblin-map.svg.new create mode 100644 docs/goblin.json create mode 100644 docs/index.html create mode 100644 docs/style.css create mode 100644 docs/ttl-graph.dot create mode 100644 docs/ttl-graph.png create mode 100644 docs/ttl-graph.svg create mode 100644 js/goblin-ontology/package-lock.json create mode 100644 uv.lock create mode 100644 web/package-lock.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f8e6946..deafbfc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,5 +77,3 @@ jobs: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 - - diff --git a/.github/workflows/js.yml b/.github/workflows/js.yml index 8443294..4fd6667 100644 --- a/.github/workflows/js.yml +++ b/.github/workflows/js.yml @@ -26,5 +26,3 @@ jobs: run: npm run build - name: Test run: npm test - - diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 5da860a..2a182ec 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -67,5 +67,3 @@ jobs: grep -q "goblin-map.svg" docs/kg.html grep -q "goblin-ontology.ttl" docs/kg.html grep -q "goblin-shapes.ttl" docs/kg.html - - diff --git a/.gitignore b/.gitignore index 5a7a5fa..6551851 100644 --- a/.gitignore +++ b/.gitignore @@ -158,5 +158,3 @@ web/node_modules/ *.egg-info/ *.tar.gz *.zip - - diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 91a7ee4..5d64d42 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,8 @@ repos: name: Python SHACL validation (mirrors validate.yml/python-validate and ci.yml) language: docker_image docker_image: python:3.11-slim - entry: bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib pyshacl graphviz pydot && python tools/validate_shapes.py' + entry: | + bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib pyshacl graphviz pydot && python tools/validate_shapes.py' pass_filenames: false require_serial: true stages: [push] @@ -24,7 +25,8 @@ repos: name: Export DOT/images and web JSON (mirrors ci.yml exporters) language: docker_image docker_image: python:3.11-slim - entry: bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib graphviz pydot && python tools/export_instances_dot.py && python tools/export_web_json.py && git diff --quiet -- docs/ || { echo ":: docs changed, commit generated artifacts"; git status --short docs/; exit 1; }' + entry: | + bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib graphviz pydot && python tools/export_instances_dot.py && python tools/export_web_json.py && git diff --quiet -- docs/ || { echo ":: docs changed, commit generated artifacts"; git status --short docs/; exit 1; }' pass_filenames: false require_serial: true stages: [push] @@ -33,7 +35,8 @@ repos: name: Check goblin-map images up-to-date (mirrors validate.yml/dot-check) language: docker_image docker_image: debian:stable-slim - entry: bash -lc 'set -e; apt-get update && apt-get install -y --no-install-recommends graphviz diffutils && dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new && dot -Tpng goblin-map.dot -o docs/goblin-map.png.new && cmp -s docs/goblin-map.svg docs/goblin-map.svg.new && cmp -s docs/goblin-map.png docs/goblin-map.png.new' + entry: | + bash -lc 'set -e; apt-get update && apt-get install -y --no-install-recommends graphviz diffutils && dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new && dot -Tpng goblin-map.dot -o docs/goblin-map.png.new && cmp -s docs/goblin-map.svg docs/goblin-map.svg.new && cmp -s docs/goblin-map.png docs/goblin-map.png.new' pass_filenames: false require_serial: true stages: [push] @@ -42,7 +45,8 @@ repos: name: JS package typecheck/build/test (mirrors js.yml) language: docker_image docker_image: node:20 - entry: bash -lc 'cd js/goblin-ontology && (npm ci || npm i) && npm run typecheck && npm run build && npm test' + entry: | + bash -lc 'cd js/goblin-ontology && (npm ci || npm i) && npm run typecheck && npm run build && npm test' pass_filenames: false stages: [push] @@ -50,8 +54,7 @@ repos: name: Web build to docs (mirrors ci.yml web build) language: docker_image docker_image: node:20 - entry: bash -lc 'cd web && (npm ci || npm i) && npm run build' + entry: | + bash -lc 'cd web && (npm ci || npm i) && npm run build' pass_filenames: false stages: [push] - - diff --git a/CHANGELOG.md b/CHANGELOG.md index 97fe40c..cff7fef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,5 +21,3 @@ All notable changes to this project will be documented in this file. - Regenerated `docs/goblin-map.svg` and `docs/goblin-map.png` from `goblin-map.dot` to match CI dot-check. ### JS - Corrected `rdf-validate-shacl` dependency to `^0.6.5` and adjusted TS config/imports to pass typecheck and build under Node 20. - - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 906c5f9..449c404 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -32,5 +32,3 @@ The pipeline generates: ## Versioning We tag semantic versions for ontology releases and maintain a `CHANGELOG.md`. - - diff --git a/Makefile b/Makefile index 80d9721..6fb99d5 100644 --- a/Makefile +++ b/Makefile @@ -43,5 +43,3 @@ act-ci-ghcr: # Run a single job with GHCR-backed act, e.g.: make act-job-ghcr JOB=js act-job-ghcr: bash -lc 'tools/ci/ghcr_login.sh && docker pull ghcr.io/nektos/act:latest >/dev/null && docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v "$$PWD":/github/workspace -v "$$HOME/.act":/root/.act -w /github/workspace ghcr.io/nektos/act:latest pull_request -P ubuntu-latest=catthehacker/ubuntu:act-latest -j "$${JOB}"' - - diff --git a/README.md b/README.md index 057339d..295aa3d 100644 --- a/README.md +++ b/README.md @@ -108,4 +108,3 @@ Run all hooks (heavy, uses Docker to ensure parity): pre-commit run --all-files --show-diff-on-failure pre-commit run --all-files --hook-stage push --show-diff-on-failure ``` - diff --git a/docker-compose.yml b/docker-compose.yml index 9f111f4..259005b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -56,5 +56,3 @@ services: command: > bash -lc "(npm ci || npm i) && npm run build" - - diff --git a/docs/app.js b/docs/app.js new file mode 100644 index 0000000..22f0968 --- /dev/null +++ b/docs/app.js @@ -0,0 +1,3643 @@ +// node_modules/d3-dispatch/src/dispatch.js +var noop = { value: () => { +} }; +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || t in _ || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); +} +function Dispatch(_) { + this._ = _; +} +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return { type: t, name }; + }); +} +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, T = parseTypenames(typename + "", _), t, i = -1, n = T.length; + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type2, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type2)) throw new Error("unknown type: " + type2); + for (t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type2, that, args) { + if (!this._.hasOwnProperty(type2)) throw new Error("unknown type: " + type2); + for (var t = this._[type2], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + } +}; +function get(type2, name) { + for (var i = 0, n = type2.length, c2; i < n; ++i) { + if ((c2 = type2[i]).name === name) { + return c2.value; + } + } +} +function set(type2, name, callback) { + for (var i = 0, n = type2.length; i < n; ++i) { + if (type2[i].name === name) { + type2[i] = noop, type2 = type2.slice(0, i).concat(type2.slice(i + 1)); + break; + } + } + if (callback != null) type2.push({ name, value: callback }); + return type2; +} +var dispatch_default = dispatch; + +// node_modules/d3-selection/src/namespaces.js +var xhtml = "http://www.w3.org/1999/xhtml"; +var namespaces_default = { + svg: "http://www.w3.org/2000/svg", + xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +// node_modules/d3-selection/src/namespace.js +function namespace_default(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces_default.hasOwnProperty(prefix) ? { space: namespaces_default[prefix], local: name } : name; +} + +// node_modules/d3-selection/src/creator.js +function creatorInherit(name) { + return function() { + var document2 = this.ownerDocument, uri = this.namespaceURI; + return uri === xhtml && document2.documentElement.namespaceURI === xhtml ? document2.createElement(name) : document2.createElementNS(uri, name); + }; +} +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; +} +function creator_default(name) { + var fullname = namespace_default(name); + return (fullname.local ? creatorFixed : creatorInherit)(fullname); +} + +// node_modules/d3-selection/src/selector.js +function none() { +} +function selector_default(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; +} + +// node_modules/d3-selection/src/selection/select.js +function select_default(select) { + if (typeof select !== "function") select = selector_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/array.js +function array(x2) { + return x2 == null ? [] : Array.isArray(x2) ? x2 : Array.from(x2); +} + +// node_modules/d3-selection/src/selectorAll.js +function empty() { + return []; +} +function selectorAll_default(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} + +// node_modules/d3-selection/src/selection/selectAll.js +function arrayAll(select) { + return function() { + return array(select.apply(this, arguments)); + }; +} +function selectAll_default(select) { + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } + } + return new Selection(subgroups, parents); +} + +// node_modules/d3-selection/src/matcher.js +function matcher_default(selector) { + return function() { + return this.matches(selector); + }; +} +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} + +// node_modules/d3-selection/src/selection/selectChild.js +var find = Array.prototype.find; +function childFind(match) { + return function() { + return find.call(this.children, match); + }; +} +function childFirst() { + return this.firstElementChild; +} +function selectChild_default(match) { + return this.select(match == null ? childFirst : childFind(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/selectChildren.js +var filter = Array.prototype.filter; +function children() { + return Array.from(this.children); +} +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; +} +function selectChildren_default(match) { + return this.selectAll(match == null ? children : childrenFilter(typeof match === "function" ? match : childMatcher(match))); +} + +// node_modules/d3-selection/src/selection/filter.js +function filter_default(match) { + if (typeof match !== "function") match = matcher_default(match); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Selection(subgroups, this._parents); +} + +// node_modules/d3-selection/src/selection/sparse.js +function sparse_default(update) { + return new Array(update.length); +} + +// node_modules/d3-selection/src/selection/enter.js +function enter_default() { + return new Selection(this._enter || this._groups.map(sparse_default), this._parents); +} +function EnterNode(parent, datum2) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum2; +} +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { + return this._parent.insertBefore(child, this._next); + }, + insertBefore: function(child, next) { + return this._parent.insertBefore(child, next); + }, + querySelector: function(selector) { + return this._parent.querySelector(selector); + }, + querySelectorAll: function(selector) { + return this._parent.querySelectorAll(selector); + } +}; + +// node_modules/d3-selection/src/constant.js +function constant_default(x2) { + return function() { + return x2; + }; +} + +// node_modules/d3-selection/src/selection/data.js +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, node, groupLength = group.length, dataLength = data.length; + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } +} +function bindKey(parent, group, enter, update, exit, data, key) { + var i, node, nodeByKeyValue = /* @__PURE__ */ new Map(), groupLength = group.length, dataLength = data.length, keyValues = new Array(groupLength), keyValue; + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && nodeByKeyValue.get(keyValues[i]) === node) { + exit[i] = node; + } + } +} +function datum(node) { + return node.__data__; +} +function data_default(value, key) { + if (!arguments.length) return Array.from(this, datum); + var bind = key ? bindKey : bindIndex, parents = this._parents, groups = this._groups; + if (typeof value !== "function") value = constant_default(value); + for (var m2 = groups.length, update = new Array(m2), enter = new Array(m2), exit = new Array(m2), j = 0; j < m2; ++j) { + var parent = parents[j], group = groups[j], groupLength = group.length, data = arraylike(value.call(parent, parent && parent.__data__, j, parents)), dataLength = data.length, enterGroup = enter[j] = new Array(dataLength), updateGroup = update[j] = new Array(dataLength), exitGroup = exit[j] = new Array(groupLength); + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength) ; + previous._next = next || null; + } + } + } + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} +function arraylike(data) { + return typeof data === "object" && "length" in data ? data : Array.from(data); +} + +// node_modules/d3-selection/src/selection/exit.js +function exit_default() { + return new Selection(this._exit || this._groups.map(sparse_default), this._parents); +} + +// node_modules/d3-selection/src/selection/join.js +function join_default(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + if (typeof onenter === "function") { + enter = onenter(enter); + if (enter) enter = enter.selection(); + } else { + enter = enter.append(onenter + ""); + } + if (onupdate != null) { + update = onupdate(update); + if (update) update = update.selection(); + } + if (onexit == null) exit.remove(); + else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} + +// node_modules/d3-selection/src/selection/merge.js +function merge_default(context) { + var selection2 = context.selection ? context.selection() : context; + for (var groups0 = this._groups, groups1 = selection2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Selection(merges, this._parents); +} + +// node_modules/d3-selection/src/selection/order.js +function order_default() { + for (var groups = this._groups, j = -1, m2 = groups.length; ++j < m2; ) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0; ) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } + } + return this; +} + +// node_modules/d3-selection/src/selection/sort.js +function sort_default(compare) { + if (!compare) compare = ascending; + function compareNode(a2, b) { + return a2 && b ? compare(a2.__data__, b.__data__) : !a2 - !b; + } + for (var groups = this._groups, m2 = groups.length, sortgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } + return new Selection(sortgroups, this._parents).order(); +} +function ascending(a2, b) { + return a2 < b ? -1 : a2 > b ? 1 : a2 >= b ? 0 : NaN; +} + +// node_modules/d3-selection/src/selection/call.js +function call_default() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; +} + +// node_modules/d3-selection/src/selection/nodes.js +function nodes_default() { + return Array.from(this); +} + +// node_modules/d3-selection/src/selection/node.js +function node_default() { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + return null; +} + +// node_modules/d3-selection/src/selection/size.js +function size_default() { + let size = 0; + for (const node of this) ++size; + return size; +} + +// node_modules/d3-selection/src/selection/empty.js +function empty_default() { + return !this.node(); +} + +// node_modules/d3-selection/src/selection/each.js +function each_default(callback) { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } + } + return this; +} + +// node_modules/d3-selection/src/selection/attr.js +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} +function attr_default(name, value) { + var fullname = namespace_default(name); + if (arguments.length < 2) { + var node = this.node(); + return fullname.local ? node.getAttributeNS(fullname.space, fullname.local) : node.getAttribute(fullname); + } + return this.each((value == null ? fullname.local ? attrRemoveNS : attrRemove : typeof value === "function" ? fullname.local ? attrFunctionNS : attrFunction : fullname.local ? attrConstantNS : attrConstant)(fullname, value)); +} + +// node_modules/d3-selection/src/window.js +function window_default(node) { + return node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView; +} + +// node_modules/d3-selection/src/selection/style.js +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} +function style_default(name, value, priority) { + return arguments.length > 1 ? this.each((value == null ? styleRemove : typeof value === "function" ? styleFunction : styleConstant)(name, value, priority == null ? "" : priority)) : styleValue(this.node(), name); +} +function styleValue(node, name) { + return node.style.getPropertyValue(name) || window_default(node).getComputedStyle(node, null).getPropertyValue(name); +} + +// node_modules/d3-selection/src/selection/property.js +function propertyRemove(name) { + return function() { + delete this[name]; + }; +} +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; +} +function propertyFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} +function property_default(name, value) { + return arguments.length > 1 ? this.each((value == null ? propertyRemove : typeof value === "function" ? propertyFunction : propertyConstant)(name, value)) : this.node()[name]; +} + +// node_modules/d3-selection/src/selection/classed.js +function classArray(string) { + return string.trim().split(/^|\s+/); +} +function classList(node) { + return node.classList || new ClassList(node); +} +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); +} +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} +function classedFalse(names) { + return function() { + classedRemove(this, names); + }; +} +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} +function classed_default(name, value) { + var names = classArray(name + ""); + if (arguments.length < 2) { + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; + } + return this.each((typeof value === "function" ? classedFunction : value ? classedTrue : classedFalse)(names, value)); +} + +// node_modules/d3-selection/src/selection/text.js +function textRemove() { + this.textContent = ""; +} +function textConstant(value) { + return function() { + this.textContent = value; + }; +} +function textFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; + }; +} +function text_default(value) { + return arguments.length ? this.each(value == null ? textRemove : (typeof value === "function" ? textFunction : textConstant)(value)) : this.node().textContent; +} + +// node_modules/d3-selection/src/selection/html.js +function htmlRemove() { + this.innerHTML = ""; +} +function htmlConstant(value) { + return function() { + this.innerHTML = value; + }; +} +function htmlFunction(value) { + return function() { + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; + }; +} +function html_default(value) { + return arguments.length ? this.each(value == null ? htmlRemove : (typeof value === "function" ? htmlFunction : htmlConstant)(value)) : this.node().innerHTML; +} + +// node_modules/d3-selection/src/selection/raise.js +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); +} +function raise_default() { + return this.each(raise); +} + +// node_modules/d3-selection/src/selection/lower.js +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); +} +function lower_default() { + return this.each(lower); +} + +// node_modules/d3-selection/src/selection/append.js +function append_default(name) { + var create2 = typeof name === "function" ? name : creator_default(name); + return this.select(function() { + return this.appendChild(create2.apply(this, arguments)); + }); +} + +// node_modules/d3-selection/src/selection/insert.js +function constantNull() { + return null; +} +function insert_default(name, before) { + var create2 = typeof name === "function" ? name : creator_default(name), select = before == null ? constantNull : typeof before === "function" ? before : selector_default(before); + return this.select(function() { + return this.insertBefore(create2.apply(this, arguments), select.apply(this, arguments) || null); + }); +} + +// node_modules/d3-selection/src/selection/remove.js +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} +function remove_default() { + return this.each(remove); +} + +// node_modules/d3-selection/src/selection/clone.js +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; +} +function clone_default(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} + +// node_modules/d3-selection/src/selection/datum.js +function datum_default(value) { + return arguments.length ? this.property("__data__", value) : this.node().__data__; +} + +// node_modules/d3-selection/src/selection/on.js +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); + }; +} +function parseTypenames2(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return { type: t, name }; + }); +} +function onRemove(typename) { + return function() { + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m2 = on.length, o; j < m2; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; + }; +} +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) for (var j = 0, m2 = on.length; j < m2; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = { type: typename.type, name: typename.name, value, listener, options }; + if (!on) this.__on = [o]; + else on.push(o); + }; +} +function on_default(typename, value, options) { + var typenames = parseTypenames2(typename + ""), i, n = typenames.length, t; + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m2 = on.length, o; j < m2; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } + } + } + return; + } + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; +} + +// node_modules/d3-selection/src/selection/dispatch.js +function dispatchEvent(node, type2, params) { + var window2 = window_default(node), event = window2.CustomEvent; + if (typeof event === "function") { + event = new event(type2, params); + } else { + event = window2.document.createEvent("Event"); + if (params) event.initEvent(type2, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type2, false, false); + } + node.dispatchEvent(event); +} +function dispatchConstant(type2, params) { + return function() { + return dispatchEvent(this, type2, params); + }; +} +function dispatchFunction(type2, params) { + return function() { + return dispatchEvent(this, type2, params.apply(this, arguments)); + }; +} +function dispatch_default2(type2, params) { + return this.each((typeof params === "function" ? dispatchFunction : dispatchConstant)(type2, params)); +} + +// node_modules/d3-selection/src/selection/iterator.js +function* iterator_default() { + for (var groups = this._groups, j = 0, m2 = groups.length; j < m2; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; + } + } +} + +// node_modules/d3-selection/src/selection/index.js +var root = [null]; +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; +} +function selection() { + return new Selection([[document.documentElement]], root); +} +function selection_selection() { + return this; +} +Selection.prototype = selection.prototype = { + constructor: Selection, + select: select_default, + selectAll: selectAll_default, + selectChild: selectChild_default, + selectChildren: selectChildren_default, + filter: filter_default, + data: data_default, + enter: enter_default, + exit: exit_default, + join: join_default, + merge: merge_default, + selection: selection_selection, + order: order_default, + sort: sort_default, + call: call_default, + nodes: nodes_default, + node: node_default, + size: size_default, + empty: empty_default, + each: each_default, + attr: attr_default, + style: style_default, + property: property_default, + classed: classed_default, + text: text_default, + html: html_default, + raise: raise_default, + lower: lower_default, + append: append_default, + insert: insert_default, + remove: remove_default, + clone: clone_default, + datum: datum_default, + on: on_default, + dispatch: dispatch_default2, + [Symbol.iterator]: iterator_default +}; +var selection_default = selection; + +// node_modules/d3-selection/src/select.js +function select_default2(selector) { + return typeof selector === "string" ? new Selection([[document.querySelector(selector)]], [document.documentElement]) : new Selection([[selector]], root); +} + +// node_modules/d3-selection/src/sourceEvent.js +function sourceEvent_default(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; +} + +// node_modules/d3-selection/src/pointer.js +function pointer_default(event, node) { + event = sourceEvent_default(event); + if (node === void 0) node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } + } + return [event.pageX, event.pageY]; +} + +// node_modules/d3-drag/src/noevent.js +var nonpassive = { passive: false }; +var nonpassivecapture = { capture: true, passive: false }; +function nopropagation(event) { + event.stopImmediatePropagation(); +} +function noevent_default(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-drag/src/nodrag.js +function nodrag_default(view) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", noevent_default, nonpassivecapture); + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", noevent_default, nonpassivecapture); + } else { + root2.__noselect = root2.style.MozUserSelect; + root2.style.MozUserSelect = "none"; + } +} +function yesdrag(view, noclick) { + var root2 = view.document.documentElement, selection2 = select_default2(view).on("dragstart.drag", null); + if (noclick) { + selection2.on("click.drag", noevent_default, nonpassivecapture); + setTimeout(function() { + selection2.on("click.drag", null); + }, 0); + } + if ("onselectstart" in root2) { + selection2.on("selectstart.drag", null); + } else { + root2.style.MozUserSelect = root2.__noselect; + delete root2.__noselect; + } +} + +// node_modules/d3-drag/src/constant.js +var constant_default2 = (x2) => () => x2; + +// node_modules/d3-drag/src/event.js +function DragEvent(type2, { + sourceEvent, + subject, + target, + identifier, + active, + x: x2, + y: y2, + dx, + dy, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type2, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + subject: { value: subject, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + identifier: { value: identifier, enumerable: true, configurable: true }, + active: { value: active, enumerable: true, configurable: true }, + x: { value: x2, enumerable: true, configurable: true }, + y: { value: y2, enumerable: true, configurable: true }, + dx: { value: dx, enumerable: true, configurable: true }, + dy: { value: dy, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; + +// node_modules/d3-drag/src/drag.js +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} +function defaultContainer() { + return this.parentNode; +} +function defaultSubject(event, d) { + return d == null ? { x: event.x, y: event.y } : d; +} +function defaultTouchable() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function drag_default() { + var filter2 = defaultFilter, container = defaultContainer, subject = defaultSubject, touchable = defaultTouchable, gestures = {}, listeners = dispatch_default("start", "drag", "end"), active = 0, mousedownx, mousedowny, mousemoving, touchending, clickDistance2 = 0; + function drag(selection2) { + selection2.on("mousedown.drag", mousedowned).filter(touchable).on("touchstart.drag", touchstarted).on("touchmove.drag", touchmoved, nonpassive).on("touchend.drag touchcancel.drag", touchended).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + function mousedowned(event, d) { + if (touchending || !filter2.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + select_default2(event.view).on("mousemove.drag", mousemoved, nonpassivecapture).on("mouseup.drag", mouseupped, nonpassivecapture); + nodrag_default(event.view); + nopropagation(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + function mousemoved(event) { + noevent_default(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; + } + gestures.mouse("drag", event); + } + function mouseupped(event) { + select_default2(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent_default(event); + gestures.mouse("end", event); + } + function touchstarted(event, d) { + if (!filter2.call(this, event, d)) return; + var touches = event.changedTouches, c2 = container.call(this, event, d), n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c2, event, d, touches[i].identifier, touches[i])) { + nopropagation(event); + gesture("start", event, touches[i]); + } + } + } + function touchmoved(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent_default(event); + gesture("drag", event, touches[i]); + } + } + } + function touchended(event) { + var touches = event.changedTouches, n = touches.length, i, gesture; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, 500); + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(event); + gesture("end", event, touches[i]); + } + } + } + function beforestart(that, container2, event, d, identifier, touch) { + var dispatch2 = listeners.copy(), p = pointer_default(touch || event, container2), dx, dy, s; + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch: dispatch2 + }), d)) == null) return; + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + return function gesture(type2, event2, touch2) { + var p0 = p, n; + switch (type2) { + case "start": + gestures[identifier] = gesture, n = active++; + break; + case "end": + delete gestures[identifier], --active; + // falls through + case "drag": + p = pointer_default(touch2 || event2, container2), n = active; + break; + } + dispatch2.call( + type2, + that, + new DragEvent(type2, { + sourceEvent: event2, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch: dispatch2 + }), + d + ); + }; + } + drag.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default2(!!_), drag) : filter2; + }; + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant_default2(_), drag) : container; + }; + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant_default2(_), drag) : subject; + }; + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default2(!!_), drag) : touchable; + }; + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + return drag; +} + +// node_modules/d3-color/src/define.js +function define_default(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; +} +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; +} + +// node_modules/d3-color/src/color.js +function Color() { +} +var darker = 0.7; +var brighter = 1 / darker; +var reI = "\\s*([+-]?\\d+)\\s*"; +var reN = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*"; +var reP = "\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*"; +var reHex = /^#([0-9a-f]{3,8})$/; +var reRgbInteger = new RegExp(`^rgb\\(${reI},${reI},${reI}\\)$`); +var reRgbPercent = new RegExp(`^rgb\\(${reP},${reP},${reP}\\)$`); +var reRgbaInteger = new RegExp(`^rgba\\(${reI},${reI},${reI},${reN}\\)$`); +var reRgbaPercent = new RegExp(`^rgba\\(${reP},${reP},${reP},${reN}\\)$`); +var reHslPercent = new RegExp(`^hsl\\(${reN},${reP},${reP}\\)$`); +var reHslaPercent = new RegExp(`^hsla\\(${reN},${reP},${reP},${reN}\\)$`); +var named = { + aliceblue: 15792383, + antiquewhite: 16444375, + aqua: 65535, + aquamarine: 8388564, + azure: 15794175, + beige: 16119260, + bisque: 16770244, + black: 0, + blanchedalmond: 16772045, + blue: 255, + blueviolet: 9055202, + brown: 10824234, + burlywood: 14596231, + cadetblue: 6266528, + chartreuse: 8388352, + chocolate: 13789470, + coral: 16744272, + cornflowerblue: 6591981, + cornsilk: 16775388, + crimson: 14423100, + cyan: 65535, + darkblue: 139, + darkcyan: 35723, + darkgoldenrod: 12092939, + darkgray: 11119017, + darkgreen: 25600, + darkgrey: 11119017, + darkkhaki: 12433259, + darkmagenta: 9109643, + darkolivegreen: 5597999, + darkorange: 16747520, + darkorchid: 10040012, + darkred: 9109504, + darksalmon: 15308410, + darkseagreen: 9419919, + darkslateblue: 4734347, + darkslategray: 3100495, + darkslategrey: 3100495, + darkturquoise: 52945, + darkviolet: 9699539, + deeppink: 16716947, + deepskyblue: 49151, + dimgray: 6908265, + dimgrey: 6908265, + dodgerblue: 2003199, + firebrick: 11674146, + floralwhite: 16775920, + forestgreen: 2263842, + fuchsia: 16711935, + gainsboro: 14474460, + ghostwhite: 16316671, + gold: 16766720, + goldenrod: 14329120, + gray: 8421504, + green: 32768, + greenyellow: 11403055, + grey: 8421504, + honeydew: 15794160, + hotpink: 16738740, + indianred: 13458524, + indigo: 4915330, + ivory: 16777200, + khaki: 15787660, + lavender: 15132410, + lavenderblush: 16773365, + lawngreen: 8190976, + lemonchiffon: 16775885, + lightblue: 11393254, + lightcoral: 15761536, + lightcyan: 14745599, + lightgoldenrodyellow: 16448210, + lightgray: 13882323, + lightgreen: 9498256, + lightgrey: 13882323, + lightpink: 16758465, + lightsalmon: 16752762, + lightseagreen: 2142890, + lightskyblue: 8900346, + lightslategray: 7833753, + lightslategrey: 7833753, + lightsteelblue: 11584734, + lightyellow: 16777184, + lime: 65280, + limegreen: 3329330, + linen: 16445670, + magenta: 16711935, + maroon: 8388608, + mediumaquamarine: 6737322, + mediumblue: 205, + mediumorchid: 12211667, + mediumpurple: 9662683, + mediumseagreen: 3978097, + mediumslateblue: 8087790, + mediumspringgreen: 64154, + mediumturquoise: 4772300, + mediumvioletred: 13047173, + midnightblue: 1644912, + mintcream: 16121850, + mistyrose: 16770273, + moccasin: 16770229, + navajowhite: 16768685, + navy: 128, + oldlace: 16643558, + olive: 8421376, + olivedrab: 7048739, + orange: 16753920, + orangered: 16729344, + orchid: 14315734, + palegoldenrod: 15657130, + palegreen: 10025880, + paleturquoise: 11529966, + palevioletred: 14381203, + papayawhip: 16773077, + peachpuff: 16767673, + peru: 13468991, + pink: 16761035, + plum: 14524637, + powderblue: 11591910, + purple: 8388736, + rebeccapurple: 6697881, + red: 16711680, + rosybrown: 12357519, + royalblue: 4286945, + saddlebrown: 9127187, + salmon: 16416882, + sandybrown: 16032864, + seagreen: 3050327, + seashell: 16774638, + sienna: 10506797, + silver: 12632256, + skyblue: 8900331, + slateblue: 6970061, + slategray: 7372944, + slategrey: 7372944, + snow: 16775930, + springgreen: 65407, + steelblue: 4620980, + tan: 13808780, + teal: 32896, + thistle: 14204888, + tomato: 16737095, + turquoise: 4251856, + violet: 15631086, + wheat: 16113331, + white: 16777215, + whitesmoke: 16119285, + yellow: 16776960, + yellowgreen: 10145074 +}; +define_default(Color, color, { + copy(channels) { + return Object.assign(new this.constructor(), this, channels); + }, + displayable() { + return this.rgb().displayable(); + }, + hex: color_formatHex, + // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHex8: color_formatHex8, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); +function color_formatHex() { + return this.rgb().formatHex(); +} +function color_formatHex8() { + return this.rgb().formatHex8(); +} +function color_formatHsl() { + return hslConvert(this).formatHsl(); +} +function color_formatRgb() { + return this.rgb().formatRgb(); +} +function color(format) { + var m2, l; + format = (format + "").trim().toLowerCase(); + return (m2 = reHex.exec(format)) ? (l = m2[1].length, m2 = parseInt(m2[1], 16), l === 6 ? rgbn(m2) : l === 3 ? new Rgb(m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, (m2 & 15) << 4 | m2 & 15, 1) : l === 8 ? rgba(m2 >> 24 & 255, m2 >> 16 & 255, m2 >> 8 & 255, (m2 & 255) / 255) : l === 4 ? rgba(m2 >> 12 & 15 | m2 >> 8 & 240, m2 >> 8 & 15 | m2 >> 4 & 240, m2 >> 4 & 15 | m2 & 240, ((m2 & 15) << 4 | m2 & 15) / 255) : null) : (m2 = reRgbInteger.exec(format)) ? new Rgb(m2[1], m2[2], m2[3], 1) : (m2 = reRgbPercent.exec(format)) ? new Rgb(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, 1) : (m2 = reRgbaInteger.exec(format)) ? rgba(m2[1], m2[2], m2[3], m2[4]) : (m2 = reRgbaPercent.exec(format)) ? rgba(m2[1] * 255 / 100, m2[2] * 255 / 100, m2[3] * 255 / 100, m2[4]) : (m2 = reHslPercent.exec(format)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, 1) : (m2 = reHslaPercent.exec(format)) ? hsla(m2[1], m2[2] / 100, m2[3] / 100, m2[4]) : named.hasOwnProperty(format) ? rgbn(named[format]) : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) : null; +} +function rgbn(n) { + return new Rgb(n >> 16 & 255, n >> 8 & 255, n & 255, 1); +} +function rgba(r, g, b, a2) { + if (a2 <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a2); +} +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb(); + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); +} +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +} +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; +} +define_default(Rgb, rgb, extend(Color, { + brighter(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb() { + return this; + }, + clamp() { + return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); + }, + displayable() { + return -0.5 <= this.r && this.r < 255.5 && (-0.5 <= this.g && this.g < 255.5) && (-0.5 <= this.b && this.b < 255.5) && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, + // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatHex8: rgb_formatHex8, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); +function rgb_formatHex() { + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`; +} +function rgb_formatHex8() { + return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`; +} +function rgb_formatRgb() { + const a2 = clampa(this.opacity); + return `${a2 === 1 ? "rgb(" : "rgba("}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a2 === 1 ? ")" : `, ${a2})`}`; +} +function clampa(opacity) { + return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); +} +function clampi(value) { + return Math.max(0, Math.min(255, Math.round(value) || 0)); +} +function hex(value) { + value = clampi(value); + return (value < 16 ? "0" : "") + value.toString(16); +} +function hsla(h, s, l, a2) { + if (a2 <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a2); +} +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl(); + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, g = o.g / 255, b = o.b / 255, min2 = Math.min(r, g, b), max2 = Math.max(r, g, b), h = NaN, s = max2 - min2, l = (max2 + min2) / 2; + if (s) { + if (r === max2) h = (g - b) / s + (g < b) * 6; + else if (g === max2) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max2 + min2 : 2 - max2 - min2; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} +define_default(Hsl, hsl, extend(Color, { + brighter(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb() { + var h = this.h % 360 + (this.h < 0) * 360, s = isNaN(h) || isNaN(this.s) ? 0 : this.s, l = this.l, m2 = l + (l < 0.5 ? l : 1 - l) * s, m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + clamp() { + return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); + }, + displayable() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && (0 <= this.l && this.l <= 1) && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl() { + const a2 = clampa(this.opacity); + return `${a2 === 1 ? "hsl(" : "hsla("}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a2 === 1 ? ")" : `, ${a2})`}`; + } +})); +function clamph(value) { + value = (value || 0) % 360; + return value < 0 ? value + 360 : value; +} +function clampt(value) { + return Math.max(0, Math.min(1, value || 0)); +} +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 : h < 180 ? m2 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 : m1) * 255; +} + +// node_modules/d3-interpolate/src/basis.js +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + (4 - 6 * t2 + 3 * t3) * v1 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + t3 * v3) / 6; +} +function basis_default(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? t = 0 : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), v1 = values[i], v2 = values[i + 1], v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/basisClosed.js +function basisClosed_default(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), v0 = values[(i + n - 1) % n], v1 = values[i % n], v2 = values[(i + 1) % n], v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); + }; +} + +// node_modules/d3-interpolate/src/constant.js +var constant_default3 = (x2) => () => x2; + +// node_modules/d3-interpolate/src/color.js +function linear(a2, d) { + return function(t) { + return a2 + t * d; + }; +} +function exponential(a2, b, y2) { + return a2 = Math.pow(a2, y2), b = Math.pow(b, y2) - a2, y2 = 1 / y2, function(t) { + return Math.pow(a2 + t * b, y2); + }; +} +function gamma(y2) { + return (y2 = +y2) === 1 ? nogamma : function(a2, b) { + return b - a2 ? exponential(a2, b, y2) : constant_default3(isNaN(a2) ? b : a2); + }; +} +function nogamma(a2, b) { + var d = b - a2; + return d ? linear(a2, d) : constant_default3(isNaN(a2) ? b : a2); +} + +// node_modules/d3-interpolate/src/rgb.js +var rgb_default = function rgbGamma(y2) { + var color2 = gamma(y2); + function rgb2(start2, end) { + var r = color2((start2 = rgb(start2)).r, (end = rgb(end)).r), g = color2(start2.g, end.g), b = color2(start2.b, end.b), opacity = nogamma(start2.opacity, end.opacity); + return function(t) { + start2.r = r(t); + start2.g = g(t); + start2.b = b(t); + start2.opacity = opacity(t); + return start2 + ""; + }; + } + rgb2.gamma = rgbGamma; + return rgb2; +}(1); +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, r = new Array(n), g = new Array(n), b = new Array(n), i, color2; + for (i = 0; i < n; ++i) { + color2 = rgb(colors[i]); + r[i] = color2.r || 0; + g[i] = color2.g || 0; + b[i] = color2.b || 0; + } + r = spline(r); + g = spline(g); + b = spline(b); + color2.opacity = 1; + return function(t) { + color2.r = r(t); + color2.g = g(t); + color2.b = b(t); + return color2 + ""; + }; + }; +} +var rgbBasis = rgbSpline(basis_default); +var rgbBasisClosed = rgbSpline(basisClosed_default); + +// node_modules/d3-interpolate/src/number.js +function number_default(a2, b) { + return a2 = +a2, b = +b, function(t) { + return a2 * (1 - t) + b * t; + }; +} + +// node_modules/d3-interpolate/src/string.js +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; +var reB = new RegExp(reA.source, "g"); +function zero(b) { + return function() { + return b; + }; +} +function one(b) { + return function(t) { + return b(t) + ""; + }; +} +function string_default(a2, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = []; + a2 = a2 + "", b = b + ""; + while ((am = reA.exec(a2)) && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { + if (s[i]) s[i] += bm; + else s[++i] = bm; + } else { + s[++i] = null; + q.push({ i, x: number_default(am, bm) }); + } + bi = reB.lastIndex; + } + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; + else s[++i] = bs; + } + return s.length < 2 ? q[0] ? one(q[0].x) : zero(b) : (b = q.length, function(t) { + for (var i2 = 0, o; i2 < b; ++i2) s[(o = q[i2]).i] = o.x(t); + return s.join(""); + }); +} + +// node_modules/d3-interpolate/src/transform/decompose.js +var degrees = 180 / Math.PI; +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; +function decompose_default(a2, b, c2, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a2 * a2 + b * b)) a2 /= scaleX, b /= scaleX; + if (skewX = a2 * c2 + b * d) c2 -= a2 * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c2 * c2 + d * d)) c2 /= scaleY, d /= scaleY, skewX /= scaleY; + if (a2 * d < b * c2) a2 = -a2, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a2) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX, + scaleY + }; +} + +// node_modules/d3-interpolate/src/transform/parse.js +var svgNode; +function parseCss(value) { + const m2 = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m2.isIdentity ? identity : decompose_default(m2.a, m2.b, m2.c, m2.d, m2.e, m2.f); +} +function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose_default(value.a, value.b, value.c, value.d, value.e, value.f); +} + +// node_modules/d3-interpolate/src/transform/index.js +function interpolateTransform(parse, pxComma, pxParen, degParen) { + function pop(s) { + return s.length ? s.pop() + " " : ""; + } + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); + } + } + function rotate(a2, b, s, q) { + if (a2 !== b) { + if (a2 - b > 180) b += 360; + else if (b - a2 > 180) a2 += 360; + q.push({ i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number_default(a2, b) }); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); + } + } + function skewX(a2, b, s, q) { + if (a2 !== b) { + q.push({ i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number_default(a2, b) }); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({ i: i - 4, x: number_default(xa, xb) }, { i: i - 2, x: number_default(ya, yb) }); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } + return function(a2, b) { + var s = [], q = []; + a2 = parse(a2), b = parse(b); + translate(a2.translateX, a2.translateY, b.translateX, b.translateY, s, q); + rotate(a2.rotate, b.rotate, s, q); + skewX(a2.skewX, b.skewX, s, q); + scale(a2.scaleX, a2.scaleY, b.scaleX, b.scaleY, s, q); + a2 = b = null; + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; + }; +} +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + +// node_modules/d3-interpolate/src/zoom.js +var epsilon2 = 1e-12; +function cosh(x2) { + return ((x2 = Math.exp(x2)) + 1 / x2) / 2; +} +function sinh(x2) { + return ((x2 = Math.exp(x2)) - 1 / x2) / 2; +} +function tanh(x2) { + return ((x2 = Math.exp(2 * x2)) - 1) / (x2 + 1); +} +var zoom_default = function zoomRho(rho, rho2, rho4) { + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S; + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } else { + var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, coshr0 = cosh(r0), u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } + i.duration = S * 1e3 * rho / Math.SQRT2; + return i; + } + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; + return zoom; +}(Math.SQRT2, 2, 4); + +// node_modules/d3-timer/src/timer.js +var frame = 0; +var timeout = 0; +var interval = 0; +var pokeDelay = 1e3; +var taskHead; +var taskTail; +var clockLast = 0; +var clockNow = 0; +var clockSkew = 0; +var clock = typeof performance === "object" && performance.now ? performance : Date; +var setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { + setTimeout(f, 17); +}; +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} +function clearNow() { + clockNow = 0; +} +function Timer() { + this._call = this._time = this._next = null; +} +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; + } + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); + } + } +}; +function timer(callback, delay, time) { + var t = new Timer(); + t.restart(callback, delay, time); + return t; +} +function timerFlush() { + now(); + ++frame; + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(void 0, e); + t = t._next; + } + --frame; +} +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; + } +} +function poke() { + var now2 = clock.now(), delay = now2 - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now2; +} +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } + } + taskTail = t0; + sleep(time); +} +function sleep(time) { + if (frame) return; + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} + +// node_modules/d3-timer/src/timeout.js +function timeout_default(callback, delay, time) { + var t = new Timer(); + delay = delay == null ? 0 : +delay; + t.restart((elapsed) => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} + +// node_modules/d3-transition/src/transition/schedule.js +var emptyOn = dispatch_default("start", "end", "cancel", "interrupt"); +var emptyTween = []; +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; +function schedule_default(node, name, id2, index2, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id2 in schedules) return; + create(node, id2, { + name, + index: index2, + // For context during callback. + group, + // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} +function init(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} +function set2(node, id2) { + var schedule = get2(node, id2); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} +function get2(node, id2) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id2])) throw new Error("transition not found"); + return schedule; +} +function create(node, id2, self) { + var schedules = node.__transition, tween; + schedules[id2] = self; + self.timer = timer(schedule, 0, self.time); + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start2, self.delay, self.time); + if (self.delay <= elapsed) start2(elapsed - self.delay); + } + function start2(elapsed) { + var i, j, n, o; + if (self.state !== SCHEDULED) return stop(); + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; + if (o.state === STARTED) return timeout_default(start2); + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } else if (+i < id2) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } + timeout_default(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; + self.state = STARTED; + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } + } + tween.length = j + 1; + } + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), i = -1, n = tween.length; + while (++i < n) { + tween[i].call(node, t); + } + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id2]; + for (var i in schedules) return; + delete node.__transition; + } +} + +// node_modules/d3-transition/src/interrupt.js +function interrupt_default(node, name) { + var schedules = node.__transition, schedule, active, empty2 = true, i; + if (!schedules) return; + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { + empty2 = false; + continue; + } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } + if (empty2) delete node.__transition; +} + +// node_modules/d3-transition/src/selection/interrupt.js +function interrupt_default2(name) { + return this.each(function() { + interrupt_default(this, name); + }); +} + +// node_modules/d3-transition/src/transition/tween.js +function tweenRemove(id2, name) { + var tween0, tween1; + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; + } + } + } + schedule.tween = tween1; + }; +} +function tweenFunction(id2, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error(); + return function() { + var schedule = set2(this, id2), tween = schedule.tween; + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = { name, value }, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } + schedule.tween = tween1; + }; +} +function tween_default(name, value) { + var id2 = this._id; + name += ""; + if (arguments.length < 2) { + var tween = get2(this.node(), id2).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } + } + return null; + } + return this.each((value == null ? tweenRemove : tweenFunction)(id2, name, value)); +} +function tweenValue(transition2, name, value) { + var id2 = transition2._id; + transition2.each(function() { + var schedule = set2(this, id2); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); + return function(node) { + return get2(node, id2).value[name]; + }; +} + +// node_modules/d3-transition/src/transition/interpolate.js +function interpolate_default(a2, b) { + var c2; + return (typeof b === "number" ? number_default : b instanceof color ? rgb_default : (c2 = color(b)) ? (b = c2, rgb_default) : string_default)(a2, b); +} + +// node_modules/d3-transition/src/transition/attr.js +function attrRemove2(name) { + return function() { + this.removeAttribute(name); + }; +} +function attrRemoveNS2(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} +function attrConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrConstantNS2(fullname, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function attrFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attrFunctionNS2(fullname, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function attr_default2(name, value) { + var fullname = namespace_default(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate_default; + return this.attrTween(name, typeof value === "function" ? (fullname.local ? attrFunctionNS2 : attrFunction2)(fullname, i, tweenValue(this, "attr." + name, value)) : value == null ? (fullname.local ? attrRemoveNS2 : attrRemove2)(fullname) : (fullname.local ? attrConstantNS2 : attrConstant2)(fullname, i, value)); +} + +// node_modules/d3-transition/src/transition/attrTween.js +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; +} +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} +function attrTween_default(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + var fullname = namespace_default(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} + +// node_modules/d3-transition/src/transition/delay.js +function delayFunction(id2, value) { + return function() { + init(this, id2).delay = +value.apply(this, arguments); + }; +} +function delayConstant(id2, value) { + return value = +value, function() { + init(this, id2).delay = value; + }; +} +function delay_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? delayFunction : delayConstant)(id2, value)) : get2(this.node(), id2).delay; +} + +// node_modules/d3-transition/src/transition/duration.js +function durationFunction(id2, value) { + return function() { + set2(this, id2).duration = +value.apply(this, arguments); + }; +} +function durationConstant(id2, value) { + return value = +value, function() { + set2(this, id2).duration = value; + }; +} +function duration_default(value) { + var id2 = this._id; + return arguments.length ? this.each((typeof value === "function" ? durationFunction : durationConstant)(id2, value)) : get2(this.node(), id2).duration; +} + +// node_modules/d3-transition/src/transition/ease.js +function easeConstant(id2, value) { + if (typeof value !== "function") throw new Error(); + return function() { + set2(this, id2).ease = value; + }; +} +function ease_default(value) { + var id2 = this._id; + return arguments.length ? this.each(easeConstant(id2, value)) : get2(this.node(), id2).ease; +} + +// node_modules/d3-transition/src/transition/easeVarying.js +function easeVarying(id2, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error(); + set2(this, id2).ease = v; + }; +} +function easeVarying_default(value) { + if (typeof value !== "function") throw new Error(); + return this.each(easeVarying(this._id, value)); +} + +// node_modules/d3-transition/src/transition/filter.js +function filter_default2(match) { + if (typeof match !== "function") match = matcher_default(match); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + return new Transition(subgroups, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/merge.js +function merge_default2(transition2) { + if (transition2._id !== this._id) throw new Error(); + for (var groups0 = this._groups, groups1 = transition2._groups, m0 = groups0.length, m1 = groups1.length, m2 = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m2; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } + } + for (; j < m0; ++j) { + merges[j] = groups0[j]; + } + return new Transition(merges, this._parents, this._name, this._id); +} + +// node_modules/d3-transition/src/transition/on.js +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} +function onFunction(id2, name, listener) { + var on0, on1, sit = start(name) ? init : set2; + return function() { + var schedule = sit(this, id2), on = schedule.on; + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + schedule.on = on1; + }; +} +function on_default2(name, listener) { + var id2 = this._id; + return arguments.length < 2 ? get2(this.node(), id2).on.on(name) : this.each(onFunction(id2, name, listener)); +} + +// node_modules/d3-transition/src/transition/remove.js +function removeFunction(id2) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id2) return; + if (parent) parent.removeChild(this); + }; +} +function remove_default2() { + return this.on("end.remove", removeFunction(this._id)); +} + +// node_modules/d3-transition/src/transition/select.js +function select_default3(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") select = selector_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = new Array(m2), j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule_default(subgroup[i], name, id2, i, subgroup, get2(node, id2)); + } + } + } + return new Transition(subgroups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selectAll.js +function selectAll_default2(select) { + var name = this._name, id2 = this._id; + if (typeof select !== "function") select = selectorAll_default(select); + for (var groups = this._groups, m2 = groups.length, subgroups = [], parents = [], j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children2 = select.call(node, node.__data__, i, group), child, inherit2 = get2(node, id2), k = 0, l = children2.length; k < l; ++k) { + if (child = children2[k]) { + schedule_default(child, name, id2, k, children2, inherit2); + } + } + subgroups.push(children2); + parents.push(node); + } + } + } + return new Transition(subgroups, parents, name, id2); +} + +// node_modules/d3-transition/src/transition/selection.js +var Selection2 = selection_default.prototype.constructor; +function selection_default2() { + return new Selection2(this._groups, this._parents); +} + +// node_modules/d3-transition/src/transition/style.js +function styleNull(name, interpolate) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), string1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} +function styleRemove2(name) { + return function() { + this.style.removeProperty(name); + }; +} +function styleConstant2(name, interpolate, value1) { + var string00, string1 = value1 + "", interpolate0; + return function() { + var string0 = styleValue(this, name); + return string0 === string1 ? null : string0 === string00 ? interpolate0 : interpolate0 = interpolate(string00 = string0, value1); + }; +} +function styleFunction2(name, interpolate, value) { + var string00, string10, interpolate0; + return function() { + var string0 = styleValue(this, name), value1 = value(this), string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name)); + return string0 === string1 ? null : string0 === string00 && string1 === string10 ? interpolate0 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} +function styleMaybeRemove(id2, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove2; + return function() { + var schedule = set2(this, id2), on = schedule.on, listener = schedule.value[key] == null ? remove2 || (remove2 = styleRemove2(name)) : void 0; + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + schedule.on = on1; + }; +} +function style_default2(name, value, priority) { + var i = (name += "") === "transform" ? interpolateTransformCss : interpolate_default; + return value == null ? this.styleTween(name, styleNull(name, i)).on("end.style." + name, styleRemove2(name)) : typeof value === "function" ? this.styleTween(name, styleFunction2(name, i, tweenValue(this, "style." + name, value))).each(styleMaybeRemove(this._id, name)) : this.styleTween(name, styleConstant2(name, i, value), priority).on("end.style." + name, null); +} + +// node_modules/d3-transition/src/transition/styleTween.js +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} +function styleTween_default(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +// node_modules/d3-transition/src/transition/text.js +function textConstant2(value) { + return function() { + this.textContent = value; + }; +} +function textFunction2(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} +function text_default2(value) { + return this.tween("text", typeof value === "function" ? textFunction2(tweenValue(this, "text", value)) : textConstant2(value == null ? "" : value + "")); +} + +// node_modules/d3-transition/src/transition/textTween.js +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; + } + tween._value = value; + return tween; +} +function textTween_default(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error(); + return this.tween(key, textTween(value)); +} + +// node_modules/d3-transition/src/transition/transition.js +function transition_default() { + var name = this._name, id0 = this._id, id1 = newId(); + for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit2 = get2(node, id0); + schedule_default(node, name, id1, i, group, { + time: inherit2.time + inherit2.delay + inherit2.duration, + delay: 0, + duration: inherit2.duration, + ease: inherit2.ease + }); + } + } + } + return new Transition(groups, this._parents, name, id1); +} + +// node_modules/d3-transition/src/transition/end.js +function end_default() { + var on0, on1, that = this, id2 = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = { value: reject }, end = { value: function() { + if (--size === 0) resolve(); + } }; + that.each(function() { + var schedule = set2(this, id2), on = schedule.on; + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); + } + schedule.on = on1; + }); + if (size === 0) resolve(); + }); +} + +// node_modules/d3-transition/src/transition/index.js +var id = 0; +function Transition(groups, parents, name, id2) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id2; +} +function transition(name) { + return selection_default().transition(name); +} +function newId() { + return ++id; +} +var selection_prototype = selection_default.prototype; +Transition.prototype = transition.prototype = { + constructor: Transition, + select: select_default3, + selectAll: selectAll_default2, + selectChild: selection_prototype.selectChild, + selectChildren: selection_prototype.selectChildren, + filter: filter_default2, + merge: merge_default2, + selection: selection_default2, + transition: transition_default, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: on_default2, + attr: attr_default2, + attrTween: attrTween_default, + style: style_default2, + styleTween: styleTween_default, + text: text_default2, + textTween: textTween_default, + remove: remove_default2, + tween: tween_default, + delay: delay_default, + duration: duration_default, + ease: ease_default, + easeVarying: easeVarying_default, + end: end_default, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +// node_modules/d3-ease/src/cubic.js +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +} + +// node_modules/d3-transition/src/selection/transition.js +var defaultTiming = { + time: null, + // Set on use. + delay: 0, + duration: 250, + ease: cubicInOut +}; +function inherit(node, id2) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id2])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id2} not found`); + } + } + return timing; +} +function transition_default2(name) { + var id2, timing; + if (name instanceof Transition) { + id2 = name._id, name = name._name; + } else { + id2 = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + ""; + } + for (var groups = this._groups, m2 = groups.length, j = 0; j < m2; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule_default(node, name, id2, i, group, timing || inherit(node, id2)); + } + } + } + return new Transition(groups, this._parents, name, id2); +} + +// node_modules/d3-transition/src/selection/index.js +selection_default.prototype.interrupt = interrupt_default2; +selection_default.prototype.transition = transition_default2; + +// node_modules/d3-brush/src/brush.js +var { abs, max, min } = Math; +function number1(e) { + return [+e[0], +e[1]]; +} +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x2, e) { + return x2 == null ? null : [[+x2[0], e[0][1]], [+x2[1], e[1][1]]]; + }, + output: function(xy) { + return xy && [xy[0][0], xy[1][0]]; + } +}; +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y2, e) { + return y2 == null ? null : [[e[0][0], +y2[0]], [e[1][0], +y2[1]]]; + }, + output: function(xy) { + return xy && [xy[0][1], xy[1][1]]; + } +}; +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { + return xy == null ? null : number2(xy); + }, + output: function(xy) { + return xy; + } +}; +function type(t) { + return { type: t }; +} + +// node_modules/d3-force/src/center.js +function center_default(x2, y2) { + var nodes, strength = 1; + if (x2 == null) x2 = 0; + if (y2 == null) y2 = 0; + function force() { + var i, n = nodes.length, node, sx = 0, sy = 0; + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + for (sx = (sx / n - x2) * strength, sy = (sy / n - y2) * strength, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } + } + force.initialize = function(_) { + nodes = _; + }; + force.x = function(_) { + return arguments.length ? (x2 = +_, force) : x2; + }; + force.y = function(_) { + return arguments.length ? (y2 = +_, force) : y2; + }; + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + return force; +} + +// node_modules/d3-quadtree/src/add.js +function add_default(d) { + const x2 = +this._x.call(null, d), y2 = +this._y.call(null, d); + return add(this.cover(x2, y2), x2, y2, d); +} +function add(tree, x2, y2, d) { + if (isNaN(x2) || isNaN(y2)) return tree; + var parent, node = tree._root, leaf = { data: d }, x0 = tree._x0, y0 = tree._y0, x1 = tree._x1, y1 = tree._y1, xm, ym, xp, yp, right, bottom, i, j; + if (!node) return tree._root = leaf, tree; + while (node.length) { + if (right = x2 >= (xm = (x0 + x1) / 2)) x0 = xm; + else x1 = xm; + if (bottom = y2 >= (ym = (y0 + y1) / 2)) y0 = ym; + else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; + } + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x2 === xp && y2 === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x2 >= (xm = (x0 + x1) / 2)) x0 = xm; + else x1 = xm; + if (bottom = y2 >= (ym = (y0 + y1) / 2)) y0 = ym; + else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | xp >= xm)); + return parent[j] = node, parent[i] = leaf, tree; +} +function addAll(data) { + var d, i, n = data.length, x2, y2, xz = new Array(n), yz = new Array(n), x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity; + for (i = 0; i < n; ++i) { + if (isNaN(x2 = +this._x.call(null, d = data[i])) || isNaN(y2 = +this._y.call(null, d))) continue; + xz[i] = x2; + yz[i] = y2; + if (x2 < x0) x0 = x2; + if (x2 > x1) x1 = x2; + if (y2 < y0) y0 = y2; + if (y2 > y1) y1 = y2; + } + if (x0 > x1 || y0 > y1) return this; + this.cover(x0, y0).cover(x1, y1); + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } + return this; +} + +// node_modules/d3-quadtree/src/cover.js +function cover_default(x2, y2) { + if (isNaN(x2 = +x2) || isNaN(y2 = +y2)) return this; + var x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1; + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x2)) + 1; + y1 = (y0 = Math.floor(y2)) + 1; + } else { + var z = x1 - x0 || 1, node = this._root, parent, i; + while (x0 > x2 || x2 >= x1 || y0 > y2 || y2 >= y1) { + i = (y2 < y0) << 1 | x2 < x0; + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: + x1 = x0 + z, y1 = y0 + z; + break; + case 1: + x0 = x1 - z, y1 = y0 + z; + break; + case 2: + x1 = x0 + z, y0 = y1 - z; + break; + case 3: + x0 = x1 - z, y0 = y1 - z; + break; + } + } + if (this._root && this._root.length) this._root = node; + } + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} + +// node_modules/d3-quadtree/src/data.js +function data_default2() { + var data = []; + this.visit(function(node) { + if (!node.length) do + data.push(node.data); + while (node = node.next); + }); + return data; +} + +// node_modules/d3-quadtree/src/extent.js +function extent_default(_) { + return arguments.length ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) : isNaN(this._x0) ? void 0 : [[this._x0, this._y0], [this._x1, this._y1]]; +} + +// node_modules/d3-quadtree/src/quad.js +function quad_default(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; +} + +// node_modules/d3-quadtree/src/find.js +function find_default(x2, y2, radius) { + var data, x0 = this._x0, y0 = this._y0, x1, y1, x22, y22, x3 = this._x1, y3 = this._y1, quads = [], node = this._root, q, i; + if (node) quads.push(new quad_default(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x2 - radius, y0 = y2 - radius; + x3 = x2 + radius, y3 = y2 + radius; + radius *= radius; + } + while (q = quads.pop()) { + if (!(node = q.node) || (x1 = q.x0) > x3 || (y1 = q.y0) > y3 || (x22 = q.x1) < x0 || (y22 = q.y1) < y0) continue; + if (node.length) { + var xm = (x1 + x22) / 2, ym = (y1 + y22) / 2; + quads.push( + new quad_default(node[3], xm, ym, x22, y22), + new quad_default(node[2], x1, ym, xm, y22), + new quad_default(node[1], xm, y1, x22, ym), + new quad_default(node[0], x1, y1, xm, ym) + ); + if (i = (y2 >= ym) << 1 | x2 >= xm) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } else { + var dx = x2 - +this._x.call(null, node.data), dy = y2 - +this._y.call(null, node.data), d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x2 - d, y0 = y2 - d; + x3 = x2 + d, y3 = y2 + d; + data = node.data; + } + } + } + return data; +} + +// node_modules/d3-quadtree/src/remove.js +function remove_default3(d) { + if (isNaN(x2 = +this._x.call(null, d)) || isNaN(y2 = +this._y.call(null, d))) return this; + var parent, node = this._root, retainer, previous, next, x0 = this._x0, y0 = this._y0, x1 = this._x1, y1 = this._y1, x2, y2, xm, ym, right, bottom, i, j; + if (!node) return this; + if (node.length) while (true) { + if (right = x2 >= (xm = (x0 + x1) / 2)) x0 = xm; + else x1 = xm; + if (bottom = y2 >= (ym = (y0 + y1) / 2)) y0 = ym; + else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[i + 1 & 3] || parent[i + 2 & 3] || parent[i + 3 & 3]) retainer = parent, j = i; + } + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; + if (previous) return next ? previous.next = next : delete previous.next, this; + if (!parent) return this._root = next, this; + next ? parent[i] = next : delete parent[i]; + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) && node === (parent[3] || parent[2] || parent[1] || parent[0]) && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; + } + return this; +} +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; +} + +// node_modules/d3-quadtree/src/root.js +function root_default() { + return this._root; +} + +// node_modules/d3-quadtree/src/size.js +function size_default2() { + var size = 0; + this.visit(function(node) { + if (!node.length) do + ++size; + while (node = node.next); + }); + return size; +} + +// node_modules/d3-quadtree/src/visit.js +function visit_default(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new quad_default(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new quad_default(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new quad_default(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new quad_default(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new quad_default(child, x0, y0, xm, ym)); + } + } + return this; +} + +// node_modules/d3-quadtree/src/visitAfter.js +function visitAfter_default(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new quad_default(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new quad_default(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new quad_default(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new quad_default(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new quad_default(child, xm, ym, x1, y1)); + } + next.push(q); + } + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); + } + return this; +} + +// node_modules/d3-quadtree/src/x.js +function defaultX(d) { + return d[0]; +} +function x_default(_) { + return arguments.length ? (this._x = _, this) : this._x; +} + +// node_modules/d3-quadtree/src/y.js +function defaultY(d) { + return d[1]; +} +function y_default(_) { + return arguments.length ? (this._y = _, this) : this._y; +} + +// node_modules/d3-quadtree/src/quadtree.js +function quadtree(nodes, x2, y2) { + var tree = new Quadtree(x2 == null ? defaultX : x2, y2 == null ? defaultY : y2, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); +} +function Quadtree(x2, y2, x0, y0, x1, y1) { + this._x = x2; + this._y = y2; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = void 0; +} +function leaf_copy(leaf) { + var copy = { data: leaf.data }, next = copy; + while (leaf = leaf.next) next = next.next = { data: leaf.data }; + return copy; +} +var treeProto = quadtree.prototype = Quadtree.prototype; +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), node = this._root, nodes, child; + if (!node) return copy; + if (!node.length) return copy._root = leaf_copy(node), copy; + nodes = [{ source: node, target: copy._root = new Array(4) }]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({ source: child, target: node.target[i] = new Array(4) }); + else node.target[i] = leaf_copy(child); + } + } + } + return copy; +}; +treeProto.add = add_default; +treeProto.addAll = addAll; +treeProto.cover = cover_default; +treeProto.data = data_default2; +treeProto.extent = extent_default; +treeProto.find = find_default; +treeProto.remove = remove_default3; +treeProto.removeAll = removeAll; +treeProto.root = root_default; +treeProto.size = size_default2; +treeProto.visit = visit_default; +treeProto.visitAfter = visitAfter_default; +treeProto.x = x_default; +treeProto.y = y_default; + +// node_modules/d3-force/src/constant.js +function constant_default5(x2) { + return function() { + return x2; + }; +} + +// node_modules/d3-force/src/jiggle.js +function jiggle_default(random) { + return (random() - 0.5) * 1e-6; +} + +// node_modules/d3-force/src/link.js +function index(d) { + return d.index; +} +function find2(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("node not found: " + nodeId); + return node; +} +function link_default(links) { + var id2 = index, strength = defaultStrength, strengths, distance = constant_default5(30), distances, nodes, count, bias, random, iterations = 1; + if (links == null) links = []; + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x2, y2, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x2 = target.x + target.vx - source.x - source.vx || jiggle_default(random); + y2 = target.y + target.vy - source.y - source.vy || jiggle_default(random); + l = Math.sqrt(x2 * x2 + y2 * y2); + l = (l - distances[i]) / l * alpha * strengths[i]; + x2 *= l, y2 *= l; + target.vx -= x2 * (b = bias[i]); + target.vy -= y2 * b; + source.vx += x2 * (b = 1 - b); + source.vy += y2 * b; + } + } + } + function initialize() { + if (!nodes) return; + var i, n = nodes.length, m2 = links.length, nodeById = new Map(nodes.map((d, i2) => [id2(d, i2, nodes), d])), link; + for (i = 0, count = new Array(n); i < m2; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find2(nodeById, link.source); + if (typeof link.target !== "object") link.target = find2(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; + } + for (i = 0, bias = new Array(m2); i < m2; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } + strengths = new Array(m2), initializeStrength(); + distances = new Array(m2), initializeDistance(); + } + function initializeStrength() { + if (!nodes) return; + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } + function initializeDistance() { + if (!nodes) return; + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); + } + } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; + force.id = function(_) { + return arguments.length ? (id2 = _, force) : id2; + }; + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initializeStrength(), force) : strength; + }; + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant_default5(+_), initializeDistance(), force) : distance; + }; + return force; +} + +// node_modules/d3-force/src/lcg.js +var a = 1664525; +var c = 1013904223; +var m = 4294967296; +function lcg_default() { + let s = 1; + return () => (s = (a * s + c) % m) / m; +} + +// node_modules/d3-force/src/simulation.js +function x(d) { + return d.x; +} +function y(d) { + return d.y; +} +var initialRadius = 10; +var initialAngle = Math.PI * (3 - Math.sqrt(5)); +function simulation_default(nodes) { + var simulation, alpha = 1, alphaMin = 1e-3, alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), alphaTarget = 0, velocityDecay = 0.6, forces = /* @__PURE__ */ new Map(), stepper = timer(step), event = dispatch_default("tick", "end"), random = lcg_default(); + if (nodes == null) nodes = []; + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } + function tick(iterations) { + var i, n = nodes.length, node; + if (iterations === void 0) iterations = 1; + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; + forces.forEach(function(force) { + force(alpha); + }); + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } + return simulation; + } + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } + } + } + function initializeForce(force) { + if (force.initialize) force.initialize(nodes, random); + return force; + } + initializeNodes(); + return simulation = { + tick, + restart: function() { + return stepper.restart(step), simulation; + }, + stop: function() { + return stepper.stop(), simulation; + }, + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; + }, + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + force: function(name, _) { + return arguments.length > 1 ? (_ == null ? forces.delete(name) : forces.set(name, initializeForce(_)), simulation) : forces.get(name); + }, + find: function(x2, y2, radius) { + var i = 0, n = nodes.length, dx, dy, d2, node, closest; + if (radius == null) radius = Infinity; + else radius *= radius; + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x2 - node.x; + dy = y2 - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + return closest; + }, + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +// node_modules/d3-force/src/manyBody.js +function manyBody_default() { + var nodes, node, random, alpha, strength = constant_default5(-30), strengths, distanceMin2 = 1, distanceMax2 = Infinity, theta2 = 0.81; + function force(_) { + var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); + } + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node2; + strengths = new Array(n); + for (i = 0; i < n; ++i) node2 = nodes[i], strengths[node2.index] = +strength(node2, i, nodes); + } + function accumulate(quad) { + var strength2 = 0, q, c2, weight = 0, x2, y2, i; + if (quad.length) { + for (x2 = y2 = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c2 = Math.abs(q.value))) { + strength2 += q.value, weight += c2, x2 += c2 * q.x, y2 += c2 * q.y; + } + } + quad.x = x2 / weight; + quad.y = y2 / weight; + } else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do + strength2 += strengths[q.data.index]; + while (q = q.next); + } + quad.value = strength2; + } + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + var x3 = quad.x - node.x, y2 = quad.y - node.y, w = x2 - x1, l = x3 * x3 + y2 * y2; + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x3 === 0) x3 = jiggle_default(random), l += x3 * x3; + if (y2 === 0) y2 = jiggle_default(random), l += y2 * y2; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x3 * quad.value * alpha / l; + node.vy += y2 * quad.value * alpha / l; + } + return true; + } else if (quad.length || l >= distanceMax2) return; + if (quad.data !== node || quad.next) { + if (x3 === 0) x3 = jiggle_default(random), l += x3 * x3; + if (y2 === 0) y2 = jiggle_default(random), l += y2 * y2; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } + do + if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x3 * w; + node.vy += y2 * w; + } + while (quad = quad.next); + } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant_default5(+_), initialize(), force) : strength; + }; + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; + return force; +} + +// node_modules/d3-zoom/src/constant.js +var constant_default6 = (x2) => () => x2; + +// node_modules/d3-zoom/src/event.js +function ZoomEvent(type2, { + sourceEvent, + target, + transform: transform2, + dispatch: dispatch2 +}) { + Object.defineProperties(this, { + type: { value: type2, enumerable: true, configurable: true }, + sourceEvent: { value: sourceEvent, enumerable: true, configurable: true }, + target: { value: target, enumerable: true, configurable: true }, + transform: { value: transform2, enumerable: true, configurable: true }, + _: { value: dispatch2 } + }); +} + +// node_modules/d3-zoom/src/transform.js +function Transform(k, x2, y2) { + this.k = k; + this.x = x2; + this.y = y2; +} +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x2, y2) { + return x2 === 0 & y2 === 0 ? this : new Transform(this.k, this.x + this.k * x2, this.y + this.k * y2); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x2) { + return x2 * this.k + this.x; + }, + applyY: function(y2) { + return y2 * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x2) { + return (x2 - this.x) / this.k; + }, + invertY: function(y2) { + return (y2 - this.y) / this.k; + }, + rescaleX: function(x2) { + return x2.copy().domain(x2.range().map(this.invertX, this).map(x2.invert, x2)); + }, + rescaleY: function(y2) { + return y2.copy().domain(y2.range().map(this.invertY, this).map(y2.invert, y2)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } +}; +var identity2 = new Transform(1, 0, 0); +transform.prototype = Transform.prototype; +function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity2; + return node.__zoom; +} + +// node_modules/d3-zoom/src/noevent.js +function nopropagation3(event) { + event.stopImmediatePropagation(); +} +function noevent_default3(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// node_modules/d3-zoom/src/zoom.js +function defaultFilter2(event) { + return (!event.ctrlKey || event.type === "wheel") && !event.button; +} +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} +function defaultTransform() { + return this.__zoom || identity2; +} +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 2e-3) * (event.ctrlKey ? 10 : 1); +} +function defaultTouchable2() { + return navigator.maxTouchPoints || "ontouchstart" in this; +} +function defaultConstrain(transform2, extent, translateExtent) { + var dx0 = transform2.invertX(extent[0][0]) - translateExtent[0][0], dx1 = transform2.invertX(extent[1][0]) - translateExtent[1][0], dy0 = transform2.invertY(extent[0][1]) - translateExtent[0][1], dy1 = transform2.invertY(extent[1][1]) - translateExtent[1][1]; + return transform2.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} +function zoom_default2() { + var filter2 = defaultFilter2, extent = defaultExtent, constrain = defaultConstrain, wheelDelta = defaultWheelDelta, touchable = defaultTouchable2, scaleExtent = [0, Infinity], translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], duration = 250, interpolate = zoom_default, listeners = dispatch_default("start", "zoom", "end"), touchstarting, touchfirst, touchending, touchDelay = 500, wheelDelay = 150, clickDistance2 = 0, tapDistance = 10; + function zoom(selection2) { + selection2.property("__zoom", defaultTransform).on("wheel.zoom", wheeled, { passive: false }).on("mousedown.zoom", mousedowned).on("dblclick.zoom", dblclicked).filter(touchable).on("touchstart.zoom", touchstarted).on("touchmove.zoom", touchmoved).on("touchend.zoom touchcancel.zoom", touchended).style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + zoom.transform = function(collection, transform2, point, event) { + var selection2 = collection.selection ? collection.selection() : collection; + selection2.property("__zoom", defaultTransform); + if (collection !== selection2) { + schedule(collection, transform2, point, event); + } else { + selection2.interrupt().each(function() { + gesture(this, arguments).event(event).start().zoom(null, typeof transform2 === "function" ? transform2.apply(this, arguments) : transform2).end(); + }); + } + }; + zoom.scaleBy = function(selection2, k, p, event) { + zoom.scaleTo(selection2, function() { + var k0 = this.__zoom.k, k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + zoom.scaleTo = function(selection2, k, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t0 = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, p1 = t0.invert(p0), k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + zoom.translateBy = function(selection2, x2, y2, event) { + zoom.transform(selection2, function() { + return constrain(this.__zoom.translate( + typeof x2 === "function" ? x2.apply(this, arguments) : x2, + typeof y2 === "function" ? y2.apply(this, arguments) : y2 + ), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + zoom.translateTo = function(selection2, x2, y2, p, event) { + zoom.transform(selection2, function() { + var e = extent.apply(this, arguments), t = this.__zoom, p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity2.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x2 === "function" ? -x2.apply(this, arguments) : -x2, + typeof y2 === "function" ? -y2.apply(this, arguments) : -y2 + ), e, translateExtent); + }, p, event); + }; + function scale(transform2, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform2.k ? transform2 : new Transform(k, transform2.x, transform2.y); + } + function translate(transform2, p0, p1) { + var x2 = p0[0] - p1[0] * transform2.k, y2 = p0[1] - p1[1] * transform2.k; + return x2 === transform2.x && y2 === transform2.y ? transform2 : new Transform(transform2.k, x2, y2); + } + function centroid(extent2) { + return [(+extent2[0][0] + +extent2[1][0]) / 2, (+extent2[0][1] + +extent2[1][1]) / 2]; + } + function schedule(transition2, transform2, point, event) { + transition2.on("start.zoom", function() { + gesture(this, arguments).event(event).start(); + }).on("interrupt.zoom end.zoom", function() { + gesture(this, arguments).event(event).end(); + }).tween("zoom", function() { + var that = this, args = arguments, g = gesture(that, args).event(event), e = extent.apply(that, args), p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), a2 = that.__zoom, b = typeof transform2 === "function" ? transform2.apply(that, args) : transform2, i = interpolate(a2.invert(p).concat(w / a2.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; + else { + var l = i(t), k = w / l[2]; + t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); + } + g.zoom(null, t); + }; + }); + } + function gesture(that, args, clean) { + return !clean && that.__zooming || new Gesture(that, args); + } + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform2) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform2.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform2.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform2.invert(this.touch1[0]); + this.that.__zoom = transform2; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type2) { + var d = select_default2(this.that).datum(); + listeners.call( + type2, + this.that, + new ZoomEvent(type2, { + sourceEvent: this.sourceEvent, + target: zoom, + type: type2, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + function wheeled(event, ...args) { + if (!filter2.apply(this, arguments)) return; + var g = gesture(this, args).event(event), t = this.__zoom, k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), p = pointer_default(event); + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } else if (t.k === k) return; + else { + g.mouse = [p, t.invert(p)]; + interrupt_default(this); + g.start(); + } + noevent_default3(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + function wheelidled() { + g.wheel = null; + g.end(); + } + } + function mousedowned(event, ...args) { + if (touchending || !filter2.apply(this, arguments)) return; + var currentTarget = event.currentTarget, g = gesture(this, args, true).event(event), v = select_default2(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), p = pointer_default(event, currentTarget), x0 = event.clientX, y0 = event.clientY; + nodrag_default(event.view); + nopropagation3(event); + g.mouse = [p, this.__zoom.invert(p)]; + interrupt_default(this); + g.start(); + function mousemoved(event2) { + noevent_default3(event2); + if (!g.moved) { + var dx = event2.clientX - x0, dy = event2.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event2).zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = pointer_default(event2, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + function mouseupped(event2) { + v.on("mousemove.zoom mouseup.zoom", null); + yesdrag(event2.view, g.moved); + noevent_default3(event2); + g.event(event2).end(); + } + } + function dblclicked(event, ...args) { + if (!filter2.apply(this, arguments)) return; + var t0 = this.__zoom, p0 = pointer_default(event.changedTouches ? event.changedTouches[0] : event, this), p1 = t0.invert(p0), k1 = t0.k * (event.shiftKey ? 0.5 : 2), t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + noevent_default3(event); + if (duration > 0) select_default2(this).transition().duration(duration).call(schedule, t1, p0, event); + else select_default2(this).call(zoom.transform, t1, p0, event); + } + function touchstarted(event, ...args) { + if (!filter2.apply(this, arguments)) return; + var touches = event.touches, n = touches.length, g = gesture(this, args, event.changedTouches.length === n).event(event), started, i, t, p; + nopropagation3(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + if (touchstarting) touchstarting = clearTimeout(touchstarting); + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { + touchstarting = null; + }, touchDelay); + interrupt_default(this); + g.start(); + } + } + function touchmoved(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t, p, l; + noevent_default3(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = pointer_default(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], p1 = g.touch1[0], l1 = g.touch1[1], dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } + function touchended(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), touches = event.changedTouches, n = touches.length, i, t; + nopropagation3(event); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { + touchending = null; + }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + if (g.taps === 2) { + t = pointer_default(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = select_default2(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + } + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant_default6(+_), zoom) : wheelDelta; + }; + zoom.filter = function(_) { + return arguments.length ? (filter2 = typeof _ === "function" ? _ : constant_default6(!!_), zoom) : filter2; + }; + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant_default6(!!_), zoom) : touchable; + }; + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant_default6([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + return zoom; +} + +// src/main.ts +function scoreColor(score) { + if (score == null || isNaN(score)) return "#d3d3d3"; + const s = Math.min(1, Math.max(0, score)); + let r = 0, g = 0; + if (s < 0.5) { + r = Math.floor(2 * s * 255); + g = 255; + } else { + r = 255; + g = Math.floor((1 - 2 * (s - 0.5)) * 255); + } + return `rgb(${r},${g},0)`; +} +async function loadData() { + const res = await fetch("goblin.json", { cache: "no-store" }); + return await res.json(); +} +function renderGraph(container, nodes, edges) { + const width = container.clientWidth || 960; + const height = container.clientHeight || 600; + const svg = select_default2(container).append("svg").attr("width", width).attr("height", height); + const zoomLayer = svg.append("g"); + const link = zoomLayer.append("g").attr("stroke", "#999").attr("stroke-opacity", 0.6).selectAll("line").data(edges).join("line").attr("stroke-dasharray", (d) => d.type === "overlapsWith" ? "4,3" : d.type === "dependsOn" ? "2,3" : "0"); + const node = zoomLayer.append("g").selectAll("g").data(nodes).join("g").call( + drag_default().on("start", (event, d) => { + if (!event.active) simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + }).on("drag", (event, d) => { + d.fx = event.x; + d.fy = event.y; + }).on("end", (event, d) => { + if (!event.active) simulation.alphaTarget(0); + d.fx = null; + d.fy = null; + }) + ); + node.append("rect").attr("rx", 8).attr("ry", 8).attr("x", -60).attr("y", -16).attr("width", 120).attr("height", 32).attr("fill", (d) => scoreColor(d.score)).attr("stroke", "#333"); + node.append("text").attr("text-anchor", "middle").attr("dominant-baseline", "middle").attr("font-family", "Helvetica, Arial, sans-serif").attr("font-size", 11).text((d) => d.label); + const idToNode = {}; + nodes.forEach((n) => { + idToNode[n.id] = n; + }); + const simulation = simulation_default(nodes).force("link", link_default(edges).id((d) => d.id).distance(120)).force("charge", manyBody_default().strength(-180)).force("center", center_default(width / 2, height / 2)).on("tick", () => { + link.attr("x1", (d) => idToNode[d.source].x).attr("y1", (d) => idToNode[d.source].y).attr("x2", (d) => idToNode[d.target].x).attr("y2", (d) => idToNode[d.target].y); + node.attr("transform", (d) => `translate(${d.x},${d.y})`); + }); + svg.call(zoom_default2().scaleExtent([0.3, 3]).on("zoom", (event) => zoomLayer.attr("transform", event.transform))); +} +async function main() { + const app = document.getElementById("app"); + app.innerHTML = "
Loading goblin graph\u2026
"; + try { + const { nodes, edges } = await loadData(); + app.innerHTML = ""; + renderGraph(app, nodes, edges); + } catch (e) { + app.innerHTML = "
Failed to load goblin.json
"; + console.error(e); + } +} +main(); +//# sourceMappingURL=app.js.map diff --git a/docs/app.js.map b/docs/app.js.map new file mode 100644 index 0000000..bec8891 --- /dev/null +++ b/docs/app.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../web/node_modules/d3-dispatch/src/dispatch.js", "../web/node_modules/d3-selection/src/namespaces.js", "../web/node_modules/d3-selection/src/namespace.js", "../web/node_modules/d3-selection/src/creator.js", "../web/node_modules/d3-selection/src/selector.js", "../web/node_modules/d3-selection/src/selection/select.js", "../web/node_modules/d3-selection/src/array.js", "../web/node_modules/d3-selection/src/selectorAll.js", "../web/node_modules/d3-selection/src/selection/selectAll.js", "../web/node_modules/d3-selection/src/matcher.js", "../web/node_modules/d3-selection/src/selection/selectChild.js", "../web/node_modules/d3-selection/src/selection/selectChildren.js", "../web/node_modules/d3-selection/src/selection/filter.js", "../web/node_modules/d3-selection/src/selection/sparse.js", "../web/node_modules/d3-selection/src/selection/enter.js", "../web/node_modules/d3-selection/src/constant.js", "../web/node_modules/d3-selection/src/selection/data.js", "../web/node_modules/d3-selection/src/selection/exit.js", "../web/node_modules/d3-selection/src/selection/join.js", "../web/node_modules/d3-selection/src/selection/merge.js", "../web/node_modules/d3-selection/src/selection/order.js", "../web/node_modules/d3-selection/src/selection/sort.js", "../web/node_modules/d3-selection/src/selection/call.js", "../web/node_modules/d3-selection/src/selection/nodes.js", "../web/node_modules/d3-selection/src/selection/node.js", "../web/node_modules/d3-selection/src/selection/size.js", "../web/node_modules/d3-selection/src/selection/empty.js", "../web/node_modules/d3-selection/src/selection/each.js", "../web/node_modules/d3-selection/src/selection/attr.js", "../web/node_modules/d3-selection/src/window.js", "../web/node_modules/d3-selection/src/selection/style.js", "../web/node_modules/d3-selection/src/selection/property.js", "../web/node_modules/d3-selection/src/selection/classed.js", "../web/node_modules/d3-selection/src/selection/text.js", "../web/node_modules/d3-selection/src/selection/html.js", "../web/node_modules/d3-selection/src/selection/raise.js", "../web/node_modules/d3-selection/src/selection/lower.js", "../web/node_modules/d3-selection/src/selection/append.js", "../web/node_modules/d3-selection/src/selection/insert.js", "../web/node_modules/d3-selection/src/selection/remove.js", "../web/node_modules/d3-selection/src/selection/clone.js", "../web/node_modules/d3-selection/src/selection/datum.js", "../web/node_modules/d3-selection/src/selection/on.js", "../web/node_modules/d3-selection/src/selection/dispatch.js", "../web/node_modules/d3-selection/src/selection/iterator.js", "../web/node_modules/d3-selection/src/selection/index.js", "../web/node_modules/d3-selection/src/select.js", "../web/node_modules/d3-selection/src/sourceEvent.js", "../web/node_modules/d3-selection/src/pointer.js", "../web/node_modules/d3-drag/src/noevent.js", "../web/node_modules/d3-drag/src/nodrag.js", "../web/node_modules/d3-drag/src/constant.js", "../web/node_modules/d3-drag/src/event.js", "../web/node_modules/d3-drag/src/drag.js", "../web/node_modules/d3-color/src/define.js", "../web/node_modules/d3-color/src/color.js", "../web/node_modules/d3-interpolate/src/basis.js", "../web/node_modules/d3-interpolate/src/basisClosed.js", "../web/node_modules/d3-interpolate/src/constant.js", "../web/node_modules/d3-interpolate/src/color.js", "../web/node_modules/d3-interpolate/src/rgb.js", "../web/node_modules/d3-interpolate/src/number.js", "../web/node_modules/d3-interpolate/src/string.js", "../web/node_modules/d3-interpolate/src/transform/decompose.js", "../web/node_modules/d3-interpolate/src/transform/parse.js", "../web/node_modules/d3-interpolate/src/transform/index.js", "../web/node_modules/d3-interpolate/src/zoom.js", "../web/node_modules/d3-timer/src/timer.js", "../web/node_modules/d3-timer/src/timeout.js", "../web/node_modules/d3-transition/src/transition/schedule.js", "../web/node_modules/d3-transition/src/interrupt.js", "../web/node_modules/d3-transition/src/selection/interrupt.js", "../web/node_modules/d3-transition/src/transition/tween.js", "../web/node_modules/d3-transition/src/transition/interpolate.js", "../web/node_modules/d3-transition/src/transition/attr.js", "../web/node_modules/d3-transition/src/transition/attrTween.js", "../web/node_modules/d3-transition/src/transition/delay.js", "../web/node_modules/d3-transition/src/transition/duration.js", "../web/node_modules/d3-transition/src/transition/ease.js", "../web/node_modules/d3-transition/src/transition/easeVarying.js", "../web/node_modules/d3-transition/src/transition/filter.js", "../web/node_modules/d3-transition/src/transition/merge.js", "../web/node_modules/d3-transition/src/transition/on.js", "../web/node_modules/d3-transition/src/transition/remove.js", "../web/node_modules/d3-transition/src/transition/select.js", "../web/node_modules/d3-transition/src/transition/selectAll.js", "../web/node_modules/d3-transition/src/transition/selection.js", "../web/node_modules/d3-transition/src/transition/style.js", "../web/node_modules/d3-transition/src/transition/styleTween.js", "../web/node_modules/d3-transition/src/transition/text.js", "../web/node_modules/d3-transition/src/transition/textTween.js", "../web/node_modules/d3-transition/src/transition/transition.js", "../web/node_modules/d3-transition/src/transition/end.js", "../web/node_modules/d3-transition/src/transition/index.js", "../web/node_modules/d3-ease/src/cubic.js", "../web/node_modules/d3-transition/src/selection/transition.js", "../web/node_modules/d3-transition/src/selection/index.js", "../web/node_modules/d3-brush/src/brush.js", "../web/node_modules/d3-force/src/center.js", "../web/node_modules/d3-quadtree/src/add.js", "../web/node_modules/d3-quadtree/src/cover.js", "../web/node_modules/d3-quadtree/src/data.js", "../web/node_modules/d3-quadtree/src/extent.js", "../web/node_modules/d3-quadtree/src/quad.js", "../web/node_modules/d3-quadtree/src/find.js", "../web/node_modules/d3-quadtree/src/remove.js", "../web/node_modules/d3-quadtree/src/root.js", "../web/node_modules/d3-quadtree/src/size.js", "../web/node_modules/d3-quadtree/src/visit.js", "../web/node_modules/d3-quadtree/src/visitAfter.js", "../web/node_modules/d3-quadtree/src/x.js", "../web/node_modules/d3-quadtree/src/y.js", "../web/node_modules/d3-quadtree/src/quadtree.js", "../web/node_modules/d3-force/src/constant.js", "../web/node_modules/d3-force/src/jiggle.js", "../web/node_modules/d3-force/src/link.js", "../web/node_modules/d3-force/src/lcg.js", "../web/node_modules/d3-force/src/simulation.js", "../web/node_modules/d3-force/src/manyBody.js", "../web/node_modules/d3-zoom/src/constant.js", "../web/node_modules/d3-zoom/src/event.js", "../web/node_modules/d3-zoom/src/transform.js", "../web/node_modules/d3-zoom/src/noevent.js", "../web/node_modules/d3-zoom/src/zoom.js", "../web/src/main.ts"], + "sourcesContent": ["var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n", "export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n", "import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n", "import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n", "function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don\u2019t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n", "function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n", "export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n", "import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "export default function(update) {\n return new Array(update.length);\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don\u2019t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn\u2019t worried about \u201Clive\u201D collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don\u2019t; we\u2019d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n", "export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n", "export default function() {\n return Array.from(this);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n", "export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n", "export default function() {\n return !this.node();\n}\n", "export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n", "import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n", "export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n", "import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n", "function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n", "function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n", "function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n", "function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n", "function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n", "function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n", "import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n", "import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n", "function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n", "function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n", "export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n", "function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n", "import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n", "export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n", "import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n", "import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n", "export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n", "import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n", "// These are typically used in conjunction with noevent to ensure that we can\n// preventDefault on the event.\nexport const nonpassive = {passive: false};\nexport const nonpassivecapture = {capture: true, passive: false};\n\nexport function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {select} from \"d3-selection\";\nimport noevent, {nonpassivecapture} from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, nonpassivecapture);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, nonpassivecapture);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, nonpassivecapture);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n", "export default x => () => x;\n", "export default function DragEvent(type, {\n sourceEvent,\n subject,\n target,\n identifier,\n active,\n x, y, dx, dy,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n subject: {value: subject, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n identifier: {value: identifier, enumerable: true, configurable: true},\n active: {value: active, enumerable: true, configurable: true},\n x: {value: x, enumerable: true, configurable: true},\n y: {value: y, enumerable: true, configurable: true},\n dx: {value: dx, enumerable: true, configurable: true},\n dy: {value: dy, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n", "import {dispatch} from \"d3-dispatch\";\nimport {select, pointer} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag.js\";\nimport noevent, {nonpassive, nonpassivecapture, nopropagation} from \"./noevent.js\";\nimport constant from \"./constant.js\";\nimport DragEvent from \"./event.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(event, d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved, nonpassive)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned(event, d) {\n if (touchending || !filter.call(this, event, d)) return;\n var gesture = beforestart(this, container.call(this, event, d), event, d, \"mouse\");\n if (!gesture) return;\n select(event.view)\n .on(\"mousemove.drag\", mousemoved, nonpassivecapture)\n .on(\"mouseup.drag\", mouseupped, nonpassivecapture);\n nodrag(event.view);\n nopropagation(event);\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\", event);\n }\n\n function mousemoved(event) {\n noevent(event);\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\", event);\n }\n\n function mouseupped(event) {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent(event);\n gestures.mouse(\"end\", event);\n }\n\n function touchstarted(event, d) {\n if (!filter.call(this, event, d)) return;\n var touches = event.changedTouches,\n c = container.call(this, event, d),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {\n nopropagation(event);\n gesture(\"start\", event, touches[i]);\n }\n }\n }\n\n function touchmoved(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent(event);\n gesture(\"drag\", event, touches[i]);\n }\n }\n }\n\n function touchended(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation(event);\n gesture(\"end\", event, touches[i]);\n }\n }\n }\n\n function beforestart(that, container, event, d, identifier, touch) {\n var dispatch = listeners.copy(),\n p = pointer(touch || event, container), dx, dy,\n s;\n\n if ((s = subject.call(that, new DragEvent(\"beforestart\", {\n sourceEvent: event,\n target: drag,\n identifier,\n active,\n x: p[0],\n y: p[1],\n dx: 0,\n dy: 0,\n dispatch\n }), d)) == null) return;\n\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n\n return function gesture(type, event, touch) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[identifier] = gesture, n = active++; break;\n case \"end\": delete gestures[identifier], --active; // falls through\n case \"drag\": p = pointer(touch || event, container), n = active; break;\n }\n dispatch.call(\n type,\n that,\n new DragEvent(type, {\n sourceEvent: event,\n subject: s,\n target: drag,\n identifier,\n active: n,\n x: p[0] + dx,\n y: p[1] + dy,\n dx: p[0] - p0[0],\n dy: p[1] - p0[1],\n dispatch\n }),\n d\n );\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n", "export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n", "import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n", "export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "export default x => () => x;\n", "import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n", "import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n", "export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n", "import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n", "var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n", "import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n", "import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n", "var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 \u2245 u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n", "var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we\u2019ve set an alarm, if we haven\u2019t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n", "import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n", "import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n", "import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n", "import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n", "import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n", "import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n", "import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n", "import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n", "import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n", "import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n", "import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n", "function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n", "import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n", "import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n", "import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n", "function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n", "import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n", "function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n", "import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n", "import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n", "import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n", "export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n", "import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name \u201C__brush\u201D rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection, event) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start(event).brush(event).end(event);\n });\n }\n };\n\n brush.clear = function(group, event) {\n brush.move(group, null, event);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move(event);\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move(event);\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move(event);\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move(event);\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n", "export default function(x, y) {\n var nodes, strength = 1;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x, sy += node.y;\n }\n\n for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) {\n node = nodes[i], node.x -= sx, node.y -= sy;\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n return force;\n}\n", "export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n", "export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don\u2019t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n", "export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n", "export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n", "export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can\u2019t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn\u2019t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n", "export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n", "export default function() {\n return this._root;\n}\n", "export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n", "export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n", "export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n", "import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "export default function(random) {\n return (random() - 0.5) * 1e-6;\n}\n", "import constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"node not found: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n count,\n bias,\n random,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle(random);\n y = target.y + target.vy - source.y - source.vy || jiggle(random);\n l = Math.sqrt(x * x + y * y);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l;\n target.vx -= x * (b = bias[i]);\n target.vy -= y * b;\n source.vx += x * (b = 1 - b);\n source.vy += y * b;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n", "// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport default function() {\n let s = 1;\n return () => (s = (a * s + c) % m) / m;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer} from \"d3-timer\";\nimport lcg from \"./lcg.js\";\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = new Map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\"),\n random = lcg();\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.forEach(function(force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes, random);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n randomSource: function(_) {\n return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n", "import {quadtree} from \"d3-quadtree\";\nimport constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\nimport {x, y} from \"./simulation.js\";\n\nexport default function() {\n var nodes,\n node,\n random,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate);\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(quad) {\n var strength = 0, q, c, weight = 0, x, y, i;\n\n // For internal nodes, accumulate forces from child quadrants.\n if (quad.length) {\n for (x = y = i = 0; i < 4; ++i) {\n if ((q = quad[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n }\n }\n quad.x = x / weight;\n quad.y = y / weight;\n }\n\n // For leaf nodes, accumulate forces from coincident quadrants.\n else {\n q = quad;\n q.x = q.data.x;\n q.y = q.data.y;\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n quad.value = strength;\n }\n\n function apply(quad, x1, _, x2) {\n if (!quad.value) return true;\n\n var x = quad.x - node.x,\n y = quad.y - node.y,\n w = x2 - x1,\n l = x * x + y * y;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * quad.value * alpha / l;\n node.vy += y * quad.value * alpha / l;\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (quad.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (quad.data !== node || quad.next) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (quad.data !== node) {\n w = strengths[quad.data.index] * alpha / l;\n node.vx += x * w;\n node.vy += y * w;\n } while (quad = quad.next);\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n", "export default x => () => x;\n", "export default function ZoomEvent(type, {\n sourceEvent,\n target,\n transform,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n transform: {value: transform, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n", "export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n", "export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {select, pointer} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction defaultFilter(event) {\n return (!event.ctrlKey || event.type === 'wheel') && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled, {passive: false})\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).event(event).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).event(event).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won\u2019t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n", "import * as d3 from \"d3\";\n\ntype NodeDatum = {\n id: string;\n label: string;\n score?: number | null;\n tier?: string | null;\n type: string;\n};\n\ntype EdgeDatum = {\n source: string;\n target: string;\n type: string;\n};\n\nfunction scoreColor(score?: number | null): string {\n if (score == null || isNaN(score)) return \"#d3d3d3\";\n const s = Math.min(1, Math.max(0, score));\n let r = 0, g = 0;\n if (s < 0.5) {\n r = Math.floor(2 * s * 255);\n g = 255;\n } else {\n r = 255;\n g = Math.floor((1 - 2 * (s - 0.5)) * 255);\n }\n return `rgb(${r},${g},0)`;\n}\n\nasync function loadData() {\n const res = await fetch(\"goblin.json\", { cache: \"no-store\" });\n return (await res.json()) as {\n nodes: NodeDatum[];\n edges: EdgeDatum[];\n };\n}\n\nfunction renderGraph(container: HTMLElement, nodes: NodeDatum[], edges: EdgeDatum[]) {\n const width = container.clientWidth || 960;\n const height = container.clientHeight || 600;\n\n const svg = d3.select(container).append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const zoomLayer = svg.append(\"g\");\n\n const link = zoomLayer.append(\"g\")\n .attr(\"stroke\", \"#999\")\n .attr(\"stroke-opacity\", 0.6)\n .selectAll(\"line\")\n .data(edges)\n .join(\"line\")\n .attr(\"stroke-dasharray\", d => d.type === \"overlapsWith\" ? \"4,3\" : d.type === \"dependsOn\" ? \"2,3\" : \"0\");\n\n const node = zoomLayer.append(\"g\")\n .selectAll(\"g\")\n .data(nodes)\n .join(\"g\")\n .call(d3.drag()\n .on(\"start\", (event, d: any) => {\n if (!event.active) simulation.alphaTarget(0.3).restart();\n d.fx = d.x; d.fy = d.y;\n })\n .on(\"drag\", (event, d: any) => {\n d.fx = event.x; d.fy = event.y;\n })\n .on(\"end\", (event, d: any) => {\n if (!event.active) simulation.alphaTarget(0);\n d.fx = null; d.fy = null;\n })\n );\n\n node.append(\"rect\")\n .attr(\"rx\", 8).attr(\"ry\", 8)\n .attr(\"x\", -60).attr(\"y\", -16)\n .attr(\"width\", 120).attr(\"height\", 32)\n .attr(\"fill\", d => scoreColor(d.score))\n .attr(\"stroke\", \"#333\");\n\n node.append(\"text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"middle\")\n .attr(\"font-family\", \"Helvetica, Arial, sans-serif\")\n .attr(\"font-size\", 11)\n .text(d => d.label);\n\n const idToNode: Record = {};\n nodes.forEach((n: any) => { idToNode[n.id] = n; });\n\n const simulation = d3.forceSimulation(nodes as any)\n .force(\"link\", d3.forceLink(edges as any).id((d: any) => d.id).distance(120))\n .force(\"charge\", d3.forceManyBody().strength(-180))\n .force(\"center\", d3.forceCenter(width / 2, height / 2))\n .on(\"tick\", () => {\n link\n .attr(\"x1\", (d: any) => idToNode[d.source].x)\n .attr(\"y1\", (d: any) => idToNode[d.source].y)\n .attr(\"x2\", (d: any) => idToNode[d.target].x)\n .attr(\"y2\", (d: any) => idToNode[d.target].y);\n\n node.attr(\"transform\", (d: any) => `translate(${d.x},${d.y})`);\n });\n\n svg.call(d3.zoom()\n .scaleExtent([0.3, 3])\n .on(\"zoom\", (event) => zoomLayer.attr(\"transform\", event.transform)));\n}\n\nasync function main() {\n const app = document.getElementById(\"app\")!;\n app.innerHTML = \"
Loading goblin graph\u2026
\";\n try {\n const { nodes, edges } = await loadData();\n app.innerHTML = \"\";\n renderGraph(app, nodes, edges);\n } catch (e) {\n app.innerHTML = \"
Failed to load goblin.json
\";\n console.error(e);\n }\n}\n\nmain();\n\n\n"], + "mappings": "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", + "names": ["type", "c", "document", "m", "x", "m", "m", "datum", "x", "m", "selection", "m", "m", "a", "m", "m", "m", "create", "create", "parseTypenames", "m", "type", "window", "dispatch_default", "m", "dispatch_default", "select_default", "root", "selection", "select_default", "constant_default", "x", "type", "x", "y", "dispatch", "filter", "selection", "select_default", "c", "container", "dispatch", "type", "event", "touch", "constant_default", "m", "a", "min", "max", "constant_default", "x", "a", "y", "y", "a", "constant_default", "y", "color", "rgb", "start", "a", "a", "i", "a", "c", "m", "a", "x", "now", "id", "index", "get", "set", "start", "empty", "interrupt_default", "id", "set", "get", "transition", "a", "c", "attrRemove", "attrRemoveNS", "attrConstant", "attrConstantNS", "attrFunction", "attrFunctionNS", "attr_default", "id", "get", "id", "set", "get", "id", "set", "get", "id", "set", "filter_default", "m", "merge_default", "transition", "m", "id", "set", "on_default", "get", "id", "remove_default", "select_default", "id", "m", "get", "selectAll_default", "id", "m", "children", "inherit", "get", "Selection", "selection_default", "styleRemove", "styleConstant", "styleFunction", "id", "remove", "set", "style_default", "textConstant", "textFunction", "text_default", "m", "inherit", "get", "id", "set", "id", "select_default", "selectAll_default", "filter_default", "merge_default", "selection_default", "on_default", "attr_default", "style_default", "text_default", "remove_default", "id", "transition_default", "m", "interrupt_default", "transition_default", "x", "y", "x", "y", "x", "y", "x", "y", "data_default", "x", "y", "x2", "y2", "remove_default", "x", "y", "size_default", "x", "y", "data_default", "remove_default", "size_default", "constant_default", "x", "find", "id", "constant_default", "x", "y", "m", "i", "x", "y", "constant_default", "node", "strength", "c", "x", "y", "constant_default", "x", "type", "transform", "dispatch", "x", "y", "identity", "nopropagation", "noevent_default", "defaultFilter", "identity", "defaultTouchable", "transform", "zoom_default", "filter", "selection", "x", "y", "extent", "transition", "a", "type", "select_default", "noevent_default", "nopropagation", "event", "constant_default", "select_default", "zoom_default"] +} diff --git a/docs/goblin-map.png.new b/docs/goblin-map.png.new new file mode 100644 index 0000000000000000000000000000000000000000..5dd51e2856fbcbcb3b6136ea866b5fd8a5cd5727 GIT binary patch literal 94069 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 + + + + + +GoblinMap + + +cluster_high + +High Goblin Domains + + +cluster_medium + +Medium Goblin Domains + + +cluster_low + +Low Goblin Domains + + + +UIFrontend + +UI / Frontend +Goblin ~ 0.92 + + + +CloudOrch + +Cloud Orchestration +Goblin ~ 0.95 + + + +Microservices + +Microservices +Goblin ~ 0.97 + + + +CICD + +CI/CD +Goblin ~ 0.88 + + + +ConfigMgmt + +Config Mgmt +Goblin ~ 0.90 + + + +IAM + +IAM / Security +Goblin ~ 0.94 + + + +Healthcare + +Healthcare Workflows +Goblin ~ 0.80 + + + +Finance + +Finance / Reconciliation +Goblin ~ 0.75 + + + +SupplyChain + +Supply Chain +Goblin ~ 0.85 + + + +MLPipelines + +ML / Data Pipelines +Goblin ~ 0.82 + + + +Government + +Government / Regulatory +Goblin ~ 0.90 + + + +Math + +Pure Mathematics +Goblin ~ 0.00 + + + +Compiler + +Compiler Pipeline +Goblin ~ 0.15 + + + +CAD + +Mechanical CAD +Goblin ~ 0.12 + + + diff --git a/docs/goblin.json b/docs/goblin.json new file mode 100644 index 0000000..e134a8e --- /dev/null +++ b/docs/goblin.json @@ -0,0 +1,214 @@ +{ + "nodes": [ + { + "id": "https://nkllon.com/problem#SupplyChain", + "label": "Supply Chain / Inventory", + "score": 0.85, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#Microservices", + "label": "Distributed Microservices", + "score": 0.97, + "tier": "https://nkllon.com/ui#High", + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#UIFrontend", + "label": "UI / Frontend Systems", + "score": 0.92, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#MechanicalCAD", + "label": "Mechanical CAD Modeling", + "score": 0.12, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#ConfigManagement", + "label": "Configuration Management", + "score": 0.9, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#HealthcareWorkflow", + "label": "Healthcare Workflows", + "score": 0.8, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#MLPipelines", + "label": "ML / Data Pipelines", + "score": 0.82, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#CICD", + "label": "CI/CD Pipelines", + "score": 0.88, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#GovernmentProcesses", + "label": "Government / Regulatory Processes", + "score": 0.9, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#IAMSecurity", + "label": "IAM / Security Policy", + "score": 0.94, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#CloudOrchestration", + "label": "Cloud Infrastructure Orchestration", + "score": 0.95, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#CompilerPipeline", + "label": "Compiler Pipeline", + "score": 0.15, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#FinanceReconciliation", + "label": "Financial Reconciliation", + "score": 0.75, + "tier": null, + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#PureMathematics", + "label": "Pure Mathematics (Formal Systems)", + "score": 0.0, + "tier": null, + "type": "ProblemClass" + } + ], + "edges": [ + { + "source": "https://nkllon.com/problem#Microservices", + "target": "https://nkllon.com/problem#CICD", + "type": "overlapsWith" + }, + { + "source": "https://nkllon.com/problem#ConfigManagement", + "target": "https://nkllon.com/problem#CloudOrchestration", + "type": "dependsOn" + }, + { + "source": "https://nkllon.com/problem#IAMSecurity", + "target": "https://nkllon.com/problem#ConfigManagement", + "type": "overlapsWith" + }, + { + "source": "https://nkllon.com/problem#CloudOrchestration", + "target": "https://nkllon.com/problem#Microservices", + "type": "influences" + } + ], + "dimensions": [ + { + "id": "https://nkllon.com/ui#Dim1_IllusionClosure", + "label": "Illusion of Closure / Model Reality Gap", + "index": 1.0, + "energyRelevance": 0.8 + }, + { + "id": "https://nkllon.com/ui#Dim2_DistributedState", + "label": "Distributed State & Fragmentation", + "index": 2.0, + "energyRelevance": 0.9 + }, + { + "id": "https://nkllon.com/ui#Dim3_AsyncNonDeterminism", + "label": "Asynchrony & Non-Determinism", + "index": 3.0, + "energyRelevance": 0.85 + }, + { + "id": "https://nkllon.com/ui#Dim4_DomainInvariants", + "label": "Domain Invariants & Business Truth", + "index": 4.0, + "energyRelevance": 0.8 + } + ], + "weights": [ + { + "dimension": "https://nkllon.com/ui#Dim1_IllusionClosure", + "weight": 0.18, + "assignment": "https://nkllon.com/ui#DefaultWeights" + }, + { + "dimension": "https://nkllon.com/ui#Dim2_DistributedState", + "weight": 0.18, + "assignment": "https://nkllon.com/ui#DefaultWeights" + }, + { + "dimension": "https://nkllon.com/ui#Dim3_AsyncNonDeterminism", + "weight": 0.18, + "assignment": "https://nkllon.com/ui#DefaultWeights" + }, + { + "dimension": "https://nkllon.com/ui#Dim5_SecurityPrivacy", + "weight": 0.18, + "assignment": "https://nkllon.com/ui#DefaultWeights" + }, + { + "dimension": "https://nkllon.com/ui#Dim4_DomainInvariants", + "weight": 0.18, + "assignment": "https://nkllon.com/ui#DefaultWeights" + }, + { + "dimension": "https://nkllon.com/ui#Dim22_EnergyGradientSensitivity", + "weight": 0.18, + "assignment": "https://nkllon.com/ui#DefaultWeights" + } + ], + "stakeholders": [ + { + "id": "https://nkllon.com/stake#CEO", + "label": "Chief Executive Officer", + "caresAbout": [] + }, + { + "id": "https://nkllon.com/stake#CIO", + "label": "Chief Information Officer", + "caresAbout": [] + }, + { + "id": "https://nkllon.com/stake#CTO", + "label": "Chief Technology Officer", + "caresAbout": [] + }, + { + "id": "https://nkllon.com/stake#CISO", + "label": "Chief Information Security Officer", + "caresAbout": [] + }, + { + "id": "https://nkllon.com/stake#DevOpsEngineer", + "label": "DevOps / Platform Engineer", + "caresAbout": [] + }, + { + "id": "https://nkllon.com/stake#UIDeveloper", + "label": "UI / Frontend Developer", + "caresAbout": [] + } + ] +} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..a206c31 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,26 @@ + + + + + + Goblin Map + + + +
+

Goblin Map (SCIG)

+
+
+
+
+ Generated from ontology at build time. +
+ + + + + diff --git a/docs/kg.html b/docs/kg.html index 99ba8d4..b784f93 100644 --- a/docs/kg.html +++ b/docs/kg.html @@ -23,5 +23,3 @@ - - diff --git a/docs/style.css b/docs/style.css new file mode 100644 index 0000000..a2e7586 --- /dev/null +++ b/docs/style.css @@ -0,0 +1,25 @@ +html, body { + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + color: #111; +} +header { + padding: 12px 16px; + border-bottom: 1px solid #eee; +} +header h1 { + margin: 0 0 6px 0; + font-size: 18px; +} +header nav a { + color: #2962ff; + text-decoration: none; + margin-right: 10px; +} +header nav a:hover { text-decoration: underline; } +.loading, .error { + padding: 16px; +} + + diff --git a/docs/ttl-graph.dot b/docs/ttl-graph.dot new file mode 100644 index 0000000..13194fe --- /dev/null +++ b/docs/ttl-graph.dot @@ -0,0 +1,22 @@ +digraph GoblinTTL { + rankdir=LR; + node [shape=box, style=rounded, fontname="Helvetica"]; + "https://nkllon.com/problem#PureMathematics" [label="Pure Mathematics (Formal Systems)\nGoblin ~ 0.00", style="filled,rounded", fillcolor="#00ff00"]; + "https://nkllon.com/problem#MLPipelines" [label="ML / Data Pipelines\nGoblin ~ 0.82", style="filled,rounded", fillcolor="#ff5b00"]; + "https://nkllon.com/problem#GovernmentProcesses" [label="Government / Regulatory Processes\nGoblin ~ 0.90", style="filled,rounded", fillcolor="#ff3200"]; + "https://nkllon.com/problem#CICD" [label="CI/CD Pipelines\nGoblin ~ 0.88", style="filled,rounded", fillcolor="#ff3d00"]; + "https://nkllon.com/problem#ConfigManagement" [label="Configuration Management\nGoblin ~ 0.90", style="filled,rounded", fillcolor="#ff3200"]; + "https://nkllon.com/problem#Microservices" [label="Distributed Microservices\nGoblin ~ 0.97", style="filled,rounded", fillcolor="#ff0f00"]; + "https://nkllon.com/problem#MechanicalCAD" [label="Mechanical CAD Modeling\nGoblin ~ 0.12", style="filled,rounded", fillcolor="#3dff00"]; + "https://nkllon.com/problem#HealthcareWorkflow" [label="Healthcare Workflows\nGoblin ~ 0.80", style="filled,rounded", fillcolor="#ff6500"]; + "https://nkllon.com/problem#FinanceReconciliation" [label="Financial Reconciliation\nGoblin ~ 0.75", style="filled,rounded", fillcolor="#ff7f00"]; + "https://nkllon.com/problem#CloudOrchestration" [label="Cloud Infrastructure Orchestration\nGoblin ~ 0.95", style="filled,rounded", fillcolor="#ff1900"]; + "https://nkllon.com/problem#SupplyChain" [label="Supply Chain / Inventory\nGoblin ~ 0.85", style="filled,rounded", fillcolor="#ff4c00"]; + "https://nkllon.com/problem#IAMSecurity" [label="IAM / Security Policy\nGoblin ~ 0.94", style="filled,rounded", fillcolor="#ff1e00"]; + "https://nkllon.com/problem#CompilerPipeline" [label="Compiler Pipeline\nGoblin ~ 0.15", style="filled,rounded", fillcolor="#4cff00"]; + "https://nkllon.com/problem#UIFrontend" [label="UI / Frontend Systems\nGoblin ~ 0.92", style="filled,rounded", fillcolor="#ff2800"]; + "https://nkllon.com/problem#ConfigManagement" -> "https://nkllon.com/problem#CloudOrchestration" [label="depends", style="dotted"]; + "https://nkllon.com/problem#Microservices" -> "https://nkllon.com/problem#CICD" [label="overlaps", style="dashed"]; + "https://nkllon.com/problem#CloudOrchestration" -> "https://nkllon.com/problem#Microservices" [label="influences", style="solid"]; + "https://nkllon.com/problem#IAMSecurity" -> "https://nkllon.com/problem#ConfigManagement" [label="overlaps", style="dashed"]; +} diff --git a/docs/ttl-graph.png b/docs/ttl-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe31684227b98982c64cba17d4adcd52f224517 GIT binary patch literal 86427 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 CWp+jY literal 0 HcmV?d00001 diff --git a/docs/ttl-graph.svg b/docs/ttl-graph.svg new file mode 100644 index 0000000..6eefde6 --- /dev/null +++ b/docs/ttl-graph.svg @@ -0,0 +1,139 @@ + + + + + + +GoblinTTL + + + +https://nkllon.com/problem#PureMathematics + +Pure Mathematics (Formal Systems) +Goblin ~ 0.00 + + + +https://nkllon.com/problem#MLPipelines + +ML / Data Pipelines +Goblin ~ 0.82 + + + +https://nkllon.com/problem#GovernmentProcesses + +Government / Regulatory Processes +Goblin ~ 0.90 + + + +https://nkllon.com/problem#CICD + +CI/CD Pipelines +Goblin ~ 0.88 + + + +https://nkllon.com/problem#ConfigManagement + +Configuration Management +Goblin ~ 0.90 + + + +https://nkllon.com/problem#CloudOrchestration + +Cloud Infrastructure Orchestration +Goblin ~ 0.95 + + + +https://nkllon.com/problem#ConfigManagement->https://nkllon.com/problem#CloudOrchestration + + +depends + + + +https://nkllon.com/problem#Microservices + +Distributed Microservices +Goblin ~ 0.97 + + + +https://nkllon.com/problem#Microservices->https://nkllon.com/problem#CICD + + +overlaps + + + +https://nkllon.com/problem#MechanicalCAD + +Mechanical CAD Modeling +Goblin ~ 0.12 + + + +https://nkllon.com/problem#HealthcareWorkflow + +Healthcare Workflows +Goblin ~ 0.80 + + + +https://nkllon.com/problem#FinanceReconciliation + +Financial Reconciliation +Goblin ~ 0.75 + + + +https://nkllon.com/problem#CloudOrchestration->https://nkllon.com/problem#Microservices + + +influences + + + +https://nkllon.com/problem#SupplyChain + +Supply Chain / Inventory +Goblin ~ 0.85 + + + +https://nkllon.com/problem#IAMSecurity + +IAM / Security Policy +Goblin ~ 0.94 + + + +https://nkllon.com/problem#IAMSecurity->https://nkllon.com/problem#ConfigManagement + + +overlaps + + + +https://nkllon.com/problem#CompilerPipeline + +Compiler Pipeline +Goblin ~ 0.15 + + + +https://nkllon.com/problem#UIFrontend + +UI / Frontend Systems +Goblin ~ 0.92 + + + diff --git a/examples/sample_input.md b/examples/sample_input.md index add3ab3..9e9c9de 100644 --- a/examples/sample_input.md +++ b/examples/sample_input.md @@ -8,5 +8,3 @@ Key points: - Backoffice users can override orders out-of-band. Requested: compute the Goblin score and per-dimension notes using the lim42 agent profile. - - diff --git a/examples/sample_score.json b/examples/sample_score.json index 82780d3..0c84b8d 100644 --- a/examples/sample_score.json +++ b/examples/sample_score.json @@ -12,5 +12,3 @@ "rdfs:label": "Example System", "goblinScore": "0.73" } - - diff --git a/goblin-agent-lim42.md b/goblin-agent-lim42.md index 890bf7a..673fa5b 100644 --- a/goblin-agent-lim42.md +++ b/goblin-agent-lim42.md @@ -11,7 +11,7 @@ Goblin score answers: **"How strong is the closure-illusion vs distributed-reali Prompt pattern: -> Given the following system description, estimate its Goblin score (0..1). +> Given the following system description, estimate its Goblin score (0..1). > Explain briefly which factors drive the score along the following axes: > - Illusion of closure / formal cleanliness > - Actual distributed state and asynchrony @@ -31,7 +31,7 @@ Then: 2. Combine using a weighted sum: - goblin_score = + goblin_score = 0.18 * illusion_closure + 0.20 * distributed_state + 0.15 * async_nondeterminism + diff --git a/goblin-ontology.ttl b/goblin-ontology.ttl index 31a9333..8c08c3a 100644 --- a/goblin-ontology.ttl +++ b/goblin-ontology.ttl @@ -466,4 +466,3 @@ _:json1 a ui:Artifact ; ui:artifactType "web-json" ; ui:artifactPath "docs/goblin.json" ; ui:generatedByBuild _:build1 . - diff --git a/goblin_ontology/__init__.py b/goblin_ontology/__init__.py index d665007..07c5de9 100644 --- a/goblin_ontology/__init__.py +++ b/goblin_ontology/__init__.py @@ -1,4 +1,2 @@ __all__ = ["__version__"] __version__ = "0.1.0" - - diff --git a/goblin_ontology/cli.py b/goblin_ontology/cli.py index 1df084b..f61021c 100644 --- a/goblin_ontology/cli.py +++ b/goblin_ontology/cli.py @@ -63,5 +63,3 @@ def main(argv: list[str] | None = None) -> int: if __name__ == "__main__": raise SystemExit(main()) - - diff --git a/goblin_ontology/data/goblin-ontology.ttl b/goblin_ontology/data/goblin-ontology.ttl index 1cde2ae..bf252c0 100644 --- a/goblin_ontology/data/goblin-ontology.ttl +++ b/goblin_ontology/data/goblin-ontology.ttl @@ -466,5 +466,3 @@ _:json1 a ui:Artifact ; ui:artifactType "web-json" ; ui:artifactPath "docs/goblin.json" ; ui:generatedByBuild _:build1 . - - diff --git a/goblin_ontology/data/goblin-shapes.ttl b/goblin_ontology/data/goblin-shapes.ttl index 1bc1a31..d4fdb3c 100644 --- a/goblin_ontology/data/goblin-shapes.ttl +++ b/goblin_ontology/data/goblin-shapes.ttl @@ -154,5 +154,3 @@ uiSh:DimensionShape sh:minCount 0 ; sh:message "Dimension MAY define an energyRelevanceScore (0..1)." ; ] . - - diff --git a/goblin_ontology/validator.py b/goblin_ontology/validator.py index 206205e..ed3d4f5 100644 --- a/goblin_ontology/validator.py +++ b/goblin_ontology/validator.py @@ -67,5 +67,3 @@ def validate( return ValidationResult( conforms=bool(conforms), report_text=str(report_text), report_graph=report_graph ) - - diff --git a/js/goblin-ontology/assets/goblin-ontology.ttl b/js/goblin-ontology/assets/goblin-ontology.ttl index 1cde2ae..bf252c0 100644 --- a/js/goblin-ontology/assets/goblin-ontology.ttl +++ b/js/goblin-ontology/assets/goblin-ontology.ttl @@ -466,5 +466,3 @@ _:json1 a ui:Artifact ; ui:artifactType "web-json" ; ui:artifactPath "docs/goblin.json" ; ui:generatedByBuild _:build1 . - - diff --git a/js/goblin-ontology/assets/goblin-shapes.ttl b/js/goblin-ontology/assets/goblin-shapes.ttl index 1bc1a31..d4fdb3c 100644 --- a/js/goblin-ontology/assets/goblin-shapes.ttl +++ b/js/goblin-ontology/assets/goblin-shapes.ttl @@ -154,5 +154,3 @@ uiSh:DimensionShape sh:minCount 0 ; sh:message "Dimension MAY define an energyRelevanceScore (0..1)." ; ] . - - diff --git a/js/goblin-ontology/package-lock.json b/js/goblin-ontology/package-lock.json new file mode 100644 index 0000000..09d05e3 --- /dev/null +++ b/js/goblin-ontology/package-lock.json @@ -0,0 +1,437 @@ +{ + "name": "@nkllon/goblin-ontology", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@nkllon/goblin-ontology", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@rdfjs/data-model": "^2.0.2", + "@rdfjs/dataset": "^2.0.1", + "n3": "^1.17.4", + "rdf-validate-shacl": "^0.6.5" + }, + "bin": { + "goblin-validate": "dist/cli.js" + }, + "devDependencies": { + "typescript": "^5.6.3" + } + }, + "node_modules/@rdfjs/data-model": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@rdfjs/data-model/-/data-model-2.1.1.tgz", + "integrity": "sha512-6mcOI4DjIPS6MOZw23H8oAdujHCk5gippVNQ7mKwliYTvTNh+uqRM91B9OLqhoAoNcQ3t49Dx2ooIMRG9/6ooA==", + "license": "MIT", + "bin": { + "rdfjs-data-model-test": "bin/test.js" + } + }, + "node_modules/@rdfjs/dataset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rdfjs/dataset/-/dataset-2.0.2.tgz", + "integrity": "sha512-6YJx+5n5Uxzq9dd9I0GGcIo6eopZOPfcsAfxSGX5d+YBzDgVa1cbtEBFnaPyPKiQsOm4+Cr3nwypjpg02YKPlA==", + "license": "MIT", + "bin": { + "rdfjs-dataset-test": "bin/test.js" + } + }, + "node_modules/@rdfjs/environment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rdfjs/environment/-/environment-1.0.0.tgz", + "integrity": "sha512-+S5YjSvfoQR5r7YQCRCCVHvIEyrWia7FJv2gqM3s5EDfotoAQmFeBagApa9c/eQFi5EiNhmBECE5nB8LIxTaHg==", + "license": "MIT" + }, + "node_modules/@rdfjs/namespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/namespace/-/namespace-2.0.1.tgz", + "integrity": "sha512-U85NWVGnL3gWvOZ4eXwUcv3/bom7PAcutSBQqmVWvOaslPy+kDzAJCH1WYBLpdQd4yMmJ+bpJcDl9rcHtXeixg==", + "license": "MIT", + "dependencies": { + "@rdfjs/data-model": "^2.0.1" + } + }, + "node_modules/@rdfjs/term-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rdfjs/term-map/-/term-map-2.0.2.tgz", + "integrity": "sha512-EJ2FmmdEUsSR/tU1nrizRLWzH24YzhuvesrbUWxC3Fs0ilYNdtTbg0RaFJDUnJF3HkbNBQe8Zrt/uvU/hcKnHg==", + "license": "MIT", + "dependencies": { + "@rdfjs/to-ntriples": "^3.0.1" + } + }, + "node_modules/@rdfjs/term-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@rdfjs/term-set/-/term-set-2.0.3.tgz", + "integrity": "sha512-DyXrKWEx+mtAFUZVU7bc3Va6/KZ8PsIp0RVdyWT9jfDgI/HCvNisZaBtAcm+SYTC45o+7WLkbudkk1bfaKVB0A==", + "license": "MIT", + "dependencies": { + "@rdfjs/to-ntriples": "^3.0.1" + } + }, + "node_modules/@rdfjs/to-ntriples": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/to-ntriples/-/to-ntriples-3.0.1.tgz", + "integrity": "sha512-gjoPAvh4j7AbGMjcDn/8R4cW+d/FPtbfbMM0uQXkyfBFtNUW2iVgrqsgJ65roLc54Y9A2TTFaeeTGSvY9a0HCQ==", + "license": "MIT" + }, + "node_modules/@rdfjs/types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-2.0.1.tgz", + "integrity": "sha512-uyAzpugX7KekAXAHq26m3JlUIZJOC0uSBhpnefGV5i15bevDyyejoB7I+9MKeUrzXD8OOUI3+4FeV1wwQr5ihA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@tpluscode/rdf-ns-builders": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@tpluscode/rdf-ns-builders/-/rdf-ns-builders-5.0.0.tgz", + "integrity": "sha512-rtMFbArdief+s0z2A3TOb/gNe5O5xn9LDiEpilCf6lGYCUIfyqoOvZY80fS/eILwcF2Mj6cUQN1WBQ+1neJmaw==", + "license": "MIT", + "dependencies": { + "@rdfjs/data-model": "^2.1.0", + "@rdfjs/namespace": "^2.0.1", + "@rdfjs/types": "^2", + "@types/rdfjs__namespace": "^2.0.10", + "@zazuko/prefixes": "^2.3.0" + } + }, + "node_modules/@types/node": { + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/rdfjs__namespace": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/rdfjs__namespace/-/rdfjs__namespace-2.0.10.tgz", + "integrity": "sha512-xoVzEIOxcpyteEmzaj94MSBbrBFs+vqv05joMhzLEiPRwsBBDnhkdBCaaDxR1Tf7wOW0kB2R1IYe4C3vEBFPgA==", + "license": "MIT", + "dependencies": { + "@rdfjs/types": "*" + } + }, + "node_modules/@vocabulary/sh": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@vocabulary/sh/-/sh-1.1.6.tgz", + "integrity": "sha512-8IfAQoKh57THz8LA2+n1jaY/VC2XaqMNSsJgzBKSSrj20y5PSMAawb6dMsxoLxqDIPBDs1TFRl/9CijUnwbBUA==", + "license": "MIT", + "peerDependencies": { + "@rdfjs/types": "^2.0.0" + } + }, + "node_modules/@zazuko/prefixes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@zazuko/prefixes/-/prefixes-2.4.0.tgz", + "integrity": "sha512-bd53k5XgFKWR56sofHeAcIbv8o0m2HsJlbHaHbrMufUCdgiZsCLvZn84Vh1dhcsyBHOD0EIo9AD4pNWDQLVRaw==", + "license": "MIT" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/clownface": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/clownface/-/clownface-2.0.3.tgz", + "integrity": "sha512-E76TBJ7CgU9+/5paSAvuNdMO+fzFThnvRVtidosktYppYkXM8V7tid8Ezzo8S1OmoWxKUam3yfkZlfCid4OiJQ==", + "license": "MIT", + "dependencies": { + "@rdfjs/data-model": "^2.0.1", + "@rdfjs/environment": "0 - 1", + "@rdfjs/namespace": "^2.0.0" + } + }, + "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/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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": "BSD-3-Clause" + }, + "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/n3": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.26.0.tgz", + "integrity": "sha512-SQknS0ua90rN+3RHuk8BeIqeYyqIH/+ecViZxX08jR4j6MugqWRjtONl3uANG/crWXnOM2WIqBJtjIhVYFha+w==", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/rdf-canonize": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/rdf-data-factory": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-2.0.2.tgz", + "integrity": "sha512-WzPoYHwQYWvIP9k+7IBLY1b4nIDitzAK4mA37WumAF/Cjvu/KOtYJH9IPZnUTWNSd5K2+pq4vrcE9WZC4sRHhg==", + "license": "MIT", + "dependencies": { + "@rdfjs/types": "^2.0.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" + } + }, + "node_modules/rdf-dataset-ext": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rdf-dataset-ext/-/rdf-dataset-ext-1.1.0.tgz", + "integrity": "sha512-CH85RfRKN9aSlbju8T7aM8hgCSWMBsh2eh/tGxUUtWMN+waxi6iFDt8/r4PAEmKaEA82guimZJ4ISbmJ2rvWQg==", + "deprecated": "rdf-dataset-ext is deprecated. Switching to rdf-ext is recommended.", + "license": "MIT", + "dependencies": { + "rdf-canonize": "^3.0.0", + "readable-stream": "3 - 4" + } + }, + "node_modules/rdf-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-2.0.0.tgz", + "integrity": "sha512-jlQ+h7EvnXmncmk8OzOYR8T3gNfd4g0LQXbflHkEkancic8dh0Tdt5RiRq8vUFndjIeNHt1RWeA5TAj6rgrtng==", + "license": "MIT", + "dependencies": { + "rdf-data-factory": "^2.0.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" + } + }, + "node_modules/rdf-validate-datatype": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/rdf-validate-datatype/-/rdf-validate-datatype-0.2.2.tgz", + "integrity": "sha512-mH9qL8i0WBbZ6HJCA26BB6V+WV2MraKvitez3SV0QegBWVQ4wYO49CgfFBzoAYg6tlnhFXl9MkrOAQ07X2N1FA==", + "license": "MIT", + "dependencies": { + "@rdfjs/term-map": "^2.0.0", + "@tpluscode/rdf-ns-builders": "3 - 5" + } + }, + "node_modules/rdf-validate-shacl": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/rdf-validate-shacl/-/rdf-validate-shacl-0.6.5.tgz", + "integrity": "sha512-rwIibopSixDE8ecA9x0c7oTVxdMWxGiJh7h3uJ+WS2h4lq2nx3DZVO7rJvwa5kZpDq9QEFPoyZINAUyfaaoN4Q==", + "license": "MIT", + "dependencies": { + "@rdfjs/data-model": "^2.1.0", + "@rdfjs/dataset": "^2.0.2", + "@rdfjs/environment": "^1.0.0", + "@rdfjs/namespace": "^2.0.1", + "@rdfjs/term-set": "^2.0.3", + "@rdfjs/types": "1 - 2", + "@vocabulary/sh": "^1.1.6", + "clownface": "^2.0.3", + "debug": "^4.3.2", + "rdf-dataset-ext": "^1.1.0", + "rdf-literal": "^2.0.0", + "rdf-validate-datatype": "^0.2.2" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + } + } +} diff --git a/js/goblin-ontology/package.json b/js/goblin-ontology/package.json index 07e4d5b..7a5548b 100644 --- a/js/goblin-ontology/package.json +++ b/js/goblin-ontology/package.json @@ -29,5 +29,3 @@ "typescript": "^5.6.3" } } - - diff --git a/js/goblin-ontology/src/cli.ts b/js/goblin-ontology/src/cli.ts index 5701f17..2656161 100644 --- a/js/goblin-ontology/src/cli.ts +++ b/js/goblin-ontology/src/cli.ts @@ -39,5 +39,3 @@ async function main(): Promise { } main().then((code) => exit(code)); - - diff --git a/js/goblin-ontology/src/index.ts b/js/goblin-ontology/src/index.ts index 7c84cc4..fe4d5bc 100644 --- a/js/goblin-ontology/src/index.ts +++ b/js/goblin-ontology/src/index.ts @@ -1,3 +1 @@ export * from "./validate.js"; - - diff --git a/js/goblin-ontology/src/shims.d.ts b/js/goblin-ontology/src/shims.d.ts index ba04593..c97fbe4 100644 --- a/js/goblin-ontology/src/shims.d.ts +++ b/js/goblin-ontology/src/shims.d.ts @@ -1,5 +1,3 @@ declare module "@rdfjs/data-model"; declare module "@rdfjs/dataset"; declare module "n3"; - - diff --git a/js/goblin-ontology/src/validate.ts b/js/goblin-ontology/src/validate.ts index 1cc712f..a164b89 100644 --- a/js/goblin-ontology/src/validate.ts +++ b/js/goblin-ontology/src/validate.ts @@ -68,5 +68,3 @@ export async function validate( return { conforms: report.conforms, reportTurtle }; } - - diff --git a/js/goblin-ontology/tsconfig.json b/js/goblin-ontology/tsconfig.json index 88478ad..4186437 100644 --- a/js/goblin-ontology/tsconfig.json +++ b/js/goblin-ontology/tsconfig.json @@ -14,5 +14,3 @@ }, "include": ["src/**/*.ts"] } - - diff --git a/pyproject.toml b/pyproject.toml index ae54337..57583f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,5 +33,3 @@ goblin_ontology = ["data/*"] [tool.uv] dev-dependencies = [] - - diff --git a/tools/ci/ghcr_login.sh b/tools/ci/ghcr_login.sh index 6ce731b..f4a1d90 100644 --- a/tools/ci/ghcr_login.sh +++ b/tools/ci/ghcr_login.sh @@ -30,5 +30,3 @@ fi # Login to GHCR printf '%s' "${TOKEN}" | docker login ghcr.io -u "${GH_USER}" --password-stdin 1>/dev/null echo "Logged in to ghcr.io as ${GH_USER}" - - diff --git a/tools/ci/run_act_ghcr.sh b/tools/ci/run_act_ghcr.sh index 42a8d2b..50307c3 100644 --- a/tools/ci/run_act_ghcr.sh +++ b/tools/ci/run_act_ghcr.sh @@ -31,5 +31,3 @@ for job in ${JOBS}; do run_job "${job}" echo "=== done: ${job} ===" done - - diff --git a/tools/export_instances_dot.py b/tools/export_instances_dot.py index 79297c8..1e9e092 100644 --- a/tools/export_instances_dot.py +++ b/tools/export_instances_dot.py @@ -151,5 +151,3 @@ def main() -> int: if __name__ == "__main__": raise SystemExit(main()) - - diff --git a/tools/export_web_json.py b/tools/export_web_json.py index 365a0a9..84963aa 100644 --- a/tools/export_web_json.py +++ b/tools/export_web_json.py @@ -115,5 +115,3 @@ def main() -> int: if __name__ == "__main__": raise SystemExit(main()) - - diff --git a/tools/validate_shapes.py b/tools/validate_shapes.py index 07be92b..47e2ced 100644 --- a/tools/validate_shapes.py +++ b/tools/validate_shapes.py @@ -60,5 +60,3 @@ def main() -> int: if __name__ == "__main__": raise SystemExit(main()) - - diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..da2d728 --- /dev/null +++ b/uv.lock @@ -0,0 +1,160 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version < '3.12'", +] + +[[package]] +name = "goblin-ontology" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "pyshacl" }, + { name = "rdflib" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] + +[package.metadata] +requires-dist = [ + { name = "pyshacl", specifier = ">=0.25.0" }, + { name = "rdflib", specifier = ">=7.0.0" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'", specifier = ">=4.7.0" }, +] + +[package.metadata.requires-dev] +dev = [] + +[[package]] +name = "html5rdf" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/55/1b839c43f5ed8207e17a9a02d8b395179520b8b4f00c00a41e113bc205ca/html5rdf-1.2.1.tar.gz", hash = "sha256:ace9b420ce52995bb4f05e7425eedf19e433c981dfe7a831ab391e2fa2e1a195", size = 287899, upload-time = "2024-10-30T05:06:56.384Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/c9/f6e1e8567660bc5b0aba281f2b0017b2a7665fcad6bf3ed67286a0c72cd4/html5rdf-1.2.1-py2.py3-none-any.whl", hash = "sha256:1f519121bc366af3e485310dc8041d2e86e5173c1a320fac3dc9d2604069b83e", size = 109765, upload-time = "2024-10-30T05:06:52.507Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "owlrl" +version = "7.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "rdflib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/fc/ce12482d096d65fff01af58f555a6f25e9dbf416fad5d99f91eaab0e11ca/owlrl-7.1.4.tar.gz", hash = "sha256:60bd4067e346b9111f0a2924565afe97ac6595b98b2bbe953928b5113971daf7", size = 44420, upload-time = "2025-07-29T00:17:27.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/78/f857ff1a7207e967dc5e8414bbcc15e0aa5cf45f693b1d2ebe2afb3eb1ce/owlrl-7.1.4-py3-none-any.whl", hash = "sha256:e78b46020169783345636da93a467d318f18700c483184dd15e885850cf64775", size = 51981, upload-time = "2025-07-29T00:17:26.229Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "prettytable" +version = "3.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/45/b0847d88d6cfeb4413566738c8bbf1e1995fad3d42515327ff32cc1eb578/prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0", size = 67892, upload-time = "2025-11-14T17:33:20.212Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/8c/83087ebc47ab0396ce092363001fa37c17153119ee282700c0713a195853/prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287", size = 34433, upload-time = "2025-11-14T17:33:19.093Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + +[[package]] +name = "pyshacl" +version = "0.30.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "owlrl" }, + { name = "packaging" }, + { name = "prettytable" }, + { name = "rdflib", extra = ["html"] }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/32/1602c3f4ab567b6d020bdd630c348fcf25d899f9e2b7a50385b10761673c/pyshacl-0.30.1.tar.gz", hash = "sha256:df712ac961b1ee7bcf0b27fa71ecab7785a135b2af69783ce30cb05fe41bcaf5", size = 1392238, upload-time = "2025-03-14T23:28:15.702Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/12/3747eff45147d416c054881b7c0902b21ac7767b905f666c714233688c81/pyshacl-0.30.1-py3-none-any.whl", hash = "sha256:d7e0c21b25e948bb643dbc5db6258da64a90a8ac89055c1fe562b469031072aa", size = 1290522, upload-time = "2025-03-14T23:28:12.72Z" }, +] + +[[package]] +name = "rdflib" +version = "7.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "isodate", marker = "python_full_version < '3.11'" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/ea/30bd9eb0d4a25dd0ab929153ed23698c907c6124389aa72eea5b7b703ab8/rdflib-7.4.0.tar.gz", hash = "sha256:c8ee16c31848c19c174aed96185327ea139ca3d392fac7fa882ddf5687f8f533", size = 4866588, upload-time = "2025-10-30T12:55:21.568Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/52/9d03e93f2e00d2a07749ee90f358d08c07822819d084f08c387b7ade8b56/rdflib-7.4.0-py3-none-any.whl", hash = "sha256:0af003470404ff21bc0eb04077cc97ee96da581f2429bf42a8e163fc1c2797bc", size = 569019, upload-time = "2025-10-30T12:55:14.462Z" }, +] + +[package.optional-dependencies] +html = [ + { name = "html5rdf" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +] diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..1d3c2e2 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,957 @@ +{ + "name": "goblin-web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "goblin-web", + "version": "0.1.0", + "dependencies": { + "d3": "^7.9.0" + }, + "devDependencies": { + "esbuild": "^0.24.0", + "typescript": "^5.6.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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/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.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "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/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/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "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/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/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/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/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/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + } + } +} diff --git a/web/package.json b/web/package.json index 62159be..d84c257 100644 --- a/web/package.json +++ b/web/package.json @@ -14,5 +14,3 @@ "d3": "^7.9.0" } } - - diff --git a/web/public/index.html b/web/public/index.html index a206c31..75b6aac 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -22,5 +22,3 @@

Goblin Map (SCIG)

- - diff --git a/web/public/style.css b/web/public/style.css index a2e7586..f6c53f8 100644 --- a/web/public/style.css +++ b/web/public/style.css @@ -21,5 +21,3 @@ header nav a:hover { text-decoration: underline; } .loading, .error { padding: 16px; } - - diff --git a/web/src/main.ts b/web/src/main.ts index 8fb05b7..3ee3f7a 100644 --- a/web/src/main.ts +++ b/web/src/main.ts @@ -122,5 +122,3 @@ async function main() { } main(); - - diff --git a/web/tsconfig.json b/web/tsconfig.json index 77740c5..a45c545 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -10,5 +10,3 @@ }, "include": ["src"] } - - From 176d189ad5efe276e5ba208bf6b561d1a09ec204 Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:18:17 -0700 Subject: [PATCH 05/13] chore: update generated docs and pre-commit config; pre-push hooks green --- .pre-commit-config.yaml | 52 ++++++++---- docs/app.js.map | 2 +- docs/goblin.json | 86 ++++++++++---------- docs/index.html | 2 - docs/style.css | 2 - docs/ttl-graph.dot | 16 ++-- docs/ttl-graph.png | Bin 86427 -> 83775 bytes docs/ttl-graph.svg | 172 ++++++++++++++++++++-------------------- 8 files changed, 175 insertions(+), 157 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5d64d42..14065a0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,48 +13,70 @@ repos: hooks: - id: python-validate name: Python SHACL validation (mirrors validate.yml/python-validate and ci.yml) - language: docker_image - docker_image: python:3.11-slim + language: system entry: | - bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib pyshacl graphviz pydot && python tools/validate_shapes.py' + bash -lc ' + docker run --rm \ + -v "$PWD":/work -w /work \ + python:3.11-slim \ + sh -lc "apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib pyshacl graphviz pydot && python tools/validate_shapes.py" + ' pass_filenames: false require_serial: true stages: [push] - id: python-export name: Export DOT/images and web JSON (mirrors ci.yml exporters) - language: docker_image - docker_image: python:3.11-slim + language: system entry: | - bash -lc 'apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib graphviz pydot && python tools/export_instances_dot.py && python tools/export_web_json.py && git diff --quiet -- docs/ || { echo ":: docs changed, commit generated artifacts"; git status --short docs/; exit 1; }' + bash -lc ' + docker run --rm \ + -v "$PWD":/work -w /work \ + python:3.11-slim \ + sh -lc "apt-get update && apt-get install -y --no-install-recommends graphviz && python -m pip install --no-cache-dir -q rdflib graphviz pydot && python tools/export_instances_dot.py && python tools/export_web_json.py" + git diff --quiet -- docs/ || { echo ":: docs changed, commit generated artifacts"; git status --short docs/; exit 1; } + ' pass_filenames: false require_serial: true stages: [push] - id: dot-committed-diff name: Check goblin-map images up-to-date (mirrors validate.yml/dot-check) - language: docker_image - docker_image: debian:stable-slim + language: system entry: | - bash -lc 'set -e; apt-get update && apt-get install -y --no-install-recommends graphviz diffutils && dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new && dot -Tpng goblin-map.dot -o docs/goblin-map.png.new && cmp -s docs/goblin-map.svg docs/goblin-map.svg.new && cmp -s docs/goblin-map.png docs/goblin-map.png.new' + bash -lc ' + docker run --rm \ + -v "$PWD":/work -w /work \ + debian:stable-slim \ + sh -lc "set -e; apt-get update && apt-get install -y --no-install-recommends graphviz diffutils && dot -Tsvg goblin-map.dot -o docs/goblin-map.svg.new && dot -Tpng goblin-map.dot -o docs/goblin-map.png.new" + cmp -s docs/goblin-map.svg docs/goblin-map.svg.new && cmp -s docs/goblin-map.png docs/goblin-map.png.new + ' pass_filenames: false require_serial: true stages: [push] - id: js-package name: JS package typecheck/build/test (mirrors js.yml) - language: docker_image - docker_image: node:20 + language: system entry: | - bash -lc 'cd js/goblin-ontology && (npm ci || npm i) && npm run typecheck && npm run build && npm test' + bash -lc ' + docker run --rm \ + -v "$PWD":/work -w /work/js/goblin-ontology \ + node:20 \ + sh -lc "(npm ci || npm i) && npm run typecheck && npm run build && npm test" + ' pass_filenames: false stages: [push] - id: web-build name: Web build to docs (mirrors ci.yml web build) - language: docker_image - docker_image: node:20 + language: system entry: | - bash -lc 'cd web && (npm ci || npm i) && npm run build' + bash -lc ' + docker run --rm \ + -v "$PWD":/work -w /work/web \ + node:20 \ + sh -lc "(npm ci || npm i) && npm run build" + ' pass_filenames: false stages: [push] diff --git a/docs/app.js.map b/docs/app.js.map index bec8891..d1c7f7e 100644 --- a/docs/app.js.map +++ b/docs/app.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../web/node_modules/d3-dispatch/src/dispatch.js", "../web/node_modules/d3-selection/src/namespaces.js", "../web/node_modules/d3-selection/src/namespace.js", "../web/node_modules/d3-selection/src/creator.js", "../web/node_modules/d3-selection/src/selector.js", "../web/node_modules/d3-selection/src/selection/select.js", "../web/node_modules/d3-selection/src/array.js", "../web/node_modules/d3-selection/src/selectorAll.js", "../web/node_modules/d3-selection/src/selection/selectAll.js", "../web/node_modules/d3-selection/src/matcher.js", "../web/node_modules/d3-selection/src/selection/selectChild.js", "../web/node_modules/d3-selection/src/selection/selectChildren.js", "../web/node_modules/d3-selection/src/selection/filter.js", "../web/node_modules/d3-selection/src/selection/sparse.js", "../web/node_modules/d3-selection/src/selection/enter.js", "../web/node_modules/d3-selection/src/constant.js", "../web/node_modules/d3-selection/src/selection/data.js", "../web/node_modules/d3-selection/src/selection/exit.js", "../web/node_modules/d3-selection/src/selection/join.js", "../web/node_modules/d3-selection/src/selection/merge.js", "../web/node_modules/d3-selection/src/selection/order.js", "../web/node_modules/d3-selection/src/selection/sort.js", "../web/node_modules/d3-selection/src/selection/call.js", "../web/node_modules/d3-selection/src/selection/nodes.js", "../web/node_modules/d3-selection/src/selection/node.js", "../web/node_modules/d3-selection/src/selection/size.js", "../web/node_modules/d3-selection/src/selection/empty.js", "../web/node_modules/d3-selection/src/selection/each.js", "../web/node_modules/d3-selection/src/selection/attr.js", "../web/node_modules/d3-selection/src/window.js", "../web/node_modules/d3-selection/src/selection/style.js", "../web/node_modules/d3-selection/src/selection/property.js", "../web/node_modules/d3-selection/src/selection/classed.js", "../web/node_modules/d3-selection/src/selection/text.js", "../web/node_modules/d3-selection/src/selection/html.js", "../web/node_modules/d3-selection/src/selection/raise.js", "../web/node_modules/d3-selection/src/selection/lower.js", "../web/node_modules/d3-selection/src/selection/append.js", "../web/node_modules/d3-selection/src/selection/insert.js", "../web/node_modules/d3-selection/src/selection/remove.js", "../web/node_modules/d3-selection/src/selection/clone.js", "../web/node_modules/d3-selection/src/selection/datum.js", "../web/node_modules/d3-selection/src/selection/on.js", "../web/node_modules/d3-selection/src/selection/dispatch.js", "../web/node_modules/d3-selection/src/selection/iterator.js", "../web/node_modules/d3-selection/src/selection/index.js", "../web/node_modules/d3-selection/src/select.js", "../web/node_modules/d3-selection/src/sourceEvent.js", "../web/node_modules/d3-selection/src/pointer.js", "../web/node_modules/d3-drag/src/noevent.js", "../web/node_modules/d3-drag/src/nodrag.js", "../web/node_modules/d3-drag/src/constant.js", "../web/node_modules/d3-drag/src/event.js", "../web/node_modules/d3-drag/src/drag.js", "../web/node_modules/d3-color/src/define.js", "../web/node_modules/d3-color/src/color.js", "../web/node_modules/d3-interpolate/src/basis.js", "../web/node_modules/d3-interpolate/src/basisClosed.js", "../web/node_modules/d3-interpolate/src/constant.js", "../web/node_modules/d3-interpolate/src/color.js", "../web/node_modules/d3-interpolate/src/rgb.js", "../web/node_modules/d3-interpolate/src/number.js", "../web/node_modules/d3-interpolate/src/string.js", "../web/node_modules/d3-interpolate/src/transform/decompose.js", "../web/node_modules/d3-interpolate/src/transform/parse.js", "../web/node_modules/d3-interpolate/src/transform/index.js", "../web/node_modules/d3-interpolate/src/zoom.js", "../web/node_modules/d3-timer/src/timer.js", "../web/node_modules/d3-timer/src/timeout.js", "../web/node_modules/d3-transition/src/transition/schedule.js", "../web/node_modules/d3-transition/src/interrupt.js", "../web/node_modules/d3-transition/src/selection/interrupt.js", "../web/node_modules/d3-transition/src/transition/tween.js", "../web/node_modules/d3-transition/src/transition/interpolate.js", "../web/node_modules/d3-transition/src/transition/attr.js", "../web/node_modules/d3-transition/src/transition/attrTween.js", "../web/node_modules/d3-transition/src/transition/delay.js", "../web/node_modules/d3-transition/src/transition/duration.js", "../web/node_modules/d3-transition/src/transition/ease.js", "../web/node_modules/d3-transition/src/transition/easeVarying.js", "../web/node_modules/d3-transition/src/transition/filter.js", "../web/node_modules/d3-transition/src/transition/merge.js", "../web/node_modules/d3-transition/src/transition/on.js", "../web/node_modules/d3-transition/src/transition/remove.js", "../web/node_modules/d3-transition/src/transition/select.js", "../web/node_modules/d3-transition/src/transition/selectAll.js", "../web/node_modules/d3-transition/src/transition/selection.js", "../web/node_modules/d3-transition/src/transition/style.js", "../web/node_modules/d3-transition/src/transition/styleTween.js", "../web/node_modules/d3-transition/src/transition/text.js", "../web/node_modules/d3-transition/src/transition/textTween.js", "../web/node_modules/d3-transition/src/transition/transition.js", "../web/node_modules/d3-transition/src/transition/end.js", "../web/node_modules/d3-transition/src/transition/index.js", "../web/node_modules/d3-ease/src/cubic.js", "../web/node_modules/d3-transition/src/selection/transition.js", "../web/node_modules/d3-transition/src/selection/index.js", "../web/node_modules/d3-brush/src/brush.js", "../web/node_modules/d3-force/src/center.js", "../web/node_modules/d3-quadtree/src/add.js", "../web/node_modules/d3-quadtree/src/cover.js", "../web/node_modules/d3-quadtree/src/data.js", "../web/node_modules/d3-quadtree/src/extent.js", "../web/node_modules/d3-quadtree/src/quad.js", "../web/node_modules/d3-quadtree/src/find.js", "../web/node_modules/d3-quadtree/src/remove.js", "../web/node_modules/d3-quadtree/src/root.js", "../web/node_modules/d3-quadtree/src/size.js", "../web/node_modules/d3-quadtree/src/visit.js", "../web/node_modules/d3-quadtree/src/visitAfter.js", "../web/node_modules/d3-quadtree/src/x.js", "../web/node_modules/d3-quadtree/src/y.js", "../web/node_modules/d3-quadtree/src/quadtree.js", "../web/node_modules/d3-force/src/constant.js", "../web/node_modules/d3-force/src/jiggle.js", "../web/node_modules/d3-force/src/link.js", "../web/node_modules/d3-force/src/lcg.js", "../web/node_modules/d3-force/src/simulation.js", "../web/node_modules/d3-force/src/manyBody.js", "../web/node_modules/d3-zoom/src/constant.js", "../web/node_modules/d3-zoom/src/event.js", "../web/node_modules/d3-zoom/src/transform.js", "../web/node_modules/d3-zoom/src/noevent.js", "../web/node_modules/d3-zoom/src/zoom.js", "../web/src/main.ts"], - "sourcesContent": ["var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n", "export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n", "import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n", "import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n", "function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don\u2019t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n", "function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n", "export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n", "import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "export default function(update) {\n return new Array(update.length);\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don\u2019t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn\u2019t worried about \u201Clive\u201D collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don\u2019t; we\u2019d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n", "export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n", "export default function() {\n return Array.from(this);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n", "export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n", "export default function() {\n return !this.node();\n}\n", "export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n", "import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n", "export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n", "import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n", "function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n", "function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n", "function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n", "function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n", "function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n", "function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n", "import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n", "import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n", "function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n", "function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n", "export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n", "function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n", "import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n", "export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n", "import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n", "import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n", "export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n", "import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n", "// These are typically used in conjunction with noevent to ensure that we can\n// preventDefault on the event.\nexport const nonpassive = {passive: false};\nexport const nonpassivecapture = {capture: true, passive: false};\n\nexport function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {select} from \"d3-selection\";\nimport noevent, {nonpassivecapture} from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, nonpassivecapture);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, nonpassivecapture);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, nonpassivecapture);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n", "export default x => () => x;\n", "export default function DragEvent(type, {\n sourceEvent,\n subject,\n target,\n identifier,\n active,\n x, y, dx, dy,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n subject: {value: subject, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n identifier: {value: identifier, enumerable: true, configurable: true},\n active: {value: active, enumerable: true, configurable: true},\n x: {value: x, enumerable: true, configurable: true},\n y: {value: y, enumerable: true, configurable: true},\n dx: {value: dx, enumerable: true, configurable: true},\n dy: {value: dy, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n", "import {dispatch} from \"d3-dispatch\";\nimport {select, pointer} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag.js\";\nimport noevent, {nonpassive, nonpassivecapture, nopropagation} from \"./noevent.js\";\nimport constant from \"./constant.js\";\nimport DragEvent from \"./event.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(event, d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved, nonpassive)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned(event, d) {\n if (touchending || !filter.call(this, event, d)) return;\n var gesture = beforestart(this, container.call(this, event, d), event, d, \"mouse\");\n if (!gesture) return;\n select(event.view)\n .on(\"mousemove.drag\", mousemoved, nonpassivecapture)\n .on(\"mouseup.drag\", mouseupped, nonpassivecapture);\n nodrag(event.view);\n nopropagation(event);\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\", event);\n }\n\n function mousemoved(event) {\n noevent(event);\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\", event);\n }\n\n function mouseupped(event) {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent(event);\n gestures.mouse(\"end\", event);\n }\n\n function touchstarted(event, d) {\n if (!filter.call(this, event, d)) return;\n var touches = event.changedTouches,\n c = container.call(this, event, d),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {\n nopropagation(event);\n gesture(\"start\", event, touches[i]);\n }\n }\n }\n\n function touchmoved(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent(event);\n gesture(\"drag\", event, touches[i]);\n }\n }\n }\n\n function touchended(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation(event);\n gesture(\"end\", event, touches[i]);\n }\n }\n }\n\n function beforestart(that, container, event, d, identifier, touch) {\n var dispatch = listeners.copy(),\n p = pointer(touch || event, container), dx, dy,\n s;\n\n if ((s = subject.call(that, new DragEvent(\"beforestart\", {\n sourceEvent: event,\n target: drag,\n identifier,\n active,\n x: p[0],\n y: p[1],\n dx: 0,\n dy: 0,\n dispatch\n }), d)) == null) return;\n\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n\n return function gesture(type, event, touch) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[identifier] = gesture, n = active++; break;\n case \"end\": delete gestures[identifier], --active; // falls through\n case \"drag\": p = pointer(touch || event, container), n = active; break;\n }\n dispatch.call(\n type,\n that,\n new DragEvent(type, {\n sourceEvent: event,\n subject: s,\n target: drag,\n identifier,\n active: n,\n x: p[0] + dx,\n y: p[1] + dy,\n dx: p[0] - p0[0],\n dy: p[1] - p0[1],\n dispatch\n }),\n d\n );\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n", "export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n", "import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n", "export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "export default x => () => x;\n", "import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n", "import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n", "export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n", "import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n", "var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n", "import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n", "import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n", "var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 \u2245 u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n", "var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we\u2019ve set an alarm, if we haven\u2019t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n", "import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n", "import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n", "import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n", "import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n", "import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n", "import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n", "import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n", "import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n", "import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n", "import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n", "import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n", "function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n", "import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n", "import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n", "import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n", "function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n", "import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n", "function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n", "import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n", "import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n", "import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n", "export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n", "import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name \u201C__brush\u201D rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection, event) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start(event).brush(event).end(event);\n });\n }\n };\n\n brush.clear = function(group, event) {\n brush.move(group, null, event);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move(event);\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move(event);\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move(event);\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move(event);\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n", "export default function(x, y) {\n var nodes, strength = 1;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x, sy += node.y;\n }\n\n for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) {\n node = nodes[i], node.x -= sx, node.y -= sy;\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n return force;\n}\n", "export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n", "export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don\u2019t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n", "export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n", "export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n", "export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can\u2019t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn\u2019t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n", "export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n", "export default function() {\n return this._root;\n}\n", "export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n", "export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n", "export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n", "import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "export default function(random) {\n return (random() - 0.5) * 1e-6;\n}\n", "import constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"node not found: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n count,\n bias,\n random,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle(random);\n y = target.y + target.vy - source.y - source.vy || jiggle(random);\n l = Math.sqrt(x * x + y * y);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l;\n target.vx -= x * (b = bias[i]);\n target.vy -= y * b;\n source.vx += x * (b = 1 - b);\n source.vy += y * b;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n", "// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport default function() {\n let s = 1;\n return () => (s = (a * s + c) % m) / m;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer} from \"d3-timer\";\nimport lcg from \"./lcg.js\";\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = new Map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\"),\n random = lcg();\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.forEach(function(force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes, random);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n randomSource: function(_) {\n return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n", "import {quadtree} from \"d3-quadtree\";\nimport constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\nimport {x, y} from \"./simulation.js\";\n\nexport default function() {\n var nodes,\n node,\n random,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate);\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(quad) {\n var strength = 0, q, c, weight = 0, x, y, i;\n\n // For internal nodes, accumulate forces from child quadrants.\n if (quad.length) {\n for (x = y = i = 0; i < 4; ++i) {\n if ((q = quad[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n }\n }\n quad.x = x / weight;\n quad.y = y / weight;\n }\n\n // For leaf nodes, accumulate forces from coincident quadrants.\n else {\n q = quad;\n q.x = q.data.x;\n q.y = q.data.y;\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n quad.value = strength;\n }\n\n function apply(quad, x1, _, x2) {\n if (!quad.value) return true;\n\n var x = quad.x - node.x,\n y = quad.y - node.y,\n w = x2 - x1,\n l = x * x + y * y;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * quad.value * alpha / l;\n node.vy += y * quad.value * alpha / l;\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (quad.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (quad.data !== node || quad.next) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (quad.data !== node) {\n w = strengths[quad.data.index] * alpha / l;\n node.vx += x * w;\n node.vy += y * w;\n } while (quad = quad.next);\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n", "export default x => () => x;\n", "export default function ZoomEvent(type, {\n sourceEvent,\n target,\n transform,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n transform: {value: transform, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n", "export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n", "export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {select, pointer} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction defaultFilter(event) {\n return (!event.ctrlKey || event.type === 'wheel') && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled, {passive: false})\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).event(event).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).event(event).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won\u2019t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n", "import * as d3 from \"d3\";\n\ntype NodeDatum = {\n id: string;\n label: string;\n score?: number | null;\n tier?: string | null;\n type: string;\n};\n\ntype EdgeDatum = {\n source: string;\n target: string;\n type: string;\n};\n\nfunction scoreColor(score?: number | null): string {\n if (score == null || isNaN(score)) return \"#d3d3d3\";\n const s = Math.min(1, Math.max(0, score));\n let r = 0, g = 0;\n if (s < 0.5) {\n r = Math.floor(2 * s * 255);\n g = 255;\n } else {\n r = 255;\n g = Math.floor((1 - 2 * (s - 0.5)) * 255);\n }\n return `rgb(${r},${g},0)`;\n}\n\nasync function loadData() {\n const res = await fetch(\"goblin.json\", { cache: \"no-store\" });\n return (await res.json()) as {\n nodes: NodeDatum[];\n edges: EdgeDatum[];\n };\n}\n\nfunction renderGraph(container: HTMLElement, nodes: NodeDatum[], edges: EdgeDatum[]) {\n const width = container.clientWidth || 960;\n const height = container.clientHeight || 600;\n\n const svg = d3.select(container).append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const zoomLayer = svg.append(\"g\");\n\n const link = zoomLayer.append(\"g\")\n .attr(\"stroke\", \"#999\")\n .attr(\"stroke-opacity\", 0.6)\n .selectAll(\"line\")\n .data(edges)\n .join(\"line\")\n .attr(\"stroke-dasharray\", d => d.type === \"overlapsWith\" ? \"4,3\" : d.type === \"dependsOn\" ? \"2,3\" : \"0\");\n\n const node = zoomLayer.append(\"g\")\n .selectAll(\"g\")\n .data(nodes)\n .join(\"g\")\n .call(d3.drag()\n .on(\"start\", (event, d: any) => {\n if (!event.active) simulation.alphaTarget(0.3).restart();\n d.fx = d.x; d.fy = d.y;\n })\n .on(\"drag\", (event, d: any) => {\n d.fx = event.x; d.fy = event.y;\n })\n .on(\"end\", (event, d: any) => {\n if (!event.active) simulation.alphaTarget(0);\n d.fx = null; d.fy = null;\n })\n );\n\n node.append(\"rect\")\n .attr(\"rx\", 8).attr(\"ry\", 8)\n .attr(\"x\", -60).attr(\"y\", -16)\n .attr(\"width\", 120).attr(\"height\", 32)\n .attr(\"fill\", d => scoreColor(d.score))\n .attr(\"stroke\", \"#333\");\n\n node.append(\"text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"middle\")\n .attr(\"font-family\", \"Helvetica, Arial, sans-serif\")\n .attr(\"font-size\", 11)\n .text(d => d.label);\n\n const idToNode: Record = {};\n nodes.forEach((n: any) => { idToNode[n.id] = n; });\n\n const simulation = d3.forceSimulation(nodes as any)\n .force(\"link\", d3.forceLink(edges as any).id((d: any) => d.id).distance(120))\n .force(\"charge\", d3.forceManyBody().strength(-180))\n .force(\"center\", d3.forceCenter(width / 2, height / 2))\n .on(\"tick\", () => {\n link\n .attr(\"x1\", (d: any) => idToNode[d.source].x)\n .attr(\"y1\", (d: any) => idToNode[d.source].y)\n .attr(\"x2\", (d: any) => idToNode[d.target].x)\n .attr(\"y2\", (d: any) => idToNode[d.target].y);\n\n node.attr(\"transform\", (d: any) => `translate(${d.x},${d.y})`);\n });\n\n svg.call(d3.zoom()\n .scaleExtent([0.3, 3])\n .on(\"zoom\", (event) => zoomLayer.attr(\"transform\", event.transform)));\n}\n\nasync function main() {\n const app = document.getElementById(\"app\")!;\n app.innerHTML = \"
Loading goblin graph\u2026
\";\n try {\n const { nodes, edges } = await loadData();\n app.innerHTML = \"\";\n renderGraph(app, nodes, edges);\n } catch (e) {\n app.innerHTML = \"
Failed to load goblin.json
\";\n console.error(e);\n }\n}\n\nmain();\n\n\n"], + "sourcesContent": ["var noop = {value: () => {}};\n\nfunction dispatch() {\n for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {\n if (!(t = arguments[i] + \"\") || (t in _) || /[\\s.]/.test(t)) throw new Error(\"illegal type: \" + t);\n _[t] = [];\n }\n return new Dispatch(_);\n}\n\nfunction Dispatch(_) {\n this._ = _;\n}\n\nfunction parseTypenames(typenames, types) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n if (t && !types.hasOwnProperty(t)) throw new Error(\"unknown type: \" + t);\n return {type: t, name: name};\n });\n}\n\nDispatch.prototype = dispatch.prototype = {\n constructor: Dispatch,\n on: function(typename, callback) {\n var _ = this._,\n T = parseTypenames(typename + \"\", _),\n t,\n i = -1,\n n = T.length;\n\n // If no callback was specified, return the callback of the given type and name.\n if (arguments.length < 2) {\n while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;\n return;\n }\n\n // If a type was specified, set the callback for the given type and name.\n // Otherwise, if a null callback was specified, remove callbacks of the given name.\n if (callback != null && typeof callback !== \"function\") throw new Error(\"invalid callback: \" + callback);\n while (++i < n) {\n if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);\n else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);\n }\n\n return this;\n },\n copy: function() {\n var copy = {}, _ = this._;\n for (var t in _) copy[t] = _[t].slice();\n return new Dispatch(copy);\n },\n call: function(type, that) {\n if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n },\n apply: function(type, that, args) {\n if (!this._.hasOwnProperty(type)) throw new Error(\"unknown type: \" + type);\n for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);\n }\n};\n\nfunction get(type, name) {\n for (var i = 0, n = type.length, c; i < n; ++i) {\n if ((c = type[i]).name === name) {\n return c.value;\n }\n }\n}\n\nfunction set(type, name, callback) {\n for (var i = 0, n = type.length; i < n; ++i) {\n if (type[i].name === name) {\n type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));\n break;\n }\n }\n if (callback != null) type.push({name: name, value: callback});\n return type;\n}\n\nexport default dispatch;\n", "export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n", "import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n", "import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n", "function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don\u2019t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n", "function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n", "import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n", "export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n", "import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n", "import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n", "export default function(update) {\n return new Array(update.length);\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don\u2019t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn\u2019t worried about \u201Clive\u201D collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don\u2019t; we\u2019d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n", "import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n", "export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n", "import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n", "export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n", "export default function() {\n return Array.from(this);\n}\n", "export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n", "export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n", "export default function() {\n return !this.node();\n}\n", "export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n", "import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n", "export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n", "import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n", "function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n", "function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n", "function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n", "function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n", "function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n", "function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n", "import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n", "import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n", "function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n", "function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n", "export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n", "function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n", "import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n", "export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n", "import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n", "import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n", "export default function(event) {\n let sourceEvent;\n while (sourceEvent = event.sourceEvent) event = sourceEvent;\n return event;\n}\n", "import sourceEvent from \"./sourceEvent.js\";\n\nexport default function(event, node) {\n event = sourceEvent(event);\n if (node === undefined) node = event.currentTarget;\n if (node) {\n var svg = node.ownerSVGElement || node;\n if (svg.createSVGPoint) {\n var point = svg.createSVGPoint();\n point.x = event.clientX, point.y = event.clientY;\n point = point.matrixTransform(node.getScreenCTM().inverse());\n return [point.x, point.y];\n }\n if (node.getBoundingClientRect) {\n var rect = node.getBoundingClientRect();\n return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];\n }\n }\n return [event.pageX, event.pageY];\n}\n", "// These are typically used in conjunction with noevent to ensure that we can\n// preventDefault on the event.\nexport const nonpassive = {passive: false};\nexport const nonpassivecapture = {capture: true, passive: false};\n\nexport function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {select} from \"d3-selection\";\nimport noevent, {nonpassivecapture} from \"./noevent.js\";\n\nexport default function(view) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", noevent, nonpassivecapture);\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", noevent, nonpassivecapture);\n } else {\n root.__noselect = root.style.MozUserSelect;\n root.style.MozUserSelect = \"none\";\n }\n}\n\nexport function yesdrag(view, noclick) {\n var root = view.document.documentElement,\n selection = select(view).on(\"dragstart.drag\", null);\n if (noclick) {\n selection.on(\"click.drag\", noevent, nonpassivecapture);\n setTimeout(function() { selection.on(\"click.drag\", null); }, 0);\n }\n if (\"onselectstart\" in root) {\n selection.on(\"selectstart.drag\", null);\n } else {\n root.style.MozUserSelect = root.__noselect;\n delete root.__noselect;\n }\n}\n", "export default x => () => x;\n", "export default function DragEvent(type, {\n sourceEvent,\n subject,\n target,\n identifier,\n active,\n x, y, dx, dy,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n subject: {value: subject, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n identifier: {value: identifier, enumerable: true, configurable: true},\n active: {value: active, enumerable: true, configurable: true},\n x: {value: x, enumerable: true, configurable: true},\n y: {value: y, enumerable: true, configurable: true},\n dx: {value: dx, enumerable: true, configurable: true},\n dy: {value: dy, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n\nDragEvent.prototype.on = function() {\n var value = this._.on.apply(this._, arguments);\n return value === this._ ? this : value;\n};\n", "import {dispatch} from \"d3-dispatch\";\nimport {select, pointer} from \"d3-selection\";\nimport nodrag, {yesdrag} from \"./nodrag.js\";\nimport noevent, {nonpassive, nonpassivecapture, nopropagation} from \"./noevent.js\";\nimport constant from \"./constant.js\";\nimport DragEvent from \"./event.js\";\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultContainer() {\n return this.parentNode;\n}\n\nfunction defaultSubject(event, d) {\n return d == null ? {x: event.x, y: event.y} : d;\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nexport default function() {\n var filter = defaultFilter,\n container = defaultContainer,\n subject = defaultSubject,\n touchable = defaultTouchable,\n gestures = {},\n listeners = dispatch(\"start\", \"drag\", \"end\"),\n active = 0,\n mousedownx,\n mousedowny,\n mousemoving,\n touchending,\n clickDistance2 = 0;\n\n function drag(selection) {\n selection\n .on(\"mousedown.drag\", mousedowned)\n .filter(touchable)\n .on(\"touchstart.drag\", touchstarted)\n .on(\"touchmove.drag\", touchmoved, nonpassive)\n .on(\"touchend.drag touchcancel.drag\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n function mousedowned(event, d) {\n if (touchending || !filter.call(this, event, d)) return;\n var gesture = beforestart(this, container.call(this, event, d), event, d, \"mouse\");\n if (!gesture) return;\n select(event.view)\n .on(\"mousemove.drag\", mousemoved, nonpassivecapture)\n .on(\"mouseup.drag\", mouseupped, nonpassivecapture);\n nodrag(event.view);\n nopropagation(event);\n mousemoving = false;\n mousedownx = event.clientX;\n mousedowny = event.clientY;\n gesture(\"start\", event);\n }\n\n function mousemoved(event) {\n noevent(event);\n if (!mousemoving) {\n var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;\n mousemoving = dx * dx + dy * dy > clickDistance2;\n }\n gestures.mouse(\"drag\", event);\n }\n\n function mouseupped(event) {\n select(event.view).on(\"mousemove.drag mouseup.drag\", null);\n yesdrag(event.view, mousemoving);\n noevent(event);\n gestures.mouse(\"end\", event);\n }\n\n function touchstarted(event, d) {\n if (!filter.call(this, event, d)) return;\n var touches = event.changedTouches,\n c = container.call(this, event, d),\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) {\n nopropagation(event);\n gesture(\"start\", event, touches[i]);\n }\n }\n }\n\n function touchmoved(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n noevent(event);\n gesture(\"drag\", event, touches[i]);\n }\n }\n }\n\n function touchended(event) {\n var touches = event.changedTouches,\n n = touches.length, i, gesture;\n\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n for (i = 0; i < n; ++i) {\n if (gesture = gestures[touches[i].identifier]) {\n nopropagation(event);\n gesture(\"end\", event, touches[i]);\n }\n }\n }\n\n function beforestart(that, container, event, d, identifier, touch) {\n var dispatch = listeners.copy(),\n p = pointer(touch || event, container), dx, dy,\n s;\n\n if ((s = subject.call(that, new DragEvent(\"beforestart\", {\n sourceEvent: event,\n target: drag,\n identifier,\n active,\n x: p[0],\n y: p[1],\n dx: 0,\n dy: 0,\n dispatch\n }), d)) == null) return;\n\n dx = s.x - p[0] || 0;\n dy = s.y - p[1] || 0;\n\n return function gesture(type, event, touch) {\n var p0 = p, n;\n switch (type) {\n case \"start\": gestures[identifier] = gesture, n = active++; break;\n case \"end\": delete gestures[identifier], --active; // falls through\n case \"drag\": p = pointer(touch || event, container), n = active; break;\n }\n dispatch.call(\n type,\n that,\n new DragEvent(type, {\n sourceEvent: event,\n subject: s,\n target: drag,\n identifier,\n active: n,\n x: p[0] + dx,\n y: p[1] + dy,\n dx: p[0] - p0[0],\n dy: p[1] - p0[1],\n dispatch\n }),\n d\n );\n };\n }\n\n drag.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), drag) : filter;\n };\n\n drag.container = function(_) {\n return arguments.length ? (container = typeof _ === \"function\" ? _ : constant(_), drag) : container;\n };\n\n drag.subject = function(_) {\n return arguments.length ? (subject = typeof _ === \"function\" ? _ : constant(_), drag) : subject;\n };\n\n drag.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), drag) : touchable;\n };\n\n drag.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? drag : value;\n };\n\n drag.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);\n };\n\n return drag;\n}\n", "export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n", "import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n", "export function basis(t1, v0, v1, v2, v3) {\n var t2 = t1 * t1, t3 = t2 * t1;\n return ((1 - 3 * t1 + 3 * t2 - t3) * v0\n + (4 - 6 * t2 + 3 * t3) * v1\n + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2\n + t3 * v3) / 6;\n}\n\nexport default function(values) {\n var n = values.length - 1;\n return function(t) {\n var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),\n v1 = values[i],\n v2 = values[i + 1],\n v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,\n v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "import {basis} from \"./basis.js\";\n\nexport default function(values) {\n var n = values.length;\n return function(t) {\n var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),\n v0 = values[(i + n - 1) % n],\n v1 = values[i % n],\n v2 = values[(i + 1) % n],\n v3 = values[(i + 2) % n];\n return basis((t - i / n) * n, v0, v1, v2, v3);\n };\n}\n", "export default x => () => x;\n", "import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n", "import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n", "export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n", "import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n", "var degrees = 180 / Math.PI;\n\nexport var identity = {\n translateX: 0,\n translateY: 0,\n rotate: 0,\n skewX: 0,\n scaleX: 1,\n scaleY: 1\n};\n\nexport default function(a, b, c, d, e, f) {\n var scaleX, scaleY, skewX;\n if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;\n if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;\n if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;\n if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;\n return {\n translateX: e,\n translateY: f,\n rotate: Math.atan2(b, a) * degrees,\n skewX: Math.atan(skewX) * degrees,\n scaleX: scaleX,\n scaleY: scaleY\n };\n}\n", "import decompose, {identity} from \"./decompose.js\";\n\nvar svgNode;\n\n/* eslint-disable no-undef */\nexport function parseCss(value) {\n const m = new (typeof DOMMatrix === \"function\" ? DOMMatrix : WebKitCSSMatrix)(value + \"\");\n return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f);\n}\n\nexport function parseSvg(value) {\n if (value == null) return identity;\n if (!svgNode) svgNode = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n svgNode.setAttribute(\"transform\", value);\n if (!(value = svgNode.transform.baseVal.consolidate())) return identity;\n value = value.matrix;\n return decompose(value.a, value.b, value.c, value.d, value.e, value.f);\n}\n", "import number from \"../number.js\";\nimport {parseCss, parseSvg} from \"./parse.js\";\n\nfunction interpolateTransform(parse, pxComma, pxParen, degParen) {\n\n function pop(s) {\n return s.length ? s.pop() + \" \" : \"\";\n }\n\n function translate(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(\"translate(\", null, pxComma, null, pxParen);\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb || yb) {\n s.push(\"translate(\" + xb + pxComma + yb + pxParen);\n }\n }\n\n function rotate(a, b, s, q) {\n if (a !== b) {\n if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path\n q.push({i: s.push(pop(s) + \"rotate(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"rotate(\" + b + degParen);\n }\n }\n\n function skewX(a, b, s, q) {\n if (a !== b) {\n q.push({i: s.push(pop(s) + \"skewX(\", null, degParen) - 2, x: number(a, b)});\n } else if (b) {\n s.push(pop(s) + \"skewX(\" + b + degParen);\n }\n }\n\n function scale(xa, ya, xb, yb, s, q) {\n if (xa !== xb || ya !== yb) {\n var i = s.push(pop(s) + \"scale(\", null, \",\", null, \")\");\n q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)});\n } else if (xb !== 1 || yb !== 1) {\n s.push(pop(s) + \"scale(\" + xb + \",\" + yb + \")\");\n }\n }\n\n return function(a, b) {\n var s = [], // string constants and placeholders\n q = []; // number interpolators\n a = parse(a), b = parse(b);\n translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);\n rotate(a.rotate, b.rotate, s, q);\n skewX(a.skewX, b.skewX, s, q);\n scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);\n a = b = null; // gc\n return function(t) {\n var i = -1, n = q.length, o;\n while (++i < n) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n };\n };\n}\n\nexport var interpolateTransformCss = interpolateTransform(parseCss, \"px, \", \"px)\", \"deg)\");\nexport var interpolateTransformSvg = interpolateTransform(parseSvg, \", \", \")\", \")\");\n", "var epsilon2 = 1e-12;\n\nfunction cosh(x) {\n return ((x = Math.exp(x)) + 1 / x) / 2;\n}\n\nfunction sinh(x) {\n return ((x = Math.exp(x)) - 1 / x) / 2;\n}\n\nfunction tanh(x) {\n return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n}\n\nexport default (function zoomRho(rho, rho2, rho4) {\n\n // p0 = [ux0, uy0, w0]\n // p1 = [ux1, uy1, w1]\n function zoom(p0, p1) {\n var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],\n ux1 = p1[0], uy1 = p1[1], w1 = p1[2],\n dx = ux1 - ux0,\n dy = uy1 - uy0,\n d2 = dx * dx + dy * dy,\n i,\n S;\n\n // Special case for u0 \u2245 u1.\n if (d2 < epsilon2) {\n S = Math.log(w1 / w0) / rho;\n i = function(t) {\n return [\n ux0 + t * dx,\n uy0 + t * dy,\n w0 * Math.exp(rho * t * S)\n ];\n }\n }\n\n // General case.\n else {\n var d1 = Math.sqrt(d2),\n b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),\n b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),\n r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),\n r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n S = (r1 - r0) / rho;\n i = function(t) {\n var s = t * S,\n coshr0 = cosh(r0),\n u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));\n return [\n ux0 + u * dx,\n uy0 + u * dy,\n w0 * coshr0 / cosh(rho * s + r0)\n ];\n }\n }\n\n i.duration = S * 1000 * rho / Math.SQRT2;\n\n return i;\n }\n\n zoom.rho = function(_) {\n var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2;\n return zoomRho(_1, _2, _4);\n };\n\n return zoom;\n})(Math.SQRT2, 2, 4);\n", "var frame = 0, // is an animation frame pending?\n timeout = 0, // is a timeout pending?\n interval = 0, // are any timers active?\n pokeDelay = 1000, // how frequently we check for clock skew\n taskHead,\n taskTail,\n clockLast = 0,\n clockNow = 0,\n clockSkew = 0,\n clock = typeof performance === \"object\" && performance.now ? performance : Date,\n setFrame = typeof window === \"object\" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };\n\nexport function now() {\n return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);\n}\n\nfunction clearNow() {\n clockNow = 0;\n}\n\nexport function Timer() {\n this._call =\n this._time =\n this._next = null;\n}\n\nTimer.prototype = timer.prototype = {\n constructor: Timer,\n restart: function(callback, delay, time) {\n if (typeof callback !== \"function\") throw new TypeError(\"callback is not a function\");\n time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);\n if (!this._next && taskTail !== this) {\n if (taskTail) taskTail._next = this;\n else taskHead = this;\n taskTail = this;\n }\n this._call = callback;\n this._time = time;\n sleep();\n },\n stop: function() {\n if (this._call) {\n this._call = null;\n this._time = Infinity;\n sleep();\n }\n }\n};\n\nexport function timer(callback, delay, time) {\n var t = new Timer;\n t.restart(callback, delay, time);\n return t;\n}\n\nexport function timerFlush() {\n now(); // Get the current time, if not already set.\n ++frame; // Pretend we\u2019ve set an alarm, if we haven\u2019t already.\n var t = taskHead, e;\n while (t) {\n if ((e = clockNow - t._time) >= 0) t._call.call(undefined, e);\n t = t._next;\n }\n --frame;\n}\n\nfunction wake() {\n clockNow = (clockLast = clock.now()) + clockSkew;\n frame = timeout = 0;\n try {\n timerFlush();\n } finally {\n frame = 0;\n nap();\n clockNow = 0;\n }\n}\n\nfunction poke() {\n var now = clock.now(), delay = now - clockLast;\n if (delay > pokeDelay) clockSkew -= delay, clockLast = now;\n}\n\nfunction nap() {\n var t0, t1 = taskHead, t2, time = Infinity;\n while (t1) {\n if (t1._call) {\n if (time > t1._time) time = t1._time;\n t0 = t1, t1 = t1._next;\n } else {\n t2 = t1._next, t1._next = null;\n t1 = t0 ? t0._next = t2 : taskHead = t2;\n }\n }\n taskTail = t0;\n sleep(time);\n}\n\nfunction sleep(time) {\n if (frame) return; // Soonest alarm already set, or will be.\n if (timeout) timeout = clearTimeout(timeout);\n var delay = time - clockNow; // Strictly less than if we recomputed clockNow.\n if (delay > 24) {\n if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);\n if (interval) interval = clearInterval(interval);\n } else {\n if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);\n frame = 1, setFrame(wake);\n }\n}\n", "import {Timer} from \"./timer.js\";\n\nexport default function(callback, delay, time) {\n var t = new Timer;\n delay = delay == null ? 0 : +delay;\n t.restart(elapsed => {\n t.stop();\n callback(elapsed + delay);\n }, delay, time);\n return t;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer, timeout} from \"d3-timer\";\n\nvar emptyOn = dispatch(\"start\", \"end\", \"cancel\", \"interrupt\");\nvar emptyTween = [];\n\nexport var CREATED = 0;\nexport var SCHEDULED = 1;\nexport var STARTING = 2;\nexport var STARTED = 3;\nexport var RUNNING = 4;\nexport var ENDING = 5;\nexport var ENDED = 6;\n\nexport default function(node, name, id, index, group, timing) {\n var schedules = node.__transition;\n if (!schedules) node.__transition = {};\n else if (id in schedules) return;\n create(node, id, {\n name: name,\n index: index, // For context during callback.\n group: group, // For context during callback.\n on: emptyOn,\n tween: emptyTween,\n time: timing.time,\n delay: timing.delay,\n duration: timing.duration,\n ease: timing.ease,\n timer: null,\n state: CREATED\n });\n}\n\nexport function init(node, id) {\n var schedule = get(node, id);\n if (schedule.state > CREATED) throw new Error(\"too late; already scheduled\");\n return schedule;\n}\n\nexport function set(node, id) {\n var schedule = get(node, id);\n if (schedule.state > STARTED) throw new Error(\"too late; already running\");\n return schedule;\n}\n\nexport function get(node, id) {\n var schedule = node.__transition;\n if (!schedule || !(schedule = schedule[id])) throw new Error(\"transition not found\");\n return schedule;\n}\n\nfunction create(node, id, self) {\n var schedules = node.__transition,\n tween;\n\n // Initialize the self timer when the transition is created.\n // Note the actual delay is not known until the first callback!\n schedules[id] = self;\n self.timer = timer(schedule, 0, self.time);\n\n function schedule(elapsed) {\n self.state = SCHEDULED;\n self.timer.restart(start, self.delay, self.time);\n\n // If the elapsed delay is less than our first sleep, start immediately.\n if (self.delay <= elapsed) start(elapsed - self.delay);\n }\n\n function start(elapsed) {\n var i, j, n, o;\n\n // If the state is not SCHEDULED, then we previously errored on start.\n if (self.state !== SCHEDULED) return stop();\n\n for (i in schedules) {\n o = schedules[i];\n if (o.name !== self.name) continue;\n\n // While this element already has a starting transition during this frame,\n // defer starting an interrupting transition until that transition has a\n // chance to tick (and possibly end); see d3/d3-transition#54!\n if (o.state === STARTED) return timeout(start);\n\n // Interrupt the active transition, if any.\n if (o.state === RUNNING) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"interrupt\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n\n // Cancel any pre-empted transitions.\n else if (+i < id) {\n o.state = ENDED;\n o.timer.stop();\n o.on.call(\"cancel\", node, node.__data__, o.index, o.group);\n delete schedules[i];\n }\n }\n\n // Defer the first tick to end of the current frame; see d3/d3#1576.\n // Note the transition may be canceled after start and before the first tick!\n // Note this must be scheduled before the start event; see d3/d3-transition#16!\n // Assuming this is successful, subsequent callbacks go straight to tick.\n timeout(function() {\n if (self.state === STARTED) {\n self.state = RUNNING;\n self.timer.restart(tick, self.delay, self.time);\n tick(elapsed);\n }\n });\n\n // Dispatch the start event.\n // Note this must be done before the tween are initialized.\n self.state = STARTING;\n self.on.call(\"start\", node, node.__data__, self.index, self.group);\n if (self.state !== STARTING) return; // interrupted\n self.state = STARTED;\n\n // Initialize the tween, deleting null tween.\n tween = new Array(n = self.tween.length);\n for (i = 0, j = -1; i < n; ++i) {\n if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {\n tween[++j] = o;\n }\n }\n tween.length = j + 1;\n }\n\n function tick(elapsed) {\n var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),\n i = -1,\n n = tween.length;\n\n while (++i < n) {\n tween[i].call(node, t);\n }\n\n // Dispatch the end event.\n if (self.state === ENDING) {\n self.on.call(\"end\", node, node.__data__, self.index, self.group);\n stop();\n }\n }\n\n function stop() {\n self.state = ENDED;\n self.timer.stop();\n delete schedules[id];\n for (var i in schedules) return; // eslint-disable-line no-unused-vars\n delete node.__transition;\n }\n}\n", "import {STARTING, ENDING, ENDED} from \"./transition/schedule.js\";\n\nexport default function(node, name) {\n var schedules = node.__transition,\n schedule,\n active,\n empty = true,\n i;\n\n if (!schedules) return;\n\n name = name == null ? null : name + \"\";\n\n for (i in schedules) {\n if ((schedule = schedules[i]).name !== name) { empty = false; continue; }\n active = schedule.state > STARTING && schedule.state < ENDING;\n schedule.state = ENDED;\n schedule.timer.stop();\n schedule.on.call(active ? \"interrupt\" : \"cancel\", node, node.__data__, schedule.index, schedule.group);\n delete schedules[i];\n }\n\n if (empty) delete node.__transition;\n}\n", "import interrupt from \"../interrupt.js\";\n\nexport default function(name) {\n return this.each(function() {\n interrupt(this, name);\n });\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction tweenRemove(id, name) {\n var tween0, tween1;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = tween0 = tween;\n for (var i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1 = tween1.slice();\n tween1.splice(i, 1);\n break;\n }\n }\n }\n\n schedule.tween = tween1;\n };\n}\n\nfunction tweenFunction(id, name, value) {\n var tween0, tween1;\n if (typeof value !== \"function\") throw new Error;\n return function() {\n var schedule = set(this, id),\n tween = schedule.tween;\n\n // If this node shared tween with the previous node,\n // just assign the updated shared tween and we\u2019re done!\n // Otherwise, copy-on-write.\n if (tween !== tween0) {\n tween1 = (tween0 = tween).slice();\n for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {\n if (tween1[i].name === name) {\n tween1[i] = t;\n break;\n }\n }\n if (i === n) tween1.push(t);\n }\n\n schedule.tween = tween1;\n };\n}\n\nexport default function(name, value) {\n var id = this._id;\n\n name += \"\";\n\n if (arguments.length < 2) {\n var tween = get(this.node(), id).tween;\n for (var i = 0, n = tween.length, t; i < n; ++i) {\n if ((t = tween[i]).name === name) {\n return t.value;\n }\n }\n return null;\n }\n\n return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));\n}\n\nexport function tweenValue(transition, name, value) {\n var id = transition._id;\n\n transition.each(function() {\n var schedule = set(this, id);\n (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);\n });\n\n return function(node) {\n return get(node, id).value[name];\n };\n}\n", "import {color} from \"d3-color\";\nimport {interpolateNumber, interpolateRgb, interpolateString} from \"d3-interpolate\";\n\nexport default function(a, b) {\n var c;\n return (typeof b === \"number\" ? interpolateNumber\n : b instanceof color ? interpolateRgb\n : (c = color(b)) ? (b = c, interpolateRgb)\n : interpolateString)(a, b);\n}\n", "import {interpolateTransformSvg as interpolateTransform} from \"d3-interpolate\";\nimport {namespace} from \"d3-selection\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttribute(name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrConstantNS(fullname, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = this.getAttributeNS(fullname.space, fullname.local);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction attrFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttribute(name);\n string0 = this.getAttribute(name);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction attrFunctionNS(fullname, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0, value1 = value(this), string1;\n if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);\n string0 = this.getAttributeNS(fullname.space, fullname.local);\n string1 = value1 + \"\";\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name), i = fullname === \"transform\" ? interpolateTransform : interpolate;\n return this.attrTween(name, typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, \"attr.\" + name, value))\n : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)\n : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));\n}\n", "import {namespace} from \"d3-selection\";\n\nfunction attrInterpolate(name, i) {\n return function(t) {\n this.setAttribute(name, i.call(this, t));\n };\n}\n\nfunction attrInterpolateNS(fullname, i) {\n return function(t) {\n this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));\n };\n}\n\nfunction attrTweenNS(fullname, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nfunction attrTween(name, value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value) {\n var key = \"attr.\" + name;\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n var fullname = namespace(name);\n return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));\n}\n", "import {get, init} from \"./schedule.js\";\n\nfunction delayFunction(id, value) {\n return function() {\n init(this, id).delay = +value.apply(this, arguments);\n };\n}\n\nfunction delayConstant(id, value) {\n return value = +value, function() {\n init(this, id).delay = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? delayFunction\n : delayConstant)(id, value))\n : get(this.node(), id).delay;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction durationFunction(id, value) {\n return function() {\n set(this, id).duration = +value.apply(this, arguments);\n };\n}\n\nfunction durationConstant(id, value) {\n return value = +value, function() {\n set(this, id).duration = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each((typeof value === \"function\"\n ? durationFunction\n : durationConstant)(id, value))\n : get(this.node(), id).duration;\n}\n", "import {get, set} from \"./schedule.js\";\n\nfunction easeConstant(id, value) {\n if (typeof value !== \"function\") throw new Error;\n return function() {\n set(this, id).ease = value;\n };\n}\n\nexport default function(value) {\n var id = this._id;\n\n return arguments.length\n ? this.each(easeConstant(id, value))\n : get(this.node(), id).ease;\n}\n", "import {set} from \"./schedule.js\";\n\nfunction easeVarying(id, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (typeof v !== \"function\") throw new Error;\n set(this, id).ease = v;\n };\n}\n\nexport default function(value) {\n if (typeof value !== \"function\") throw new Error;\n return this.each(easeVarying(this._id, value));\n}\n", "import {matcher} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Transition(subgroups, this._parents, this._name, this._id);\n}\n", "import {Transition} from \"./index.js\";\n\nexport default function(transition) {\n if (transition._id !== this._id) throw new Error;\n\n for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Transition(merges, this._parents, this._name, this._id);\n}\n", "import {get, set, init} from \"./schedule.js\";\n\nfunction start(name) {\n return (name + \"\").trim().split(/^|\\s+/).every(function(t) {\n var i = t.indexOf(\".\");\n if (i >= 0) t = t.slice(0, i);\n return !t || t === \"start\";\n });\n}\n\nfunction onFunction(id, name, listener) {\n var on0, on1, sit = start(name) ? init : set;\n return function() {\n var schedule = sit(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, listener) {\n var id = this._id;\n\n return arguments.length < 2\n ? get(this.node(), id).on.on(name)\n : this.each(onFunction(id, name, listener));\n}\n", "function removeFunction(id) {\n return function() {\n var parent = this.parentNode;\n for (var i in this.__transition) if (+i !== id) return;\n if (parent) parent.removeChild(this);\n };\n}\n\nexport default function() {\n return this.on(\"end.remove\", removeFunction(this._id));\n}\n", "import {selector} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n schedule(subgroup[i], name, id, i, subgroup, get(node, id));\n }\n }\n }\n\n return new Transition(subgroups, this._parents, name, id);\n}\n", "import {selectorAll} from \"d3-selection\";\nimport {Transition} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function(select) {\n var name = this._name,\n id = this._id;\n\n if (typeof select !== \"function\") select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) {\n if (child = children[k]) {\n schedule(child, name, id, k, children, inherit);\n }\n }\n subgroups.push(children);\n parents.push(node);\n }\n }\n }\n\n return new Transition(subgroups, parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\n\nvar Selection = selection.prototype.constructor;\n\nexport default function() {\n return new Selection(this._groups, this._parents);\n}\n", "import {interpolateTransformCss as interpolateTransform} from \"d3-interpolate\";\nimport {style} from \"d3-selection\";\nimport {set} from \"./schedule.js\";\nimport {tweenValue} from \"./tween.js\";\nimport interpolate from \"./interpolate.js\";\n\nfunction styleNull(name, interpolate) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n string1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, string10 = string1);\n };\n}\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, interpolate, value1) {\n var string00,\n string1 = value1 + \"\",\n interpolate0;\n return function() {\n var string0 = style(this, name);\n return string0 === string1 ? null\n : string0 === string00 ? interpolate0\n : interpolate0 = interpolate(string00 = string0, value1);\n };\n}\n\nfunction styleFunction(name, interpolate, value) {\n var string00,\n string10,\n interpolate0;\n return function() {\n var string0 = style(this, name),\n value1 = value(this),\n string1 = value1 + \"\";\n if (value1 == null) string1 = value1 = (this.style.removeProperty(name), style(this, name));\n return string0 === string1 ? null\n : string0 === string00 && string1 === string10 ? interpolate0\n : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));\n };\n}\n\nfunction styleMaybeRemove(id, name) {\n var on0, on1, listener0, key = \"style.\" + name, event = \"end.\" + key, remove;\n return function() {\n var schedule = set(this, id),\n on = schedule.on,\n listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);\n\n schedule.on = on1;\n };\n}\n\nexport default function(name, value, priority) {\n var i = (name += \"\") === \"transform\" ? interpolateTransform : interpolate;\n return value == null ? this\n .styleTween(name, styleNull(name, i))\n .on(\"end.style.\" + name, styleRemove(name))\n : typeof value === \"function\" ? this\n .styleTween(name, styleFunction(name, i, tweenValue(this, \"style.\" + name, value)))\n .each(styleMaybeRemove(this._id, name))\n : this\n .styleTween(name, styleConstant(name, i, value), priority)\n .on(\"end.style.\" + name, null);\n}\n", "function styleInterpolate(name, i, priority) {\n return function(t) {\n this.style.setProperty(name, i.call(this, t), priority);\n };\n}\n\nfunction styleTween(name, value, priority) {\n var t, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);\n return t;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(name, value, priority) {\n var key = \"style.\" + (name += \"\");\n if (arguments.length < 2) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, styleTween(name, value, priority == null ? \"\" : priority));\n}\n", "import {tweenValue} from \"./tween.js\";\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var value1 = value(this);\n this.textContent = value1 == null ? \"\" : value1;\n };\n}\n\nexport default function(value) {\n return this.tween(\"text\", typeof value === \"function\"\n ? textFunction(tweenValue(this, \"text\", value))\n : textConstant(value == null ? \"\" : value + \"\"));\n}\n", "function textInterpolate(i) {\n return function(t) {\n this.textContent = i.call(this, t);\n };\n}\n\nfunction textTween(value) {\n var t0, i0;\n function tween() {\n var i = value.apply(this, arguments);\n if (i !== i0) t0 = (i0 = i) && textInterpolate(i);\n return t0;\n }\n tween._value = value;\n return tween;\n}\n\nexport default function(value) {\n var key = \"text\";\n if (arguments.length < 1) return (key = this.tween(key)) && key._value;\n if (value == null) return this.tween(key, null);\n if (typeof value !== \"function\") throw new Error;\n return this.tween(key, textTween(value));\n}\n", "import {Transition, newId} from \"./index.js\";\nimport schedule, {get} from \"./schedule.js\";\n\nexport default function() {\n var name = this._name,\n id0 = this._id,\n id1 = newId();\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n var inherit = get(node, id0);\n schedule(node, name, id1, i, group, {\n time: inherit.time + inherit.delay + inherit.duration,\n delay: 0,\n duration: inherit.duration,\n ease: inherit.ease\n });\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id1);\n}\n", "import {set} from \"./schedule.js\";\n\nexport default function() {\n var on0, on1, that = this, id = that._id, size = that.size();\n return new Promise(function(resolve, reject) {\n var cancel = {value: reject},\n end = {value: function() { if (--size === 0) resolve(); }};\n\n that.each(function() {\n var schedule = set(this, id),\n on = schedule.on;\n\n // If this node shared a dispatch with the previous node,\n // just assign the updated shared dispatch and we\u2019re done!\n // Otherwise, copy-on-write.\n if (on !== on0) {\n on1 = (on0 = on).copy();\n on1._.cancel.push(cancel);\n on1._.interrupt.push(cancel);\n on1._.end.push(end);\n }\n\n schedule.on = on1;\n });\n\n // The selection was empty, resolve end immediately\n if (size === 0) resolve();\n });\n}\n", "import {selection} from \"d3-selection\";\nimport transition_attr from \"./attr.js\";\nimport transition_attrTween from \"./attrTween.js\";\nimport transition_delay from \"./delay.js\";\nimport transition_duration from \"./duration.js\";\nimport transition_ease from \"./ease.js\";\nimport transition_easeVarying from \"./easeVarying.js\";\nimport transition_filter from \"./filter.js\";\nimport transition_merge from \"./merge.js\";\nimport transition_on from \"./on.js\";\nimport transition_remove from \"./remove.js\";\nimport transition_select from \"./select.js\";\nimport transition_selectAll from \"./selectAll.js\";\nimport transition_selection from \"./selection.js\";\nimport transition_style from \"./style.js\";\nimport transition_styleTween from \"./styleTween.js\";\nimport transition_text from \"./text.js\";\nimport transition_textTween from \"./textTween.js\";\nimport transition_transition from \"./transition.js\";\nimport transition_tween from \"./tween.js\";\nimport transition_end from \"./end.js\";\n\nvar id = 0;\n\nexport function Transition(groups, parents, name, id) {\n this._groups = groups;\n this._parents = parents;\n this._name = name;\n this._id = id;\n}\n\nexport default function transition(name) {\n return selection().transition(name);\n}\n\nexport function newId() {\n return ++id;\n}\n\nvar selection_prototype = selection.prototype;\n\nTransition.prototype = transition.prototype = {\n constructor: Transition,\n select: transition_select,\n selectAll: transition_selectAll,\n selectChild: selection_prototype.selectChild,\n selectChildren: selection_prototype.selectChildren,\n filter: transition_filter,\n merge: transition_merge,\n selection: transition_selection,\n transition: transition_transition,\n call: selection_prototype.call,\n nodes: selection_prototype.nodes,\n node: selection_prototype.node,\n size: selection_prototype.size,\n empty: selection_prototype.empty,\n each: selection_prototype.each,\n on: transition_on,\n attr: transition_attr,\n attrTween: transition_attrTween,\n style: transition_style,\n styleTween: transition_styleTween,\n text: transition_text,\n textTween: transition_textTween,\n remove: transition_remove,\n tween: transition_tween,\n delay: transition_delay,\n duration: transition_duration,\n ease: transition_ease,\n easeVarying: transition_easeVarying,\n end: transition_end,\n [Symbol.iterator]: selection_prototype[Symbol.iterator]\n};\n", "export function cubicIn(t) {\n return t * t * t;\n}\n\nexport function cubicOut(t) {\n return --t * t * t + 1;\n}\n\nexport function cubicInOut(t) {\n return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;\n}\n", "import {Transition, newId} from \"../transition/index.js\";\nimport schedule from \"../transition/schedule.js\";\nimport {easeCubicInOut} from \"d3-ease\";\nimport {now} from \"d3-timer\";\n\nvar defaultTiming = {\n time: null, // Set on use.\n delay: 0,\n duration: 250,\n ease: easeCubicInOut\n};\n\nfunction inherit(node, id) {\n var timing;\n while (!(timing = node.__transition) || !(timing = timing[id])) {\n if (!(node = node.parentNode)) {\n throw new Error(`transition ${id} not found`);\n }\n }\n return timing;\n}\n\nexport default function(name) {\n var id,\n timing;\n\n if (name instanceof Transition) {\n id = name._id, name = name._name;\n } else {\n id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + \"\";\n }\n\n for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n schedule(node, name, id, i, group, timing || inherit(node, id));\n }\n }\n }\n\n return new Transition(groups, this._parents, name, id);\n}\n", "import {selection} from \"d3-selection\";\nimport selection_interrupt from \"./interrupt.js\";\nimport selection_transition from \"./transition.js\";\n\nselection.prototype.interrupt = selection_interrupt;\nselection.prototype.transition = selection_transition;\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolate} from \"d3-interpolate\";\nimport {pointer, select} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport BrushEvent from \"./event.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\nvar MODE_DRAG = {name: \"drag\"},\n MODE_SPACE = {name: \"space\"},\n MODE_HANDLE = {name: \"handle\"},\n MODE_CENTER = {name: \"center\"};\n\nconst {abs, max, min} = Math;\n\nfunction number1(e) {\n return [+e[0], +e[1]];\n}\n\nfunction number2(e) {\n return [number1(e[0]), number1(e[1])];\n}\n\nvar X = {\n name: \"x\",\n handles: [\"w\", \"e\"].map(type),\n input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },\n output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }\n};\n\nvar Y = {\n name: \"y\",\n handles: [\"n\", \"s\"].map(type),\n input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },\n output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }\n};\n\nvar XY = {\n name: \"xy\",\n handles: [\"n\", \"w\", \"e\", \"s\", \"nw\", \"ne\", \"sw\", \"se\"].map(type),\n input: function(xy) { return xy == null ? null : number2(xy); },\n output: function(xy) { return xy; }\n};\n\nvar cursors = {\n overlay: \"crosshair\",\n selection: \"move\",\n n: \"ns-resize\",\n e: \"ew-resize\",\n s: \"ns-resize\",\n w: \"ew-resize\",\n nw: \"nwse-resize\",\n ne: \"nesw-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\"\n};\n\nvar flipX = {\n e: \"w\",\n w: \"e\",\n nw: \"ne\",\n ne: \"nw\",\n se: \"sw\",\n sw: \"se\"\n};\n\nvar flipY = {\n n: \"s\",\n s: \"n\",\n nw: \"sw\",\n ne: \"se\",\n se: \"ne\",\n sw: \"nw\"\n};\n\nvar signsX = {\n overlay: +1,\n selection: +1,\n n: null,\n e: +1,\n s: null,\n w: -1,\n nw: -1,\n ne: +1,\n se: +1,\n sw: -1\n};\n\nvar signsY = {\n overlay: +1,\n selection: +1,\n n: -1,\n e: null,\n s: +1,\n w: null,\n nw: -1,\n ne: -1,\n se: +1,\n sw: +1\n};\n\nfunction type(t) {\n return {type: t};\n}\n\n// Ignore right-click, since that should open the context menu.\nfunction defaultFilter(event) {\n return !event.ctrlKey && !event.button;\n}\n\nfunction defaultExtent() {\n var svg = this.ownerSVGElement || this;\n if (svg.hasAttribute(\"viewBox\")) {\n svg = svg.viewBox.baseVal;\n return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];\n }\n return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\n// Like d3.local, but with the name \u201C__brush\u201D rather than auto-generated.\nfunction local(node) {\n while (!node.__brush) if (!(node = node.parentNode)) return;\n return node.__brush;\n}\n\nfunction empty(extent) {\n return extent[0][0] === extent[1][0]\n || extent[0][1] === extent[1][1];\n}\n\nexport function brushSelection(node) {\n var state = node.__brush;\n return state ? state.dim.output(state.selection) : null;\n}\n\nexport function brushX() {\n return brush(X);\n}\n\nexport function brushY() {\n return brush(Y);\n}\n\nexport default function() {\n return brush(XY);\n}\n\nfunction brush(dim) {\n var extent = defaultExtent,\n filter = defaultFilter,\n touchable = defaultTouchable,\n keys = true,\n listeners = dispatch(\"start\", \"brush\", \"end\"),\n handleSize = 6,\n touchending;\n\n function brush(group) {\n var overlay = group\n .property(\"__brush\", initialize)\n .selectAll(\".overlay\")\n .data([type(\"overlay\")]);\n\n overlay.enter().append(\"rect\")\n .attr(\"class\", \"overlay\")\n .attr(\"pointer-events\", \"all\")\n .attr(\"cursor\", cursors.overlay)\n .merge(overlay)\n .each(function() {\n var extent = local(this).extent;\n select(this)\n .attr(\"x\", extent[0][0])\n .attr(\"y\", extent[0][1])\n .attr(\"width\", extent[1][0] - extent[0][0])\n .attr(\"height\", extent[1][1] - extent[0][1]);\n });\n\n group.selectAll(\".selection\")\n .data([type(\"selection\")])\n .enter().append(\"rect\")\n .attr(\"class\", \"selection\")\n .attr(\"cursor\", cursors.selection)\n .attr(\"fill\", \"#777\")\n .attr(\"fill-opacity\", 0.3)\n .attr(\"stroke\", \"#fff\")\n .attr(\"shape-rendering\", \"crispEdges\");\n\n var handle = group.selectAll(\".handle\")\n .data(dim.handles, function(d) { return d.type; });\n\n handle.exit().remove();\n\n handle.enter().append(\"rect\")\n .attr(\"class\", function(d) { return \"handle handle--\" + d.type; })\n .attr(\"cursor\", function(d) { return cursors[d.type]; });\n\n group\n .each(redraw)\n .attr(\"fill\", \"none\")\n .attr(\"pointer-events\", \"all\")\n .on(\"mousedown.brush\", started)\n .filter(touchable)\n .on(\"touchstart.brush\", started)\n .on(\"touchmove.brush\", touchmoved)\n .on(\"touchend.brush touchcancel.brush\", touchended)\n .style(\"touch-action\", \"none\")\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n brush.move = function(group, selection, event) {\n if (group.tween) {\n group\n .on(\"start.brush\", function(event) { emitter(this, arguments).beforestart().start(event); })\n .on(\"interrupt.brush end.brush\", function(event) { emitter(this, arguments).end(event); })\n .tween(\"brush\", function() {\n var that = this,\n state = that.__brush,\n emit = emitter(that, arguments),\n selection0 = state.selection,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(this, arguments) : selection, state.extent),\n i = interpolate(selection0, selection1);\n\n function tween(t) {\n state.selection = t === 1 && selection1 === null ? null : i(t);\n redraw.call(that);\n emit.brush();\n }\n\n return selection0 !== null && selection1 !== null ? tween : tween(1);\n });\n } else {\n group\n .each(function() {\n var that = this,\n args = arguments,\n state = that.__brush,\n selection1 = dim.input(typeof selection === \"function\" ? selection.apply(that, args) : selection, state.extent),\n emit = emitter(that, args).beforestart();\n\n interrupt(that);\n state.selection = selection1 === null ? null : selection1;\n redraw.call(that);\n emit.start(event).brush(event).end(event);\n });\n }\n };\n\n brush.clear = function(group, event) {\n brush.move(group, null, event);\n };\n\n function redraw() {\n var group = select(this),\n selection = local(this).selection;\n\n if (selection) {\n group.selectAll(\".selection\")\n .style(\"display\", null)\n .attr(\"x\", selection[0][0])\n .attr(\"y\", selection[0][1])\n .attr(\"width\", selection[1][0] - selection[0][0])\n .attr(\"height\", selection[1][1] - selection[0][1]);\n\n group.selectAll(\".handle\")\n .style(\"display\", null)\n .attr(\"x\", function(d) { return d.type[d.type.length - 1] === \"e\" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })\n .attr(\"y\", function(d) { return d.type[0] === \"s\" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })\n .attr(\"width\", function(d) { return d.type === \"n\" || d.type === \"s\" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })\n .attr(\"height\", function(d) { return d.type === \"e\" || d.type === \"w\" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });\n }\n\n else {\n group.selectAll(\".selection,.handle\")\n .style(\"display\", \"none\")\n .attr(\"x\", null)\n .attr(\"y\", null)\n .attr(\"width\", null)\n .attr(\"height\", null);\n }\n }\n\n function emitter(that, args, clean) {\n var emit = that.__brush.emitter;\n return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean);\n }\n\n function Emitter(that, args, clean) {\n this.that = that;\n this.args = args;\n this.state = that.__brush;\n this.active = 0;\n this.clean = clean;\n }\n\n Emitter.prototype = {\n beforestart: function() {\n if (++this.active === 1) this.state.emitter = this, this.starting = true;\n return this;\n },\n start: function(event, mode) {\n if (this.starting) this.starting = false, this.emit(\"start\", event, mode);\n else this.emit(\"brush\", event);\n return this;\n },\n brush: function(event, mode) {\n this.emit(\"brush\", event, mode);\n return this;\n },\n end: function(event, mode) {\n if (--this.active === 0) delete this.state.emitter, this.emit(\"end\", event, mode);\n return this;\n },\n emit: function(type, event, mode) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new BrushEvent(type, {\n sourceEvent: event,\n target: brush,\n selection: dim.output(this.state.selection),\n mode,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function started(event) {\n if (touchending && !event.touches) return;\n if (!filter.apply(this, arguments)) return;\n\n var that = this,\n type = event.target.__data__.type,\n mode = (keys && event.metaKey ? type = \"overlay\" : type) === \"selection\" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE),\n signX = dim === Y ? null : signsX[type],\n signY = dim === X ? null : signsY[type],\n state = local(that),\n extent = state.extent,\n selection = state.selection,\n W = extent[0][0], w0, w1,\n N = extent[0][1], n0, n1,\n E = extent[1][0], e0, e1,\n S = extent[1][1], s0, s1,\n dx = 0,\n dy = 0,\n moving,\n shifting = signX && signY && keys && event.shiftKey,\n lockX,\n lockY,\n points = Array.from(event.touches || [event], t => {\n const i = t.identifier;\n t = pointer(t, that);\n t.point0 = t.slice();\n t.identifier = i;\n return t;\n });\n\n interrupt(that);\n var emit = emitter(that, arguments, true).beforestart();\n\n if (type === \"overlay\") {\n if (selection) moving = true;\n const pts = [points[0], points[1] || points[0]];\n state.selection = selection = [[\n w0 = dim === Y ? W : min(pts[0][0], pts[1][0]),\n n0 = dim === X ? N : min(pts[0][1], pts[1][1])\n ], [\n e0 = dim === Y ? E : max(pts[0][0], pts[1][0]),\n s0 = dim === X ? S : max(pts[0][1], pts[1][1])\n ]];\n if (points.length > 1) move(event);\n } else {\n w0 = selection[0][0];\n n0 = selection[0][1];\n e0 = selection[1][0];\n s0 = selection[1][1];\n }\n\n w1 = w0;\n n1 = n0;\n e1 = e0;\n s1 = s0;\n\n var group = select(that)\n .attr(\"pointer-events\", \"none\");\n\n var overlay = group.selectAll(\".overlay\")\n .attr(\"cursor\", cursors[type]);\n\n if (event.touches) {\n emit.moved = moved;\n emit.ended = ended;\n } else {\n var view = select(event.view)\n .on(\"mousemove.brush\", moved, true)\n .on(\"mouseup.brush\", ended, true);\n if (keys) view\n .on(\"keydown.brush\", keydowned, true)\n .on(\"keyup.brush\", keyupped, true)\n\n dragDisable(event.view);\n }\n\n redraw.call(that);\n emit.start(event, mode.name);\n\n function moved(event) {\n for (const p of event.changedTouches || [event]) {\n for (const d of points)\n if (d.identifier === p.identifier) d.cur = pointer(p, that);\n }\n if (shifting && !lockX && !lockY && points.length === 1) {\n const point = points[0];\n if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1]))\n lockY = true;\n else\n lockX = true;\n }\n for (const point of points)\n if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1];\n moving = true;\n noevent(event);\n move(event);\n }\n\n function move(event) {\n const point = points[0], point0 = point.point0;\n var t;\n\n dx = point[0] - point0[0];\n dy = point[1] - point0[1];\n\n switch (mode) {\n case MODE_SPACE:\n case MODE_DRAG: {\n if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;\n if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;\n break;\n }\n case MODE_HANDLE: {\n if (points[1]) {\n if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1;\n if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1;\n } else {\n if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0;\n else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx;\n if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0;\n else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy;\n }\n break;\n }\n case MODE_CENTER: {\n if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX));\n if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY));\n break;\n }\n }\n\n if (e1 < w1) {\n signX *= -1;\n t = w0, w0 = e0, e0 = t;\n t = w1, w1 = e1, e1 = t;\n if (type in flipX) overlay.attr(\"cursor\", cursors[type = flipX[type]]);\n }\n\n if (s1 < n1) {\n signY *= -1;\n t = n0, n0 = s0, s0 = t;\n t = n1, n1 = s1, s1 = t;\n if (type in flipY) overlay.attr(\"cursor\", cursors[type = flipY[type]]);\n }\n\n if (state.selection) selection = state.selection; // May be set by brush.move!\n if (lockX) w1 = selection[0][0], e1 = selection[1][0];\n if (lockY) n1 = selection[0][1], s1 = selection[1][1];\n\n if (selection[0][0] !== w1\n || selection[0][1] !== n1\n || selection[1][0] !== e1\n || selection[1][1] !== s1) {\n state.selection = [[w1, n1], [e1, s1]];\n redraw.call(that);\n emit.brush(event, mode.name);\n }\n }\n\n function ended(event) {\n nopropagation(event);\n if (event.touches) {\n if (event.touches.length) return;\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!\n } else {\n dragEnable(event.view, moving);\n view.on(\"keydown.brush keyup.brush mousemove.brush mouseup.brush\", null);\n }\n group.attr(\"pointer-events\", \"all\");\n overlay.attr(\"cursor\", cursors.overlay);\n if (state.selection) selection = state.selection; // May be set by brush.move (on start)!\n if (empty(selection)) state.selection = null, redraw.call(that);\n emit.end(event, mode.name);\n }\n\n function keydowned(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n shifting = signX && signY;\n break;\n }\n case 18: { // ALT\n if (mode === MODE_HANDLE) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n move(event);\n }\n break;\n }\n case 32: { // SPACE; takes priority over ALT\n if (mode === MODE_HANDLE || mode === MODE_CENTER) {\n if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;\n if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;\n mode = MODE_SPACE;\n overlay.attr(\"cursor\", cursors.selection);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n\n function keyupped(event) {\n switch (event.keyCode) {\n case 16: { // SHIFT\n if (shifting) {\n lockX = lockY = shifting = false;\n move(event);\n }\n break;\n }\n case 18: { // ALT\n if (mode === MODE_CENTER) {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n move(event);\n }\n break;\n }\n case 32: { // SPACE\n if (mode === MODE_SPACE) {\n if (event.altKey) {\n if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;\n if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;\n mode = MODE_CENTER;\n } else {\n if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;\n if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;\n mode = MODE_HANDLE;\n }\n overlay.attr(\"cursor\", cursors[type]);\n move(event);\n }\n break;\n }\n default: return;\n }\n noevent(event);\n }\n }\n\n function touchmoved(event) {\n emitter(this, arguments).moved(event);\n }\n\n function touchended(event) {\n emitter(this, arguments).ended(event);\n }\n\n function initialize() {\n var state = this.__brush || {selection: null};\n state.extent = number2(extent.apply(this, arguments));\n state.dim = dim;\n return state;\n }\n\n brush.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant(number2(_)), brush) : extent;\n };\n\n brush.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), brush) : filter;\n };\n\n brush.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), brush) : touchable;\n };\n\n brush.handleSize = function(_) {\n return arguments.length ? (handleSize = +_, brush) : handleSize;\n };\n\n brush.keyModifiers = function(_) {\n return arguments.length ? (keys = !!_, brush) : keys;\n };\n\n brush.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? brush : value;\n };\n\n return brush;\n}\n", "export default function(x, y) {\n var nodes, strength = 1;\n\n if (x == null) x = 0;\n if (y == null) y = 0;\n\n function force() {\n var i,\n n = nodes.length,\n node,\n sx = 0,\n sy = 0;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i], sx += node.x, sy += node.y;\n }\n\n for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) {\n node = nodes[i], node.x -= sx, node.y -= sy;\n }\n }\n\n force.initialize = function(_) {\n nodes = _;\n };\n\n force.x = function(_) {\n return arguments.length ? (x = +_, force) : x;\n };\n\n force.y = function(_) {\n return arguments.length ? (y = +_, force) : y;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = +_, force) : strength;\n };\n\n return force;\n}\n", "export default function(d) {\n const x = +this._x.call(null, d),\n y = +this._y.call(null, d);\n return add(this.cover(x, y), x, y, d);\n}\n\nfunction add(tree, x, y, d) {\n if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points\n\n var parent,\n node = tree._root,\n leaf = {data: d},\n x0 = tree._x0,\n y0 = tree._y0,\n x1 = tree._x1,\n y1 = tree._y1,\n xm,\n ym,\n xp,\n yp,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return tree._root = leaf, tree;\n\n // Find the existing leaf for the new point, or add it.\n while (node.length) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;\n }\n\n // Is the new point is exactly coincident with the existing point?\n xp = +tree._x.call(null, node.data);\n yp = +tree._y.call(null, node.data);\n if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;\n\n // Otherwise, split the leaf node until the old and new point are separated.\n do {\n parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));\n return parent[j] = node, parent[i] = leaf, tree;\n}\n\nexport function addAll(data) {\n var d, i, n = data.length,\n x,\n y,\n xz = new Array(n),\n yz = new Array(n),\n x0 = Infinity,\n y0 = Infinity,\n x1 = -Infinity,\n y1 = -Infinity;\n\n // Compute the points and their extent.\n for (i = 0; i < n; ++i) {\n if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;\n xz[i] = x;\n yz[i] = y;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n\n // If there were no (valid) points, abort.\n if (x0 > x1 || y0 > y1) return this;\n\n // Expand the tree to cover the new points.\n this.cover(x0, y0).cover(x1, y1);\n\n // Add the new points.\n for (i = 0; i < n; ++i) {\n add(this, xz[i], yz[i], data[i]);\n }\n\n return this;\n}\n", "export default function(x, y) {\n if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points\n\n var x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1;\n\n // If the quadtree has no extent, initialize them.\n // Integer extent are necessary so that if we later double the extent,\n // the existing quadrant boundaries don\u2019t change due to floating point error!\n if (isNaN(x0)) {\n x1 = (x0 = Math.floor(x)) + 1;\n y1 = (y0 = Math.floor(y)) + 1;\n }\n\n // Otherwise, double repeatedly to cover.\n else {\n var z = x1 - x0 || 1,\n node = this._root,\n parent,\n i;\n\n while (x0 > x || x >= x1 || y0 > y || y >= y1) {\n i = (y < y0) << 1 | (x < x0);\n parent = new Array(4), parent[i] = node, node = parent, z *= 2;\n switch (i) {\n case 0: x1 = x0 + z, y1 = y0 + z; break;\n case 1: x0 = x1 - z, y1 = y0 + z; break;\n case 2: x1 = x0 + z, y0 = y1 - z; break;\n case 3: x0 = x1 - z, y0 = y1 - z; break;\n }\n }\n\n if (this._root && this._root.length) this._root = node;\n }\n\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n return this;\n}\n", "export default function() {\n var data = [];\n this.visit(function(node) {\n if (!node.length) do data.push(node.data); while (node = node.next)\n });\n return data;\n}\n", "export default function(_) {\n return arguments.length\n ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])\n : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];\n}\n", "export default function(node, x0, y0, x1, y1) {\n this.node = node;\n this.x0 = x0;\n this.y0 = y0;\n this.x1 = x1;\n this.y1 = y1;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(x, y, radius) {\n var data,\n x0 = this._x0,\n y0 = this._y0,\n x1,\n y1,\n x2,\n y2,\n x3 = this._x1,\n y3 = this._y1,\n quads = [],\n node = this._root,\n q,\n i;\n\n if (node) quads.push(new Quad(node, x0, y0, x3, y3));\n if (radius == null) radius = Infinity;\n else {\n x0 = x - radius, y0 = y - radius;\n x3 = x + radius, y3 = y + radius;\n radius *= radius;\n }\n\n while (q = quads.pop()) {\n\n // Stop searching if this quadrant can\u2019t contain a closer node.\n if (!(node = q.node)\n || (x1 = q.x0) > x3\n || (y1 = q.y0) > y3\n || (x2 = q.x1) < x0\n || (y2 = q.y1) < y0) continue;\n\n // Bisect the current quadrant.\n if (node.length) {\n var xm = (x1 + x2) / 2,\n ym = (y1 + y2) / 2;\n\n quads.push(\n new Quad(node[3], xm, ym, x2, y2),\n new Quad(node[2], x1, ym, xm, y2),\n new Quad(node[1], xm, y1, x2, ym),\n new Quad(node[0], x1, y1, xm, ym)\n );\n\n // Visit the closest quadrant first.\n if (i = (y >= ym) << 1 | (x >= xm)) {\n q = quads[quads.length - 1];\n quads[quads.length - 1] = quads[quads.length - 1 - i];\n quads[quads.length - 1 - i] = q;\n }\n }\n\n // Visit this point. (Visiting coincident points isn\u2019t necessary!)\n else {\n var dx = x - +this._x.call(null, node.data),\n dy = y - +this._y.call(null, node.data),\n d2 = dx * dx + dy * dy;\n if (d2 < radius) {\n var d = Math.sqrt(radius = d2);\n x0 = x - d, y0 = y - d;\n x3 = x + d, y3 = y + d;\n data = node.data;\n }\n }\n }\n\n return data;\n}\n", "export default function(d) {\n if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points\n\n var parent,\n node = this._root,\n retainer,\n previous,\n next,\n x0 = this._x0,\n y0 = this._y0,\n x1 = this._x1,\n y1 = this._y1,\n x,\n y,\n xm,\n ym,\n right,\n bottom,\n i,\n j;\n\n // If the tree is empty, initialize the root as a leaf.\n if (!node) return this;\n\n // Find the leaf node for the point.\n // While descending, also retain the deepest parent with a non-removed sibling.\n if (node.length) while (true) {\n if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;\n if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;\n if (!(parent = node, node = node[i = bottom << 1 | right])) return this;\n if (!node.length) break;\n if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;\n }\n\n // Find the point to remove.\n while (node.data !== d) if (!(previous = node, node = node.next)) return this;\n if (next = node.next) delete node.next;\n\n // If there are multiple coincident points, remove just the point.\n if (previous) return (next ? previous.next = next : delete previous.next), this;\n\n // If this is the root point, remove it.\n if (!parent) return this._root = next, this;\n\n // Remove this leaf.\n next ? parent[i] = next : delete parent[i];\n\n // If the parent now contains exactly one leaf, collapse superfluous parents.\n if ((node = parent[0] || parent[1] || parent[2] || parent[3])\n && node === (parent[3] || parent[2] || parent[1] || parent[0])\n && !node.length) {\n if (retainer) retainer[j] = node;\n else this._root = node;\n }\n\n return this;\n}\n\nexport function removeAll(data) {\n for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);\n return this;\n}\n", "export default function() {\n return this._root;\n}\n", "export default function() {\n var size = 0;\n this.visit(function(node) {\n if (!node.length) do ++size; while (node = node.next)\n });\n return size;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], q, node = this._root, child, x0, y0, x1, y1;\n if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {\n var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n }\n }\n return this;\n}\n", "import Quad from \"./quad.js\";\n\nexport default function(callback) {\n var quads = [], next = [], q;\n if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));\n while (q = quads.pop()) {\n var node = q.node;\n if (node.length) {\n var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;\n if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));\n if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));\n if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));\n if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));\n }\n next.push(q);\n }\n while (q = next.pop()) {\n callback(q.node, q.x0, q.y0, q.x1, q.y1);\n }\n return this;\n}\n", "export function defaultX(d) {\n return d[0];\n}\n\nexport default function(_) {\n return arguments.length ? (this._x = _, this) : this._x;\n}\n", "export function defaultY(d) {\n return d[1];\n}\n\nexport default function(_) {\n return arguments.length ? (this._y = _, this) : this._y;\n}\n", "import tree_add, {addAll as tree_addAll} from \"./add.js\";\nimport tree_cover from \"./cover.js\";\nimport tree_data from \"./data.js\";\nimport tree_extent from \"./extent.js\";\nimport tree_find from \"./find.js\";\nimport tree_remove, {removeAll as tree_removeAll} from \"./remove.js\";\nimport tree_root from \"./root.js\";\nimport tree_size from \"./size.js\";\nimport tree_visit from \"./visit.js\";\nimport tree_visitAfter from \"./visitAfter.js\";\nimport tree_x, {defaultX} from \"./x.js\";\nimport tree_y, {defaultY} from \"./y.js\";\n\nexport default function quadtree(nodes, x, y) {\n var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);\n return nodes == null ? tree : tree.addAll(nodes);\n}\n\nfunction Quadtree(x, y, x0, y0, x1, y1) {\n this._x = x;\n this._y = y;\n this._x0 = x0;\n this._y0 = y0;\n this._x1 = x1;\n this._y1 = y1;\n this._root = undefined;\n}\n\nfunction leaf_copy(leaf) {\n var copy = {data: leaf.data}, next = copy;\n while (leaf = leaf.next) next = next.next = {data: leaf.data};\n return copy;\n}\n\nvar treeProto = quadtree.prototype = Quadtree.prototype;\n\ntreeProto.copy = function() {\n var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),\n node = this._root,\n nodes,\n child;\n\n if (!node) return copy;\n\n if (!node.length) return copy._root = leaf_copy(node), copy;\n\n nodes = [{source: node, target: copy._root = new Array(4)}];\n while (node = nodes.pop()) {\n for (var i = 0; i < 4; ++i) {\n if (child = node.source[i]) {\n if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});\n else node.target[i] = leaf_copy(child);\n }\n }\n }\n\n return copy;\n};\n\ntreeProto.add = tree_add;\ntreeProto.addAll = tree_addAll;\ntreeProto.cover = tree_cover;\ntreeProto.data = tree_data;\ntreeProto.extent = tree_extent;\ntreeProto.find = tree_find;\ntreeProto.remove = tree_remove;\ntreeProto.removeAll = tree_removeAll;\ntreeProto.root = tree_root;\ntreeProto.size = tree_size;\ntreeProto.visit = tree_visit;\ntreeProto.visitAfter = tree_visitAfter;\ntreeProto.x = tree_x;\ntreeProto.y = tree_y;\n", "export default function(x) {\n return function() {\n return x;\n };\n}\n", "export default function(random) {\n return (random() - 0.5) * 1e-6;\n}\n", "import constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\n\nfunction index(d) {\n return d.index;\n}\n\nfunction find(nodeById, nodeId) {\n var node = nodeById.get(nodeId);\n if (!node) throw new Error(\"node not found: \" + nodeId);\n return node;\n}\n\nexport default function(links) {\n var id = index,\n strength = defaultStrength,\n strengths,\n distance = constant(30),\n distances,\n nodes,\n count,\n bias,\n random,\n iterations = 1;\n\n if (links == null) links = [];\n\n function defaultStrength(link) {\n return 1 / Math.min(count[link.source.index], count[link.target.index]);\n }\n\n function force(alpha) {\n for (var k = 0, n = links.length; k < iterations; ++k) {\n for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {\n link = links[i], source = link.source, target = link.target;\n x = target.x + target.vx - source.x - source.vx || jiggle(random);\n y = target.y + target.vy - source.y - source.vy || jiggle(random);\n l = Math.sqrt(x * x + y * y);\n l = (l - distances[i]) / l * alpha * strengths[i];\n x *= l, y *= l;\n target.vx -= x * (b = bias[i]);\n target.vy -= y * b;\n source.vx += x * (b = 1 - b);\n source.vy += y * b;\n }\n }\n }\n\n function initialize() {\n if (!nodes) return;\n\n var i,\n n = nodes.length,\n m = links.length,\n nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])),\n link;\n\n for (i = 0, count = new Array(n); i < m; ++i) {\n link = links[i], link.index = i;\n if (typeof link.source !== \"object\") link.source = find(nodeById, link.source);\n if (typeof link.target !== \"object\") link.target = find(nodeById, link.target);\n count[link.source.index] = (count[link.source.index] || 0) + 1;\n count[link.target.index] = (count[link.target.index] || 0) + 1;\n }\n\n for (i = 0, bias = new Array(m); i < m; ++i) {\n link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);\n }\n\n strengths = new Array(m), initializeStrength();\n distances = new Array(m), initializeDistance();\n }\n\n function initializeStrength() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n strengths[i] = +strength(links[i], i, links);\n }\n }\n\n function initializeDistance() {\n if (!nodes) return;\n\n for (var i = 0, n = links.length; i < n; ++i) {\n distances[i] = +distance(links[i], i, links);\n }\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.links = function(_) {\n return arguments.length ? (links = _, initialize(), force) : links;\n };\n\n force.id = function(_) {\n return arguments.length ? (id = _, force) : id;\n };\n\n force.iterations = function(_) {\n return arguments.length ? (iterations = +_, force) : iterations;\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initializeStrength(), force) : strength;\n };\n\n force.distance = function(_) {\n return arguments.length ? (distance = typeof _ === \"function\" ? _ : constant(+_), initializeDistance(), force) : distance;\n };\n\n return force;\n}\n", "// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use\nconst a = 1664525;\nconst c = 1013904223;\nconst m = 4294967296; // 2^32\n\nexport default function() {\n let s = 1;\n return () => (s = (a * s + c) % m) / m;\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {timer} from \"d3-timer\";\nimport lcg from \"./lcg.js\";\n\nexport function x(d) {\n return d.x;\n}\n\nexport function y(d) {\n return d.y;\n}\n\nvar initialRadius = 10,\n initialAngle = Math.PI * (3 - Math.sqrt(5));\n\nexport default function(nodes) {\n var simulation,\n alpha = 1,\n alphaMin = 0.001,\n alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),\n alphaTarget = 0,\n velocityDecay = 0.6,\n forces = new Map(),\n stepper = timer(step),\n event = dispatch(\"tick\", \"end\"),\n random = lcg();\n\n if (nodes == null) nodes = [];\n\n function step() {\n tick();\n event.call(\"tick\", simulation);\n if (alpha < alphaMin) {\n stepper.stop();\n event.call(\"end\", simulation);\n }\n }\n\n function tick(iterations) {\n var i, n = nodes.length, node;\n\n if (iterations === undefined) iterations = 1;\n\n for (var k = 0; k < iterations; ++k) {\n alpha += (alphaTarget - alpha) * alphaDecay;\n\n forces.forEach(function(force) {\n force(alpha);\n });\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n if (node.fx == null) node.x += node.vx *= velocityDecay;\n else node.x = node.fx, node.vx = 0;\n if (node.fy == null) node.y += node.vy *= velocityDecay;\n else node.y = node.fy, node.vy = 0;\n }\n }\n\n return simulation;\n }\n\n function initializeNodes() {\n for (var i = 0, n = nodes.length, node; i < n; ++i) {\n node = nodes[i], node.index = i;\n if (node.fx != null) node.x = node.fx;\n if (node.fy != null) node.y = node.fy;\n if (isNaN(node.x) || isNaN(node.y)) {\n var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle;\n node.x = radius * Math.cos(angle);\n node.y = radius * Math.sin(angle);\n }\n if (isNaN(node.vx) || isNaN(node.vy)) {\n node.vx = node.vy = 0;\n }\n }\n }\n\n function initializeForce(force) {\n if (force.initialize) force.initialize(nodes, random);\n return force;\n }\n\n initializeNodes();\n\n return simulation = {\n tick: tick,\n\n restart: function() {\n return stepper.restart(step), simulation;\n },\n\n stop: function() {\n return stepper.stop(), simulation;\n },\n\n nodes: function(_) {\n return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes;\n },\n\n alpha: function(_) {\n return arguments.length ? (alpha = +_, simulation) : alpha;\n },\n\n alphaMin: function(_) {\n return arguments.length ? (alphaMin = +_, simulation) : alphaMin;\n },\n\n alphaDecay: function(_) {\n return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;\n },\n\n alphaTarget: function(_) {\n return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;\n },\n\n velocityDecay: function(_) {\n return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;\n },\n\n randomSource: function(_) {\n return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random;\n },\n\n force: function(name, _) {\n return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);\n },\n\n find: function(x, y, radius) {\n var i = 0,\n n = nodes.length,\n dx,\n dy,\n d2,\n node,\n closest;\n\n if (radius == null) radius = Infinity;\n else radius *= radius;\n\n for (i = 0; i < n; ++i) {\n node = nodes[i];\n dx = x - node.x;\n dy = y - node.y;\n d2 = dx * dx + dy * dy;\n if (d2 < radius) closest = node, radius = d2;\n }\n\n return closest;\n },\n\n on: function(name, _) {\n return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);\n }\n };\n}\n", "import {quadtree} from \"d3-quadtree\";\nimport constant from \"./constant.js\";\nimport jiggle from \"./jiggle.js\";\nimport {x, y} from \"./simulation.js\";\n\nexport default function() {\n var nodes,\n node,\n random,\n alpha,\n strength = constant(-30),\n strengths,\n distanceMin2 = 1,\n distanceMax2 = Infinity,\n theta2 = 0.81;\n\n function force(_) {\n var i, n = nodes.length, tree = quadtree(nodes, x, y).visitAfter(accumulate);\n for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);\n }\n\n function initialize() {\n if (!nodes) return;\n var i, n = nodes.length, node;\n strengths = new Array(n);\n for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);\n }\n\n function accumulate(quad) {\n var strength = 0, q, c, weight = 0, x, y, i;\n\n // For internal nodes, accumulate forces from child quadrants.\n if (quad.length) {\n for (x = y = i = 0; i < 4; ++i) {\n if ((q = quad[i]) && (c = Math.abs(q.value))) {\n strength += q.value, weight += c, x += c * q.x, y += c * q.y;\n }\n }\n quad.x = x / weight;\n quad.y = y / weight;\n }\n\n // For leaf nodes, accumulate forces from coincident quadrants.\n else {\n q = quad;\n q.x = q.data.x;\n q.y = q.data.y;\n do strength += strengths[q.data.index];\n while (q = q.next);\n }\n\n quad.value = strength;\n }\n\n function apply(quad, x1, _, x2) {\n if (!quad.value) return true;\n\n var x = quad.x - node.x,\n y = quad.y - node.y,\n w = x2 - x1,\n l = x * x + y * y;\n\n // Apply the Barnes-Hut approximation if possible.\n // Limit forces for very close nodes; randomize direction if coincident.\n if (w * w / theta2 < l) {\n if (l < distanceMax2) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n node.vx += x * quad.value * alpha / l;\n node.vy += y * quad.value * alpha / l;\n }\n return true;\n }\n\n // Otherwise, process points directly.\n else if (quad.length || l >= distanceMax2) return;\n\n // Limit forces for very close nodes; randomize direction if coincident.\n if (quad.data !== node || quad.next) {\n if (x === 0) x = jiggle(random), l += x * x;\n if (y === 0) y = jiggle(random), l += y * y;\n if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);\n }\n\n do if (quad.data !== node) {\n w = strengths[quad.data.index] * alpha / l;\n node.vx += x * w;\n node.vy += y * w;\n } while (quad = quad.next);\n }\n\n force.initialize = function(_nodes, _random) {\n nodes = _nodes;\n random = _random;\n initialize();\n };\n\n force.strength = function(_) {\n return arguments.length ? (strength = typeof _ === \"function\" ? _ : constant(+_), initialize(), force) : strength;\n };\n\n force.distanceMin = function(_) {\n return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);\n };\n\n force.distanceMax = function(_) {\n return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);\n };\n\n force.theta = function(_) {\n return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);\n };\n\n return force;\n}\n", "export default x => () => x;\n", "export default function ZoomEvent(type, {\n sourceEvent,\n target,\n transform,\n dispatch\n}) {\n Object.defineProperties(this, {\n type: {value: type, enumerable: true, configurable: true},\n sourceEvent: {value: sourceEvent, enumerable: true, configurable: true},\n target: {value: target, enumerable: true, configurable: true},\n transform: {value: transform, enumerable: true, configurable: true},\n _: {value: dispatch}\n });\n}\n", "export function Transform(k, x, y) {\n this.k = k;\n this.x = x;\n this.y = y;\n}\n\nTransform.prototype = {\n constructor: Transform,\n scale: function(k) {\n return k === 1 ? this : new Transform(this.k * k, this.x, this.y);\n },\n translate: function(x, y) {\n return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);\n },\n apply: function(point) {\n return [point[0] * this.k + this.x, point[1] * this.k + this.y];\n },\n applyX: function(x) {\n return x * this.k + this.x;\n },\n applyY: function(y) {\n return y * this.k + this.y;\n },\n invert: function(location) {\n return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];\n },\n invertX: function(x) {\n return (x - this.x) / this.k;\n },\n invertY: function(y) {\n return (y - this.y) / this.k;\n },\n rescaleX: function(x) {\n return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));\n },\n rescaleY: function(y) {\n return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));\n },\n toString: function() {\n return \"translate(\" + this.x + \",\" + this.y + \") scale(\" + this.k + \")\";\n }\n};\n\nexport var identity = new Transform(1, 0, 0);\n\ntransform.prototype = Transform.prototype;\n\nexport default function transform(node) {\n while (!node.__zoom) if (!(node = node.parentNode)) return identity;\n return node.__zoom;\n}\n", "export function nopropagation(event) {\n event.stopImmediatePropagation();\n}\n\nexport default function(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n}\n", "import {dispatch} from \"d3-dispatch\";\nimport {dragDisable, dragEnable} from \"d3-drag\";\nimport {interpolateZoom} from \"d3-interpolate\";\nimport {select, pointer} from \"d3-selection\";\nimport {interrupt} from \"d3-transition\";\nimport constant from \"./constant.js\";\nimport ZoomEvent from \"./event.js\";\nimport {Transform, identity} from \"./transform.js\";\nimport noevent, {nopropagation} from \"./noevent.js\";\n\n// Ignore right-click, since that should open the context menu.\n// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event\nfunction defaultFilter(event) {\n return (!event.ctrlKey || event.type === 'wheel') && !event.button;\n}\n\nfunction defaultExtent() {\n var e = this;\n if (e instanceof SVGElement) {\n e = e.ownerSVGElement || e;\n if (e.hasAttribute(\"viewBox\")) {\n e = e.viewBox.baseVal;\n return [[e.x, e.y], [e.x + e.width, e.y + e.height]];\n }\n return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];\n }\n return [[0, 0], [e.clientWidth, e.clientHeight]];\n}\n\nfunction defaultTransform() {\n return this.__zoom || identity;\n}\n\nfunction defaultWheelDelta(event) {\n return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1);\n}\n\nfunction defaultTouchable() {\n return navigator.maxTouchPoints || (\"ontouchstart\" in this);\n}\n\nfunction defaultConstrain(transform, extent, translateExtent) {\n var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],\n dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],\n dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],\n dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];\n return transform.translate(\n dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),\n dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)\n );\n}\n\nexport default function() {\n var filter = defaultFilter,\n extent = defaultExtent,\n constrain = defaultConstrain,\n wheelDelta = defaultWheelDelta,\n touchable = defaultTouchable,\n scaleExtent = [0, Infinity],\n translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],\n duration = 250,\n interpolate = interpolateZoom,\n listeners = dispatch(\"start\", \"zoom\", \"end\"),\n touchstarting,\n touchfirst,\n touchending,\n touchDelay = 500,\n wheelDelay = 150,\n clickDistance2 = 0,\n tapDistance = 10;\n\n function zoom(selection) {\n selection\n .property(\"__zoom\", defaultTransform)\n .on(\"wheel.zoom\", wheeled, {passive: false})\n .on(\"mousedown.zoom\", mousedowned)\n .on(\"dblclick.zoom\", dblclicked)\n .filter(touchable)\n .on(\"touchstart.zoom\", touchstarted)\n .on(\"touchmove.zoom\", touchmoved)\n .on(\"touchend.zoom touchcancel.zoom\", touchended)\n .style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\");\n }\n\n zoom.transform = function(collection, transform, point, event) {\n var selection = collection.selection ? collection.selection() : collection;\n selection.property(\"__zoom\", defaultTransform);\n if (collection !== selection) {\n schedule(collection, transform, point, event);\n } else {\n selection.interrupt().each(function() {\n gesture(this, arguments)\n .event(event)\n .start()\n .zoom(null, typeof transform === \"function\" ? transform.apply(this, arguments) : transform)\n .end();\n });\n }\n };\n\n zoom.scaleBy = function(selection, k, p, event) {\n zoom.scaleTo(selection, function() {\n var k0 = this.__zoom.k,\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return k0 * k1;\n }, p, event);\n };\n\n zoom.scaleTo = function(selection, k, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t0 = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p,\n p1 = t0.invert(p0),\n k1 = typeof k === \"function\" ? k.apply(this, arguments) : k;\n return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);\n }, p, event);\n };\n\n zoom.translateBy = function(selection, x, y, event) {\n zoom.transform(selection, function() {\n return constrain(this.__zoom.translate(\n typeof x === \"function\" ? x.apply(this, arguments) : x,\n typeof y === \"function\" ? y.apply(this, arguments) : y\n ), extent.apply(this, arguments), translateExtent);\n }, null, event);\n };\n\n zoom.translateTo = function(selection, x, y, p, event) {\n zoom.transform(selection, function() {\n var e = extent.apply(this, arguments),\n t = this.__zoom,\n p0 = p == null ? centroid(e) : typeof p === \"function\" ? p.apply(this, arguments) : p;\n return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate(\n typeof x === \"function\" ? -x.apply(this, arguments) : -x,\n typeof y === \"function\" ? -y.apply(this, arguments) : -y\n ), e, translateExtent);\n }, p, event);\n };\n\n function scale(transform, k) {\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));\n return k === transform.k ? transform : new Transform(k, transform.x, transform.y);\n }\n\n function translate(transform, p0, p1) {\n var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;\n return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);\n }\n\n function centroid(extent) {\n return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];\n }\n\n function schedule(transition, transform, point, event) {\n transition\n .on(\"start.zoom\", function() { gesture(this, arguments).event(event).start(); })\n .on(\"interrupt.zoom end.zoom\", function() { gesture(this, arguments).event(event).end(); })\n .tween(\"zoom\", function() {\n var that = this,\n args = arguments,\n g = gesture(that, args).event(event),\n e = extent.apply(that, args),\n p = point == null ? centroid(e) : typeof point === \"function\" ? point.apply(that, args) : point,\n w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),\n a = that.__zoom,\n b = typeof transform === \"function\" ? transform.apply(that, args) : transform,\n i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));\n return function(t) {\n if (t === 1) t = b; // Avoid rounding error on end.\n else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }\n g.zoom(null, t);\n };\n });\n }\n\n function gesture(that, args, clean) {\n return (!clean && that.__zooming) || new Gesture(that, args);\n }\n\n function Gesture(that, args) {\n this.that = that;\n this.args = args;\n this.active = 0;\n this.sourceEvent = null;\n this.extent = extent.apply(that, args);\n this.taps = 0;\n }\n\n Gesture.prototype = {\n event: function(event) {\n if (event) this.sourceEvent = event;\n return this;\n },\n start: function() {\n if (++this.active === 1) {\n this.that.__zooming = this;\n this.emit(\"start\");\n }\n return this;\n },\n zoom: function(key, transform) {\n if (this.mouse && key !== \"mouse\") this.mouse[1] = transform.invert(this.mouse[0]);\n if (this.touch0 && key !== \"touch\") this.touch0[1] = transform.invert(this.touch0[0]);\n if (this.touch1 && key !== \"touch\") this.touch1[1] = transform.invert(this.touch1[0]);\n this.that.__zoom = transform;\n this.emit(\"zoom\");\n return this;\n },\n end: function() {\n if (--this.active === 0) {\n delete this.that.__zooming;\n this.emit(\"end\");\n }\n return this;\n },\n emit: function(type) {\n var d = select(this.that).datum();\n listeners.call(\n type,\n this.that,\n new ZoomEvent(type, {\n sourceEvent: this.sourceEvent,\n target: zoom,\n type,\n transform: this.that.__zoom,\n dispatch: listeners\n }),\n d\n );\n }\n };\n\n function wheeled(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var g = gesture(this, args).event(event),\n t = this.__zoom,\n k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),\n p = pointer(event);\n\n // If the mouse is in the same location as before, reuse it.\n // If there were recent wheel events, reset the wheel idle timeout.\n if (g.wheel) {\n if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {\n g.mouse[1] = t.invert(g.mouse[0] = p);\n }\n clearTimeout(g.wheel);\n }\n\n // If this wheel event won\u2019t trigger a transform change, ignore it.\n else if (t.k === k) return;\n\n // Otherwise, capture the mouse point and location at the start.\n else {\n g.mouse = [p, t.invert(p)];\n interrupt(this);\n g.start();\n }\n\n noevent(event);\n g.wheel = setTimeout(wheelidled, wheelDelay);\n g.zoom(\"mouse\", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));\n\n function wheelidled() {\n g.wheel = null;\n g.end();\n }\n }\n\n function mousedowned(event, ...args) {\n if (touchending || !filter.apply(this, arguments)) return;\n var currentTarget = event.currentTarget,\n g = gesture(this, args, true).event(event),\n v = select(event.view).on(\"mousemove.zoom\", mousemoved, true).on(\"mouseup.zoom\", mouseupped, true),\n p = pointer(event, currentTarget),\n x0 = event.clientX,\n y0 = event.clientY;\n\n dragDisable(event.view);\n nopropagation(event);\n g.mouse = [p, this.__zoom.invert(p)];\n interrupt(this);\n g.start();\n\n function mousemoved(event) {\n noevent(event);\n if (!g.moved) {\n var dx = event.clientX - x0, dy = event.clientY - y0;\n g.moved = dx * dx + dy * dy > clickDistance2;\n }\n g.event(event)\n .zoom(\"mouse\", constrain(translate(g.that.__zoom, g.mouse[0] = pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent));\n }\n\n function mouseupped(event) {\n v.on(\"mousemove.zoom mouseup.zoom\", null);\n dragEnable(event.view, g.moved);\n noevent(event);\n g.event(event).end();\n }\n }\n\n function dblclicked(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var t0 = this.__zoom,\n p0 = pointer(event.changedTouches ? event.changedTouches[0] : event, this),\n p1 = t0.invert(p0),\n k1 = t0.k * (event.shiftKey ? 0.5 : 2),\n t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent);\n\n noevent(event);\n if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0, event);\n else select(this).call(zoom.transform, t1, p0, event);\n }\n\n function touchstarted(event, ...args) {\n if (!filter.apply(this, arguments)) return;\n var touches = event.touches,\n n = touches.length,\n g = gesture(this, args, event.changedTouches.length === n).event(event),\n started, i, t, p;\n\n nopropagation(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n p = [p, this.__zoom.invert(p), t.identifier];\n if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;\n else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;\n }\n\n if (touchstarting) touchstarting = clearTimeout(touchstarting);\n\n if (started) {\n if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);\n interrupt(this);\n g.start();\n }\n }\n\n function touchmoved(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t, p, l;\n\n noevent(event);\n for (i = 0; i < n; ++i) {\n t = touches[i], p = pointer(t, this);\n if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;\n else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;\n }\n t = g.that.__zoom;\n if (g.touch1) {\n var p0 = g.touch0[0], l0 = g.touch0[1],\n p1 = g.touch1[0], l1 = g.touch1[1],\n dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,\n dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;\n t = scale(t, Math.sqrt(dp / dl));\n p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];\n l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];\n }\n else if (g.touch0) p = g.touch0[0], l = g.touch0[1];\n else return;\n\n g.zoom(\"touch\", constrain(translate(t, p, l), g.extent, translateExtent));\n }\n\n function touchended(event, ...args) {\n if (!this.__zooming) return;\n var g = gesture(this, args).event(event),\n touches = event.changedTouches,\n n = touches.length, i, t;\n\n nopropagation(event);\n if (touchending) clearTimeout(touchending);\n touchending = setTimeout(function() { touchending = null; }, touchDelay);\n for (i = 0; i < n; ++i) {\n t = touches[i];\n if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;\n else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;\n }\n if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;\n if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);\n else {\n g.end();\n // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.\n if (g.taps === 2) {\n t = pointer(t, this);\n if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) {\n var p = select(this).on(\"dblclick.zoom\");\n if (p) p.apply(this, arguments);\n }\n }\n }\n }\n\n zoom.wheelDelta = function(_) {\n return arguments.length ? (wheelDelta = typeof _ === \"function\" ? _ : constant(+_), zoom) : wheelDelta;\n };\n\n zoom.filter = function(_) {\n return arguments.length ? (filter = typeof _ === \"function\" ? _ : constant(!!_), zoom) : filter;\n };\n\n zoom.touchable = function(_) {\n return arguments.length ? (touchable = typeof _ === \"function\" ? _ : constant(!!_), zoom) : touchable;\n };\n\n zoom.extent = function(_) {\n return arguments.length ? (extent = typeof _ === \"function\" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;\n };\n\n zoom.scaleExtent = function(_) {\n return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];\n };\n\n zoom.translateExtent = function(_) {\n return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];\n };\n\n zoom.constrain = function(_) {\n return arguments.length ? (constrain = _, zoom) : constrain;\n };\n\n zoom.duration = function(_) {\n return arguments.length ? (duration = +_, zoom) : duration;\n };\n\n zoom.interpolate = function(_) {\n return arguments.length ? (interpolate = _, zoom) : interpolate;\n };\n\n zoom.on = function() {\n var value = listeners.on.apply(listeners, arguments);\n return value === listeners ? zoom : value;\n };\n\n zoom.clickDistance = function(_) {\n return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);\n };\n\n zoom.tapDistance = function(_) {\n return arguments.length ? (tapDistance = +_, zoom) : tapDistance;\n };\n\n return zoom;\n}\n", "import * as d3 from \"d3\";\n\ntype NodeDatum = {\n id: string;\n label: string;\n score?: number | null;\n tier?: string | null;\n type: string;\n};\n\ntype EdgeDatum = {\n source: string;\n target: string;\n type: string;\n};\n\nfunction scoreColor(score?: number | null): string {\n if (score == null || isNaN(score)) return \"#d3d3d3\";\n const s = Math.min(1, Math.max(0, score));\n let r = 0, g = 0;\n if (s < 0.5) {\n r = Math.floor(2 * s * 255);\n g = 255;\n } else {\n r = 255;\n g = Math.floor((1 - 2 * (s - 0.5)) * 255);\n }\n return `rgb(${r},${g},0)`;\n}\n\nasync function loadData() {\n const res = await fetch(\"goblin.json\", { cache: \"no-store\" });\n return (await res.json()) as {\n nodes: NodeDatum[];\n edges: EdgeDatum[];\n };\n}\n\nfunction renderGraph(container: HTMLElement, nodes: NodeDatum[], edges: EdgeDatum[]) {\n const width = container.clientWidth || 960;\n const height = container.clientHeight || 600;\n\n const svg = d3.select(container).append(\"svg\")\n .attr(\"width\", width)\n .attr(\"height\", height);\n\n const zoomLayer = svg.append(\"g\");\n\n const link = zoomLayer.append(\"g\")\n .attr(\"stroke\", \"#999\")\n .attr(\"stroke-opacity\", 0.6)\n .selectAll(\"line\")\n .data(edges)\n .join(\"line\")\n .attr(\"stroke-dasharray\", d => d.type === \"overlapsWith\" ? \"4,3\" : d.type === \"dependsOn\" ? \"2,3\" : \"0\");\n\n const node = zoomLayer.append(\"g\")\n .selectAll(\"g\")\n .data(nodes)\n .join(\"g\")\n .call(d3.drag()\n .on(\"start\", (event, d: any) => {\n if (!event.active) simulation.alphaTarget(0.3).restart();\n d.fx = d.x; d.fy = d.y;\n })\n .on(\"drag\", (event, d: any) => {\n d.fx = event.x; d.fy = event.y;\n })\n .on(\"end\", (event, d: any) => {\n if (!event.active) simulation.alphaTarget(0);\n d.fx = null; d.fy = null;\n })\n );\n\n node.append(\"rect\")\n .attr(\"rx\", 8).attr(\"ry\", 8)\n .attr(\"x\", -60).attr(\"y\", -16)\n .attr(\"width\", 120).attr(\"height\", 32)\n .attr(\"fill\", d => scoreColor(d.score))\n .attr(\"stroke\", \"#333\");\n\n node.append(\"text\")\n .attr(\"text-anchor\", \"middle\")\n .attr(\"dominant-baseline\", \"middle\")\n .attr(\"font-family\", \"Helvetica, Arial, sans-serif\")\n .attr(\"font-size\", 11)\n .text(d => d.label);\n\n const idToNode: Record = {};\n nodes.forEach((n: any) => { idToNode[n.id] = n; });\n\n const simulation = d3.forceSimulation(nodes as any)\n .force(\"link\", d3.forceLink(edges as any).id((d: any) => d.id).distance(120))\n .force(\"charge\", d3.forceManyBody().strength(-180))\n .force(\"center\", d3.forceCenter(width / 2, height / 2))\n .on(\"tick\", () => {\n link\n .attr(\"x1\", (d: any) => idToNode[d.source].x)\n .attr(\"y1\", (d: any) => idToNode[d.source].y)\n .attr(\"x2\", (d: any) => idToNode[d.target].x)\n .attr(\"y2\", (d: any) => idToNode[d.target].y);\n\n node.attr(\"transform\", (d: any) => `translate(${d.x},${d.y})`);\n });\n\n svg.call(d3.zoom()\n .scaleExtent([0.3, 3])\n .on(\"zoom\", (event) => zoomLayer.attr(\"transform\", event.transform)));\n}\n\nasync function main() {\n const app = document.getElementById(\"app\")!;\n app.innerHTML = \"
Loading goblin graph\u2026
\";\n try {\n const { nodes, edges } = await loadData();\n app.innerHTML = \"\";\n renderGraph(app, nodes, edges);\n } catch (e) {\n app.innerHTML = \"
Failed to load goblin.json
\";\n console.error(e);\n }\n}\n\nmain();\n"], "mappings": "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", "names": ["type", "c", "document", "m", "x", "m", "m", "datum", "x", "m", "selection", "m", "m", "a", "m", "m", "m", "create", "create", "parseTypenames", "m", "type", "window", "dispatch_default", "m", "dispatch_default", "select_default", "root", "selection", "select_default", "constant_default", "x", "type", "x", "y", "dispatch", "filter", "selection", "select_default", "c", "container", "dispatch", "type", "event", "touch", "constant_default", "m", "a", "min", "max", "constant_default", "x", "a", "y", "y", "a", "constant_default", "y", "color", "rgb", "start", "a", "a", "i", "a", "c", "m", "a", "x", "now", "id", "index", "get", "set", "start", "empty", "interrupt_default", "id", "set", "get", "transition", "a", "c", "attrRemove", "attrRemoveNS", "attrConstant", "attrConstantNS", "attrFunction", "attrFunctionNS", "attr_default", "id", "get", "id", "set", "get", "id", "set", "get", "id", "set", "filter_default", "m", "merge_default", "transition", "m", "id", "set", "on_default", "get", "id", "remove_default", "select_default", "id", "m", "get", "selectAll_default", "id", "m", "children", "inherit", "get", "Selection", "selection_default", "styleRemove", "styleConstant", "styleFunction", "id", "remove", "set", "style_default", "textConstant", "textFunction", "text_default", "m", "inherit", "get", "id", "set", "id", "select_default", "selectAll_default", "filter_default", "merge_default", "selection_default", "on_default", "attr_default", "style_default", "text_default", "remove_default", "id", "transition_default", "m", "interrupt_default", "transition_default", "x", "y", "x", "y", "x", "y", "x", "y", "data_default", "x", "y", "x2", "y2", "remove_default", "x", "y", "size_default", "x", "y", "data_default", "remove_default", "size_default", "constant_default", "x", "find", "id", "constant_default", "x", "y", "m", "i", "x", "y", "constant_default", "node", "strength", "c", "x", "y", "constant_default", "x", "type", "transform", "dispatch", "x", "y", "identity", "nopropagation", "noevent_default", "defaultFilter", "identity", "defaultTouchable", "transform", "zoom_default", "filter", "selection", "x", "y", "extent", "transition", "a", "type", "select_default", "noevent_default", "nopropagation", "event", "constant_default", "select_default", "zoom_default"] } diff --git a/docs/goblin.json b/docs/goblin.json index e134a8e..d7e0687 100644 --- a/docs/goblin.json +++ b/docs/goblin.json @@ -1,23 +1,23 @@ { "nodes": [ { - "id": "https://nkllon.com/problem#SupplyChain", - "label": "Supply Chain / Inventory", - "score": 0.85, + "id": "https://nkllon.com/problem#IAMSecurity", + "label": "IAM / Security Policy", + "score": 0.94, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#Microservices", - "label": "Distributed Microservices", - "score": 0.97, - "tier": "https://nkllon.com/ui#High", + "id": "https://nkllon.com/problem#HealthcareWorkflow", + "label": "Healthcare Workflows", + "score": 0.8, + "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#UIFrontend", - "label": "UI / Frontend Systems", - "score": 0.92, + "id": "https://nkllon.com/problem#FinanceReconciliation", + "label": "Financial Reconciliation", + "score": 0.75, "tier": null, "type": "ProblemClass" }, @@ -28,6 +28,13 @@ "tier": null, "type": "ProblemClass" }, + { + "id": "https://nkllon.com/problem#CICD", + "label": "CI/CD Pipelines", + "score": 0.88, + "tier": null, + "type": "ProblemClass" + }, { "id": "https://nkllon.com/problem#ConfigManagement", "label": "Configuration Management", @@ -36,44 +43,44 @@ "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#HealthcareWorkflow", - "label": "Healthcare Workflows", - "score": 0.8, + "id": "https://nkllon.com/problem#SupplyChain", + "label": "Supply Chain / Inventory", + "score": 0.85, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#MLPipelines", - "label": "ML / Data Pipelines", - "score": 0.82, + "id": "https://nkllon.com/problem#GovernmentProcesses", + "label": "Government / Regulatory Processes", + "score": 0.9, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#CICD", - "label": "CI/CD Pipelines", - "score": 0.88, + "id": "https://nkllon.com/problem#UIFrontend", + "label": "UI / Frontend Systems", + "score": 0.92, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#GovernmentProcesses", - "label": "Government / Regulatory Processes", - "score": 0.9, - "tier": null, + "id": "https://nkllon.com/problem#Microservices", + "label": "Distributed Microservices", + "score": 0.97, + "tier": "https://nkllon.com/ui#High", "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#IAMSecurity", - "label": "IAM / Security Policy", - "score": 0.94, + "id": "https://nkllon.com/problem#PureMathematics", + "label": "Pure Mathematics (Formal Systems)", + "score": 0.0, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#CloudOrchestration", - "label": "Cloud Infrastructure Orchestration", - "score": 0.95, + "id": "https://nkllon.com/problem#MLPipelines", + "label": "ML / Data Pipelines", + "score": 0.82, "tier": null, "type": "ProblemClass" }, @@ -85,24 +92,17 @@ "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#FinanceReconciliation", - "label": "Financial Reconciliation", - "score": 0.75, - "tier": null, - "type": "ProblemClass" - }, - { - "id": "https://nkllon.com/problem#PureMathematics", - "label": "Pure Mathematics (Formal Systems)", - "score": 0.0, + "id": "https://nkllon.com/problem#CloudOrchestration", + "label": "Cloud Infrastructure Orchestration", + "score": 0.95, "tier": null, "type": "ProblemClass" } ], "edges": [ { - "source": "https://nkllon.com/problem#Microservices", - "target": "https://nkllon.com/problem#CICD", + "source": "https://nkllon.com/problem#IAMSecurity", + "target": "https://nkllon.com/problem#ConfigManagement", "type": "overlapsWith" }, { @@ -111,8 +111,8 @@ "type": "dependsOn" }, { - "source": "https://nkllon.com/problem#IAMSecurity", - "target": "https://nkllon.com/problem#ConfigManagement", + "source": "https://nkllon.com/problem#Microservices", + "target": "https://nkllon.com/problem#CICD", "type": "overlapsWith" }, { diff --git a/docs/index.html b/docs/index.html index a206c31..75b6aac 100644 --- a/docs/index.html +++ b/docs/index.html @@ -22,5 +22,3 @@

Goblin Map (SCIG)

- - diff --git a/docs/style.css b/docs/style.css index a2e7586..f6c53f8 100644 --- a/docs/style.css +++ b/docs/style.css @@ -21,5 +21,3 @@ header nav a:hover { text-decoration: underline; } .loading, .error { padding: 16px; } - - diff --git a/docs/ttl-graph.dot b/docs/ttl-graph.dot index 13194fe..27072d9 100644 --- a/docs/ttl-graph.dot +++ b/docs/ttl-graph.dot @@ -1,20 +1,20 @@ digraph GoblinTTL { rankdir=LR; node [shape=box, style=rounded, fontname="Helvetica"]; - "https://nkllon.com/problem#PureMathematics" [label="Pure Mathematics (Formal Systems)\nGoblin ~ 0.00", style="filled,rounded", fillcolor="#00ff00"]; - "https://nkllon.com/problem#MLPipelines" [label="ML / Data Pipelines\nGoblin ~ 0.82", style="filled,rounded", fillcolor="#ff5b00"]; - "https://nkllon.com/problem#GovernmentProcesses" [label="Government / Regulatory Processes\nGoblin ~ 0.90", style="filled,rounded", fillcolor="#ff3200"]; - "https://nkllon.com/problem#CICD" [label="CI/CD Pipelines\nGoblin ~ 0.88", style="filled,rounded", fillcolor="#ff3d00"]; + "https://nkllon.com/problem#CompilerPipeline" [label="Compiler Pipeline\nGoblin ~ 0.15", style="filled,rounded", fillcolor="#4cff00"]; "https://nkllon.com/problem#ConfigManagement" [label="Configuration Management\nGoblin ~ 0.90", style="filled,rounded", fillcolor="#ff3200"]; - "https://nkllon.com/problem#Microservices" [label="Distributed Microservices\nGoblin ~ 0.97", style="filled,rounded", fillcolor="#ff0f00"]; + "https://nkllon.com/problem#PureMathematics" [label="Pure Mathematics (Formal Systems)\nGoblin ~ 0.00", style="filled,rounded", fillcolor="#00ff00"]; "https://nkllon.com/problem#MechanicalCAD" [label="Mechanical CAD Modeling\nGoblin ~ 0.12", style="filled,rounded", fillcolor="#3dff00"]; + "https://nkllon.com/problem#Microservices" [label="Distributed Microservices\nGoblin ~ 0.97", style="filled,rounded", fillcolor="#ff0f00"]; + "https://nkllon.com/problem#CloudOrchestration" [label="Cloud Infrastructure Orchestration\nGoblin ~ 0.95", style="filled,rounded", fillcolor="#ff1900"]; "https://nkllon.com/problem#HealthcareWorkflow" [label="Healthcare Workflows\nGoblin ~ 0.80", style="filled,rounded", fillcolor="#ff6500"]; + "https://nkllon.com/problem#MLPipelines" [label="ML / Data Pipelines\nGoblin ~ 0.82", style="filled,rounded", fillcolor="#ff5b00"]; + "https://nkllon.com/problem#CICD" [label="CI/CD Pipelines\nGoblin ~ 0.88", style="filled,rounded", fillcolor="#ff3d00"]; "https://nkllon.com/problem#FinanceReconciliation" [label="Financial Reconciliation\nGoblin ~ 0.75", style="filled,rounded", fillcolor="#ff7f00"]; - "https://nkllon.com/problem#CloudOrchestration" [label="Cloud Infrastructure Orchestration\nGoblin ~ 0.95", style="filled,rounded", fillcolor="#ff1900"]; + "https://nkllon.com/problem#UIFrontend" [label="UI / Frontend Systems\nGoblin ~ 0.92", style="filled,rounded", fillcolor="#ff2800"]; + "https://nkllon.com/problem#GovernmentProcesses" [label="Government / Regulatory Processes\nGoblin ~ 0.90", style="filled,rounded", fillcolor="#ff3200"]; "https://nkllon.com/problem#SupplyChain" [label="Supply Chain / Inventory\nGoblin ~ 0.85", style="filled,rounded", fillcolor="#ff4c00"]; "https://nkllon.com/problem#IAMSecurity" [label="IAM / Security Policy\nGoblin ~ 0.94", style="filled,rounded", fillcolor="#ff1e00"]; - "https://nkllon.com/problem#CompilerPipeline" [label="Compiler Pipeline\nGoblin ~ 0.15", style="filled,rounded", fillcolor="#4cff00"]; - "https://nkllon.com/problem#UIFrontend" [label="UI / Frontend Systems\nGoblin ~ 0.92", style="filled,rounded", fillcolor="#ff2800"]; "https://nkllon.com/problem#ConfigManagement" -> "https://nkllon.com/problem#CloudOrchestration" [label="depends", style="dotted"]; "https://nkllon.com/problem#Microservices" -> "https://nkllon.com/problem#CICD" [label="overlaps", style="dashed"]; "https://nkllon.com/problem#CloudOrchestration" -> "https://nkllon.com/problem#Microservices" [label="influences", style="solid"]; diff --git a/docs/ttl-graph.png b/docs/ttl-graph.png index 7fe31684227b98982c64cba17d4adcd52f224517..b760d5b32cd7b63bdc9a6ebc8abb50a33bc3b905 100644 GIT binary patch literal 83775 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 G8}L8SJT;*J literal 86427 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 CWp+jY diff --git a/docs/ttl-graph.svg b/docs/ttl-graph.svg index 6eefde6..ddc2dd2 100644 --- a/docs/ttl-graph.svg +++ b/docs/ttl-graph.svg @@ -9,131 +9,131 @@ GoblinTTL - + -https://nkllon.com/problem#PureMathematics - -Pure Mathematics (Formal Systems) -Goblin ~ 0.00 - - - -https://nkllon.com/problem#MLPipelines - -ML / Data Pipelines -Goblin ~ 0.82 - - - -https://nkllon.com/problem#GovernmentProcesses - -Government / Regulatory Processes -Goblin ~ 0.90 - - - -https://nkllon.com/problem#CICD - -CI/CD Pipelines -Goblin ~ 0.88 +https://nkllon.com/problem#CompilerPipeline + +Compiler Pipeline +Goblin ~ 0.15 - + https://nkllon.com/problem#ConfigManagement - -Configuration Management -Goblin ~ 0.90 + +Configuration Management +Goblin ~ 0.90 - + https://nkllon.com/problem#CloudOrchestration - -Cloud Infrastructure Orchestration -Goblin ~ 0.95 + +Cloud Infrastructure Orchestration +Goblin ~ 0.95 https://nkllon.com/problem#ConfigManagement->https://nkllon.com/problem#CloudOrchestration - - -depends + + +depends + + + +https://nkllon.com/problem#PureMathematics + +Pure Mathematics (Formal Systems) +Goblin ~ 0.00 + + + +https://nkllon.com/problem#MechanicalCAD + +Mechanical CAD Modeling +Goblin ~ 0.12 - + https://nkllon.com/problem#Microservices - -Distributed Microservices -Goblin ~ 0.97 + +Distributed Microservices +Goblin ~ 0.97 + + + +https://nkllon.com/problem#CICD + +CI/CD Pipelines +Goblin ~ 0.88 https://nkllon.com/problem#Microservices->https://nkllon.com/problem#CICD - - -overlaps + + +overlaps - - -https://nkllon.com/problem#MechanicalCAD - -Mechanical CAD Modeling -Goblin ~ 0.12 + + +https://nkllon.com/problem#CloudOrchestration->https://nkllon.com/problem#Microservices + + +influences - + https://nkllon.com/problem#HealthcareWorkflow - -Healthcare Workflows -Goblin ~ 0.80 + +Healthcare Workflows +Goblin ~ 0.80 + + + +https://nkllon.com/problem#MLPipelines + +ML / Data Pipelines +Goblin ~ 0.82 - + https://nkllon.com/problem#FinanceReconciliation Financial Reconciliation Goblin ~ 0.75 - - -https://nkllon.com/problem#CloudOrchestration->https://nkllon.com/problem#Microservices - - -influences + + +https://nkllon.com/problem#UIFrontend + +UI / Frontend Systems +Goblin ~ 0.92 + + + +https://nkllon.com/problem#GovernmentProcesses + +Government / Regulatory Processes +Goblin ~ 0.90 - + https://nkllon.com/problem#SupplyChain - -Supply Chain / Inventory -Goblin ~ 0.85 + +Supply Chain / Inventory +Goblin ~ 0.85 - + https://nkllon.com/problem#IAMSecurity - -IAM / Security Policy -Goblin ~ 0.94 + +IAM / Security Policy +Goblin ~ 0.94 https://nkllon.com/problem#IAMSecurity->https://nkllon.com/problem#ConfigManagement - - -overlaps - - - -https://nkllon.com/problem#CompilerPipeline - -Compiler Pipeline -Goblin ~ 0.15 - - - -https://nkllon.com/problem#UIFrontend - -UI / Frontend Systems -Goblin ~ 0.92 + + +overlaps From e178132700e0f3a0e49034728f5f97c467f57f10 Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:41:49 -0700 Subject: [PATCH 06/13] feat: deterministic exporters (sorted outputs); update generated docs --- docs/goblin.json | 138 +++++++++++++------------- docs/ttl-graph.dot | 20 ++-- docs/ttl-graph.png | Bin 83775 -> 86755 bytes docs/ttl-graph.svg | 176 +++++++++++++++++----------------- tools/export_instances_dot.py | 6 +- tools/export_web_json.py | 21 ++-- 6 files changed, 185 insertions(+), 176 deletions(-) diff --git a/docs/goblin.json b/docs/goblin.json index d7e0687..9f6a7a7 100644 --- a/docs/goblin.json +++ b/docs/goblin.json @@ -1,73 +1,80 @@ { "nodes": [ { - "id": "https://nkllon.com/problem#IAMSecurity", - "label": "IAM / Security Policy", - "score": 0.94, + "id": "https://nkllon.com/problem#CICD", + "label": "CI/CD Pipelines", + "score": 0.88, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#HealthcareWorkflow", - "label": "Healthcare Workflows", - "score": 0.8, + "id": "https://nkllon.com/problem#CloudOrchestration", + "label": "Cloud Infrastructure Orchestration", + "score": 0.95, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#FinanceReconciliation", - "label": "Financial Reconciliation", - "score": 0.75, + "id": "https://nkllon.com/problem#CompilerPipeline", + "label": "Compiler Pipeline", + "score": 0.15, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#MechanicalCAD", - "label": "Mechanical CAD Modeling", - "score": 0.12, + "id": "https://nkllon.com/problem#ConfigManagement", + "label": "Configuration Management", + "score": 0.9, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#CICD", - "label": "CI/CD Pipelines", - "score": 0.88, + "id": "https://nkllon.com/problem#Microservices", + "label": "Distributed Microservices", + "score": 0.97, + "tier": "https://nkllon.com/ui#High", + "type": "ProblemClass" + }, + { + "id": "https://nkllon.com/problem#FinanceReconciliation", + "label": "Financial Reconciliation", + "score": 0.75, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#ConfigManagement", - "label": "Configuration Management", + "id": "https://nkllon.com/problem#GovernmentProcesses", + "label": "Government / Regulatory Processes", "score": 0.9, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#SupplyChain", - "label": "Supply Chain / Inventory", - "score": 0.85, + "id": "https://nkllon.com/problem#HealthcareWorkflow", + "label": "Healthcare Workflows", + "score": 0.8, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#GovernmentProcesses", - "label": "Government / Regulatory Processes", - "score": 0.9, + "id": "https://nkllon.com/problem#IAMSecurity", + "label": "IAM / Security Policy", + "score": 0.94, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#UIFrontend", - "label": "UI / Frontend Systems", - "score": 0.92, + "id": "https://nkllon.com/problem#MLPipelines", + "label": "ML / Data Pipelines", + "score": 0.82, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#Microservices", - "label": "Distributed Microservices", - "score": 0.97, - "tier": "https://nkllon.com/ui#High", + "id": "https://nkllon.com/problem#MechanicalCAD", + "label": "Mechanical CAD Modeling", + "score": 0.12, + "tier": null, "type": "ProblemClass" }, { @@ -78,32 +85,25 @@ "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#MLPipelines", - "label": "ML / Data Pipelines", - "score": 0.82, - "tier": null, - "type": "ProblemClass" - }, - { - "id": "https://nkllon.com/problem#CompilerPipeline", - "label": "Compiler Pipeline", - "score": 0.15, + "id": "https://nkllon.com/problem#SupplyChain", + "label": "Supply Chain / Inventory", + "score": 0.85, "tier": null, "type": "ProblemClass" }, { - "id": "https://nkllon.com/problem#CloudOrchestration", - "label": "Cloud Infrastructure Orchestration", - "score": 0.95, + "id": "https://nkllon.com/problem#UIFrontend", + "label": "UI / Frontend Systems", + "score": 0.92, "tier": null, "type": "ProblemClass" } ], "edges": [ { - "source": "https://nkllon.com/problem#IAMSecurity", - "target": "https://nkllon.com/problem#ConfigManagement", - "type": "overlapsWith" + "source": "https://nkllon.com/problem#CloudOrchestration", + "target": "https://nkllon.com/problem#Microservices", + "type": "influences" }, { "source": "https://nkllon.com/problem#ConfigManagement", @@ -111,22 +111,22 @@ "type": "dependsOn" }, { - "source": "https://nkllon.com/problem#Microservices", - "target": "https://nkllon.com/problem#CICD", + "source": "https://nkllon.com/problem#IAMSecurity", + "target": "https://nkllon.com/problem#ConfigManagement", "type": "overlapsWith" }, { - "source": "https://nkllon.com/problem#CloudOrchestration", - "target": "https://nkllon.com/problem#Microservices", - "type": "influences" + "source": "https://nkllon.com/problem#Microservices", + "target": "https://nkllon.com/problem#CICD", + "type": "overlapsWith" } ], "dimensions": [ { - "id": "https://nkllon.com/ui#Dim1_IllusionClosure", - "label": "Illusion of Closure / Model Reality Gap", - "index": 1.0, - "energyRelevance": 0.8 + "id": "https://nkllon.com/ui#Dim3_AsyncNonDeterminism", + "label": "Asynchrony & Non-Determinism", + "index": 3.0, + "energyRelevance": 0.85 }, { "id": "https://nkllon.com/ui#Dim2_DistributedState", @@ -134,17 +134,17 @@ "index": 2.0, "energyRelevance": 0.9 }, - { - "id": "https://nkllon.com/ui#Dim3_AsyncNonDeterminism", - "label": "Asynchrony & Non-Determinism", - "index": 3.0, - "energyRelevance": 0.85 - }, { "id": "https://nkllon.com/ui#Dim4_DomainInvariants", "label": "Domain Invariants & Business Truth", "index": 4.0, "energyRelevance": 0.8 + }, + { + "id": "https://nkllon.com/ui#Dim1_IllusionClosure", + "label": "Illusion of Closure / Model Reality Gap", + "index": 1.0, + "energyRelevance": 0.8 } ], "weights": [ @@ -154,17 +154,17 @@ "assignment": "https://nkllon.com/ui#DefaultWeights" }, { - "dimension": "https://nkllon.com/ui#Dim2_DistributedState", + "dimension": "https://nkllon.com/ui#Dim22_EnergyGradientSensitivity", "weight": 0.18, "assignment": "https://nkllon.com/ui#DefaultWeights" }, { - "dimension": "https://nkllon.com/ui#Dim3_AsyncNonDeterminism", + "dimension": "https://nkllon.com/ui#Dim2_DistributedState", "weight": 0.18, "assignment": "https://nkllon.com/ui#DefaultWeights" }, { - "dimension": "https://nkllon.com/ui#Dim5_SecurityPrivacy", + "dimension": "https://nkllon.com/ui#Dim3_AsyncNonDeterminism", "weight": 0.18, "assignment": "https://nkllon.com/ui#DefaultWeights" }, @@ -174,7 +174,7 @@ "assignment": "https://nkllon.com/ui#DefaultWeights" }, { - "dimension": "https://nkllon.com/ui#Dim22_EnergyGradientSensitivity", + "dimension": "https://nkllon.com/ui#Dim5_SecurityPrivacy", "weight": 0.18, "assignment": "https://nkllon.com/ui#DefaultWeights" } @@ -191,13 +191,13 @@ "caresAbout": [] }, { - "id": "https://nkllon.com/stake#CTO", - "label": "Chief Technology Officer", + "id": "https://nkllon.com/stake#CISO", + "label": "Chief Information Security Officer", "caresAbout": [] }, { - "id": "https://nkllon.com/stake#CISO", - "label": "Chief Information Security Officer", + "id": "https://nkllon.com/stake#CTO", + "label": "Chief Technology Officer", "caresAbout": [] }, { diff --git a/docs/ttl-graph.dot b/docs/ttl-graph.dot index 27072d9..5f5d0c7 100644 --- a/docs/ttl-graph.dot +++ b/docs/ttl-graph.dot @@ -1,22 +1,22 @@ digraph GoblinTTL { rankdir=LR; node [shape=box, style=rounded, fontname="Helvetica"]; + "https://nkllon.com/problem#CICD" [label="CI/CD Pipelines\nGoblin ~ 0.88", style="filled,rounded", fillcolor="#ff3d00"]; + "https://nkllon.com/problem#CloudOrchestration" [label="Cloud Infrastructure Orchestration\nGoblin ~ 0.95", style="filled,rounded", fillcolor="#ff1900"]; "https://nkllon.com/problem#CompilerPipeline" [label="Compiler Pipeline\nGoblin ~ 0.15", style="filled,rounded", fillcolor="#4cff00"]; "https://nkllon.com/problem#ConfigManagement" [label="Configuration Management\nGoblin ~ 0.90", style="filled,rounded", fillcolor="#ff3200"]; - "https://nkllon.com/problem#PureMathematics" [label="Pure Mathematics (Formal Systems)\nGoblin ~ 0.00", style="filled,rounded", fillcolor="#00ff00"]; - "https://nkllon.com/problem#MechanicalCAD" [label="Mechanical CAD Modeling\nGoblin ~ 0.12", style="filled,rounded", fillcolor="#3dff00"]; "https://nkllon.com/problem#Microservices" [label="Distributed Microservices\nGoblin ~ 0.97", style="filled,rounded", fillcolor="#ff0f00"]; - "https://nkllon.com/problem#CloudOrchestration" [label="Cloud Infrastructure Orchestration\nGoblin ~ 0.95", style="filled,rounded", fillcolor="#ff1900"]; - "https://nkllon.com/problem#HealthcareWorkflow" [label="Healthcare Workflows\nGoblin ~ 0.80", style="filled,rounded", fillcolor="#ff6500"]; - "https://nkllon.com/problem#MLPipelines" [label="ML / Data Pipelines\nGoblin ~ 0.82", style="filled,rounded", fillcolor="#ff5b00"]; - "https://nkllon.com/problem#CICD" [label="CI/CD Pipelines\nGoblin ~ 0.88", style="filled,rounded", fillcolor="#ff3d00"]; "https://nkllon.com/problem#FinanceReconciliation" [label="Financial Reconciliation\nGoblin ~ 0.75", style="filled,rounded", fillcolor="#ff7f00"]; - "https://nkllon.com/problem#UIFrontend" [label="UI / Frontend Systems\nGoblin ~ 0.92", style="filled,rounded", fillcolor="#ff2800"]; "https://nkllon.com/problem#GovernmentProcesses" [label="Government / Regulatory Processes\nGoblin ~ 0.90", style="filled,rounded", fillcolor="#ff3200"]; - "https://nkllon.com/problem#SupplyChain" [label="Supply Chain / Inventory\nGoblin ~ 0.85", style="filled,rounded", fillcolor="#ff4c00"]; + "https://nkllon.com/problem#HealthcareWorkflow" [label="Healthcare Workflows\nGoblin ~ 0.80", style="filled,rounded", fillcolor="#ff6500"]; "https://nkllon.com/problem#IAMSecurity" [label="IAM / Security Policy\nGoblin ~ 0.94", style="filled,rounded", fillcolor="#ff1e00"]; - "https://nkllon.com/problem#ConfigManagement" -> "https://nkllon.com/problem#CloudOrchestration" [label="depends", style="dotted"]; - "https://nkllon.com/problem#Microservices" -> "https://nkllon.com/problem#CICD" [label="overlaps", style="dashed"]; + "https://nkllon.com/problem#MLPipelines" [label="ML / Data Pipelines\nGoblin ~ 0.82", style="filled,rounded", fillcolor="#ff5b00"]; + "https://nkllon.com/problem#MechanicalCAD" [label="Mechanical CAD Modeling\nGoblin ~ 0.12", style="filled,rounded", fillcolor="#3dff00"]; + "https://nkllon.com/problem#PureMathematics" [label="Pure Mathematics (Formal Systems)\nGoblin ~ 0.00", style="filled,rounded", fillcolor="#00ff00"]; + "https://nkllon.com/problem#SupplyChain" [label="Supply Chain / Inventory\nGoblin ~ 0.85", style="filled,rounded", fillcolor="#ff4c00"]; + "https://nkllon.com/problem#UIFrontend" [label="UI / Frontend Systems\nGoblin ~ 0.92", style="filled,rounded", fillcolor="#ff2800"]; "https://nkllon.com/problem#CloudOrchestration" -> "https://nkllon.com/problem#Microservices" [label="influences", style="solid"]; + "https://nkllon.com/problem#ConfigManagement" -> "https://nkllon.com/problem#CloudOrchestration" [label="depends", style="dotted"]; "https://nkllon.com/problem#IAMSecurity" -> "https://nkllon.com/problem#ConfigManagement" [label="overlaps", style="dashed"]; + "https://nkllon.com/problem#Microservices" -> "https://nkllon.com/problem#CICD" [label="overlaps", style="dashed"]; } diff --git a/docs/ttl-graph.png b/docs/ttl-graph.png index b760d5b32cd7b63bdc9a6ebc8abb50a33bc3b905..f338944fc09e008c0b4205309f23b50932b1bf74 100644 GIT binary patch literal 86755 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

hZ6Fh~O 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�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 G8}L8SJT;*J diff --git a/docs/ttl-graph.svg b/docs/ttl-graph.svg index ddc2dd2..37dae93 100644 --- a/docs/ttl-graph.svg +++ b/docs/ttl-graph.svg @@ -9,131 +9,131 @@ GoblinTTL - + -https://nkllon.com/problem#CompilerPipeline - -Compiler Pipeline -Goblin ~ 0.15 - - - -https://nkllon.com/problem#ConfigManagement - -Configuration Management -Goblin ~ 0.90 +https://nkllon.com/problem#CICD + +CI/CD Pipelines +Goblin ~ 0.88 - + https://nkllon.com/problem#CloudOrchestration - -Cloud Infrastructure Orchestration -Goblin ~ 0.95 + +Cloud Infrastructure Orchestration +Goblin ~ 0.95 - + + +https://nkllon.com/problem#Microservices + +Distributed Microservices +Goblin ~ 0.97 + + -https://nkllon.com/problem#ConfigManagement->https://nkllon.com/problem#CloudOrchestration - - -depends +https://nkllon.com/problem#CloudOrchestration->https://nkllon.com/problem#Microservices + + +influences - + -https://nkllon.com/problem#PureMathematics - -Pure Mathematics (Formal Systems) -Goblin ~ 0.00 +https://nkllon.com/problem#CompilerPipeline + +Compiler Pipeline +Goblin ~ 0.15 - + -https://nkllon.com/problem#MechanicalCAD - -Mechanical CAD Modeling -Goblin ~ 0.12 - - - -https://nkllon.com/problem#Microservices - -Distributed Microservices -Goblin ~ 0.97 +https://nkllon.com/problem#ConfigManagement + +Configuration Management +Goblin ~ 0.90 - - -https://nkllon.com/problem#CICD - -CI/CD Pipelines -Goblin ~ 0.88 + + +https://nkllon.com/problem#ConfigManagement->https://nkllon.com/problem#CloudOrchestration + + +depends - + https://nkllon.com/problem#Microservices->https://nkllon.com/problem#CICD - - -overlaps + + +overlaps - - -https://nkllon.com/problem#CloudOrchestration->https://nkllon.com/problem#Microservices - - -influences + + +https://nkllon.com/problem#FinanceReconciliation + +Financial Reconciliation +Goblin ~ 0.75 - + +https://nkllon.com/problem#GovernmentProcesses + +Government / Regulatory Processes +Goblin ~ 0.90 + + + https://nkllon.com/problem#HealthcareWorkflow Healthcare Workflows Goblin ~ 0.80 + + +https://nkllon.com/problem#IAMSecurity + +IAM / Security Policy +Goblin ~ 0.94 + + + +https://nkllon.com/problem#IAMSecurity->https://nkllon.com/problem#ConfigManagement + + +overlaps + - + https://nkllon.com/problem#MLPipelines ML / Data Pipelines Goblin ~ 0.82 - - -https://nkllon.com/problem#FinanceReconciliation - -Financial Reconciliation -Goblin ~ 0.75 - - + -https://nkllon.com/problem#UIFrontend - -UI / Frontend Systems -Goblin ~ 0.92 +https://nkllon.com/problem#MechanicalCAD + +Mechanical CAD Modeling +Goblin ~ 0.12 - + -https://nkllon.com/problem#GovernmentProcesses - -Government / Regulatory Processes -Goblin ~ 0.90 +https://nkllon.com/problem#PureMathematics + +Pure Mathematics (Formal Systems) +Goblin ~ 0.00 https://nkllon.com/problem#SupplyChain - -Supply Chain / Inventory -Goblin ~ 0.85 + +Supply Chain / Inventory +Goblin ~ 0.85 - + -https://nkllon.com/problem#IAMSecurity - -IAM / Security Policy -Goblin ~ 0.94 - - - -https://nkllon.com/problem#IAMSecurity->https://nkllon.com/problem#ConfigManagement - - -overlaps +https://nkllon.com/problem#UIFrontend + +UI / Frontend Systems +Goblin ~ 0.92 diff --git a/tools/export_instances_dot.py b/tools/export_instances_dot.py index 1e9e092..a9742e4 100644 --- a/tools/export_instances_dot.py +++ b/tools/export_instances_dot.py @@ -105,11 +105,13 @@ def emit_dot(nodes: Dict[str, Dict], edges: Dict[Tuple[str, str], str]) -> str: lines.append("digraph GoblinTTL {") lines.append(" rankdir=LR;") lines.append(" node [shape=box, style=rounded, fontname=\"Helvetica\"];") - for nid, meta in nodes.items(): + # Deterministic ordering: sort nodes by label then id + for nid, meta in sorted(nodes.items(), key=lambda item: (item[1].get("label", ""), item[0])): label = meta["label"].replace("\"", "\\\"") color = meta["fillcolor"] lines.append(f" \"{nid}\" [label=\"{label}\", style=\"filled,rounded\", fillcolor=\"{color}\"];") - for (u, v), kind in edges.items(): + # Deterministic ordering: sort edges by (u, v, kind) + for (u, v), kind in sorted(edges.items(), key=lambda item: (item[0][0], item[0][1], item[1])): style = "solid" if kind == "overlaps": style = "dashed" diff --git a/tools/export_web_json.py b/tools/export_web_json.py index 84963aa..dad1e1b 100644 --- a/tools/export_web_json.py +++ b/tools/export_web_json.py @@ -48,7 +48,7 @@ def collect(g: Graph) -> Dict[str, Any]: for inst in g.subjects(RDF.type, subclass): problem_classes.add(inst) - for n in problem_classes: + for n in sorted(problem_classes, key=lambda x: str(x)): nid = str(n) nodes.append({ "id": nid, @@ -59,14 +59,14 @@ def collect(g: Graph) -> Dict[str, Any]: }) # Relations (edges) - for s in list(problem_classes): + for s in sorted(list(problem_classes), key=lambda x: str(x)): for prop, kind in ((UI.influences, "influences"), (UI.overlapsWith, "overlapsWith"), (UI.dependsOn, "dependsOn")): for o in g.objects(s, prop): if (str(s) in {n["id"] for n in nodes}) and (str(o) in {n["id"] for n in nodes}): edges.append({"source": str(s), "target": str(o), "type": kind}) # Dimensions - for d in g.subjects(RDF.type, UI.Dimension): + for d in sorted(g.subjects(RDF.type, UI.Dimension), key=lambda x: str(x)): did = str(d) dimensions.append({ "id": did, @@ -76,8 +76,8 @@ def collect(g: Graph) -> Dict[str, Any]: }) # Weights - for w in g.subjects(RDF.type, UI.WeightAssignment): - for dim in g.objects(w, UI.forDimension): + for w in sorted(g.subjects(RDF.type, UI.WeightAssignment), key=lambda x: str(x)): + for dim in sorted(g.objects(w, UI.forDimension), key=lambda x: str(x)): weight_val = get_float(g, w, UI.hasWeight) if weight_val is not None: weights.append({ @@ -87,14 +87,21 @@ def collect(g: Graph) -> Dict[str, Any]: }) # Stakeholders - for role in g.subjects(RDF.type, STAKE.StakeholderRole): - cares = [str(d) for d in g.objects(role, STAKE.caresAbout)] + for role in sorted(g.subjects(RDF.type, STAKE.StakeholderRole), key=lambda x: str(x)): + cares = sorted([str(d) for d in g.objects(role, STAKE.caresAbout)]) stakeholders.append({ "id": str(role), "label": get_label(g, role), "caresAbout": cares, }) + # Deterministic ordering for all lists + nodes.sort(key=lambda n: (n["label"], n["id"])) + edges.sort(key=lambda e: (e["source"], e["target"], e["type"])) + dimensions.sort(key=lambda d: (d["label"], d["id"])) + weights.sort(key=lambda w: (w["dimension"], w["assignment"], w["weight"])) + stakeholders.sort(key=lambda s: (s["label"], s["id"])) + return { "nodes": nodes, "edges": edges, From 61ed271af91a738a6456c396c52be9e1d5078425 Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:44:34 -0700 Subject: [PATCH 07/13] chore: make GHCR CI scripts executable --- tools/ci/ghcr_login.sh | 0 tools/ci/run_act_ghcr.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tools/ci/ghcr_login.sh mode change 100644 => 100755 tools/ci/run_act_ghcr.sh diff --git a/tools/ci/ghcr_login.sh b/tools/ci/ghcr_login.sh old mode 100644 new mode 100755 diff --git a/tools/ci/run_act_ghcr.sh b/tools/ci/run_act_ghcr.sh old mode 100644 new mode 100755 From 61d1e12fd3f3a83d08015d0a7f1f55c1eede6ffd Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:45:16 -0700 Subject: [PATCH 08/13] ci: switch act runner to local binary; keep GHCR login for registries --- tools/ci/run_act_ghcr.sh | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/tools/ci/run_act_ghcr.sh b/tools/ci/run_act_ghcr.sh index 50307c3..a95b623 100755 --- a/tools/ci/run_act_ghcr.sh +++ b/tools/ci/run_act_ghcr.sh @@ -4,30 +4,24 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" -# Login to GHCR using gh -"${SCRIPT_DIR}/ghcr_login.sh" +# Login to GHCR using gh (for private registries if needed) +"${SCRIPT_DIR}/ghcr_login.sh" || true -# Pull required images (act and ubuntu runner) -docker pull ghcr.io/nektos/act:latest 1>/dev/null +# Prefer local act binary; require it for reliability +if ! command -v act >/dev/null 2>&1; then + echo "act not found. Please install: brew install act" >&2 + exit 1 +fi + +# Pull runner image (ubuntu) docker pull catthehacker/ubuntu:act-latest 1>/dev/null -ACT_IMG="ghcr.io/nektos/act:latest" PARAMS=(-P "ubuntu-latest=catthehacker/ubuntu:act-latest") -run_job() { - local job="$1" - docker run --rm \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v "${ROOT_DIR}":/github/workspace \ - -v "${HOME}/.act":/root/.act \ - -w /github/workspace \ - "${ACT_IMG}" pull_request -j "${job}" "${PARAMS[@]}" -} - # Allow override: ACT_JOBS="job1 job2" JOBS="${ACT_JOBS:-validate-and-build js python-validate dot-check docs-link}" for job in ${JOBS}; do echo "=== ${job} ===" - run_job "${job}" + act pull_request -j "${job}" "${PARAMS[@]}" echo "=== done: ${job} ===" done From edc364e7db1d3e6b6c25ad5fe2bb6fb77c17125a Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:52:41 -0700 Subject: [PATCH 09/13] chore: normalize EOF in docs/goblin.json via pre-commit --- docs/goblin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/goblin.json b/docs/goblin.json index 9f6a7a7..020806b 100644 --- a/docs/goblin.json +++ b/docs/goblin.json @@ -211,4 +211,4 @@ "caresAbout": [] } ] -} \ No newline at end of file +} From 397b856e28615e6c42344671006beea7fb6126e3 Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 11:55:09 -0700 Subject: [PATCH 10/13] chore: exporter writes trailing newline for stable EOF; regen docs --- tools/export_web_json.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/export_web_json.py b/tools/export_web_json.py index dad1e1b..9d65002 100644 --- a/tools/export_web_json.py +++ b/tools/export_web_json.py @@ -115,7 +115,8 @@ def main() -> int: g = load_graph(DATA_TTL) data = collect(g) OUT_DIR.mkdir(parents=True, exist_ok=True) - JSON_PATH.write_text(json.dumps(data, indent=2), encoding="utf-8") + # Ensure trailing newline for stable EOF fixer behavior + JSON_PATH.write_text(json.dumps(data, indent=2) + "\n", encoding="utf-8") print(f"Wrote JSON: {JSON_PATH}") return 0 From ca323871ecddd0297b5ddad13737f23ac2370dff Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 12:08:44 -0700 Subject: [PATCH 11/13] ci: skip pages artifact upload when running under act (env.ACT) --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index deafbfc..362fa19 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,6 +59,7 @@ jobs: npm run build - name: Upload artifact (docs) + if: ${{ env.ACT != 'true' }} uses: actions/upload-pages-artifact@v3 with: path: docs From 69088f8da748e24b79952852e6ff02c0e6cbdb1a Mon Sep 17 00:00:00 2001 From: Lou Springer Date: Sat, 22 Nov 2025 12:11:25 -0700 Subject: [PATCH 12/13] docs: regenerate goblin-map from goblin-map.dot --- docs/goblin-map.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/goblin-map.svg b/docs/goblin-map.svg index caac5de..934d4af 100644 --- a/docs/goblin-map.svg +++ b/docs/goblin-map.svg @@ -1,7 +1,7 @@ - Date: Fri, 5 Dec 2025 12:38:22 -0700 Subject: [PATCH 13/13] Regenerate goblin map assets --- docs/goblin-map.svg.new | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/goblin-map.svg.new b/docs/goblin-map.svg.new index caac5de..934d4af 100644 --- a/docs/goblin-map.svg.new +++ b/docs/goblin-map.svg.new @@ -1,7 +1,7 @@ -