jbrowse-plugin-graphgenomeviewer 1.0.1 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +202 -24
- package/dist/chunks/AddTrackWorkflow-Y3OBHM33.js +2 -0
- package/dist/chunks/AddTrackWorkflow-Y3OBHM33.js.map +7 -0
- package/dist/chunks/GbzBaseSyntenyAdapter-6UTRY4CV.js +8 -0
- package/dist/chunks/GbzBaseSyntenyAdapter-6UTRY4CV.js.map +7 -0
- package/dist/chunks/GraphGenomeView-UD5WCV3Q.js +14 -0
- package/dist/chunks/GraphGenomeView-UD5WCV3Q.js.map +7 -0
- package/dist/chunks/MinigraphBubbleAdapter-B75VQK7T.js +2 -0
- package/dist/chunks/MinigraphBubbleAdapter-B75VQK7T.js.map +7 -0
- package/dist/chunks/RgfaTabixAdapter-IT7I5RR3.js +3 -0
- package/dist/chunks/RgfaTabixAdapter-IT7I5RR3.js.map +7 -0
- package/dist/chunks/bandage-layout-FIOZ7B3E.js +1660 -0
- package/dist/chunks/bandage-layout-FIOZ7B3E.js.map +7 -0
- package/dist/chunks/chunk-D7XFR2IV.js +2 -0
- package/dist/chunks/chunk-D7XFR2IV.js.map +7 -0
- package/dist/chunks/chunk-F4C3BEPV.js +2 -0
- package/dist/chunks/chunk-F4C3BEPV.js.map +7 -0
- package/dist/chunks/chunk-FCWXYIFC.js +2 -0
- package/dist/chunks/chunk-FCWXYIFC.js.map +7 -0
- package/dist/chunks/chunk-FY3BTKY4.js +2 -0
- package/dist/chunks/chunk-FY3BTKY4.js.map +7 -0
- package/dist/chunks/chunk-J4OLMLS5.js +2 -0
- package/dist/chunks/chunk-J4OLMLS5.js.map +7 -0
- package/dist/chunks/chunk-JCG7RLMB.js +2 -0
- package/dist/chunks/chunk-JCG7RLMB.js.map +7 -0
- package/dist/chunks/chunk-KWAXLUPQ.js +2 -0
- package/dist/chunks/chunk-KWAXLUPQ.js.map +7 -0
- package/dist/chunks/chunk-LGKM2PZH.js +2 -0
- package/dist/chunks/chunk-LGKM2PZH.js.map +7 -0
- package/dist/chunks/chunk-TN6FK5UD.js +2 -0
- package/dist/chunks/chunk-TN6FK5UD.js.map +7 -0
- package/dist/chunks/chunk-X3X74OGB.js +2 -0
- package/dist/chunks/chunk-X3X74OGB.js.map +7 -0
- package/dist/chunks/chunk-XEJ47DLD.js +2 -0
- package/dist/chunks/chunk-XEJ47DLD.js.map +7 -0
- package/dist/chunks/chunk-ZNGDWZ6Z.js +2 -0
- package/dist/chunks/chunk-ZNGDWZ6Z.js.map +7 -0
- package/dist/chunks/executeDiagonalize-XMPEDHVZ.js +2 -0
- package/dist/chunks/executeDiagonalize-XMPEDHVZ.js.map +7 -0
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +3 -0
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +7 -0
- package/package.json +94 -50
- package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +687 -0
- package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +648 -0
- package/src/GbzBaseSyntenyAdapter/configSchema.ts +181 -0
- package/src/GbzBaseSyntenyAdapter/index.ts +34 -0
- package/src/GbzBaseSyntenyAdapter/test_data/micb-kir3dl1.gbz.db +0 -0
- package/src/GbzBaseSyntenyAdapter/test_data/micb-kir3dl1.haplotype-index.db +0 -0
- package/src/GetSubgraph.test.ts +193 -0
- package/src/GetSubgraph.ts +93 -0
- package/src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx +167 -0
- package/src/GraphAddTrackWorkflow/buildTrackConfig.test.ts +150 -0
- package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +114 -0
- package/src/GraphAddTrackWorkflow/index.ts +20 -0
- package/src/GraphComputeLayout.ts +46 -0
- package/src/GraphGenomeView/anchoredNodes.ts +101 -0
- package/src/GraphGenomeView/bubbleSpreads.ts +102 -0
- package/src/GraphGenomeView/bubbles/bubbleHalos.test.ts +58 -0
- package/src/GraphGenomeView/bubbles/bubbleHalos.ts +149 -0
- package/src/GraphGenomeView/bubbles/bubbleRoutes.test.ts +141 -0
- package/src/GraphGenomeView/bubbles/bubblesFromGraph.test.ts +239 -0
- package/src/GraphGenomeView/bubbles/bubblesFromGraph.ts +210 -0
- package/src/GraphGenomeView/bubbles/classifyBubble.test.ts +172 -0
- package/src/GraphGenomeView/bubbles/classifyBubble.ts +138 -0
- package/src/GraphGenomeView/bubbles/popBubble.test.ts +73 -0
- package/src/GraphGenomeView/bubbles/popBubble.ts +26 -0
- package/src/GraphGenomeView/colorSchemes.ts +36 -0
- package/src/GraphGenomeView/components/BubbleHalos.tsx +162 -0
- package/src/GraphGenomeView/components/BubbleOverlay.tsx +181 -0
- package/src/GraphGenomeView/components/ColorSchemeSelect.tsx +41 -0
- package/src/GraphGenomeView/components/GenePins.tsx +107 -0
- package/src/GraphGenomeView/components/GraphCanvas.tsx +759 -0
- package/src/GraphGenomeView/components/GraphGenomeView.test.tsx +77 -0
- package/src/GraphGenomeView/components/GraphGenomeView.tsx +18 -19
- package/src/GraphGenomeView/components/GraphLoadStatus.tsx +84 -0
- package/src/GraphGenomeView/components/GraphSettingsDialog.tsx +327 -0
- package/src/GraphGenomeView/components/GraphStats.tsx +82 -0
- package/src/GraphGenomeView/components/GraphToolbar.tsx +84 -0
- package/src/GraphGenomeView/components/ImportForm.tsx +124 -0
- package/src/GraphGenomeView/components/LabelChip.tsx +65 -0
- package/src/GraphGenomeView/components/LayoutSelect.tsx +56 -0
- package/src/GraphGenomeView/components/RepeatSelect.tsx +51 -0
- package/src/GraphGenomeView/components/SettingsMenu.tsx +82 -0
- package/src/GraphGenomeView/components/SubgraphContextSelect.tsx +75 -0
- package/src/GraphGenomeView/components/SubgraphHaplotypesField.tsx +86 -0
- package/src/GraphGenomeView/components/WalkRowsOverlay.tsx +252 -0
- package/src/GraphGenomeView/components/WalkSelect.tsx +51 -0
- package/src/GraphGenomeView/components/overlayLabels.test.ts +56 -0
- package/src/GraphGenomeView/components/overlayLabels.ts +75 -0
- package/src/GraphGenomeView/deletionEdges.test.ts +198 -0
- package/src/GraphGenomeView/deletionEdges.ts +217 -0
- package/src/GraphGenomeView/genes/geneFeatures.ts +107 -0
- package/src/GraphGenomeView/genes/genePins.ts +130 -0
- package/src/GraphGenomeView/genes/genes.test.ts +153 -0
- package/src/GraphGenomeView/gfa/gfaConverter.test.ts +394 -0
- package/src/GraphGenomeView/gfa/gfaConverter.ts +235 -0
- package/src/GraphGenomeView/graphLabels.budget.test.ts +36 -0
- package/src/GraphGenomeView/graphLabels.test.ts +548 -0
- package/src/GraphGenomeView/graphLabels.ts +640 -0
- package/src/GraphGenomeView/index.ts +29 -7
- package/src/GraphGenomeView/laneRamp.test.ts +97 -0
- package/src/GraphGenomeView/laneRamp.ts +87 -0
- package/src/GraphGenomeView/launchKeys.test.ts +63 -0
- package/src/GraphGenomeView/layout/anchoredLayout.test.ts +213 -0
- package/src/GraphGenomeView/layout/anchoredLayout.ts +80 -0
- package/src/GraphGenomeView/layout/bubbleCrossing.test.ts +190 -0
- package/src/GraphGenomeView/layout/drawnScale.ts +199 -0
- package/src/GraphGenomeView/layout/mergeRuns.test.ts +100 -0
- package/src/GraphGenomeView/layout/mergeRuns.ts +203 -0
- package/src/GraphGenomeView/layout/orderedLayout.test.ts +212 -0
- package/src/GraphGenomeView/layout/orderedLayout.ts +396 -0
- package/src/GraphGenomeView/layout/orientToReference.test.ts +110 -0
- package/src/GraphGenomeView/layout/orientToReference.ts +79 -0
- package/src/GraphGenomeView/layout/placeOffReference.ts +147 -0
- package/src/GraphGenomeView/layout/referenceSeeds.test.ts +79 -0
- package/src/GraphGenomeView/layout/referenceSeeds.ts +89 -0
- package/src/GraphGenomeView/layout/rowSpacing.ts +5 -0
- package/src/GraphGenomeView/layout/sampleRowLayout.test.ts +318 -0
- package/src/GraphGenomeView/layout/sampleRowLayout.ts +134 -0
- package/src/GraphGenomeView/layout/variantMapLayout.test.ts +59 -0
- package/src/GraphGenomeView/layout/variantMapLayout.ts +20 -0
- package/src/GraphGenomeView/layout/walkRowLayout.ts +54 -0
- package/src/GraphGenomeView/layout/walkRows.test.ts +178 -0
- package/src/GraphGenomeView/layout/walkRows.ts +177 -0
- package/src/GraphGenomeView/layoutModes.ts +131 -0
- package/src/GraphGenomeView/model.test.ts +2696 -0
- package/src/GraphGenomeView/model.ts +2665 -174
- package/src/GraphGenomeView/nodeWidths.ts +67 -0
- package/src/GraphGenomeView/pathAnchoring.test.ts +252 -0
- package/src/GraphGenomeView/pathAnchoring.ts +164 -0
- package/src/GraphGenomeView/pathColors.test.ts +83 -0
- package/src/GraphGenomeView/pathColors.ts +122 -0
- package/src/GraphGenomeView/referenceSpan.test.ts +84 -0
- package/src/GraphGenomeView/referenceSpan.ts +133 -0
- package/src/GraphGenomeView/renderPasses.bench.ts +172 -0
- package/src/GraphGenomeView/renderPipeline.test.ts +226 -0
- package/src/GraphGenomeView/renderer/Canvas2DRenderer.test.ts +205 -0
- package/src/GraphGenomeView/renderer/Canvas2DRenderer.ts +246 -0
- package/src/GraphGenomeView/renderer/GeometryBuilder.test.ts +723 -0
- package/src/GraphGenomeView/renderer/GeometryBuilder.ts +882 -0
- package/src/GraphGenomeView/renderer/GraphRenderer.ts +13 -0
- package/src/GraphGenomeView/renderer/colorBits.ts +43 -0
- package/src/GraphGenomeView/renderer/recordingCanvas.ts +64 -0
- package/src/GraphGenomeView/renderer/types.ts +84 -0
- package/src/GraphGenomeView/renderer/walkFade.test.ts +100 -0
- package/src/GraphGenomeView/repeats/repeatFeatures.test.ts +114 -0
- package/src/GraphGenomeView/repeats/repeatFeatures.ts +202 -0
- package/src/GraphGenomeView/repeats/test_data/abca7_trgt_walks.json +575 -0
- package/src/GraphGenomeView/repeats/walkCalls.test.ts +127 -0
- package/src/GraphGenomeView/repeats/walkCalls.ts +132 -0
- package/src/GraphGenomeView/stress.test.ts +214 -0
- package/src/GraphGenomeView/subgraphLoad.test.ts +245 -0
- package/src/GraphGenomeView/types.ts +141 -0
- package/src/GraphGenomeView/util/SpatialIndex.test.ts +73 -0
- package/src/GraphGenomeView/util/SpatialIndex.ts +312 -0
- package/src/GraphGenomeView/util/edgeCurves.test.ts +93 -0
- package/src/GraphGenomeView/util/edgeCurves.ts +94 -0
- package/src/GraphGenomeView/util/geometry.test.ts +447 -0
- package/src/GraphGenomeView/util/geometry.ts +656 -0
- package/src/GraphGenomeView/util/hitDetection.test.ts +307 -0
- package/src/GraphGenomeView/util/hitDetection.ts +330 -0
- package/src/GraphGenomeView/util/wheelZoom.test.ts +40 -0
- package/src/GraphGenomeView/util/wheelZoom.ts +26 -0
- package/src/GraphGenomeView/walkHighlight.test.ts +54 -0
- package/src/GraphGenomeView/walkHighlight.ts +56 -0
- package/src/LaunchGraphGenomeView.ts +46 -0
- package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.test.ts +139 -0
- package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +86 -0
- package/src/MinigraphBubbleAdapter/bubbleLine.ts +92 -0
- package/src/MinigraphBubbleAdapter/configSchema.ts +109 -0
- package/src/MinigraphBubbleAdapter/index.ts +22 -0
- package/src/MinigraphBubbleAdapter/test_data/hprc_bubbles_mhc.bed.gz +0 -0
- package/src/MinigraphBubbleAdapter/test_data/hprc_bubbles_mhc.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +285 -0
- package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +194 -0
- package/src/RgfaTabixAdapter/bubbleTier.test.ts +84 -0
- package/src/RgfaTabixAdapter/configSchema.ts +142 -0
- package/src/RgfaTabixAdapter/index.ts +24 -0
- package/src/RgfaTabixAdapter/rgfaBed.test.ts +158 -0
- package/src/RgfaTabixAdapter/rgfaBed.ts +156 -0
- package/src/RgfaTabixAdapter/test_data/bubble_tier_chrY.links.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/bubble_tier_chrY.links.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/bubble_tier_chrY.segs.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/bubble_tier_chrY.segs.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/pggb_ecoli.links.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/pggb_ecoli.links.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/pggb_ecoli.segs.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/pggb_ecoli.segs.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.links.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.links.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.segs.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.segs.bed.gz.tbi +0 -0
- package/src/alleleProjection/projectAlleles.test.ts +75 -0
- package/src/alleleProjection/projectAlleles.ts +190 -0
- package/src/bandage/README.md +121 -0
- package/src/bandage/bandage-layout.d.ts +14 -0
- package/src/bandage/bandage-layout.js +0 -0
- package/src/bandage/native/CMakeLists.txt +45 -0
- package/src/bandage/native/include/graph.h +188 -0
- package/src/bandage/native/include/graphlayout.h +74 -0
- package/src/bandage/native/include/settings.h +86 -0
- package/src/bandage/native/include/types.h +56 -0
- package/src/bandage/native/src/bindings.cpp +164 -0
- package/src/bandage/native/src/graphlayout.cpp +621 -0
- package/src/bandage/resizableDecode.test.ts +58 -0
- package/src/gfa-core/gfaParser.bench.ts +55 -0
- package/src/gfa-core/gfaParser.test.ts +168 -0
- package/src/gfa-core/gfaParser.ts +237 -0
- package/src/gfa-core/index.ts +10 -0
- package/src/hoverSync/GraphNodeHighlight.tsx +62 -0
- package/src/hoverSync/graphViewHighlights.test.ts +158 -0
- package/src/hoverSync/graphViewHighlights.ts +119 -0
- package/src/hoverSync/index.test.tsx +36 -0
- package/src/hoverSync/index.tsx +19 -0
- package/src/hoverSync/lgvHover.test.ts +202 -0
- package/src/hoverSync/lgvHover.ts +136 -0
- package/src/index.ts +46 -15
- package/src/launchFromGraph/contributors.test.ts +197 -0
- package/src/launchFromGraph/contributors.ts +0 -0
- package/src/launchFromGraph/graphMenuItems.ts +211 -0
- package/src/launchFromGraph/launchFromGraph.test.ts +489 -0
- package/src/launchFromGraph/launchFromGraph.ts +265 -0
- package/src/launchFromGraph/launchTracks.test.ts +72 -0
- package/src/launchFromGraph/launchTracks.ts +50 -0
- package/src/launchFromGraph/linearViewTarget.test.ts +82 -0
- package/src/launchFromGraph/linearViewTarget.ts +75 -0
- package/src/launchFromGraph/syntenyTracks.ts +47 -0
- package/src/launchSubgraph/index.ts +152 -0
- package/src/launchSubgraph/launchSubgraph.test.ts +264 -0
- package/src/launchSubgraph/launchSubgraphView.ts +128 -0
- package/src/launchSubgraph/linearViewMenuItems.test.ts +176 -0
- package/src/launchSubgraph/linearViewMenuItems.ts +107 -0
- package/src/launchSubgraph/multiWayLaunch.test.ts +289 -0
- package/src/launchSubgraph/subgraphMenuItems.ts +73 -0
- package/src/launchSubgraph/subgraphTracks.test.ts +165 -0
- package/src/launchSubgraph/subgraphTracks.ts +151 -0
- package/src/launchSubgraph/testEnv.ts +258 -0
- package/src/loadBandage.ts +22 -0
- package/src/panSNTabix.test.ts +72 -0
- package/src/panSNTabix.ts +149 -0
- package/src/pansn.ts +106 -0
- package/src/pluginName.ts +3 -0
- package/src/synteny/ComparativeAdapterBase.ts +86 -0
- package/src/synteny/SyntenyFeature.ts +116 -0
- package/src/synteny/clipFeatureToRegion.test.ts +329 -0
- package/src/synteny/clipFeatureToRegion.ts +167 -0
- package/src/version.ts +1 -0
- package/dist/GraphGenomeView/components/AreYouSureDialog.d.ts +0 -6
- package/dist/GraphGenomeView/components/AreYouSureDialog.js +0 -22
- package/dist/GraphGenomeView/components/AreYouSureDialog.js.map +0 -1
- package/dist/GraphGenomeView/components/FeatureDialog.d.ts +0 -7
- package/dist/GraphGenomeView/components/FeatureDialog.js +0 -14
- package/dist/GraphGenomeView/components/FeatureDialog.js.map +0 -1
- package/dist/GraphGenomeView/components/GraphGenomeView.d.ts +0 -6
- package/dist/GraphGenomeView/components/GraphGenomeView.js +0 -18
- package/dist/GraphGenomeView/components/GraphGenomeView.js.map +0 -1
- package/dist/GraphGenomeView/components/GraphPanel.d.ts +0 -6
- package/dist/GraphGenomeView/components/GraphPanel.js +0 -21
- package/dist/GraphGenomeView/components/GraphPanel.js.map +0 -1
- package/dist/GraphGenomeView/components/GraphSettings.d.ts +0 -14
- package/dist/GraphGenomeView/components/GraphSettings.js +0 -64
- package/dist/GraphGenomeView/components/GraphSettings.js.map +0 -1
- package/dist/GraphGenomeView/components/Header.d.ts +0 -6
- package/dist/GraphGenomeView/components/Header.js +0 -59
- package/dist/GraphGenomeView/components/Header.js.map +0 -1
- package/dist/GraphGenomeView/components/HeaderMenu.d.ts +0 -6
- package/dist/GraphGenomeView/components/HeaderMenu.js +0 -83
- package/dist/GraphGenomeView/components/HeaderMenu.js.map +0 -1
- package/dist/GraphGenomeView/components/HelpDialog.d.ts +0 -5
- package/dist/GraphGenomeView/components/HelpDialog.js +0 -15
- package/dist/GraphGenomeView/components/HelpDialog.js.map +0 -1
- package/dist/GraphGenomeView/components/LocStringInput.d.ts +0 -6
- package/dist/GraphGenomeView/components/LocStringInput.js +0 -23
- package/dist/GraphGenomeView/components/LocStringInput.js.map +0 -1
- package/dist/GraphGenomeView/components/ServerSettings.d.ts +0 -6
- package/dist/GraphGenomeView/components/ServerSettings.js +0 -22
- package/dist/GraphGenomeView/components/ServerSettings.js.map +0 -1
- package/dist/GraphGenomeView/components/SettingsDialog.d.ts +0 -7
- package/dist/GraphGenomeView/components/SettingsDialog.js +0 -45
- package/dist/GraphGenomeView/components/SettingsDialog.js.map +0 -1
- package/dist/GraphGenomeView/graphSettingsModel.d.ts +0 -26
- package/dist/GraphGenomeView/graphSettingsModel.js +0 -105
- package/dist/GraphGenomeView/graphSettingsModel.js.map +0 -1
- package/dist/GraphGenomeView/index.d.ts +0 -2
- package/dist/GraphGenomeView/index.js +0 -15
- package/dist/GraphGenomeView/index.js.map +0 -1
- package/dist/GraphGenomeView/model.d.ts +0 -175
- package/dist/GraphGenomeView/model.js +0 -178
- package/dist/GraphGenomeView/model.js.map +0 -1
- package/dist/GraphGenomeView/util.d.ts +0 -1
- package/dist/GraphGenomeView/util.js +0 -8
- package/dist/GraphGenomeView/util.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -24
- package/dist/index.js.map +0 -1
- package/dist/jbrowse-plugin-graphgenomeviewer.umd.production.min.js +0 -85
- package/dist/jbrowse-plugin-graphgenomeviewer.umd.production.min.js.map +0 -7
- package/src/GraphGenomeView/components/AreYouSureDialog.tsx +0 -50
- package/src/GraphGenomeView/components/FeatureDialog.tsx +0 -36
- package/src/GraphGenomeView/components/GraphPanel.tsx +0 -65
- package/src/GraphGenomeView/components/GraphSettings.tsx +0 -138
- package/src/GraphGenomeView/components/Header.tsx +0 -74
- package/src/GraphGenomeView/components/HeaderMenu.tsx +0 -98
- package/src/GraphGenomeView/components/HelpDialog.tsx +0 -45
- package/src/GraphGenomeView/components/LocStringInput.tsx +0 -47
- package/src/GraphGenomeView/components/ServerSettings.tsx +0 -44
- package/src/GraphGenomeView/components/SettingsDialog.tsx +0 -123
- package/src/GraphGenomeView/graphSettingsModel.ts +0 -147
- package/src/GraphGenomeView/util.ts +0 -7
- package/src/declare.d.ts +0 -1
package/README.md
CHANGED
|
@@ -1,36 +1,214 @@
|
|
|
1
1
|
# jbrowse-plugin-graphgenomeviewer
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A JBrowse 2 plugin that adds a **GraphGenomeView** for pangenome graphs (GFA /
|
|
4
|
+
rGFA), plus a right-click launcher to open the local subgraph around a region
|
|
5
|
+
from a linear genome view.
|
|
4
6
|
|
|
5
|
-
##
|
|
7
|
+
## Screenshots
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
The LPA KIV-2 window of the HPRC release 2 graph in the **force-directed
|
|
10
|
+
layout**: the GRCh38 backbone runs left to right, coloured by position the way
|
|
11
|
+
the rGFA segments track above it is, and the kringle repeat array is the knot of
|
|
12
|
+
loops in the middle. Each bubble the graph holds is haloed along its own nodes
|
|
13
|
+
and labelled by what it is; the label opens the bubble on its own.
|
|
8
14
|
|
|
9
|
-
|
|
15
|
+

|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
Clicking the array's label opens its 29 segments in the same layout, with a
|
|
18
|
+
button back to the window. A popped graph derives its own bubbles, so a
|
|
19
|
+
superbubble opens level by level:
|
|
12
20
|
|
|
13
|
-
-
|
|
14
|
-
the genome browser (these are meant to be locus-specific smallish GFA, not
|
|
15
|
-
full assembly graphs)
|
|
16
|
-
- alternatively, can configure a "GFA server" which will use the `vg chunk`
|
|
17
|
-
command to extract the region into a web based bandage-like graph genome
|
|
18
|
-
viewer https://github.com/cmdcolin/graphgenomeviewer
|
|
21
|
+

|
|
19
22
|
|
|
20
|
-
|
|
23
|
+
Over a gbz-base database the cut carries the haplotypes' walks. A node draws
|
|
24
|
+
thicker the more of them carry it, Bandage's depth as width, and every route
|
|
25
|
+
through a bubble is labelled at the far point of its loop for the haplotypes
|
|
26
|
+
that take it and how long it is, so the array reads as one copy count per
|
|
27
|
+
haplotype:
|
|
21
28
|
|
|
22
|
-
|
|
23
|
-
toolkit commands and concepts https://github.com/StableGenomics/PangPAG
|
|
29
|
+

|
|
24
30
|
|
|
25
|
-
|
|
31
|
+
Picking one walk lifts it out of the drawing. HG00133's route through the window
|
|
32
|
+
keeps its ink and the other haplotypes fade; the readout says it carries 116 kb
|
|
33
|
+
more than GRCh38 through the array:
|
|
26
34
|
|
|
27
|
-
|
|
35
|
+

|
|
28
36
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
MHC class II, where one 254-segment superbubble covers the DRB haplotype block
|
|
38
|
+
and a run of small indels follows it. The session's gene track is drawn onto the
|
|
39
|
+
graph: exons as dark stretches along the backbone nodes that carry them, and
|
|
40
|
+
each gene's name pinned under the backbone at its midpoint, so the superbubble
|
|
41
|
+
reads as HLA-DRB5's and the indels as HLA-DRB6's and HLA-DRB1's:
|
|
42
|
+
|
|
43
|
+

|
|
44
|
+
|
|
45
|
+
The KIV-2 window as a **variant map**, the reference as one line with one typed
|
|
46
|
+
glyph per bubble:
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
It ships six layouts:
|
|
51
|
+
|
|
52
|
+
- **Force-directed**: the graph's shape, computed by the OGDF FMMM engine from
|
|
53
|
+
[Bandage](https://github.com/rrwick/Bandage), seeded along the reference and
|
|
54
|
+
turned to read left to right. The engine lays out unbranching runs rather than
|
|
55
|
+
nodes, so a base-level cut of 15,000 nodes draws in a few seconds. The Walk
|
|
56
|
+
picker lifts one haplotype out: its route keeps its ink, the rest fades, and a
|
|
57
|
+
readout gives its length against the reference.
|
|
58
|
+
- **Variant map** (rGFA or a reference path): the reference as a line, one typed
|
|
59
|
+
glyph per bubble, click to open a bubble's graph, and again for a bubble
|
|
60
|
+
inside it.
|
|
61
|
+
- **Ordered** (rGFA or a reference path): x is reference order rather than bp,
|
|
62
|
+
so every node gets room and a bubble reads as a lens. Scrolls sideways.
|
|
63
|
+
- **Anchored** (rGFA or a reference path): x is reference bp, one row per stable
|
|
64
|
+
rank, aligned under a linear view.
|
|
65
|
+
- **Sample rows**: x is reference bp, one row per contributing assembly.
|
|
66
|
+
- **Walk rows** (W or P lines): x is each walk's own bp, one bar per haplotype,
|
|
67
|
+
sequence the reference also carries in blue and sequence it does not in
|
|
68
|
+
purple, so a repeat expansion reads as bar length. The Repeat picker tiles the
|
|
69
|
+
bars by a repeat annotation's unit and marks the allele a genotyper called.
|
|
70
|
+
|
|
71
|
+
The bubbles come from `gfatools bubble` output beside the rGFA index
|
|
72
|
+
(`<prefix>.bubbles.bed.gz`), which HPRC's hosted graph has and
|
|
73
|
+
`scripts/build_rgfa_tabix.sh` in jbrowse-components writes, or, for a graph with
|
|
74
|
+
no index, a GBZ cut, a pggb file or a popped bubble, from the graph itself off
|
|
75
|
+
the ordered layout's layering. Every node layout marks them as halos; the
|
|
76
|
+
variant map draws them as glyphs.
|
|
77
|
+
|
|
78
|
+
### Demonstration loci
|
|
79
|
+
|
|
80
|
+
Six HPRC release 2 windows, the ones the
|
|
81
|
+
[HPRC tutorials](https://jbrowse.org/jb2/docs/tutorials/pangenome_hprc/) walk
|
|
82
|
+
through, are the standing test set for layout screenshots. Each cuts to under
|
|
83
|
+
300 nodes and shows a different kind of variation:
|
|
84
|
+
|
|
85
|
+
| Locus | Window | What it shows |
|
|
86
|
+
| ------------ | ------------------------------ | ----------------------------------- |
|
|
87
|
+
| LPA KIV-2 | `chr6:160,525,000-160,655,000` | the kringle repeat, copy per loop |
|
|
88
|
+
| MHC class II | `chr6:32,510,000-32,600,000` | DRB haplotypes, dozens of alleles |
|
|
89
|
+
| AMY1 | `chr1:103,690,000-103,780,000` | amylase copy number |
|
|
90
|
+
| C4 | `chr6:31,980,000-32,050,000` | one bubble over the C4 duplication |
|
|
91
|
+
| CFH | `chr1:196,640,000-196,900,000` | an 84 kb deletion as a bare edge |
|
|
92
|
+
| KIR | `chr19:54,750,000-54,840,000` | the KIR cluster, densest of the six |
|
|
93
|
+
|
|
94
|
+
[docs/layout-experiments.md](docs/layout-experiments.md) draws all six in every
|
|
95
|
+
layout the plugin has and in the ones proposed to replace them, and
|
|
96
|
+
`scripts/layout-lab/` reproduces the figures.
|
|
97
|
+
|
|
98
|
+
## License (GPL-3.0)
|
|
99
|
+
|
|
100
|
+
This plugin is **GPL-3.0-or-later**. The force-directed layout is computed by a
|
|
101
|
+
WebAssembly build of Bandage's FMMM layout from [OGDF](https://ogdf.github.io/),
|
|
102
|
+
and both Bandage and OGDF are GPL-licensed, so this plugin takes the same
|
|
103
|
+
license rather than linking around it.
|
|
104
|
+
|
|
105
|
+
JBrowse itself is unaffected and stays Apache-2.0: this is a separate plugin,
|
|
106
|
+
loaded at runtime only by configs that ask for it. The anchored and sample-row
|
|
107
|
+
layouts are pure TypeScript and need no external engine.
|
|
108
|
+
|
|
109
|
+
## Developing
|
|
110
|
+
|
|
111
|
+
Requires [pnpm](https://pnpm.io/installation). The plugin builds against the
|
|
112
|
+
published `@jbrowse/*` packages at 5.0.0-beta.9 and needs a host of at least
|
|
113
|
+
that version: it hands its RPC calls an AbortSignal, which an earlier JBrowse 5
|
|
114
|
+
beta cannot post to its worker.
|
|
115
|
+
|
|
116
|
+
```console
|
|
117
|
+
pnpm install
|
|
118
|
+
pnpm start # esbuild watch, serves dist/out.js on :9000 with CORS
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
In another terminal, serve a JBrowse Web that points at `config.json` (its
|
|
122
|
+
`plugins` entry already targets `http://localhost:9000/dist/out.js`).
|
|
123
|
+
|
|
124
|
+
## Building
|
|
125
|
+
|
|
126
|
+
```console
|
|
127
|
+
pnpm build # native ESM bundle via esbuild (code-split)
|
|
128
|
+
pnpm typecheck # tsc, separately — esbuild strips types without checking them
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
This writes the plugin to `dist/`, and the **whole directory must be served
|
|
132
|
+
together** — the entry loads its sibling chunks relative to its own url:
|
|
133
|
+
|
|
134
|
+
- `jbrowse-plugin-graphgenomeviewer.esm.js` — the plugin entry
|
|
135
|
+
- `chunks/bandage-layout-<hash>.js` — the Bandage layout engine (~425kb),
|
|
136
|
+
imported on demand and named by content hash so a redeployed engine is never
|
|
137
|
+
served from cache
|
|
138
|
+
- `chunks/*.js` — other lazily-loaded code split out of the entry
|
|
139
|
+
|
|
140
|
+
Load the plugin from any JBrowse config, 5.0.0-beta.9 or later, with an
|
|
141
|
+
`esmUrl`:
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"plugins": [
|
|
146
|
+
{
|
|
147
|
+
"name": "GraphGenomeView",
|
|
148
|
+
"esmUrl": "https://your-host/jbrowse-plugin-graphgenomeviewer.esm.js"
|
|
149
|
+
}
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Note: ESM plugins are loaded via a dynamic `import()`, which cannot carry a
|
|
155
|
+
subresource-integrity hash the way a UMD `<script integrity>` can — there is
|
|
156
|
+
nowhere to put a digest. For a deployment that needs pinned, tamper-evident
|
|
157
|
+
bytes, serve the plugin from an immutable, version-pinned url on a host you
|
|
158
|
+
control. The engine chunk is already immutable by content hash.
|
|
159
|
+
|
|
160
|
+
The engine is a lazy chunk: it is only fetched the first time someone selects
|
|
161
|
+
the force-directed layout, so sessions that use the anchored or sample-row
|
|
162
|
+
layouts never download it. Its url is not configured anywhere — `loadBandage` is
|
|
163
|
+
a plain dynamic `import()`, so the browser resolves the chunk relative to the
|
|
164
|
+
plugin module's own url (`import.meta.url`, defined on the main thread and in
|
|
165
|
+
the RPC worker alike). That is why the whole `dist/` has to be served together,
|
|
166
|
+
and it is also why there is nothing to point elsewhere: to host the engine on
|
|
167
|
+
another origin, rebuild with the chunk emitted there.
|
|
168
|
+
|
|
169
|
+
### Rebuilding the engine
|
|
170
|
+
|
|
171
|
+
`src/bandage/bandage-layout.js` is a committed build artifact, so a normal
|
|
172
|
+
`pnpm build` never needs Emscripten. Regenerate it only when the C++ layout
|
|
173
|
+
sources change:
|
|
174
|
+
|
|
175
|
+
```console
|
|
176
|
+
pnpm build:wasm # needs emsdk, nothing else
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Emscripten is the only thing you have to install. OGDF is vendored at
|
|
180
|
+
`vendor/ogdf` (a stock checkout of it does not build for wasm at all — see
|
|
181
|
+
[`vendor/README.md`](vendor/README.md)), so this works offline from a fresh
|
|
182
|
+
clone of this repo alone. Roughly four minutes the first time, seconds after
|
|
183
|
+
that.
|
|
184
|
+
|
|
185
|
+
It compiles with `-sSINGLE_FILE=1`, embedding the wasm as base64 so the result
|
|
186
|
+
is one self-contained ES module that esbuild can copy rather than bundle.
|
|
187
|
+
|
|
188
|
+
A rebuild has to be checked against the drawing rather than against the file,
|
|
189
|
+
since the artifact's bytes move for reasons the layout does not — see
|
|
190
|
+
[`src/bandage/README.md`](src/bandage/README.md) for
|
|
191
|
+
`scripts/layout-digest.mjs`.
|
|
192
|
+
|
|
193
|
+
## Testing
|
|
194
|
+
|
|
195
|
+
```console
|
|
196
|
+
pnpm test # vitest unit tests
|
|
197
|
+
pnpm test:watch
|
|
198
|
+
pnpm test:wasm # runs the committed Bandage engine, no deps needed
|
|
199
|
+
pnpm test:e2e # puppeteer, opt-in — see test/README.md
|
|
200
|
+
pnpm host-compat # boots dist/ on the hosted JBrowse releases and cuts a graph
|
|
201
|
+
pnpm lint
|
|
202
|
+
pnpm typecheck
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
`pnpm test:e2e` drives the force layout through a real JBrowse in a headless
|
|
206
|
+
browser, behind `RUN_E2E=1` because it needs a jbrowse-web build to serve;
|
|
207
|
+
[`test/README.md`](test/README.md) explains how to run it.
|
|
208
|
+
|
|
209
|
+
`pnpm host-compat` is the check a publish has to pass, and `pnpm version` runs
|
|
210
|
+
it. It serves the built `dist/` to a real shipped config on each hosted release
|
|
211
|
+
and cuts a subgraph there, because the failures it catches pass tsc, eslint and
|
|
212
|
+
the unit tests: an RPC argument a released core cannot post to its worker, or a
|
|
213
|
+
re-export the host no longer serves, shows only when the bundle runs on the
|
|
214
|
+
host.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as z}from"./chunk-FCWXYIFC.js";import{a as $}from"./chunk-D7XFR2IV.js";import{a as L,b as j,c as O,d as J,e as U}from"./chunk-XEJ47DLD.js";import{a as H}from"./chunk-J4OLMLS5.js";import{a as D,b as r}from"./chunk-FY3BTKY4.js";var C=D((Z,y)=>{y.exports=JBrowseExports["@jbrowse/core/util/tss-react"]});var c=r(U(),1),p=r(J(),1),m=r(H(),1),E=r(C(),1),B=r(z(),1),i=r(O(),1),P=r(j(),1);var b=r($(),1),S={RgfaTabixAdapter:"rGFA segments (tabix BED pair)",MinigraphBubbleAdapter:"Minigraph bubbles (tabix BED)"},R={RgfaTabixAdapter:"Path to segments BED (.segs.bed.gz from build_rgfa_tabix.sh; the .links.bed.gz and both .tbi are assumed beside it)",MinigraphBubbleAdapter:"Path to bubbles BED (.bed.gz from gfatools bubble; the .tbi is assumed beside it)"},u=".segs.bed.gz";function f(t){return"uri"in t?t.uri:"localPath"in t?t.localPath:""}function X(t){let e=f(t);if(!e.endsWith(u))throw new Error(`Expected a segments BED ending in ${u}, got ${e||"a blob"}`);let a=`${e.slice(0,-u.length)}.links.bed.gz`;return"uri"in t?{...t,uri:a}:"localPath"in t?{...t,localPath:a}:t}function A(t,e){return e?{location:e,indexType:(0,b.makeIndexType)(f(e),"CSI","TBI")}:{location:(0,b.makeIndex)(t,".tbi"),indexType:"TBI"}}function q(t,e){return e!==void 0&&f(e).endsWith(".csi")?{location:(0,b.makeIndex)(t,".csi"),indexType:"CSI"}:{location:(0,b.makeIndex)(t,".tbi"),indexType:"TBI"}}function I(t,e){let a=e.trim();return a?{assemblyNameToPanSN:{[t]:a}}:{}}function K({choice:t,loc:e,indexLoc:a,assembly:s,sample:l}){if(t==="MinigraphBubbleAdapter")return{type:"MinigraphBubbleAdapter",bubblesLocation:e,index:A(e,a),...I(s,l)};let d=X(e);return{type:"RgfaTabixAdapter",segmentsLocation:e,segmentsIndex:A(e,a),linksLocation:d,linksIndex:q(d,a),...I(s,l)}}function G(t){let{choice:e,assembly:a,trackId:s,name:l}=t;return{type:"FeatureTrack",trackId:s,name:l,assemblyNames:[a],adapter:K(t),...e==="RgfaTabixAdapter"?{displayDefaults:{showLabels:"none"}}:{}}}var n=r(L(),1),Q=(0,E.makeStyles)()(t=>({paper:{margin:t.spacing(),padding:t.spacing()},field:{marginTop:t.spacing(2)},submit:{marginTop:25,marginBottom:100,display:"block"}})),V=["RgfaTabixAdapter","MinigraphBubbleAdapter"],Y=(0,P.observer)(function({model:e}){let{classes:a}=Q(),s=(0,m.getSession)(e),l=(0,B.getRoot)(e),[d,M]=(0,c.useState)("RgfaTabixAdapter"),[g,N]=(0,c.useState)(),[F,v]=(0,c.useState)(),[k,w]=(0,c.useState)(""),[h,_]=(0,c.useState)("Pangenome graph"),[x,T]=(0,c.useState)();function W(){if(!(!g||!e.assembly))try{T(void 0);let o=h.trim();(0,m.addTrackFromWidget)({model:e,session:s,conf:G({choice:d,loc:g,indexLoc:F,assembly:e.assembly,sample:k,trackId:(0,m.makeTrackId)({name:o}),name:o})})}catch(o){T(o)}}return(0,n.jsxs)(i.Paper,{className:a.paper,children:[x?(0,n.jsx)(p.ErrorMessage,{error:x}):null,(0,n.jsxs)(i.FormControl,{children:[(0,n.jsx)(i.FormLabel,{children:"File type"}),(0,n.jsx)(i.RadioGroup,{value:d,onChange:o=>{M(o.target.value)},children:V.map(o=>(0,n.jsx)(i.FormControlLabel,{value:o,control:(0,n.jsx)(i.Radio,{}),label:S[o]},o))})]}),(0,n.jsx)(p.FileSelector,{location:g,name:R[d],rootModel:l,setLocation:N}),(0,n.jsx)(p.FileSelector,{location:F,name:"Path to tabix index (optional; the sibling .tbi is assumed, a .csi is recognised by name)",rootModel:l,setLocation:v}),(0,n.jsx)(i.TextField,{className:a.field,value:k,onChange:o=>{w(o.target.value)},label:"Sample name in the graph",slotProps:{htmlInput:{"data-testid":"graph-sample-input"}},helperText:"Optional. The PanSN prefix the graph gives this assembly, e.g. GRCh38 for HPRC's GRCh38#0#chr1; leave blank when the graph's stable names are bare",placeholder:"GRCh38",fullWidth:!0}),(0,n.jsx)(i.TextField,{className:a.field,value:h,helperText:"Track name",slotProps:{htmlInput:{"data-testid":"graph-track-name-input"}},onChange:o=>{_(o.target.value)}}),(0,n.jsx)(p.AssemblySelector,{session:s,helperText:"Select assembly to add track to",selected:e.assembly,onChange:o=>{e.setAssembly(o)},fullWidth:!0}),(0,n.jsx)(i.Button,{variant:"contained",className:a.submit,disabled:!g||!h.trim()||!e.assembly,onClick:W,children:"Submit"})]})}),ae=Y;export{ae as default};
|
|
2
|
+
//# sourceMappingURL=AddTrackWorkflow-Y3OBHM33.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["global-externals:@jbrowse/core/util/tss-react", "../../src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx", "../../src/GraphAddTrackWorkflow/buildTrackConfig.ts"],
|
|
4
|
+
"sourcesContent": ["module.exports = JBrowseExports[\"@jbrowse/core/util/tss-react\"];", "import { useState } from 'react'\n\nimport { AssemblySelector, ErrorMessage, FileSelector } from '@jbrowse/core/ui'\nimport { addTrackFromWidget, getSession, makeTrackId } from '@jbrowse/core/util'\nimport { makeStyles } from '@jbrowse/core/util/tss-react'\nimport { getRoot } from '@jbrowse/mobx-state-tree'\nimport {\n Button,\n FormControl,\n FormControlLabel,\n FormLabel,\n Paper,\n Radio,\n RadioGroup,\n TextField,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport {\n GRAPH_FILE_FIELDS,\n GRAPH_FILE_LABELS,\n buildTrackConfig,\n} from './buildTrackConfig'\n\nimport type { GraphFileChoice } from './buildTrackConfig'\nimport type {\n AbstractRootModel,\n AddTrackWorkflowModel,\n FileLocation,\n} from '@jbrowse/core/util'\n\nconst useStyles = makeStyles()(theme => ({\n paper: {\n margin: theme.spacing(),\n padding: theme.spacing(),\n },\n field: {\n marginTop: theme.spacing(2),\n },\n submit: {\n marginTop: 25,\n marginBottom: 100,\n display: 'block',\n },\n}))\n\nconst CHOICES: GraphFileChoice[] = [\n 'RgfaTabixAdapter',\n 'MinigraphBubbleAdapter',\n]\n\nconst GraphAddTrackWidget = observer(function GraphAddTrackWidget({\n model,\n}: {\n model: AddTrackWorkflowModel\n}) {\n const { classes } = useStyles()\n const session = getSession(model)\n const rootModel = getRoot<AbstractRootModel>(model)\n const [choice, setChoice] = useState<GraphFileChoice>('RgfaTabixAdapter')\n const [loc, setLoc] = useState<FileLocation>()\n const [indexLoc, setIndexLoc] = useState<FileLocation>()\n const [sample, setSample] = useState('')\n const [trackName, setTrackName] = useState('Pangenome graph')\n const [error, setError] = useState<unknown>()\n\n function handleSubmit() {\n if (!loc || !model.assembly) {\n return\n }\n try {\n setError(undefined)\n const name = trackName.trim()\n addTrackFromWidget({\n model,\n session,\n conf: buildTrackConfig({\n choice,\n loc,\n indexLoc,\n assembly: model.assembly,\n sample,\n trackId: makeTrackId({ name }),\n name,\n }),\n })\n } catch (e) {\n setError(e)\n }\n }\n\n return (\n <Paper className={classes.paper}>\n {error ? <ErrorMessage error={error} /> : null}\n <FormControl>\n <FormLabel>File type</FormLabel>\n <RadioGroup\n value={choice}\n onChange={event => {\n setChoice(event.target.value as GraphFileChoice)\n }}\n >\n {CHOICES.map(option => (\n <FormControlLabel\n key={option}\n value={option}\n control={<Radio />}\n label={GRAPH_FILE_LABELS[option]}\n />\n ))}\n </RadioGroup>\n </FormControl>\n <FileSelector\n location={loc}\n name={GRAPH_FILE_FIELDS[choice]}\n rootModel={rootModel}\n setLocation={setLoc}\n />\n <FileSelector\n location={indexLoc}\n name=\"Path to tabix index (optional; the sibling .tbi is assumed, a .csi is recognised by name)\"\n rootModel={rootModel}\n setLocation={setIndexLoc}\n />\n <TextField\n className={classes.field}\n value={sample}\n onChange={event => {\n setSample(event.target.value)\n }}\n label=\"Sample name in the graph\"\n slotProps={{ htmlInput: { 'data-testid': 'graph-sample-input' } }}\n helperText=\"Optional. The PanSN prefix the graph gives this assembly, e.g. GRCh38 for HPRC's GRCh38#0#chr1; leave blank when the graph's stable names are bare\"\n placeholder=\"GRCh38\"\n fullWidth\n />\n <TextField\n className={classes.field}\n value={trackName}\n helperText=\"Track name\"\n slotProps={{ htmlInput: { 'data-testid': 'graph-track-name-input' } }}\n onChange={event => {\n setTrackName(event.target.value)\n }}\n />\n <AssemblySelector\n session={session}\n helperText=\"Select assembly to add track to\"\n selected={model.assembly}\n onChange={arg => {\n model.setAssembly(arg)\n }}\n fullWidth\n />\n <Button\n variant=\"contained\"\n className={classes.submit}\n disabled={!loc || !trackName.trim() || !model.assembly}\n onClick={handleSubmit}\n >\n Submit\n </Button>\n </Paper>\n )\n})\n\nexport default GraphAddTrackWidget\n", "import { makeIndex, makeIndexType } from '@jbrowse/core/util/tracks'\n\nimport type { FileLocation } from '@jbrowse/core/util'\n\nexport type GraphFileChoice = 'RgfaTabixAdapter' | 'MinigraphBubbleAdapter'\n\nexport const GRAPH_FILE_LABELS: Record<GraphFileChoice, string> = {\n RgfaTabixAdapter: 'rGFA segments (tabix BED pair)',\n MinigraphBubbleAdapter: 'Minigraph bubbles (tabix BED)',\n}\n\nexport const GRAPH_FILE_FIELDS: Record<GraphFileChoice, string> = {\n RgfaTabixAdapter:\n 'Path to segments BED (.segs.bed.gz from build_rgfa_tabix.sh; the .links.bed.gz and both .tbi are assumed beside it)',\n MinigraphBubbleAdapter:\n 'Path to bubbles BED (.bed.gz from gfatools bubble; the .tbi is assumed beside it)',\n}\n\nconst SEGMENTS_SUFFIX = '.segs.bed.gz'\n\nfunction locationName(loc: FileLocation) {\n return 'uri' in loc ? loc.uri : 'localPath' in loc ? loc.localPath : ''\n}\n\nfunction linksLocation(loc: FileLocation) {\n const name = locationName(loc)\n if (!name.endsWith(SEGMENTS_SUFFIX)) {\n throw new Error(\n `Expected a segments BED ending in ${SEGMENTS_SUFFIX}, got ${name || 'a blob'}`,\n )\n }\n const links = `${name.slice(0, -SEGMENTS_SUFFIX.length)}.links.bed.gz`\n return 'uri' in loc\n ? { ...loc, uri: links }\n : 'localPath' in loc\n ? { ...loc, localPath: links }\n : loc\n}\n\nfunction tabixIndex(loc: FileLocation, indexLoc: FileLocation | undefined) {\n return indexLoc\n ? {\n location: indexLoc,\n indexType: makeIndexType(locationName(indexLoc), 'CSI', 'TBI'),\n }\n : { location: makeIndex(loc, '.tbi'), indexType: 'TBI' }\n}\n\n// The links file's index is assumed beside it, of the kind the segments' is.\nfunction siblingIndex(loc: FileLocation, indexLoc: FileLocation | undefined) {\n const csi = indexLoc !== undefined && locationName(indexLoc).endsWith('.csi')\n return csi\n ? { location: makeIndex(loc, '.csi'), indexType: 'CSI' }\n : { location: makeIndex(loc, '.tbi'), indexType: 'TBI' }\n}\n\nfunction panSN(assembly: string, sample: string) {\n const name = sample.trim()\n return name ? { assemblyNameToPanSN: { [assembly]: name } } : {}\n}\n\nexport function buildAdapterConfig({\n choice,\n loc,\n indexLoc,\n assembly,\n sample,\n}: {\n choice: GraphFileChoice\n loc: FileLocation\n indexLoc: FileLocation | undefined\n assembly: string\n sample: string\n}) {\n if (choice === 'MinigraphBubbleAdapter') {\n return {\n type: 'MinigraphBubbleAdapter',\n bubblesLocation: loc,\n index: tabixIndex(loc, indexLoc),\n ...panSN(assembly, sample),\n }\n }\n const links = linksLocation(loc)\n return {\n type: 'RgfaTabixAdapter',\n segmentsLocation: loc,\n segmentsIndex: tabixIndex(loc, indexLoc),\n linksLocation: links,\n linksIndex: siblingIndex(links, indexLoc),\n ...panSN(assembly, sample),\n }\n}\n\nexport function buildTrackConfig(args: {\n choice: GraphFileChoice\n loc: FileLocation\n indexLoc: FileLocation | undefined\n assembly: string\n sample: string\n trackId: string\n name: string\n}) {\n const { choice, assembly, trackId, name } = args\n return {\n type: 'FeatureTrack',\n trackId,\n name,\n assemblyNames: [assembly],\n adapter: buildAdapterConfig(args),\n ...(choice === 'RgfaTabixAdapter'\n ? { displayDefaults: { showLabels: 'none' } }\n : {}),\n }\n}\n"],
|
|
5
|
+
"mappings": "2OAAA,IAAAA,EAAAC,EAAA,CAAAC,EAAAC,IAAA,CAAAA,EAAO,QAAU,eAAe,8BAA8B,ICA9D,IAAAC,EAAyB,SAEzBC,EAA6D,SAC7DC,EAA4D,SAC5DC,EAA2B,SAC3BC,EAAwB,SACxBC,EASO,SACPC,EAAyB,SChBzB,IAAAC,EAAyC,SAM5BC,EAAqD,CAChE,iBAAkB,iCAClB,uBAAwB,+BAC1B,EAEaC,EAAqD,CAChE,iBACE,sHACF,uBACE,mFACJ,EAEMC,EAAkB,eAExB,SAASC,EAAaC,EAAmB,CACvC,MAAO,QAASA,EAAMA,EAAI,IAAM,cAAeA,EAAMA,EAAI,UAAY,EACvE,CAEA,SAASC,EAAcD,EAAmB,CACxC,IAAME,EAAOH,EAAaC,CAAG,EAC7B,GAAI,CAACE,EAAK,SAASJ,CAAe,EAChC,MAAM,IAAI,MACR,qCAAqCA,CAAe,SAASI,GAAQ,QAAQ,EAC/E,EAEF,IAAMC,EAAQ,GAAGD,EAAK,MAAM,EAAG,CAACJ,EAAgB,MAAM,CAAC,gBACvD,MAAO,QAASE,EACZ,CAAE,GAAGA,EAAK,IAAKG,CAAM,EACrB,cAAeH,EACb,CAAE,GAAGA,EAAK,UAAWG,CAAM,EAC3BH,CACR,CAEA,SAASI,EAAWJ,EAAmBK,EAAoC,CACzE,OAAOA,EACH,CACE,SAAUA,EACV,aAAW,iBAAcN,EAAaM,CAAQ,EAAG,MAAO,KAAK,CAC/D,EACA,CAAE,YAAU,aAAUL,EAAK,MAAM,EAAG,UAAW,KAAM,CAC3D,CAGA,SAASM,EAAaN,EAAmBK,EAAoC,CAE3E,OADYA,IAAa,QAAaN,EAAaM,CAAQ,EAAE,SAAS,MAAM,EAExE,CAAE,YAAU,aAAUL,EAAK,MAAM,EAAG,UAAW,KAAM,EACrD,CAAE,YAAU,aAAUA,EAAK,MAAM,EAAG,UAAW,KAAM,CAC3D,CAEA,SAASO,EAAMC,EAAkBC,EAAgB,CAC/C,IAAMP,EAAOO,EAAO,KAAK,EACzB,OAAOP,EAAO,CAAE,oBAAqB,CAAE,CAACM,CAAQ,EAAGN,CAAK,CAAE,EAAI,CAAC,CACjE,CAEO,SAASQ,EAAmB,CACjC,OAAAC,EACA,IAAAX,EACA,SAAAK,EACA,SAAAG,EACA,OAAAC,CACF,EAMG,CACD,GAAIE,IAAW,yBACb,MAAO,CACL,KAAM,yBACN,gBAAiBX,EACjB,MAAOI,EAAWJ,EAAKK,CAAQ,EAC/B,GAAGE,EAAMC,EAAUC,CAAM,CAC3B,EAEF,IAAMN,EAAQF,EAAcD,CAAG,EAC/B,MAAO,CACL,KAAM,mBACN,iBAAkBA,EAClB,cAAeI,EAAWJ,EAAKK,CAAQ,EACvC,cAAeF,EACf,WAAYG,EAAaH,EAAOE,CAAQ,EACxC,GAAGE,EAAMC,EAAUC,CAAM,CAC3B,CACF,CAEO,SAASG,EAAiBC,EAQ9B,CACD,GAAM,CAAE,OAAAF,EAAQ,SAAAH,EAAU,QAAAM,EAAS,KAAAZ,CAAK,EAAIW,EAC5C,MAAO,CACL,KAAM,eACN,QAAAC,EACA,KAAAZ,EACA,cAAe,CAACM,CAAQ,EACxB,QAASE,EAAmBG,CAAI,EAChC,GAAIF,IAAW,mBACX,CAAE,gBAAiB,CAAE,WAAY,MAAO,CAAE,EAC1C,CAAC,CACP,CACF,CDpBe,IAAAI,EAAA,SA9DTC,KAAY,cAAW,EAAEC,IAAU,CACvC,MAAO,CACL,OAAQA,EAAM,QAAQ,EACtB,QAASA,EAAM,QAAQ,CACzB,EACA,MAAO,CACL,UAAWA,EAAM,QAAQ,CAAC,CAC5B,EACA,OAAQ,CACN,UAAW,GACX,aAAc,IACd,QAAS,OACX,CACF,EAAE,EAEIC,EAA6B,CACjC,mBACA,wBACF,EAEMC,KAAsB,YAAS,SAA6B,CAChE,MAAAC,CACF,EAEG,CACD,GAAM,CAAE,QAAAC,CAAQ,EAAIL,EAAU,EACxBM,KAAU,cAAWF,CAAK,EAC1BG,KAAY,WAA2BH,CAAK,EAC5C,CAACI,EAAQC,CAAS,KAAI,YAA0B,kBAAkB,EAClE,CAACC,EAAKC,CAAM,KAAI,YAAuB,EACvC,CAACC,EAAUC,CAAW,KAAI,YAAuB,EACjD,CAACC,EAAQC,CAAS,KAAI,YAAS,EAAE,EACjC,CAACC,EAAWC,CAAY,KAAI,YAAS,iBAAiB,EACtD,CAACC,EAAOC,CAAQ,KAAI,YAAkB,EAE5C,SAASC,GAAe,CACtB,GAAI,GAACV,GAAO,CAACN,EAAM,UAGnB,GAAI,CACFe,EAAS,MAAS,EAClB,IAAME,EAAOL,EAAU,KAAK,KAC5B,sBAAmB,CACjB,MAAAZ,EACA,QAAAE,EACA,KAAMgB,EAAiB,CACrB,OAAAd,EACA,IAAAE,EACA,SAAAE,EACA,SAAUR,EAAM,SAChB,OAAAU,EACA,WAAS,eAAY,CAAE,KAAAO,CAAK,CAAC,EAC7B,KAAAA,CACF,CAAC,CACH,CAAC,CACH,OAASE,EAAG,CACVJ,EAASI,CAAC,CACZ,CACF,CAEA,SACE,QAAC,SAAM,UAAWlB,EAAQ,MACvB,UAAAa,KAAQ,OAAC,gBAAa,MAAOA,EAAO,EAAK,QAC1C,QAAC,eACC,oBAAC,aAAU,qBAAS,KACpB,OAAC,cACC,MAAOV,EACP,SAAUgB,GAAS,CACjBf,EAAUe,EAAM,OAAO,KAAwB,CACjD,EAEC,SAAAtB,EAAQ,IAAIuB,MACX,OAAC,oBAEC,MAAOA,EACP,WAAS,OAAC,UAAM,EAChB,MAAOC,EAAkBD,CAAM,GAH1BA,CAIP,CACD,EACH,GACF,KACA,OAAC,gBACC,SAAUf,EACV,KAAMiB,EAAkBnB,CAAM,EAC9B,UAAWD,EACX,YAAaI,EACf,KACA,OAAC,gBACC,SAAUC,EACV,KAAK,4FACL,UAAWL,EACX,YAAaM,EACf,KACA,OAAC,aACC,UAAWR,EAAQ,MACnB,MAAOS,EACP,SAAUU,GAAS,CACjBT,EAAUS,EAAM,OAAO,KAAK,CAC9B,EACA,MAAM,2BACN,UAAW,CAAE,UAAW,CAAE,cAAe,oBAAqB,CAAE,EAChE,WAAW,qJACX,YAAY,SACZ,UAAS,GACX,KACA,OAAC,aACC,UAAWnB,EAAQ,MACnB,MAAOW,EACP,WAAW,aACX,UAAW,CAAE,UAAW,CAAE,cAAe,wBAAyB,CAAE,EACpE,SAAUQ,GAAS,CACjBP,EAAaO,EAAM,OAAO,KAAK,CACjC,EACF,KACA,OAAC,oBACC,QAASlB,EACT,WAAW,kCACX,SAAUF,EAAM,SAChB,SAAUwB,GAAO,CACfxB,EAAM,YAAYwB,CAAG,CACvB,EACA,UAAS,GACX,KACA,OAAC,UACC,QAAQ,YACR,UAAWvB,EAAQ,OACnB,SAAU,CAACK,GAAO,CAACM,EAAU,KAAK,GAAK,CAACZ,EAAM,SAC9C,QAASgB,EACV,kBAED,GACF,CAEJ,CAAC,EAEMS,GAAQ1B",
|
|
6
|
+
"names": ["require_tss_react", "__commonJSMin", "exports", "module", "import_react", "import_ui", "import_util", "import_tss_react", "import_mobx_state_tree", "import_material", "import_mobx_react", "import_tracks", "GRAPH_FILE_LABELS", "GRAPH_FILE_FIELDS", "SEGMENTS_SUFFIX", "locationName", "loc", "linksLocation", "name", "links", "tabixIndex", "indexLoc", "siblingIndex", "panSN", "assembly", "sample", "buildAdapterConfig", "choice", "buildTrackConfig", "args", "trackId", "import_jsx_runtime", "useStyles", "theme", "CHOICES", "GraphAddTrackWidget", "model", "classes", "session", "rootModel", "choice", "setChoice", "loc", "setLoc", "indexLoc", "setIndexLoc", "sample", "setSample", "trackName", "setTrackName", "error", "setError", "handleSubmit", "name", "buildTrackConfig", "e", "event", "option", "GRAPH_FILE_LABELS", "GRAPH_FILE_FIELDS", "arg", "AddTrackWorkflow_default"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import"./chunk-LGKM2PZH.js";import{a as so}from"./chunk-D7XFR2IV.js";import{a as bn,b as oo}from"./chunk-TN6FK5UD.js";import{a as ro}from"./chunk-KWAXLUPQ.js";import{a as Ae}from"./chunk-J4OLMLS5.js";import{a as Sn,d as Ee,e as ue,f as Lt}from"./chunk-F4C3BEPV.js";import{a as no,b as Y}from"./chunk-FY3BTKY4.js";var Qr=no((Mc,Wr)=>{Wr.exports=JBrowseExports["@jbrowse/core/util/installClearHoverOnSurfaceMove"]});function V(r,e){return 2*r+(e==="reverse"?1:0)}function A(r){return Math.floor(r/2)}function me(r){return r%2===0?"forward":"reverse"}function L(r){return r%2===1}function G(r){return r%2===0?r+1:r-1}function vn(r){return r==="left"?"right":"left"}function He(r){return r==="forward"?"left":"right"}function qe(r){return r==="forward"?"right":"left"}function In(r){return r==="left"?"forward":"reverse"}function An(r){return r==="right"?"forward":"reverse"}function ge(r,e){let t=A(r),n=A(e);return L(r)?n>t||n===t&&!L(e):n>=t}function En(r){return $e(r[0],r[r.length-1])}function $e(r,e){return r===void 0||e===void 0?!0:L(r)===L(e)?!L(r):ge(r,e)}var Ce=class{offset=0;bytes;constructor(e){this.bytes=e}get done(){return this.offset>=this.bytes.length}byte(){let e=this.bytes[this.offset];if(e!==void 0)return this.offset+=1,e}int(){let e=1,t=0;for(;this.offset<this.bytes.length;){let n=this.bytes[this.offset];if(this.offset+=1,t+=(n&127)*e,e*=128,(n&128)===0)return t}}},Cn=255,ao=256,Be=class{source;sigma;threshold;constructor(e,t){this.source=new Ce(e),this.sigma=t===0?Number.MAX_SAFE_INTEGER:t,this.threshold=this.sigma<Cn?Math.floor(ao/this.sigma):0}next(){if(this.sigma>=Cn){let o=this.source.int(),s=this.source.int();return o===void 0||s===void 0?void 0:{value:o,len:s+1}}let e=this.source.byte();if(e===void 0)return;let t=e%this.sigma,n=Math.floor(e/this.sigma)+1;if(n===this.threshold){let o=this.source.int();if(o===void 0)return;n+=o}return{value:t,len:n}}*[Symbol.iterator](){for(let e=this.next();e!==void 0;e=this.next())yield e}};function Rn(r){let e=new Ce(r),t=e.int();if(t===void 0||t===0)return[];let n=[],o=0;for(let s=0;s<t;s++){let i=e.int(),a=e.int();if(i===void 0||a===void 0)throw new Error("GBWT edge list ends early");o+=i,n.push({node:o,offset:a})}return n}var Ge=class{edges;bwt;constructor(e,t){this.edges=e,this.bwt=t}runs(){return new Be(this.bwt,this.edges.length)}edge(e){let t=this.edges[e];if(t===void 0)throw new Error(`GBWT run refers to edge rank ${e} of ${this.edges.length}`);return t}lf(e){let t=this.edges.map(o=>o.offset),n=0;for(let o of this.runs()){let s=this.edge(o.value),i=t[o.value];if(n+o.len>e)return s.node===0?void 0:{node:s.node,offset:i+(e-n)};t[o.value]=i+o.len,n+=o.len}}edgeTo(e){let t=0,n=this.edges.length;for(;t<n;){let o=t+n>>1,s=this.edges[o];if(s.node===e)return o;s.node<e?t=o+1:n=o}}offsetTo(e){if(e.node===0)return;let t=this.edgeTo(e.node);if(t===void 0)return;let n=this.edges[t].offset;if(n>e.offset)return;let o=0;for(let s of this.runs())if(o+=s.len,s.value===t&&(n+=s.len,n>e.offset))return o-(n-e.offset)}predecessorAt(e){let t=this.edges.map(o=>({node:o.node===0?0:G(o.node),count:0}));for(let o of this.runs()){let s=t[o.value];s&&(s.count+=o.len)}for(let o=1;o<t.length;o++){let s=t[o-1],i=t[o];A(s.node)===A(i.node)&&(t[o-1]=i,t[o]=s)}let n=0;for(let o of t)if(n+=o.count,n>e)return o.node===0?void 0:o.node}decompressArrays(){let e=this.edges.map(i=>i.offset),t=0;for(let i of this.runs())t+=i.len;let n=new Int32Array(t),o=new Int32Array(t),s=0;for(let i of this.runs()){let a=this.edge(i.value),c=e[i.value];for(let f=0;f<i.len;f++)n[s]=a.node,o[s]=c,c+=1,s+=1;e[i.value]=c}return{nodes:n,offsets:o}}decompress(){let e=this.edges.map(n=>n.offset),t=[];for(let n of this.runs()){let o=this.edge(n.value);for(let s=0;s<n.len;s++)t.push({node:o.node,offset:e[n.value]}),e[n.value]=e[n.value]+1}return t}};var fo=["","A","C","G","T","N"];function _n(r){let e=r[r.length-1];if(e===void 0)return 0;let t=e,n=0;for(let o=0;o<3&&t%6!==0;o++)t=Math.floor(t/6),n+=1;return 3*(r.length-1)+n}function Pn(r){let e="";for(let t of r){let n=t;for(let o=0;o<3;o++){let s=fo[n%6];if(s==="")return e;n=Math.floor(n/6),e+=s}}return e}var co={A:"T",C:"G",G:"C",T:"A",N:"N"};function De(r){let e="";for(let t=r.length-1;t>=0;t--)e+=co[r[t]]??"N";return e}function kn(r,e){let t=new Map;if(r!==void 0)for(let n of r.split(";")){let o=n.split(","),[s,i]=o;if(o.length!==2||!s||!i)throw new Error(`Invalid ${e} relationship: ${n}`);let a=t.get(s);a||(a=new Set,t.set(s,a)),a.add(i)}return t}function Ln(r){return{name:r.get("pggname"),subgraph:kn(r.get("subgraph"),"subgraph"),translation:kn(r.get("translation"),"translation")}}function Mn(r,e){for(let[t,n]of e){let o=r.get(t);o||(o=new Set,r.set(t,o));for(let s of n)o.add(s)}}function Tn(r,e){let t={name:r,subgraph:new Map,translation:new Map};return e.name!==void 0&&(t.subgraph.set(r,new Set([e.name])),Mn(t.subgraph,e.subgraph),Mn(t.translation,e.translation)),t}function On(r){return[...r.entries()].sort(([e],[t])=>e<t?-1:e>t?1:0).flatMap(([e,t])=>[...t].sort().map(n=>[e,n]))}function Nn(r){let e=[];r.name!==void 0&&e.push(`H NM:Z:${r.name}`);for(let[t,n]of On(r.subgraph))e.push(`H SG:Z:${t},${n}`);for(let[t,n]of On(r.translation))e.push(`H TL:Z:${t},${n}`);return e}async function Fn(r){let e=r.reduce((s,i)=>s+i.length,0),t=new Uint8Array(e),n=0;for(let s of r)t.set(s,n),n+=s.length;let o=await globalThis.crypto.subtle.digest("SHA-256",t);return[...new Uint8Array(o)].map(s=>s.toString(16).padStart(2,"0")).join("")}var lo="_gbwt_ref";function q(r,e){return`${r.sample}#${r.haplotype}#${r.contig}[${r.fragment}-${e}]`}var po=/^([^#]+)#(\d+)#([^#]+?)(?:\[\d+-\d+\])?$/,ho=/^([^#]+?)(?:\[\d+-\d+\])?$/;function uo(r){let e=po.exec(r);if(e)return{sample:e[1],haplotype:Number(e[2]),contig:e[3]};let t=ho.exec(r);if(t)return{contig:t[1]};throw new Error(`"${r}" is not a path name; expected "sample#haplotype#contig" or a bare contig`)}function Hn(r){return typeof r=="string"?uo(r):r}function Re(r,e){return{sample:r.sample??lo,contig:r.contig,haplotype:r.haplotype??0,fragment:e}}function ze(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>1;r[o]<e?t=o+1:n=o}return t}var je=class{ending;tree;constructor(e){this.ending=new Float64Array(e),this.tree=new Int32Array(e+1).fill(-1)}bestBefore(e){let t=-1;for(let n=e;n>0;n-=n&-n){let o=this.tree[n];o!==-1&&(t===-1||this.ending[o]>this.ending[t])&&(t=o)}return t}raise(e,t){this.ending[e]=t;for(let n=e+1;n<this.tree.length;n+=n&-n){let o=this.tree[n];(o===-1||t>this.ending[o])&&(this.tree[n]=e)}}},Tt=class{pairs=[];total=0;a;b;weight;occurrences=new Map;constructor(e,t,n){this.a=e,this.b=t,this.weight=n,t.forEach((o,s)=>{let i=this.occurrences.get(o);i?i.push(s):this.occurrences.set(o,[s])})}solve(e,t,n,o){let s=0;for(;e+s<t&&n+s<o&&this.a[e+s]===this.b[n+s];)this.match(e+s,n+s),s+=1;let i=0;for(;t-i>e+s&&o-i>n+s&&this.a[t-i-1]===this.b[o-i-1];)i+=1;this.solveMiddle(e+s,t-i,n+s,o-i);for(let a=i;a>0;a--)this.match(t-a,o-a)}match(e,t){this.pairs.push([e,t]),this.total+=this.weight(this.a[e])}solveMiddle(e,t,n,o){if(e===t||n===o)return;let s=this.matchCount(e,t,n,o);if(s===0)return;if(s<=t-e+(o-n)){this.chain(e,t,n,o,s);return}let i=e+t>>1,a=this.split(e,i,t,n,o);this.solve(e,i,n,a),this.solve(i,t,a,o)}matchCount(e,t,n,o){let s=0;for(let i=e;i<t;i++){let a=this.occurrences.get(this.a[i]);a&&(s+=ze(a,o)-ze(a,n))}return s}sweep(e,t,n,o,s,i,a){for(let c=e;c!==t;c+=n){let f=this.occurrences.get(this.a[c]);if(!f)continue;let l=this.weight(this.a[c]),p=ze(f,o),d=ze(f,s);for(let h=0;h<d-p;h++){let u=n===1?f[d-1-h]-o:s-1-f[p+h],m=i.bestBefore(u),y=(m===-1?0:i.ending[m])+l;if(y>i.ending[u]&&(i.raise(u,y),a)){let x=a.count++;a.row[x]=c,a.column[x]=u,a.previous[x]=m===-1?-1:a.endingMatch[m],a.endingMatch[u]=x}}}}chain(e,t,n,o,s){let i=new je(o-n),a={row:new Int32Array(s),column:new Int32Array(s),previous:new Int32Array(s),endingMatch:new Int32Array(o-n),count:0};this.sweep(e,t,1,n,o,i,a);let c=i.bestBefore(o-n);if(c===-1)return;this.total+=i.ending[c];let f=[];for(let l=a.endingMatch[c];l!==-1;l=a.previous[l])f.push([a.row[l],n+a.column[l]]);for(let l=f.length-1;l>=0;l--)this.pairs.push(f[l])}frontier(e,t,n,o,s){let i=new je(s-o);this.sweep(e,t,n,o,s,i);let a=new Float64Array(s-o+1);for(let c=0;c<s-o;c++)a[c+1]=Math.max(a[c],i.ending[c]);return a}split(e,t,n,o,s){let i=s-o,a=this.frontier(e,t,1,o,s),c=this.frontier(n-1,t-1,-1,o,s),f=0,l=-1;for(let p=0;p<=i;p++){let d=a[p]+c[i-p];d>l&&(l=d,f=p)}return o+f}};function qn(r,e,t){let n=new Tt(r,e,t);return n.solve(0,r.length,0,e.length),[n.pairs,n.total]}var mo=100,Ht=4e6,go=5e3,D=15,yo=64,wo=8,Un=1,qt=-4,B=-6,ee=-1,ye=-(2**30),We=0,Nt=1,Wn=2;function te(r,e,t){let n=r.at(-1);t>0&&(n?.[0]===e?n[1]+=t:r.push([e,t]))}function Ue(r,e,t){return r>=t&&r>=e?We:t>=e?Wn:Nt}function Qn(r,e,t){let n=r.length,o=e.length,s=o+1,i=new Uint8Array((n+1)*s),a=new Int32Array(s).fill(ye),c=new Int32Array(s).fill(ye),f=new Int32Array(s).fill(ye);a[0]=0;for(let u=1;u<=o;u++)f[u]=B+(u-1)*ee,i[u]=(u===1?We:Wn)<<4;for(let u=1;u<=n;u++){let m=new Int32Array(s).fill(ye),y=new Int32Array(s).fill(ye),x=new Int32Array(s).fill(ye);y[0]=B+(u-1)*ee,i[u*s]=(u===1?We:Nt)<<2;let S=r.charCodeAt(u-1);for(let g=1;g<=o;g++){let b=Ue(a[g-1],c[g-1],f[g-1]);m[g]=Math.max(a[g-1],c[g-1],f[g-1])+(S===e.charCodeAt(g-1)?Un:qt);let w=Ue(a[g]+B,c[g]+ee,f[g]+B);y[g]=Math.max(a[g]+B,c[g]+ee,f[g]+B);let v=Ue(m[g-1]+B,y[g-1]+B,x[g-1]+ee);x[g]=Math.max(m[g-1]+B,y[g-1]+B,x[g-1]+ee),i[u*s+g]=b|w<<2|v<<4}a=m,c=y,f=x}let l=[],p=n,d=o,h=Ue(a[o],c[o],f[o]);for(;p>0||d>0;){let u=i[p*s+d]>>2*h&3;h===We?(l.push(r[p-1]===e[d-1]?"=":"X"),p-=1,d-=1):h===Nt?(l.push("I"),p-=1):(l.push("D"),d-=1),h=u}for(let u of l.reverse())te(t,u,1)}function xo(r,e){let t=Math.abs(r-e);return(t===0?0:Math.min(-B-(t-1)*ee,-B+10*Math.log2(t)))+(Math.min(r,e)>0?-qt:0)}function Yn(r,e){let t=Math.abs(r-e);return t===0?0:.01*D*t+.5*Math.log2(t)}function $n(r,e,t){return{qs:r.qs+e,qe:r.qs+t,ts:r.flipped?r.te-t:r.ts+e,te:r.flipped?r.te-e:r.ts+t,flipped:r.flipped}}function bo(r,e,t){let n=r.qe-r.qs,o=[];for(let[a,c]of e){let f=Math.max(0,a-r.qs),l=Math.min(n,c-r.qs);f<l&&o.push([f,l])}for(let[a,c]of t){let f=Math.max(0,r.flipped?r.te-c:a-r.ts),l=Math.min(n,r.flipped?r.te-a:c-r.ts);f<l&&o.push([f,l])}if(o.length===0)return[r];o.sort((a,c)=>a[0]-c[0]);let s=[],i=0;for(let[a,c]of o)a-i>=D&&s.push($n(r,i,a)),i=Math.max(i,c);return n-i>=D&&s.push($n(r,i,n)),s}function $t(r,e,t,n,o=1/0){let s=[],i={query:[],target:[]},a={forward:{query:[],target:[]},flipped:{query:[],target:[]}},c=[...r].sort((f,l)=>f.qs-l.qs||f.ts-l.ts);for(;c.length>0&&s.length<o;){let f=c.map(g=>g.qe-g.qs),l=new Int32Array(c.length).fill(-1),p=new Int32Array(c.length);for(let g=0;g<c.length;g++){let b=c[g],w=b.qe-b.qs;for(let v=g-1;v>=Math.max(0,g-go);v--){if(f[v]+w<=f[g])continue;let I=c[v];if(I.flipped===b.flipped&&I.qs<b.qs&&(b.flipped?b.te<I.te:I.ts<b.ts)){let C=Math.max(0,I.qe-b.qs,b.flipped?b.te-I.ts:I.te-b.ts),_=b.qs+C-I.qe,E=b.flipped?I.ts-(b.te-C):b.ts+C-I.te;if(C<w&&_<=e&&E<=e){let k=f[v]+w-C-n(_,E);k>f[g]&&(f[g]=k,l[g]=v,p[g]=C)}}}}let d=0;for(let g=1;g<c.length;g++)f[g]>f[d]&&(d=g);let h=[];for(let g=d;g>=0;g=l[g])h.push({run:c[g],trim:p[g]});if(h.reverse(),h.reduce((g,{run:b,trim:w})=>g+b.qe-b.qs-w,0)<t)break;s.push(h);let m=h[0],y=h.at(-1),{flipped:x}=m.run,S=x?a.flipped:a.forward;S.query.push([m.run.qs+m.trim,y.run.qe]),S.target.push(x?[y.run.ts,m.run.te-m.trim]:[m.run.ts+m.trim,y.run.te]);for(let{run:g,trim:b}of h)i.query.push([g.qs+b,g.qe]),i.target.push(g.flipped?[g.ts,g.te-b]:[g.ts+b,g.te]);c=c.flatMap(g=>{let b=g.flipped?a.flipped:a.forward;return bo(g,[...i.query,...b.query],[...i.target,...b.target])}).sort((g,b)=>g.qs-b.qs||g.ts-b.ts)}return s}function Ft(r,e){let t=new Map;for(let s=0;s+D<=e.length;s++){let i=e.slice(s,s+D),a=t.get(i);a?a.push(s):t.set(i,[s])}let n=[],o=new Map;for(let s=0;s+D<=r.length;s++){let i=t.get(r.slice(s,s+D));if(i&&i.length<=yo)for(let a of i){let c=a-s,f=o.get(c);if(f&&s<=f.qe)f.qe=s+D,f.te=a+D;else{let l={qs:s,qe:s+D,ts:a,te:a+D,flipped:!1};o.set(c,l),n.push(l)}}}return n}function So(r,e){return[...Ft(r,e),...Ft(r,De(e)).map(t=>({...t,ts:e.length-t.te,te:e.length-t.ts,flipped:!0}))]}function Qe(r,e,t,n,o){let s;for(let{run:i,trim:a}of r){let c=i.qs+a;if(s){let f=i.flipped?i.te-a:s.te,l=i.flipped?s.ts:i.ts+a,p=t.slice(f,l);o(e.slice(s.qe,c),i.flipped?De(p):p,n,s.qe,f)}te(n,"=",i.qe-c),s=i}}function Vn(r,e,t){r.length*e.length<=Ht?Qn(r,e,t):(te(t,"I",r.length),te(t,"D",e.length))}function Bt(r,e,t,n=0){let[o]=r.length*e.length>Ht&&n<wo?$t(Ft(r,e),1/0,D,Yn,1):[];if(!o){Vn(r,e,t);return}let s=(c,f,l)=>{Bt(c,f,l,n+1)},i=o[0].run,a=o.at(-1).run;s(r.slice(0,i.qs),e.slice(0,i.ts),t),Qe(o,r,e,t,s),s(r.slice(a.qe),e.slice(a.te),t)}function vo(r,e,t){Bt(r,e,t)}function Io(r,e,t){let n=[];Qe(r,e,t,n,vo);let o=r[0],s=r.at(-1),{flipped:i}=o.run;return{queryStart:o.run.qs+o.trim,queryEnd:s.run.qe,targetStart:i?s.run.ts:o.run.ts+o.trim,targetEnd:i?o.run.te-o.trim:s.run.te,strand:i?"-":"+",edits:i?n.reverse():n,sharedBases:0}}function Ao(r,e,t,n){let o=[];if(r.length*e.length<=Ht)Qn(r,e,t);else{let s=$t(So(r,e),1/0,Math.max(n,D),Yn),i=s.find(a=>!a[0].run.flipped);if(o=s.filter(a=>a[0].run.flipped).map(a=>Io(a,r,e)),i){let a=(l,p,d,h,u)=>{o.some(y=>h<y.queryEnd&&y.queryStart<h+l.length||u<y.targetEnd&&y.targetStart<u+p.length)?Vn(l,p,d):Bt(l,p,d)},c=i[0].run,f=i.at(-1).run;a(r.slice(0,c.qs),e.slice(0,c.ts),t,0,0),Qe(i,r,e,t,a),a(r.slice(f.qe),e.slice(f.te),t,f.qe,f.te)}else te(t,"I",r.length),te(t,"D",e.length)}return o}function Gt(r,e){let t=r.strand==="-",n=0,o=0;for(let[s,i]of r.edits)e(s,i,t?r.queryEnd-1-n:r.queryStart+n,r.targetStart+o),s!=="D"&&(n+=i),s!=="I"&&(o+=i)}function Bn(r,e,t,n){let o=e==="query"&&r.strand==="-"?-1:1,s=0;return Gt(r,(i,a,c,f)=>{let l=e==="query"?c:f,p=d=>{let h=l+o*d;return h>=t&&h<n};if(i==="="||i==="X")for(let d=0;d<a;d++)p(d)&&(s+=i==="="?Un:qt);else if(i==="I"==(e==="query"))for(let d=0;d<a;d++)p(d)&&(s+=d===0?B:ee);else p(0)&&(s+=B+(a-1)*ee)}),s}function Gn(r,e){return e==="query"?[r.queryStart,r.queryEnd]:[r.targetStart,r.targetEnd]}function Eo(r,e){let t=r.strand==="-",n=[],o=0,s=0,i=0,a=0,c=new Uint8Array(r.queryEnd-r.queryStart);for(let[h,u]of r.shared)c.fill(1,h-r.queryStart,u-r.queryStart);let f=h=>c[h-r.queryStart]===1,l=()=>{te(n,"I",o),te(n,"D",s),o=0,s=0};Gt(r,(h,u,m)=>{if(h==="I")o+=u;else if(h==="D")s+=u;else{for(let y=0;y<u;y++)e[i+y]?(o+=1,s+=1,f(t?m-y:m+y)&&(a+=1)):((o>0||s>0)&&l(),te(n,h,1));i+=u}}),l();let p={I:0,D:0};for(;n[0]?.[0]==="I"||n[0]?.[0]==="D";){let[h,u]=n.shift();p[h]+=u}let d={I:0,D:0};for(;n.at(-1)?.[0]==="I"||n.at(-1)?.[0]==="D";){let[h,u]=n.pop();d[h]+=u}return n.length===0?void 0:{...r,queryStart:r.queryStart+(t?d.I:p.I),queryEnd:r.queryEnd-(t?p.I:d.I),targetStart:r.targetStart+p.D,targetEnd:r.targetEnd-d.D,edits:n,sharedBases:r.sharedBases-a}}function Co(r,e,t,n){let o={query:new Uint8Array(e),target:new Uint8Array(t)},s=r.map(f=>{let l=[];Gt(f,(p,d,h,u)=>{if(p==="="||p==="X")for(let m=0;m<d;m++)l.push([f.strand==="-"?h-m:h+m,u+m])});for(let[p,d]of l)o.query[p]=Math.min(255,o.query[p]+1),o.target[d]=Math.min(255,o.target[d]+1);return l}),i={query:new Map,target:new Map};s.forEach((f,l)=>{for(let[p,d]of f)for(let[h,u]of[["query",p],["target",d]])if(o[h][u]>1){let m=i[h].get(u);m?m.at(-1)!==l&&m.push(l):i[h].set(u,[l])}});let a=new Map,c=(f,l,p)=>{let d=`${p}:${f}:${l}`,h=a.get(d);if(h===void 0){let[u,m]=Gn(r[f],p),[y,x]=Gn(r[l],p),S=Math.max(u,y),g=Math.min(m,x);h=Bn(r[f],p,S,g)<Bn(r[l],p,S,g),a.set(d,h)}return h};return r.flatMap((f,l)=>{let p=s[l],d=new Uint8Array(p.length);if(p.forEach(([m,y],x)=>{for(let[S,g]of[["query",m],["target",y]])!d[x]&&i[S].get(g)?.some(b=>b!==l&&c(l,b,S))&&(d[x]=1)}),!d.includes(1))return[f];let h=Eo(f,d),u=h?.edits.reduce((m,[y,x])=>m+(y==="="?x:0),0)??0;return h&&u>=n?[h]:[]})}function Dn(r,e){return r.map(t=>{let n=e(A(t));return L(t)?De(n):n}).join("")}function zn(r,e){let t=[0];for(let n of r)t.push(t.at(-1)+e(A(n)).length);return t}function jn(r){let e=new Map,t=new Map;r.forEach((i,a)=>{let c=A(i);e.has(c)?t.set(c,a):e.set(c,a)});let n=new Int32Array(r.length+1);for(let[i,a]of t)n[e.get(i)]+=1,n[a+1]-=1;let o=new Uint8Array(r.length),s=0;for(let i=0;i<r.length;i++)s+=n[i],o[i]=s>0?1:0;return o}function Ro(r,e,t,n){let o=jn(r),s=jn(e),i=new Map;e.forEach((p,d)=>{s[d]||i.set(A(p),[d])});let a=2*e.length,c=(p,d,h)=>p*a+2*d+(h?1:0),f=new Set;r.forEach((p,d)=>{for(let h of o[d]?[]:i.get(A(p))??[])f.add(c(d,h,L(p)!==L(e[h])))});let l=[];return r.forEach((p,d)=>{for(let h of o[d]?[]:i.get(A(p))??[]){let u=L(p)!==L(e[h]),m=u?-1:1;if(!f.has(c(d-1,h-m,u))){let y=d,x=h;for(;y<r.length&&x>=0&&x<e.length&&f.has(c(y,x,u));)y+=1,x+=m;let S=x-m;l.push({qs:t[d],qe:t[y],ts:n[Math.min(h,S)],te:n[Math.max(h,S)+1],flipped:u})}}}),l}function Kn(r,e,t,n={}){let o=Dn(r,t),s=Dn(e,t),i=Ro(r,e,zn(r,t),zn(e,t)),a=n.minMatch??mo,c=[];for(let f of $t(i,n.maxGap??1/0,a,xo)){let l=[],p=f[0],d=f.at(-1),{flipped:h}=p.run;Qe(f,o,s,l,(u,m,y,x,S)=>{for(let g of Ao(u,m,y,a)){let b=S+m.length;c.push({...g,queryStart:x+g.queryStart,queryEnd:x+g.queryEnd,targetStart:h?b-g.targetEnd:S+g.targetStart,targetEnd:h?b-g.targetStart:S+g.targetEnd,strand:h?"+":"-",edits:h?g.edits.reverse():g.edits,shared:[]})}}),c.push({queryStart:p.run.qs+p.trim,queryEnd:d.run.qe,targetStart:h?d.run.ts:p.run.ts+p.trim,targetEnd:h?p.run.te-p.trim:d.run.te,strand:h?"-":"+",edits:h?l.reverse():l,sharedBases:f.reduce((u,{run:m,trim:y})=>u+m.qe-m.qs-y,0),shared:f.map(({run:u,trim:m})=>[u.qs+m,u.qe])})}return Co(c,o.length,s.length,a).map(({shared:f,...l})=>l).sort((f,l)=>f.queryStart-l.queryStart)}function Xn(r){return r.map(([e,t])=>`${t}${e}`).join("")}var X=class extends Error{name="SubgraphLimitError";limit;windowBp;walkedBp;constructor(e,t){super(t===void 0?`Subgraph size limit of ${e} nodes exceeded`:`Subgraph size limit of ${e} nodes exceeded ${t.walkedBp} bp into a ${t.windowBp} bp window`),this.limit=e,this.windowBp=t?.windowBp,this.walkedBp=t?.walkedBp}};function Dt(r,e){return r[0]<e[0]||r[0]===e[0]&&(r[1]<e[1]||r[1]===e[1]&&r[2]<e[2])}var _e=class{heap=[];push(e,t,n){let o=this.heap;o.push([e,t,n]);let s=o.length-1;for(;s>0;){let i=s-1>>1;if(Dt(o[s],o[i]))[o[s],o[i]]=[o[i],o[s]],s=i;else break}}pop(){let e=this.heap,t=e[0],n=e.pop();if(e.length>0&&n!==void 0){e[0]=n;let o=0;for(;;){let s=2*o+1,i=s+1,a=o;if(s<e.length&&Dt(e[s],e[a])&&(a=s),i<e.length&&Dt(e[i],e[a])&&(a=i),a===o)break;[e[o],e[a]]=[e[a],e[o]],o=a}}return t}get size(){return this.heap.length}};function _o(r){let e=new Int32Array(r.length),t=new Int32Array(r.length);return r.forEach(([n,o],s)=>{e[s]=n,t[s]=o}),{pathAt:e,refAt:t,count:r.length}}function Po(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>1;r[o]>e?n=o:t=o+1}return r[t]}function fe(r){return`${r.node}:${r.offset}`}function ko(r,e){let t=e.identity.hapStart-r.identity.hapEnd,n=r.strand==="+"?e.refStart-r.refEnd:r.refStart-e.refEnd;return r.strand===e.strand&&t>=0&&n>=0?{insertion:t,deletion:n}:void 0}function Mo(r,e,t){let[n,o]=r.strand==="+"?[r,e]:[e,r],s=n.edits.map(([f,l])=>[f,l]);Jn(s,t.insertion,t.deletion);for(let[f,l]of o.edits)z(s,f,l);let i=r.identity.walkForward,[a,c]=i?[r,e]:[e,r];return{strand:r.strand,refStart:n.refStart,refEnd:o.refEnd,edits:s,weight:void 0,path:[...a.path,...c.path],start:a.start,identity:{pathHandle:r.identity.pathHandle,name:r.identity.name,hapStart:r.identity.hapStart,hapEnd:e.identity.hapEnd,walkForward:i}}}function Oo(r){if(r.some(o=>o.weight!==void 0))return r;let e=new Map;r.forEach((o,s)=>{if(o.identity){let i=e.get(o.identity.pathHandle);i?i.push(s):e.set(o.identity.pathHandle,[s])}});let t=new Map,n=new Set;for(let o of e.values()){o.sort((a,c)=>r[a].identity.hapStart-r[c].identity.hapStart);let s=o[0],i=r[s];for(let a of o.slice(1)){let c=r[a],f=ko(i,c);f?(i=Mo(i,c,f),n.add(a)):(t.set(s,i),s=a,i=c)}t.set(s,i)}return r.flatMap((o,s)=>n.has(s)?[]:[t.get(s)??o])}function Ye(r,e){return{node:r.path[e],offset:r.offsets[e]}}var Lo=4096;function Zn(r){let e=[];for(let t of r){let n=e[e.length-1];n&&t-n[1]<=Lo?n[1]=t:e.push([t,t])}return e}var To=32768,No=65536;function Fo(r){let e=[...r].sort((n,o)=>n-o),t=[];for(let n of e){let o=t[t.length-1];o&&n-o[1]<=To?o[1]=n:t.push([n,n])}return t}var Pe=class{records=new Map;paths=[];twinStarts=new Set;refId;refPath;refHandle;refInterval;refIndexCache;refPrefixCache;walkedBp;stats={orderedAlignments:0,lcsAlignments:0,identificationSteps:0,identificationFetches:0,identification:{interval:0,scans:[],windowSamples:0,fragmentLengths:[],companionSeeks:0,companionMisses:0,graphLookups:0,graphFetches:0,chains:[]},anchorWalk:void 0};db;limit;signal;constructor(e,t={}){this.db=e,this.limit=t.limit,this.signal=t.signal}get nodeCount(){return this.records.size/2}get pathCount(){return this.paths.length}get referenceInterval(){return this.refInterval&&this.refPath?{name:this.refPath,start:this.refPath.fragment+this.refInterval[0],end:this.refPath.fragment+this.refInterval[1]}:void 0}hasNode(e){return this.records.has(V(e,"forward"))}hasHandle(e){return this.records.has(e)}record(e){let t=this.records.get(e);if(!t)throw new Error(`Subgraph has no record for handle ${e}`);return t}sortedHandles(){return[...this.records.keys()].sort((e,t)=>e-t)}async addNode(e){if(this.signal?.throwIfAborted(),this.limit!==void 0&&this.nodeCount>=this.limit)throw new X(this.limit);let t=await this.db.getRecord(V(e,"forward")),n=await this.db.getRecord(V(e,"reverse"));if(!t||!n)throw new Error(`Node ${e} does not exist in the graph`);this.records.set(t.handle,t),this.records.set(n.handle,n)}async ensureNode(e){this.hasNode(e)||await this.addNode(e)}clearPaths(){this.paths=[],this.twinStarts.clear(),this.refId=void 0,this.refPath=void 0,this.refHandle=void 0,this.refInterval=void 0,this.refIndexCache=void 0,this.refPrefixCache=void 0}async pathPosition(e){let t=await this.db.findPath(e);if(!t)throw new Error(`Cannot find a path covering ${q(e,e.fragment)}`);if(!t.isIndexed)throw new Error(`Path ${q(t.name,t.name.fragment)} has not been indexed for random access`);let n=e.fragment-t.name.fragment,o=await this.db.indexedPosition(t.handle,n);if(!o)throw new Error(`Path ${q(t.name,t.name.fragment)} has not been indexed for random access`);return this.findPathPosition(t,n,o.pathOffset,o.pos)}async findPathPosition(e,t,n,o){let s=n,i=o;for(;;){await this.ensureNode(A(i.node));let a=this.record(i.node);if(s+a.sequenceLen>t)return{position:{seqOffset:t,handle:i.node,nodeOffset:t-s,gbwtOffset:i.offset},name:e.name,handle:e.handle};s+=a.sequenceLen;let c=a.gbwt().lf(i.offset);if(!c)throw new Error(`Path ${q(e.name,e.name.fragment)} does not contain offset ${t}`);i=c}}async aroundPosition(e,t,n){let o=A(e);await this.ensureNode(o);let s=this.record(e),i=me(e),a=new _e;return a.push(t,o,He(i)),a.push(s.sequenceLen-t-1,o,qe(i)),this.insertContext(a,n)}prefetchReferenceWalk(e,t){return this.prefetchReferenceRange(e.handle,e.position.seqOffset,e.position.seqOffset+t)}async prefetchReferenceRange(e,t,n){let[o,s]=await Promise.all([this.db.indexedPosition(e,t),this.db.indexedPosition(e,n)]);if(o&&s){let i=o.pos.node,a=s.pos.node;if(!await this.db.prefetchRecords(Math.min(i,a),Math.max(i,a)+1)){let f=await this.db.indexedPositionsBetween(e,t,n),l=Fo(f.map(p=>p.pos.node));await Promise.all(l.map(([p,d])=>this.db.prefetchRecords(p,d+2)))}}return o}async aroundInterval(e,t,n){if(t===0)throw new Error("Interval length must be greater than 0");this.walkedBp=0;try{return await this.walkInterval(e,t,n)}catch(o){throw o instanceof X&&o.windowBp===void 0?new X(o.limit,{windowBp:t,walkedBp:this.walkedBp}):o}}get referenceWalkedBp(){return this.walkedBp}async walkInterval(e,t,n){let o={node:e.handle,offset:e.gbwtOffset},s=e.nodeOffset,i=t,a=new _e;for(;;){let c=A(o.node),f=me(o.node);this.walkedBp=t-i,await this.ensureNode(c);let l=this.record(o.node);if(s>=l.sequenceLen)throw new Error(`Offset ${s} in node ${c} of length ${l.sequenceLen}`);a.push(s,c,He(f));let p=l.sequenceLen-s;if(i<=p){a.push(i===p?0:p-i-1,c,qe(f));break}a.push(0,c,qe(f));let d=l.gbwt().lf(o.offset);if(!d)throw new Error(`No successor for GBWT position (${o.node}, ${o.offset})`);o=d,s=0,i-=p}return this.walkedBp=t,this.insertContext(a,n)}async aroundNodes(e,t){let n=new _e;for(let o of e)await this.ensureNode(o),n.push(0,o,"left"),n.push(0,o,"right");return this.insertContext(n,t)}async insertContext(e,t){this.clearPaths();let n=new Set,o=new Set;for(let i of this.records.keys())o.add(A(i));let s=0;for(;e.size>0;){let[i,a,c]=e.pop(),f=`${a}:${c}`;if(n.has(f))continue;n.add(f),o.delete(a),this.hasNode(a)||(await this.addNode(a),s+=1);let l=vn(c);if(!n.has(`${a}:${l}`)){let h=this.record(V(a,In(c))),u=i+h.sequenceLen-1;u<=t&&e.push(u,a,l)}let p=this.record(V(a,An(c))),d=i+1;if(d<=t)for(let h of p.successors()){let u=A(h),m=He(me(h));n.has(`${u}:${m}`)||e.push(d,u,m)}}for(let i of o)this.records.delete(V(i,"forward")),this.records.delete(V(i,"reverse"));return{inserted:s,removed:o.size}}async betweenNodes(e,t){this.clearPaths();let n=[e,G(t)],o=new Set([A(e),A(t)]),s=0;for(;n.length>0;){let i=n.pop(),a=A(i);this.hasNode(a)||(await this.addNode(a),s+=1);for(let c of this.record(i).successors()){let f=A(c);o.has(f)||(n.push(c,G(c)),o.add(f))}}return s}async extractSnarls(e){let t=0;for(let[n,o]of await this.overlappingSnarls(e))t+=await this.betweenNodes(n,o);return t}async overlappingSnarls(e){let t=[];if(e!=="none"){let n=!1;for(let o of this.sortedHandles()){let s=this.record(o),i=s.next;i!==void 0&&(n=!0,this.hasHandle(i)?ge(o,i)&&t.push([o,i]):e==="overlapping"&&this.isSnarlEntryInSubgraph(s)&&t.push([o,i]))}if(!n&&e==="overlapping"&&await this.db.hasChainLinks()){let o=await this.findCoveringSnarl();o&&t.push(o)}}return t}isSnarlEntryInSubgraph(e){let t=e.successors(),n=t.find(o=>this.hasHandle(o));return n===void 0?!1:t.length>1||this.record(G(n)).successors().length>1}recordReader(e){let t=new Map;return async n=>{let o=this.records.get(n);if(o)return o;let s=t.get(n);if(!s){if(s=await this.db.getRecord(n),e?.(),!s)throw new Error(`Node record ${n} is missing from the database`);t.set(n,s)}return s}}async findCoveringSnarl(){let e=this.recordReader(),t=async c=>{let f=c.successors(),l=f[0];return l===void 0?!1:f.length>1||(await e(G(l))).successors().length>1},n=async c=>{let f=await e(G(c));return f.next!==void 0?await t(f)?{kind:"snarl-exit",snarl:[G(c),f.next]}:{kind:"chain"}:(await e(c)).next!==void 0?{kind:"chain"}:{kind:"regular"}},o=new Set,s=this.sortedHandles().flatMap(c=>this.record(c).successors()),i,a=!1;for(;!a&&s.length>0;){let c=s.shift(),f=A(c);if(!this.hasHandle(c)&&!o.has(f)){o.add(f);let l=await n(c);if(l.kind==="snarl-exit")i=l.snarl,a=!0;else if(l.kind==="chain")a=!0;else for(let p of["forward","reverse"])s.push(...(await e(V(f,p))).successors())}}return i}extractPaths(e,t){if(this.clearPaths(),t==="none")return;let n=e?.position;this.refPath=e?.name,this.refHandle=e?.handle;let o=this.sortedHandles(),s=o.length,i=new Map;o.forEach((w,v)=>i.set(w,v));let a=new Int32Array(s+1),c=new Int32Array(s),f=[];for(let w=0;w<s;w++){let v=this.record(o[w]),I=v.gbwt().decompressArrays();c[w]=v.sequenceLen,f.push(I),a[w+1]=a[w]+I.nodes.length}let l=a[s],p=new Int32Array(l),d=new Int32Array(l),h=new Uint8Array(l);for(let w=0;w<s;w++){let v=f[w];p.set(v.nodes,a[w]),d.set(v.offsets,a[w])}f.length=0;for(let w=0;w<l;w++){let v=i.get(p[w]);v===void 0?p[w]=-1:(p[w]=v,h[a[v]+d[w]]=1)}let u=n===void 0?void 0:i.get(n.handle),m=n?.gbwtOffset,y,x=(w,v,I)=>{let R=[],C=0,_=0,E=-1,k=w,O=v;for(;;){k===u&&O===m&&(E=C),I&&(I.push(o[k]),R.push(O)),C+=1,_+=c[k];let N=a[k]+O,F=p[N];if(F<0)break;O=d[N],k=F}return{offsets:R,len:_,refAt:E,last:k}},S=(w,v,I,R)=>{R>=0&&(this.refId=this.paths.length,y=R),this.paths.push({path:w,offsets:v,len:I,weight:void 0,identity:void 0})},g=new Int32Array(s),b=u!==void 0&&L(o[u]);for(let w=0;w<s;w++){let v=o[w];if(!L(v)){let I=a[w],R=a[w+1]-I;for(let C=0;C<R;C++)if(h[I+C]===0){let _=[],{offsets:E,len:k,refAt:O,last:N}=x(w,C,_),F=o[N];if(O>=0||$e(v,F)){if(S(_,E,k,O),!L(F)){let H=i.get(G(F));g[H]=g[H]+1}}else this.twinStarts.add(fe({node:v,offset:C}))}}}for(let w=0;w<s;w++){let v=o[w];if(L(v)){let I=a[w],R=a[w+1]-I,C=0;for(let E=0;E<R;E++)h[I+E]===0&&(C+=1);let _=!b&&C===g[w];for(let E=0;E<R;E++)if(h[I+E]===0){let k=_?void 0:x(w,E,void 0);if(k&&(k.refAt>=0||$e(v,o[k.last]))){let O=[],{offsets:N,len:F,refAt:H}=x(w,E,O);S(O,N,F,H)}else this.twinStarts.add(fe({node:v,offset:E}))}}}if(n){if(y===void 0||this.refId===void 0)throw this.clearPaths(),new Error("Could not find the reference path");let w=this.paths[this.refId],v=n.nodeOffset;for(let R of w.path.slice(0,y))v+=this.record(R).sequenceLen;let I=n.seqOffset-v;this.refInterval=[I,I+w.len],w.identity={pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:I,hapEnd:I+w.len}}if(t==="distinct")this.distinctPaths();else if(t==="reference-only"){if(this.refId===void 0)throw new Error("Reference path is required for reference-only output");this.paths=[this.paths[this.refId]],this.refId=0}}distinctPaths(){let e=this.refId===void 0?void 0:this.paths[this.refId].path;this.paths.sort((o,s)=>zt(o.path,s.path)||o.len-s.len);let t=[],n;for(let o of this.paths){let s=t[t.length-1];s&&zt(s.path,o.path)===0?s.weight=(s.weight??0)+1:(e&&zt(o.path,e)===0&&(n=t.length),t.push({...o,weight:1}))}this.paths=t,this.refId=n}keepHaplotypes(e){let t=this.refId===void 0?void 0:this.paths[this.refId],n=this.paths.filter((s,i)=>i===this.refId||s.identity!==void 0&&e(s.identity.name)),o=new Set;for(let s of n)for(let i of s.path)o.add(A(i));for(let s of[...this.records.keys()])o.has(A(s))||this.records.delete(s);this.paths=n,this.refId=t===void 0?void 0:n.indexOf(t)}async walkHaplotypesFromAnchor(e,t,n,o,s){let i=e.position.seqOffset,a=i+t,c=Math.floor(i/n)*n,f=Math.min(n,No),l=4*(n+t)+f,p={spacing:n,anchorOffset:c,anchorNodeOffset:-1,anchorHandle:-1,referenceSteps:0,rows:0,walks:[],graphFetches:0,scans:[],scanRows:0,fallback:void 0,ms:{reference:0,rows:0,walks:0,scan:0,sampled:0}};this.stats.anchorWalk=p;let d=performance.now(),h=()=>{let M=performance.now(),U=M-d;return d=M,U};this.clearPaths(),this.records.clear();let u=this.recordReader(()=>{p.graphFetches+=1}),m=await this.db.haplotypeAnchor(e.handle,c);if(m===void 0)throw new Error(`The haplotype index names no anchor for ${q(e.name,e.name.fragment)} at offset ${c}; it was not built with anchors at ${n} bp for this graph`);p.anchorNodeOffset=m.pathOffset;let y=await this.prefetchReferenceRange(e.handle,m.pathOffset,a+f);if(!y)throw new Error(`Path ${q(e.name,e.name.fragment)} has not been indexed for random access`);let x=await this.walkReference(u,y,m,i,a,a+f),{anchor:S,refOffsetOf:g,refHandles:b,windowSteps:w}=x;p.anchorHandle=S.pos.node,p.referenceSteps=x.steps,this.walkedBp=t;let v=[],I=[],R=0;for(let M of w)await this.ensureNode(A(M.pos.node)),v.push(M.pos.node),I.push(M.pos.offset),R+=this.record(M.pos.node).sequenceLen;let C=w[0];if(C===void 0)throw new Error("The reference walk has no node in the window");this.refPath=e.name,this.refHandle=e.handle,this.refInterval=[C.refOffset,C.refOffset+R],this.refId=0,this.paths.push({path:v,offsets:I,len:R,weight:void 0,identity:{pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:C.refOffset,hapEnd:C.refOffset+R}}),p.ms.reference=h();let _=await this.db.haplotypeSamplesAtNode(S.pos.node);p.rows=_.length,p.ms.rows=h();let E=_.find(M=>M.offset===S.pos.offset&&M.pathHandle===e.handle&&M.pathOffset===S.offset);if(E===void 0)throw new Error(`The haplotype index has no anchor row for ${q(e.name,e.name.fragment)} at offset ${S.offset} (node ${A(S.pos.node)}); it was not built with anchors at ${n} bp for this graph`);let k=await this.db.pathsByHandle(),O=M=>{let U=k.get(M);if(!U)throw new Error(`Path ${M} is missing from the database`);return U.name},N=new Set([e.handle]),F=new Map;for(let M of _)if(M!==E&&o(O(M.pathHandle))){let U=F.get(M.pathHandle);U?U.push(M):F.set(M.pathHandle,[M])}let H;for(let[M,U]of F)if(H===void 0){let he=ae=>Math.abs(ae.offset-E.offset);U.sort((ae,to)=>he(ae)-he(to));let de;for(let ae of U)N.has(M)||(de=await this.walkAndKeep(u,ae,"anchor",O(M),g,a,l,s,N,p));N.has(M)||(H=de)}p.ms.walks=h();let Ie=H===void 0?await this.samplesOfUnwalkedContigs(v,g,b,o,N,O,p):new Map;if(p.ms.scan=h(),Ie.size>0){await this.mapReferenceBefore(u,e.handle,Math.max(0,m.pathOffset-2*n),m.pathOffset,g,b);for(let[M,U]of Ie)if(H===void 0){let he=O(M),de;for(let ae of U)de??=await this.entryBefore(u,ae,g,b,this.refInterval[0],l);H=de===void 0?`no sample of ${q(he,he.fragment)} on the window's nodes runs with the reference`:await this.walkAndKeep(u,de,"sample",he,g,a,l,s,N,p)}p.ms.sampled=h()}return p.fallback=H,H}async walkAndKeep(e,t,n,o,s,i,a,c,f,l){let p=await this.walkFromRow(e,t,o,s,this.refInterval[0],i,a,c);l.walks.push({pathHandle:t.pathHandle,from:n,steps:p.steps,pieces:p.infos.length,end:p.end});let d;return p.end==="bound"||p.infos.length===0?d=`${q(o,t.pathOffset)} walked ${p.steps} steps from its ${n} without writing a walk through the window (${p.end})`:(f.add(t.pathHandle),this.paths.push(...p.infos)),d}async mapReferenceBefore(e,t,n,o,s,i){let a=await this.prefetchReferenceRange(t,n,o),c=a?.pos,f=a?.pathOffset??o;for(;c!==void 0&&c.node!==0&&f<o;){this.signal?.throwIfAborted();let l=await e(c.node),p=A(c.node);s.has(p)||(s.set(p,f),i.add(c.node)),f+=l.sequenceLen,c=l.gbwt().lf(c.offset)}}async runsWithReference(e,t,n,o,s){let i={node:t.node,offset:t.offset},a=0,c;for(;c===void 0;)if(this.signal?.throwIfAborted(),i===void 0||i.node===0||a>s)c=!1;else if(n.has(A(i.node)))c=o.has(i.node);else{let f=await e(i.node);a+=f.sequenceLen,i=f.gbwt().lf(i.offset)}return c}async entryBefore(e,t,n,o,s,i){let a=(await e(t.node)).sequenceLen,c=async(h,u)=>{let m=(await e(h.node)).sequenceLen;return{node:h.node,offset:h.offset,pathHandle:t.pathHandle,orientation:t.orientation,pathOffset:t.orientation==="forward"?t.pathOffset-u:t.pathOffset+a+u-m}},f={node:t.node,offset:t.offset},l=0,p,d=!await this.runsWithReference(e,t,n,o,i);for(;!d;){this.signal?.throwIfAborted();let h=n.get(A(f.node));if(h!==void 0&&h<s)p=await c(f,l),d=!0;else if(l>i)p={...t},d=!0;else{let m=(await e(G(f.node))).gbwt().predecessorAt(f.offset);if(m===void 0)p=await c(f,l),d=!0;else{let y=await e(m),x=y.gbwt().offsetTo(f);if(x===void 0)throw new Error(`No offset in ${m} leads to ${f.node}:${f.offset}`);f={node:m,offset:x},l+=y.sequenceLen}}}return p}async walkReference(e,t,n,o,s,i){let a=new Map,c=new Set,f=[],l,p=t.pos,d=t.pathOffset,h=0;for(;p!==void 0&&p.node!==0&&d<i;){this.signal?.throwIfAborted();let u=await e(p.node),m=d+u.sequenceLen;if(l===void 0&&d===n.pathOffset){if(p.node!==n.node)throw new Error(`The reference walk reaches node ${A(p.node)} at offset ${d} where the haplotype index names node ${A(n.node)} as the anchor`);l={pos:p,offset:d}}if(l!==void 0){h+=1;let y=A(p.node);a.has(y)||(a.set(y,d),c.add(p.node)),d<s&&m>o&&f.push({pos:p,refOffset:d})}d=m,p=u.gbwt().lf(p.offset)}if(l===void 0)throw new Error(`The reference walk from offset ${t.pathOffset} never starts a node at the anchor offset ${n.pathOffset}`);return{anchor:l,refOffsetOf:a,refHandles:c,windowSteps:f,steps:h}}async walkFromRow(e,t,n,o,s,i,a,c){let f=(await e(t.node)).sequenceLen,l=t.orientation==="forward"?t.pathOffset:t.pathOffset+f,p=[],d=[],h=[],u=0,m=0,y=0,x,S,g={node:t.node,offset:t.offset};for(;S===void 0;)if(this.signal?.throwIfAborted(),g===void 0||g.node===0)S=x===void 0?"before the window":"ended in the window";else if(m>a)S="bound";else{let w=o.get(A(g.node)),v=x!==void 0;if(w!==void 0&&w>=i)S=v?"through the window":"past the window";else{!v&&w!==void 0&&w>=s&&(x=m);let I=await e(g.node);if(x!==void 0){let R={pos:g,at:m,len:I.sequenceLen};w===void 0?(h.push(R),u+=R.len):(u>c&&w<s?(p.push(d),d=[]):d.push(...h),h=[],u=0,d.push(R))}y+=1,m+=I.sequenceLen,g=I.gbwt().lf(g.offset)}}p.push(d);let b=[];for(let w of p){let v=w[0],I=w[w.length-1];if(v!==void 0&&I!==void 0){let R=[],C=[],_=0;for(let O of w)await this.ensureNode(A(O.pos.node)),R.push(O.pos.node),C.push(O.pos.offset),_+=O.len;let E=v.at,k=I.at+I.len;b.push({path:R,offsets:C,len:_,weight:void 0,identity:t.orientation==="forward"?{pathHandle:t.pathHandle,name:n,orientation:"forward",hapStart:l+E,hapEnd:l+k}:{pathHandle:t.pathHandle,name:n,orientation:"reverse",hapStart:l-k,hapEnd:l-E}})}}return{steps:y,end:S,infos:b}}async samplesOfUnwalkedContigs(e,t,n,o,s,i,a){let c=Zn([...e].sort((l,p)=>l-p));a.scans=c;let f=new Map;for(let[l,p]of c){let d=await this.db.haplotypeSamplesInRange(l,p);a.scanRows+=d.length;for(let h of d){let u=t.has(A(h.node));if(!s.has(h.pathHandle)&&(!u||n.has(h.node))&&o(i(h.pathHandle))){let m=f.get(h.pathHandle)??[];u?m.unshift(h):m.push(h),f.set(h.pathHandle,m)}}}return f}async identifyPaths(){if(!this.db.hasHaplotypeIndex)throw new Error("The database has no HaplotypeSamples table; run gbz-haplotype-index on it");let e=await this.db.haplotypeSampleInterval()??4096,t=Zn(this.sortedHandles());if(t.length===0)return;let n=new Map;for(let[u,m]of t)for(let y of await this.db.haplotypeSamplesInRange(u,m))n.set(fe(y),y);let o=u=>{let m=0,y=t.length-1;for(;m<y;){let S=m+y+1>>1;t[S][0]<=u?m=S:y=S-1}let x=t[m];return x[0]<=u&&u<=x[1]},s=new Map;this.paths.forEach((u,m)=>{u.path.length>0&&m!==this.refId&&s.set(fe(Ye(u,0)),m)});let i=this.stats.identification;i.interval=e,i.scans=t,i.windowSamples=n.size,this.paths.forEach((u,m)=>{m!==this.refId&&i.fragmentLengths.push(u.len)});let a=this.recordReader(()=>{this.stats.identificationFetches+=1,i.graphFetches+=1}),c=u=>(i.graphLookups+=1,a(u)),f=async(u,m)=>{if(o(u.node))return n.get(fe(u));this.stats.identificationFetches+=1,i.companionSeeks+=1,m.seeks+=1;let y=await this.db.haplotypeSampleAt(u.node,u.offset);return y||(i.companionMisses+=1),y},l=new Map,p=async u=>{let m=l.get(u);if(!m){let y=await this.db.getPath(u);if(!y)throw new Error(`Path ${u} is missing from the database`);m=y.name,l.set(u,m)}return m},d=(u,m,y)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.pathOffset-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.pathOffset+m+y},h=(u,m)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.hapStart-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.hapEnd+m};for(let u=0;u<this.paths.length;u++){let m=this.paths[u];if(u===this.refId||m.identity)continue;let y=[],x=new Set,S={fragments:0,steps:0,seeks:0,reentries:0,twinLandings:0,end:"endmarker",pathHandle:void 0};i.chains.push(S);let g,b=0,w=u,v;for(;g===void 0;){if(this.signal?.throwIfAborted(),w!==void 0){if(x.has(w)){S.end="cycle";break}x.add(w);let E=this.paths[w];y.push({index:w,startBp:b}),S.fragments+=1;let k=b;for(let N=0;N<E.path.length;N++){let F=Ye(E,N),H=n.get(fe(F)),Ie=this.record(F.node).sequenceLen;if(H){g=d(H,k,Ie);break}k+=Ie}if(b+=E.len,g){S.end="in-fragment sample";break}let O=Ye(E,E.path.length-1);v=this.record(O.node).gbwt().lf(O.offset),w=void 0}if(v===void 0||v.node===0){S.end="endmarker";break}let I=fe(v),R=s.get(I);if(R!==void 0){let E=this.paths[R].identity;if(E){g=h(E,b),S.end="identified sibling";break}w=R;continue}this.records.has(v.node)&&(S.reentries+=1),this.twinStarts.has(I)&&(S.twinLandings+=1);let C=await f(v,S),_=await c(v.node);if(C){g=d(C,b,_.sequenceLen),S.end="out-of-window sample";break}if(this.stats.identificationSteps+=1,S.steps+=1,b-y[y.length-1].startBp>4*e+4*_.sequenceLen){S.end="bound";break}b+=_.sequenceLen,v=_.gbwt().lf(v.offset)}if(g){S.pathHandle=g.pathHandle;let I=await p(g.pathHandle);for(let{index:R,startBp:C}of y){let _=this.paths[R];_.identity=g.orientation==="forward"?{pathHandle:g.pathHandle,name:I,orientation:"forward",hapStart:g.base+C,hapEnd:g.base+C+_.len}:{pathHandle:g.pathHandle,name:I,orientation:"reverse",hapStart:g.base-C-_.len,hapEnd:g.base-C}}}}}refIndex(e){if(this.refIndexCache===void 0){let t=new Map;e.forEach((n,o)=>{let s=t.get(n);s?s.push(o):t.set(n,[o])}),this.refIndexCache=t}return this.refIndexCache}refPrefix(e){if(this.refPrefixCache===void 0){let t=[0];e.forEach((n,o)=>{t.push(t[o]+this.record(n).sequenceLen)}),this.refPrefixCache=t}return this.refPrefixCache}orderedMatches(e,t){let n=this.refIndex(t),o=new Int32Array(e.length),s=new Int32Array(e.length),i=0,a=-1;for(let c=0;c<e.length;c++){let f=n.get(e[c]);if(f){let l=Po(f,a);if(l===void 0)return;o[i]=c,s[i]=l,i+=1,a=l}}return{pathAt:o,refAt:s,count:i}}pathLen(e){let t=0;for(let n of e)t+=this.record(n).sequenceLen;return t}prefixMatches(e,t){let n=0,o=0,s=0,i=0,a=0;for(;o<e.length&&s<t.length;){let c=this.record(e[o]).sequence,f=this.record(t[s]).sequence;for(;i<c.length&&a<f.length;){if(c[i]!==f[a])return n;i+=1,a+=1,n+=1}i===c.length&&(o+=1,i=0),a===f.length&&(s+=1,a=0)}return n}suffixMatches(e,t){let n=0,o=0,s=0,i=0,a=0;for(;o<e.length&&s<t.length;){let c=this.record(e[e.length-o-1]).sequence,f=this.record(t[t.length-s-1]).sequence;for(;i<c.length&&a<f.length;){if(c[c.length-i-1]!==f[f.length-a-1])return n;i+=1,a+=1,n+=1}i===c.length&&(o+=1,i=0),a===f.length&&(s+=1,a=0)}return n}align(e,t,n){let o=this.pathLen(e),s=this.pathLen(t),i=this.prefixMatches(e,t),a=this.suffixMatches(e,t);i+a>o&&(a=o-i),i+a>s&&(a=s-i),z(n,"M",i),Jn(n,o-i-a,s-i-a),z(n,"M",a)}sharedWeight(e,t){let n=this.refIndex(t),o=0;for(let s of e)n.has(s)&&(o+=this.record(s).sequenceLen);return o}editsAgainst(e,t){let n=this.orderedMatches(e,t);n?this.stats.orderedAlignments+=1:this.stats.lcsAlignments+=1;let o=n??_o(qn(e,t,p=>this.record(p).sequenceLen)[0]),s=[],i=this.refPrefix(t),a=(p,d,h,u)=>{p===d?z(s,"D",i[u]-i[h]):h===u?z(s,"I",this.pathLen(e.slice(p,d))):this.align(e.slice(p,d),t.slice(h,u),s)},c=0,f=0,l=0;for(let p=0;p<o.count;p++){let d=o.pathAt[p],h=o.refAt[p];(f!==d||l!==h)&&a(f,d,l,h);let u=this.record(e[d]).sequenceLen;z(s,"M",u),c+=u,f=d+1,l=h+1}return a(f,e.length,l,t.length),{edits:s,matched:c}}alignment(e){let t=this.paths[e];if(this.refId===void 0||e===this.refId||!t)return;let n=this.paths[this.refId].path,o;if(En(n))o={edits:this.editsAgainst(t.path,n).edits,flipped:!1};else{let s=t.path.map(c=>G(c)).reverse(),i=this.sharedWeight(t.path,n);if(this.sharedWeight(s,n)===0)o={edits:this.editsAgainst(t.path,n).edits,flipped:!1};else if(i===0)o={edits:this.editsAgainst(s,n).edits,flipped:!0};else{let c=this.editsAgainst(t.path,n),f=this.editsAgainst(s,n);o=f.matched>c.matched?{edits:f.edits,flipped:!0}:{edits:c.edits,flipped:!1}}}return o}alignToRef(e){return this.alignment(e)?.edits.map(([t,n])=>`${n}${t}`).join("")}alignments(){let e=this.referenceInterval;if(this.refId===void 0||!e)throw new Error("Alignments need a reference path");let t=this.paths[this.refId].path,n=this.refPrefix(t)[t.length],o=[];return this.paths.forEach((s,i)=>{if(i===this.refId)return;let{edits:a,flipped:c}=this.alignment(i),f=0,l=0;for(;f<a.length&&a[f][0]==="D";)l+=a[f][1],f+=1;let p=a.length,d=0;for(;p>f&&a[p-1][0]==="D";)d+=a[p-1][1],p-=1;let h=s.identity,u=h?h.orientation==="forward"!==c:!c;o.push({strand:u?"+":"-",refStart:e.start+l,refEnd:e.start+n-d,edits:a.slice(f,p),weight:s.weight,path:s.path,start:Ye(s,0),identity:h===void 0?void 0:{pathHandle:h.pathHandle,name:h.name,hapStart:h.name.fragment+h.hapStart,hapEnd:h.name.fragment+h.hapEnd,walkForward:h.orientation==="forward"}})}),Oo(o).map(s=>{let{edits:i,identity:a,...c}=s,f={...c,cigar:qo(i)};return a?{...f,resolved:!0,name:a.name,label:q({...a.name,fragment:a.hapStart},a.hapEnd),pathHandle:a.pathHandle,hapStart:a.hapStart,hapEnd:a.hapEnd}:{...f,resolved:!1}})}pairAlignments(e){let{target:t,query:n,maxGap:o}=e,s=this.paths.flatMap(l=>{let{identity:p}=l;return p?[{name:p.name,start:p.name.fragment+p.hapStart,steps:Ke(l,p)}]:[]}),i=l=>p=>p.sample===l.sample&&p.haplotype===l.haplotype,a=i(t),c=n?i(n):l=>!a(l),f=l=>this.record(V(l,"forward")).sequence;return s.filter(l=>a(l.name)).flatMap(l=>s.filter(p=>c(p.name)).flatMap(p=>Kn(p.steps,l.steps,f,o===void 0?{}:{maxGap:o}).map(d=>({query:p.name,queryStart:p.start+d.queryStart,queryEnd:p.start+d.queryEnd,strand:d.strand,target:l.name,targetStart:l.start+d.targetStart,targetEnd:l.start+d.targetEnd,cigar:Xn(d.edits),matches:d.edits.reduce((h,[u,m])=>h+(u==="="?m:0),0),columns:d.edits.reduce((h,[,u])=>h+u,0),sharedBases:d.sharedBases}))))}canonicalEdges(e){let t=[];for(let n of["forward","reverse"]){let o=V(e,n);for(let s of this.record(o).successors())this.hasHandle(s)&&ge(o,s)&&t.push([n==="reverse"?1:0,A(s),L(s)?1:0])}return t.sort((n,o)=>n[0]-o[0]||n[1]-o[1]||n[2]-o[2]),t.filter((n,o)=>o===0||n[0]!==t[o-1][0]||n[1]!==t[o-1][1]||n[2]!==t[o-1][2])}async stableName(){let e=new TextEncoder,t=[];for(let n of this.sortedHandles())if(!L(n)){let o=A(n),s=`S ${o} ${this.record(n).sequence}
|
|
2
|
+
`;for(let[i,a,c]of this.canonicalEdges(o))s+=`L ${o} ${i?"-":"+"} ${a} ${c?"-":"+"}
|
|
3
|
+
`;t.push(e.encode(s))}return Fn(t)}async toGFA(e={}){let t=e.cigar??!1,n=[this.refPath?`H VN:Z:1.1 RS:Z:${this.refPath.sample}`:"H VN:Z:1.1",...Nn(Tn(await this.stableName(),await this.db.graphName()))],o=this.sortedHandles();for(let f of o)L(f)||n.push(`S ${A(f)} ${this.record(f).sequence}`);let s=f=>L(f)?"-":"+";for(let f of o)for(let l of this.record(f).successors())this.hasHandle(l)&&ge(f,l)&&n.push(`L ${A(f)} ${s(f)} ${A(l)} ${s(l)} 0M`);let i=(f,l,p,d,h)=>{let u=Ke(f,l).map(x=>`${L(x)?"<":">"}${A(x)}`).join(""),m=f.weight===void 0?"":` WT:i:${f.weight}`,y=h===void 0?"":` CG:Z:${h}`;return`W ${p.sample} ${p.haplotype} ${p.contig} ${p.fragment} ${d} ${u}${m}${y}`},a=this.refPath?.contig??"unknown";this.refId!==void 0&&this.refPath&&this.refInterval&&n.push(i(this.paths[this.refId],void 0,{...this.refPath,fragment:this.refPath.fragment+this.refInterval[0]},this.refPath.fragment+this.refInterval[1],void 0));let c=1;return this.paths.forEach((f,l)=>{if(l!==this.refId){let p=e.names==="resolved"?f.identity:void 0,d=t?this.alignToRef(l):void 0;n.push(p?i(f,p,{...p.name,fragment:p.name.fragment+p.hapStart},p.name.fragment+p.hapEnd,d):i(f,void 0,{sample:"unknown",contig:a,haplotype:c,fragment:0},f.len,d)),c+=1}}),`${n.join(`
|
|
4
|
+
`)}
|
|
5
|
+
`}outputPaths(e){let t=e.cigar??!1,n=[],o=this.refPath?.contig??"unknown";if(this.refId!==void 0&&this.refPath&&this.refInterval){let i={...this.refPath,fragment:this.refPath.fragment+this.refInterval[0]};n.push({info:this.paths[this.refId],identity:void 0,name:q(i,this.refPath.fragment+this.refInterval[1]),cigar:void 0})}let s=1;return this.paths.forEach((i,a)=>{if(a===this.refId)return;let c=e.names==="resolved"?i.identity:void 0;n.push({info:i,identity:c,name:c?q({...c.name,fragment:c.name.fragment+c.hapStart},c.name.fragment+c.hapEnd):q({sample:"unknown",contig:o,haplotype:s,fragment:0},i.len),cigar:t?this.alignToRef(a):void 0}),s+=1}),n}*outputEdges(){for(let e of this.sortedHandles())for(let t of this.record(e).successors())this.hasHandle(t)&&ge(e,t)&&(yield[e,t])}toSubgraphJson(e={}){let t=this.sortedHandles().filter(s=>!L(s)).map(s=>({id:String(A(s)),sequence:this.record(s).sequence})),n=[];for(let[s,i]of this.outputEdges())n.push({from:String(A(s)),from_is_reverse:L(s),to:String(A(i)),to_is_reverse:L(i)});let o=this.outputPaths(e).map(s=>Ho(s.info,s.identity,s.name,s.cigar));return{nodes:t,edges:n,paths:o}}toCompactSubgraph(e={}){let t=this.sortedHandles().filter(i=>!L(i)),n=new Int32Array(t.length),o=[];t.forEach((i,a)=>{n[a]=A(i),o.push(this.record(i).sequence)});let s=[];for(let[i,a]of this.outputEdges())s.push(i,a);return{nodeIds:n,nodeSequences:o,edges:Int32Array.from(s),paths:this.outputPaths(e).map(i=>({name:i.name,weight:i.info.weight,cigar:i.cigar,steps:Int32Array.from(Ke(i.info,i.identity))}))}}};function Ke(r,e){return e?.orientation==="reverse"?r.path.map(t=>G(t)).reverse():r.path}function Ho(r,e,t,n){return{name:t,...r.weight===void 0?{}:{weight:r.weight},...n===void 0?{}:{cigar:n},path:Ke(r,e).map(o=>({id:String(A(o)),is_reverse:L(o)}))}}function zt(r,e){let t=Math.min(r.length,e.length);for(let n=0;n<t;n++){let o=r[n],s=e[n];if(o!==s)return o<s?-1:1}return r.length-e.length}function z(r,e,t){if(t===0)return;let n=r[r.length-1];n?.[0]===e?n[1]+=t:r.push([e,t])}function Ve(r){return r===0?0:6+(r-1)}function Jn(r,e,t){if(e===0)z(r,"D",t);else if(t===0)z(r,"I",e);else{let n=Math.min(e,t),o=4*n+Ve(e-n)+Ve(t-n),s=Ve(e)+Ve(t);o<=s?(z(r,"M",n),z(r,"I",e-n),z(r,"D",t-n)):(z(r,"I",e),z(r,"D",t))}}function qo(r){return r.map(([e,t])=>`${t}${e}`).join("")}async function Xe(r,e,t,n,o={}){let s=new Pe(r,o);try{let i=await s.pathPosition(Re(e,t));await s.prefetchReferenceWalk(i,n-t),await s.aroundInterval(i.position,n-t,o.context??100),await s.extractSnarls(o.snarls??"none"),s.extractPaths(i,o.haplotypes??"all")}catch(i){throw i instanceof X&&i.windowBp===void 0?new X(i.limit,{windowBp:n-t,walkedBp:s.referenceWalkedBp??0}):i}return s}async function er(r,e,t,n,o){if(!r.hasHaplotypeIndex)throw new Error("keep needs the haplotype index: this database cannot name its walks");let s=await r.haplotypeAnchorSpacing(),i,a;if(s!==void 0&&(o.haplotypes??"all")==="all"){let c=new Pe(r,o);try{let f=await c.pathPosition(Re(e,t));a=await c.walkHaplotypesFromAnchor(f,n-t,s,o.keep,o.context??100)}catch(f){throw f instanceof X&&f.windowBp===void 0?new X(f.limit,{windowBp:n-t,walkedBp:c.referenceWalkedBp??0}):f}if(a===void 0)i=c;else{a=`${a}; identified from the per-path samples instead`;let f=await Xe(r,e,t,n,o);await f.identifyPaths(),f.keepHaplotypes(o.keep),f.stats.anchorWalk=c.stats.anchorWalk,f.stats.anchorWalk&&(f.stats.anchorWalk.fallback=a),i=f}}else i=await Xe(r,e,t,n,o),await i.identifyPaths(),i.keepHaplotypes(o.keep);return i}function Z(r,e){let t=0;for(let o=0;o<8;o++){let s=r[e+o];if(s===void 0)throw new Error("SQLite varint runs past the end of the buffer");if(t=t*128+(s&127),(s&128)===0)return[t,e+o+1]}let n=r[e+8];if(n===void 0)throw new Error("SQLite varint runs past the end of the buffer");if(t=t*256+n,!Number.isSafeInteger(t))throw new Error("SQLite varint exceeds the safe integer range");return[t,e+9]}function $o(r,e,t){switch(t){case 1:return r.getInt8(e);case 2:return r.getInt16(e);case 3:return r.getInt8(e)<<16|r.getUint16(e+1);case 4:return r.getInt32(e);case 6:return r.getInt16(e)*4294967296+r.getUint32(e+2);default:{let n=r.getBigInt64(e);if(n>BigInt(Number.MAX_SAFE_INTEGER)||n<BigInt(Number.MIN_SAFE_INTEGER))throw new Error(`SQLite integer ${n} exceeds the safe integer range`);return Number(n)}}}var Bo=new TextDecoder;function Ze(r){let[e,t]=Z(r,0),n=[],o=t;for(;o<e;){let[a,c]=Z(r,o);n.push(a),o=c}let s=new DataView(r.buffer,r.byteOffset,r.byteLength),i=e;return n.map(a=>{if(a===0)return null;if(a>=1&&a<=6){let c=a<=4?a:a===5?6:8,f=$o(s,i,c);return i+=c,f}if(a===7){let c=s.getFloat64(i);return i+=8,c}if(a===8)return 0;if(a===9)return 1;if(a>=12){let c=a-12>>1,f=r.subarray(i,i+c);return i+=c,a%2===0?f:Bo.decode(f)}throw new Error(`SQLite serial type ${a} is reserved`)})}var ke=2,et=5,nr=10,Je=13;function rr(r,e){return r[e]*256+r[e+1]}function oe(r,e){return r[e]*16777216+r[e+1]*65536+r[e+2]*256+r[e+3]}function Go(r,e){let t=r[e];if(t!==ke&&t!==et&&t!==nr&&t!==Je)throw new Error(`SQLite page has unknown b-tree type ${t}`);let n=t===ke||t===et;return{type:t,cellCount:rr(r,e+3),rightChild:n?oe(r,e+8):0,cellPointers:e+(n?12:8)}}function ne(r,e,t){return rr(r,e.cellPointers+2*t)}var Do=4096,zo=4096,tt=class{usable;pager;decodedIndexPages=new Map;tableDepths=new Map;constructor(e,t){this.pager=e,this.usable=e.pageSize-t}localPayloadSize(e,t){let n=this.usable,o=t?Math.floor((n-12)*64/255)-23:n-35;if(e<=o)return e;let s=Math.floor((n-12)*32/255)-23,i=s+(e-s)%(n-4);return i<=o?i:s}async payload(e,t,n,o){let s=this.localPayloadSize(n,o);if(s===n)return e.subarray(t,t+n);let i=new Uint8Array(n);i.set(e.subarray(t,t+s),0);let a=s,c=oe(e,t+s);for(;c!==0&&a<n;){let f=await this.pager.page(c),l=f.subarray(4,4+Math.min(this.usable-4,n-a));i.set(l,a),a+=l.length,c=oe(f,0)}if(a!==n)throw new Error("SQLite overflow chain ended before the payload was complete");return i}async pageAt(e){let t=await this.pager.page(e);return{page:t,header:Go(t,e===1?100:0)}}tableDepth(e,t){let n=this.tableDepths.get(e);return n||(n=(async()=>{let o=e;for(let s=0;;s++){let{page:i,header:a}=await this.pageAt(o);if(a.type===Je)return s;if(a.type!==et)throw new Error("SQLite table b-tree contains an index page");let c=this.childIndexFor(i,a,t);o=c===a.cellCount?a.rightChild:oe(i,ne(i,a,c))}})(),this.tableDepths.set(e,n),n.catch(()=>this.tableDepths.delete(e))),n}childIndexFor(e,t,n){let o=0,s=t.cellCount;for(;o<s;){let i=o+s>>1,[a]=Z(e,ne(e,t,i)+4);a<n?o=i+1:s=i}return o}async prefetchRowidRange(e,t,n){let o=await this.tableDepth(e,t),s=[e];for(let i=0;i<o;i++){let a=await Promise.all(s.map(f=>this.pageAt(f))),c=[];if(a.forEach(({page:f,header:l},p)=>{let d=p===0?this.childIndexFor(f,l,t):0,h=p===a.length-1?this.childIndexFor(f,l,n):l.cellCount;for(let u=d;u<=h;u++)c.push(u===l.cellCount?l.rightChild:oe(f,ne(f,l,u)))}),c.length>zo)return!1;this.pager.prefetch(c),s=c}return!0}async tableRowid(e,t){let n=e;for(;;){let{page:o,header:s}=await this.pageAt(n);if(s.type===Je){let c=0,f=s.cellCount;for(;c<f;){let l=c+f>>1,p=ne(o,s,l),[d,h]=Z(o,p),[u,m]=Z(o,h);if(u===t)return Ze(await this.payload(o,m,d,!1));u<t?c=l+1:f=l}return}if(s.type!==et)throw new Error("SQLite table b-tree contains an index page");let i=0,a=s.cellCount;for(;i<a;){let c=i+a>>1,f=ne(o,s,c),[l]=Z(o,f+4);l<t?i=c+1:a=c}n=i===s.cellCount?s.rightChild:oe(o,ne(o,s,i))}}async*tableScan(e){let{page:t,header:n}=await this.pageAt(e);if(n.type===Je)for(let o=0;o<n.cellCount;o++){let s=ne(t,n,o),[i,a]=Z(t,s),[c,f]=Z(t,a);yield{rowid:c,values:Ze(await this.payload(t,f,i,!1))}}else{let o=[];for(let s=0;s<n.cellCount;s++)o.push(oe(t,ne(t,n,s)));o.push(n.rightChild),this.pager.prefetch(o);for(let s of o)yield*this.tableScan(s)}}decodedCells(e,t){let n=this.decodedIndexPages.get(e);if(n)this.decodedIndexPages.delete(e);else if(n=new Array(t.cellCount),this.decodedIndexPages.size>=Do){let o=this.decodedIndexPages.keys().next().value;o!==void 0&&this.decodedIndexPages.delete(o)}return this.decodedIndexPages.set(e,n),n}async indexCell(e,t,n,o){let s=this.decodedCells(e,n),i=s[o];if(!i){let a=ne(t,n,o),c=n.type===ke,[f,l]=Z(t,c?a+4:a);i={values:Ze(await this.payload(t,l,f,!0)),leftChild:c?oe(t,a):0},s[o]=i}return i}async*indexScanFrom(e,t){let{page:n,header:o}=await this.pageAt(e),s=0,i=o.cellCount;for(;s<i;){let a=s+i>>1,c=await this.indexCell(e,n,o,a);tr(c.values,t)<0?s=a+1:i=a}for(let a=s;a<o.cellCount;a++){let c=await this.indexCell(e,n,o,a);o.type===ke&&(yield*this.indexScanFrom(c.leftChild,t)),yield c.values}o.type===ke&&(yield*this.indexScanFrom(o.rightChild,t))}async indexSeekLE(e,t){let n,o=e;for(;;){let{page:s,header:i}=await this.pageAt(o),a=0,c=i.cellCount,f=0;for(;a<c;){let l=a+c>>1,p=await this.indexCell(o,s,i,l);tr(p.values,t)<=0?(n=p.values,a=l+1):(f=p.leftChild,c=l)}if(i.type===nr)return n;o=a===i.cellCount?i.rightChild:f}}};function tr(r,e){for(let t=0;t<e.length;t++){let n=r[t],o=e[t];if(typeof n!="number"||o===void 0)throw new Error("SQLite index key is not numeric");if(n!==o)return n<o?-1:1}return 0}var nt=class{blocks=new Map;blockSize;maxBlocks;bytesFetched=0;fetches=0;source;pageSize;fileSize;constructor(e,t,n,o={}){this.source=e,this.pageSize=t,this.fileSize=n;let s=o.blockSize??65536;this.blockSize=Math.max(t,Math.ceil(s/t)*t),this.maxBlocks=o.maxBlocks??256}async read(e,t){let n=0;for(;;)try{let o=await this.source.read(e,t);return this.bytesFetched+=o.length,o}catch(o){if(n+=1,n>=3)throw o;await new Promise(s=>setTimeout(s,200*n))}}seed(e,t){t.length===Math.min(this.blockSize,this.fileSize-e*this.blockSize)&&this.blocks.set(e,Promise.resolve(t))}block(e){let t=this.blocks.get(e);if(t)return this.blocks.delete(e),this.blocks.set(e,t),t;let n=e*this.blockSize,o=Math.min(this.blockSize,this.fileSize-n),s=this.read(o,n);return this.fetches+=1,this.blocks.set(e,s),this.forgetOnFailure(s,[e]),this.evict(),s}prefetch(e){let t=[...new Set(e.map(o=>Math.floor((o-1)*this.pageSize/this.blockSize)))].filter(o=>!this.blocks.has(o)).sort((o,s)=>o-s),n=0;for(;n<t.length;){let o=n+1;for(;o<t.length&&t[o]===t[o-1]+1;)o+=1;this.fetchRun(t[n],o-n),n=o}}fetchRun(e,t){let n=e*this.blockSize,o=Math.min(t*this.blockSize,this.fileSize-n),s=this.read(o,n);this.fetches+=1;let i=[];for(let a=0;a<t;a++){let c=a*this.blockSize;i.push(e+a),this.blocks.set(e+a,s.then(f=>f.subarray(c,c+this.blockSize)))}this.forgetOnFailure(s,i),this.evict()}forgetOnFailure(e,t){e.catch(()=>{for(let n of t)this.blocks.delete(n)})}evict(){for(;this.blocks.size>this.maxBlocks;){let e=this.blocks.keys().next().value;if(e===void 0)break;this.blocks.delete(e)}}async page(e){let t=(e-1)*this.pageSize;if(e<1||t+this.pageSize>this.fileSize)throw new Error(`SQLite page ${e} is outside the file`);let n=await this.block(Math.floor(t/this.blockSize)),o=t%this.blockSize;return n.subarray(o,o+this.pageSize)}};var Me=class r{pager;btree;objects;constructor(e,t,n){this.pager=e,this.btree=t,this.objects=n}static async open(e,t={}){let{size:n}=await e.stat(),o=await e.read(Math.min(t.blockSize??65536,n),0),s=o.subarray(0,100);if(new TextDecoder().decode(s.subarray(0,15))!=="SQLite format 3")throw new Error("Not a SQLite database");let a=new DataView(s.buffer,s.byteOffset,s.byteLength),c=a.getUint16(16),f=c===1?65536:c,l=s[20]??0,p=a.getUint32(56);if(p!==1)throw new Error(`SQLite text encoding ${p} is not UTF-8`);let d=new nt(e,f,n,t);d.seed(0,o),d.fetches+=1,d.bytesFetched+=o.length;let h=new tt(d,l),u=new Map;for await(let{values:m}of h.tableScan(1)){let[y,x,S,g,b]=m;typeof y=="string"&&typeof x=="string"&&typeof S=="string"&&typeof g=="number"&&u.set(x,{type:y,name:x,tableName:S,rootPage:g,sql:typeof b=="string"?b:""})}return new r(d,h,u)}rootPage(e){let t=this.objects.get(e);if(!t)throw new Error(`SQLite database has no object named ${e}`);return t.rootPage}indexOn(e){let t=[...this.objects.values()].find(n=>n.type==="index"&&n.tableName===e);if(!t)throw new Error(`SQLite table ${e} has no index`);return t.rootPage}byRowid(e,t){return this.btree.tableRowid(this.rootPage(e),t)}prefetchRows(e,t,n){return this.btree.prefetchRowidRange(this.rootPage(e),t,n)}scan(e){return this.btree.tableScan(this.rootPage(e))}indexSeekLE(e,t){return this.btree.indexSeekLE(this.indexOn(e),t)}indexScanFrom(e,t){return this.btree.indexScanFrom(this.indexOn(e),t)}has(e){return this.objects.has(e)}};var Ut="GBZ-base version 4",rt=class extends Error{name="ForwardOnlyIndexError";constructor(){super("the haplotype index was written with --forward-only, which cannot name the walks stored against their reference (about half of them); rebuild it with gbz-haplotype-index without --forward-only")}},ot=class extends Error{name="SchemaVersionError";found;constructor(e){super(e===void 0?"not a gbz-base database: its Tags table has no version":`unsupported database schema "${e}"; this reader understands "${Ut}"`),this.found=e}},st=class{sequenceLen;handle;edges;bwt;encodedSequence;next;decoded;constructor(e,t,n,o,s){this.handle=e,this.edges=t,this.bwt=n,this.encodedSequence=o,this.next=s,this.sequenceLen=_n(o)}get id(){return A(this.handle)}get orientation(){return me(this.handle)}get sequence(){return this.decoded??=Pn(this.encodedSequence),this.decoded}successors(){return this.edges.filter(e=>e.node!==0).map(e=>e.node)}gbwt(){if(this.edges.length===0)throw new Error(`GBWT record for handle ${this.handle} is empty`);return new Ge(this.edges,this.bwt)}};function T(r,e){if(typeof r!="number")throw new Error(`${e} is not a number in the database`);return r}function it(r,e){if(typeof r!="string")throw new Error(`${e} is not text in the database`);return r}function jt(r,e){if(!(r instanceof Uint8Array))throw new Error(`${e} is not a blob in the database`);return r}function or(r,e){return{handle:r,fwStart:{node:T(e[1],"Paths.fw_node"),offset:T(e[2],"Paths.fw_offset")},revStart:{node:T(e[3],"Paths.rev_node"),offset:T(e[4],"Paths.rev_offset")},name:{sample:it(e[5],"Paths.sample"),contig:it(e[6],"Paths.contig"),haplotype:T(e[7],"Paths.haplotype"),fragment:T(e[8],"Paths.fragment")},isIndexed:T(e[9],"Paths.is_indexed")!==0}}async function sr(r){let e=new Map;for await(let{values:t}of r.scan("Tags"))e.set(it(t[0],"Tags.key"),it(t[1],"Tags.value"));return e}var Oe=class r{tagCache;pathCache;pathMapCache;indexTags;sqlite;index;constructor(e,t){this.sqlite=e,this.index=t}static async open(e,t={}){let{haplotypeIndex:n,...o}=t,s=await Me.open(e,o);for(let f of["Tags","Nodes","Paths","ReferenceIndex"])s.rootPage(f);let i=n?await Me.open(n,o):s,a=new r(s,i),c=await a.tag("version");if(c!==Ut)throw new ot(c);if(n){for(let h of["Tags","HaplotypeSamples","HaplotypeLengths"])i.rootPage(h);a.indexTags=await sr(i);let f=a.indexTags.get("haplotype_index_paths"),l=await a.tag("paths");if(f!==l)throw new Error(`haplotype index was built for ${f??"an unknown number of"} paths but the graph has ${l}`);let p=a.indexTags.get("haplotype_index_nodes"),d=await a.tag("nodes");if(p!==void 0&&p!==d)throw new Error(`haplotype index was built for a graph with ${p} nodes but this one has ${d}`)}if(a.hasHaplotypeIndex&&await a.haplotypeIndexTag("haplotype_index_orientations")==="forward")throw new rt;return a}tags(){return this.tagCache??=sr(this.sqlite),this.tagCache}async tag(e){return(await this.tags()).get(e)}prefetchRecords(e,t){return this.sqlite.prefetchRows("Nodes",e,t)}async getRecord(e){let t=await this.sqlite.byRowid("Nodes",e);if(!t)return;let n=t[4];return new st(e,Rn(jt(t[1],"Nodes.edges")),jt(t[2],"Nodes.bwt"),jt(t[3],"Nodes.sequence"),typeof n=="number"?n:void 0)}paths(){return this.pathCache??=(async()=>{let e=[];for await(let{rowid:t,values:n}of this.sqlite.scan("Paths"))e.push(or(t,n));return e})(),this.pathCache}async getPath(e){let t=await this.sqlite.byRowid("Paths",e);return t?or(e,t):void 0}pathsByHandle(){return this.pathMapCache??=this.paths().then(e=>new Map(e.map(t=>[t.handle,t]))),this.pathMapCache}async findPath(e){return(await this.paths()).filter(n=>n.name.sample===e.sample&&n.name.contig===e.contig&&n.name.haplotype===e.haplotype&&n.name.fragment<=e.fragment).sort((n,o)=>o.name.fragment-n.name.fragment)[0]}async pathsForSample(e){return(await this.paths()).filter(t=>t.name.sample===e)}async pathsNamed(e){let t=Re(Hn(e),0);return(await this.paths()).filter(n=>n.name.sample===t.sample&&n.name.contig===t.contig&&n.name.haplotype===t.haplotype).sort((n,o)=>n.name.fragment-o.name.fragment)}async hasPath(e){return(await this.pathsNamed(e)).length>0}pathLengths=new Map;pathLength(e){let t=this.pathLengths.get(e);return t||(t=this.walkPathLength(e),this.pathLengths.set(e,t),t.catch(()=>this.pathLengths.delete(e))),t}async walkPathLength(e){let t=this.hasHaplotypeIndex?await this.haplotypeLength(e):void 0;if(t===void 0){let n=await this.indexedPosition(e,Number.MAX_SAFE_INTEGER);if(!n){let i=await this.getPath(e);throw new Error(`Path ${i?q(i.name,i.name.fragment):e} has not been indexed for random access`)}let o=n.pathOffset,s=n.pos;for(;;){let i=await this.getRecord(s.node);if(!i)throw new Error(`Node ${s.node} does not exist in the graph`);o+=i.sequenceLen;let a=i.gbwt().lf(s.offset);if(!a||a.node===0)return o;s=a}}return t}async pathFragmentsForRange(e,t,n){if(n<=t)return[];let o=await this.pathsNamed(e),s=o.filter(c=>c.name.fragment<=t).slice(-1),i=o.filter(c=>c.name.fragment>t&&c.name.fragment<n);return(await Promise.all([...s,...i].map(async c=>({path:c,start:c.name.fragment,end:c.name.fragment+await this.pathLength(c.handle)})))).filter(c=>t<c.end)}async subgraphForFragment(e,t,n,o){let{keep:s,...i}=o;if(s!==void 0&&!this.hasHaplotypeIndex)throw new Error("keep needs the haplotype index: this database cannot name its walks");let{sample:a,contig:c,haplotype:f}=e.path.name,l={sample:a,contig:c,haplotype:f},p=Math.max(t,e.start),d=Math.min(n,e.end),h=o.haplotypes??"all",u=h==="all"||h==="distinct",m;return s!==void 0&&h==="all"?m=await er(this,l,p,d,{...i,keep:s}):(m=await Xe(this,l,p,d,i),this.hasHaplotypeIndex&&u&&(await m.identifyPaths(),s!==void 0&&m.keepHaplotypes(s))),m}async getSubgraphForRange(e,t,n,o={}){let[s]=await this.pathFragmentsForRange(e,t,n);return s?this.subgraphForFragment(s,t,n,o):void 0}async getAlignmentsForRange(e,t,n,o={}){let s=[];for(let i of await this.pathFragmentsForRange(e,t,n)){let a=await this.subgraphForFragment(i,t,n,o);s.push(...a.alignments())}return s}async graphName(){let e=new Map;for(let[n,o]of await this.tags())n.startsWith("gbz_")&&e.set(n.slice(4),o);let t={name:void 0,subgraph:new Map,translation:new Map};try{t=Ln(e)}catch{}return t}async hasChainLinks(){let e=await this.tag("chain_links");return e!==void 0&&Number(e)>0}get hasHaplotypeIndex(){return this.index.has("HaplotypeSamples")&&this.index.has("HaplotypeLengths")}async haplotypeIndexTag(e){return this.indexTags?this.indexTags.get(e):await this.tag(e)}async haplotypeSampleInterval(){let e=await this.haplotypeIndexTag("haplotype_index_interval");return e===void 0?void 0:Number(e)}async haplotypeAnchorSpacing(){let e=this.hasHaplotypeIndex&&this.index.has("HaplotypeAnchors")?await this.haplotypeIndexTag("haplotype_index_anchor_spacing"):void 0;return e===void 0?void 0:Number(e)}async haplotypeAnchor(e,t){let n=await this.index.indexSeekLE("HaplotypeAnchors",[e,t]),o=n?.[0]===e&&n[1]===t?await this.index.byRowid("HaplotypeAnchors",T(n[2],"HaplotypeAnchors rowid")):void 0;return o?{node:T(o[2],"HaplotypeAnchors.node_handle"),pathOffset:T(o[3],"HaplotypeAnchors.path_offset")}:void 0}haplotypeSamplesAtNode(e){return this.haplotypeSamplesInRange(e,e)}sampleFromRow(e){return{node:T(e[0],"HaplotypeSamples.node_handle"),offset:T(e[1],"HaplotypeSamples.node_offset"),pathHandle:T(e[2],"HaplotypeSamples.path_handle"),orientation:T(e[3],"HaplotypeSamples.orientation")===0?"forward":"reverse",pathOffset:T(e[4],"HaplotypeSamples.path_offset")}}async haplotypeSamplesInRange(e,t){let n=[];for await(let o of this.index.indexScanFrom("HaplotypeSamples",[e,0])){if(T(o[0],"HaplotypeSamples.node_handle")>t)break;let i=await this.index.byRowid("HaplotypeSamples",T(o[2],"HaplotypeSamples rowid"));i&&n.push(this.sampleFromRow(i))}return n}async haplotypeSampleAt(e,t){let n=await this.index.indexSeekLE("HaplotypeSamples",[e,t]);if(n?.[0]!==e||n[1]!==t)return;let o=await this.index.byRowid("HaplotypeSamples",T(n[2],"HaplotypeSamples rowid"));return o?this.sampleFromRow(o):void 0}async haplotypeLength(e){let t=await this.index.byRowid("HaplotypeLengths",e);return t?T(t[1],"HaplotypeLengths.length"):void 0}async indexedRow(e){let t=await this.sqlite.byRowid("ReferenceIndex",e);if(!t)throw new Error("ReferenceIndex row referenced by its index is missing");return{pathOffset:T(t[1],"ReferenceIndex.path_offset"),pos:{node:T(t[2],"ReferenceIndex.node_handle"),offset:T(t[3],"ReferenceIndex.node_offset")}}}async indexedRowid(e,t){let n=await this.sqlite.indexSeekLE("ReferenceIndex",[e,t]);return n?.[0]===e?T(n[2],"ReferenceIndex rowid"):void 0}async indexedPosition(e,t){let n=await this.indexedRowid(e,t);return n===void 0?void 0:this.indexedRow(n)}async indexedPositionsBetween(e,t,n){let[o,s]=await Promise.all([this.indexedRowid(e,t),this.indexedRowid(e,n)]),i=[];if(o!==void 0&&s!==void 0){await this.sqlite.prefetchRows("ReferenceIndex",o,s+1);for(let a=o;a<=s;a++)i.push(await this.indexedRow(a))}return i}};var Jr=Y(bn(),1),hn=Y(Ae(),1),dn=Y(ro(),1),eo=Y(oo(),1);var Kr=Y(bn(),1),Xr=Y(Ae(),1);var Wt=function(r,e){return Wt=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,n){t.__proto__=n}||function(t,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])},Wt(r,e)};function Le(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");Wt(r,e);function t(){this.constructor=r}r.prototype=e===null?Object.create(e):(t.prototype=e.prototype,new t)}function ir(r,e,t,n){function o(s){return s instanceof t?s:new t(function(i){i(s)})}return new(t||(t=Promise))(function(s,i){function a(l){try{f(n.next(l))}catch(p){i(p)}}function c(l){try{f(n.throw(l))}catch(p){i(p)}}function f(l){l.done?s(l.value):o(l.value).then(a,c)}f((n=n.apply(r,e||[])).next())})}function at(r,e){var t={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},n,o,s,i=Object.create((typeof Iterator=="function"?Iterator:Object).prototype);return i.next=a(0),i.throw=a(1),i.return=a(2),typeof Symbol=="function"&&(i[Symbol.iterator]=function(){return this}),i;function a(f){return function(l){return c([f,l])}}function c(f){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,f[0]&&(t=0)),t;)try{if(n=1,o&&(s=f[0]&2?o.return:f[0]?o.throw||((s=o.return)&&s.call(o),0):o.next)&&!(s=s.call(o,f[1])).done)return s;switch(o=0,s&&(f=[f[0]&2,s.value]),f[0]){case 0:case 1:s=f;break;case 4:return t.label++,{value:f[1],done:!1};case 5:t.label++,o=f[1],f=[0];continue;case 7:f=t.ops.pop(),t.trys.pop();continue;default:if(s=t.trys,!(s=s.length>0&&s[s.length-1])&&(f[0]===6||f[0]===2)){t=0;continue}if(f[0]===3&&(!s||f[1]>s[0]&&f[1]<s[3])){t.label=f[1];break}if(f[0]===6&&t.label<s[1]){t.label=s[1],s=f;break}if(s&&t.label<s[2]){t.label=s[2],t.ops.push(f);break}s[2]&&t.ops.pop(),t.trys.pop();continue}f=e.call(r,t)}catch(l){f=[6,l],o=0}finally{n=s=0}if(f[0]&5)throw f[1];return{value:f[0]?f[1]:void 0,done:!0}}}function ce(r){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&r[e],n=0;if(t)return t.call(r);if(r&&typeof r.length=="number")return{next:function(){return r&&n>=r.length&&(r=void 0),{value:r&&r[n++],done:!r}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function we(r,e){var t=typeof Symbol=="function"&&r[Symbol.iterator];if(!t)return r;var n=t.call(r),o,s=[],i;try{for(;(e===void 0||e-- >0)&&!(o=n.next()).done;)s.push(o.value)}catch(a){i={error:a}}finally{try{o&&!o.done&&(t=n.return)&&t.call(n)}finally{if(i)throw i.error}}return s}function xe(r,e,t){if(t||arguments.length===2)for(var n=0,o=e.length,s;n<o;n++)(s||!(n in e))&&(s||(s=Array.prototype.slice.call(e,0,n)),s[n]=e[n]);return r.concat(s||Array.prototype.slice.call(e))}function le(r){return this instanceof le?(this.v=r,this):new le(r)}function ar(r,e,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=t.apply(r,e||[]),o,s=[];return o=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),a("next"),a("throw"),a("return",i),o[Symbol.asyncIterator]=function(){return this},o;function i(h){return function(u){return Promise.resolve(u).then(h,p)}}function a(h,u){n[h]&&(o[h]=function(m){return new Promise(function(y,x){s.push([h,m,y,x])>1||c(h,m)})},u&&(o[h]=u(o[h])))}function c(h,u){try{f(n[h](u))}catch(m){d(s[0][3],m)}}function f(h){h.value instanceof le?Promise.resolve(h.value.v).then(l,p):d(s[0][2],h)}function l(h){c("next",h)}function p(h){c("throw",h)}function d(h,u){h(u),s.shift(),s.length&&c(s[0][0],s[0][1])}}function fr(r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=r[Symbol.asyncIterator],t;return e?e.call(r):(r=typeof ce=="function"?ce(r):r[Symbol.iterator](),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(s){t[s]=r[s]&&function(i){return new Promise(function(a,c){i=r[s](i),o(a,c,i.done,i.value)})}}function o(s,i,a,c){Promise.resolve(c).then(function(f){s({value:f,done:a})},i)}}function P(r){return typeof r=="function"}function cr(r){var e=function(n){Error.call(n),n.stack=new Error().stack},t=r(e);return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var ft=cr(function(r){return function(t){r(this),this.message=t?t.length+` errors occurred during unsubscription:
|
|
6
|
+
`+t.map(function(n,o){return o+1+") "+n.toString()}).join(`
|
|
7
|
+
`):"",this.name="UnsubscriptionError",this.errors=t}});function Qt(r,e){if(r){var t=r.indexOf(e);0<=t&&r.splice(t,1)}}var ct=(function(){function r(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}return r.prototype.unsubscribe=function(){var e,t,n,o,s;if(!this.closed){this.closed=!0;var i=this._parentage;if(i)if(this._parentage=null,Array.isArray(i))try{for(var a=ce(i),c=a.next();!c.done;c=a.next()){var f=c.value;f.remove(this)}}catch(m){e={error:m}}finally{try{c&&!c.done&&(t=a.return)&&t.call(a)}finally{if(e)throw e.error}}else i.remove(this);var l=this.initialTeardown;if(P(l))try{l()}catch(m){s=m instanceof ft?m.errors:[m]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var d=ce(p),h=d.next();!h.done;h=d.next()){var u=h.value;try{lr(u)}catch(m){s=s??[],m instanceof ft?s=xe(xe([],we(s)),we(m.errors)):s.push(m)}}}catch(m){n={error:m}}finally{try{h&&!h.done&&(o=d.return)&&o.call(d)}finally{if(n)throw n.error}}}if(s)throw new ft(s)}},r.prototype.add=function(e){var t;if(e&&e!==this)if(this.closed)lr(e);else{if(e instanceof r){if(e.closed||e._hasParent(this))return;e._addParent(this)}(this._finalizers=(t=this._finalizers)!==null&&t!==void 0?t:[]).push(e)}},r.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},r.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},r.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&Qt(t,e)},r.prototype.remove=function(e){var t=this._finalizers;t&&Qt(t,e),e instanceof r&&e._removeParent(this)},r.EMPTY=(function(){var e=new r;return e.closed=!0,e})(),r})();var Ii=ct.EMPTY;function lt(r){return r instanceof ct||r&&"closed"in r&&P(r.remove)&&P(r.add)&&P(r.unsubscribe)}function lr(r){P(r)?r():r.unsubscribe()}var K={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var be={setTimeout:function(r,e){for(var t=[],n=2;n<arguments.length;n++)t[n-2]=arguments[n];var o=be.delegate;return o?.setTimeout?o.setTimeout.apply(o,xe([r,e],we(t))):setTimeout.apply(void 0,xe([r,e],we(t)))},clearTimeout:function(r){var e=be.delegate;return(e?.clearTimeout||clearTimeout)(r)},delegate:void 0};function pt(r){be.setTimeout(function(){var e=K.onUnhandledError;if(e)e(r);else throw r})}function Yt(){}var pr=(function(){return Vt("C",void 0,void 0)})();function hr(r){return Vt("E",void 0,r)}function dr(r){return Vt("N",r,void 0)}function Vt(r,e,t){return{kind:r,value:e,error:t}}var pe=null;function ur(r){if(K.useDeprecatedSynchronousErrorHandling){var e=!pe;if(e&&(pe={errorThrown:!1,error:null}),r(),e){var t=pe,n=t.errorThrown,o=t.error;if(pe=null,n)throw o}}else r()}function mr(r){K.useDeprecatedSynchronousErrorHandling&&pe&&(pe.errorThrown=!0,pe.error=r)}var Te=(function(r){Le(e,r);function e(t){var n=r.call(this)||this;return n.isStopped=!1,t?(n.destination=t,lt(t)&&t.add(n)):n.destination=Qo,n}return e.create=function(t,n,o){return new dt(t,n,o)},e.prototype.next=function(t){this.isStopped?Xt(dr(t),this):this._next(t)},e.prototype.error=function(t){this.isStopped?Xt(hr(t),this):(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped?Xt(pr,this):(this.isStopped=!0,this._complete())},e.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,r.prototype.unsubscribe.call(this),this.destination=null)},e.prototype._next=function(t){this.destination.next(t)},e.prototype._error=function(t){try{this.destination.error(t)}finally{this.unsubscribe()}},e.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},e})(ct);var jo=Function.prototype.bind;function Kt(r,e){return jo.call(r,e)}var Uo=(function(){function r(e){this.partialObserver=e}return r.prototype.next=function(e){var t=this.partialObserver;if(t.next)try{t.next(e)}catch(n){ht(n)}},r.prototype.error=function(e){var t=this.partialObserver;if(t.error)try{t.error(e)}catch(n){ht(n)}else ht(e)},r.prototype.complete=function(){var e=this.partialObserver;if(e.complete)try{e.complete()}catch(t){ht(t)}},r})(),dt=(function(r){Le(e,r);function e(t,n,o){var s=r.call(this)||this,i;if(P(t)||!t)i={next:t??void 0,error:n??void 0,complete:o??void 0};else{var a;s&&K.useDeprecatedNextContext?(a=Object.create(t),a.unsubscribe=function(){return s.unsubscribe()},i={next:t.next&&Kt(t.next,a),error:t.error&&Kt(t.error,a),complete:t.complete&&Kt(t.complete,a)}):i=t}return s.destination=new Uo(i),s}return e})(Te);function ht(r){K.useDeprecatedSynchronousErrorHandling?mr(r):pt(r)}function Wo(r){throw r}function Xt(r,e){var t=K.onStoppedNotification;t&&be.setTimeout(function(){return t(r,e)})}var Qo={closed:!0,next:Yt,error:Wo,complete:Yt};var Se=(function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"})();function gr(r){return r}function yr(r){return r.length===0?gr:r.length===1?r[0]:function(t){return r.reduce(function(n,o){return o(n)},t)}}var j=(function(){function r(e){e&&(this._subscribe=e)}return r.prototype.lift=function(e){var t=new r;return t.source=this,t.operator=e,t},r.prototype.subscribe=function(e,t,n){var o=this,s=Vo(e)?e:new dt(e,t,n);return ur(function(){var i=o,a=i.operator,c=i.source;s.add(a?a.call(s,c):c?o._subscribe(s):o._trySubscribe(s))}),s},r.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.error(t)}},r.prototype.forEach=function(e,t){var n=this;return t=wr(t),new t(function(o,s){var i=new dt({next:function(a){try{e(a)}catch(c){s(c),i.unsubscribe()}},error:s,complete:o});n.subscribe(i)})},r.prototype._subscribe=function(e){var t;return(t=this.source)===null||t===void 0?void 0:t.subscribe(e)},r.prototype[Se]=function(){return this},r.prototype.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return yr(e)(this)},r.prototype.toPromise=function(e){var t=this;return e=wr(e),new e(function(n,o){var s;t.subscribe(function(i){return s=i},function(i){return o(i)},function(){return n(s)})})},r.create=function(e){return new r(e)},r})();function wr(r){var e;return(e=r??K.Promise)!==null&&e!==void 0?e:Promise}function Yo(r){return r&&P(r.next)&&P(r.error)&&P(r.complete)}function Vo(r){return r&&r instanceof Te||Yo(r)&<(r)}function Ko(r){return P(r?.lift)}function W(r){return function(e){if(Ko(e))return e.lift(function(t){try{return r(t,this)}catch(n){this.error(n)}});throw new TypeError("Unable to lift unknown Observable type")}}function re(r,e,t,n,o){return new Xo(r,e,t,n,o)}var Xo=(function(r){Le(e,r);function e(t,n,o,s,i,a){var c=r.call(this,t)||this;return c.onFinalize=i,c.shouldUnsubscribe=a,c._next=n?function(f){try{n(f)}catch(l){t.error(l)}}:r.prototype._next,c._error=s?function(f){try{s(f)}catch(l){t.error(l)}finally{this.unsubscribe()}}:r.prototype._error,c._complete=o?function(){try{o()}catch(f){t.error(f)}finally{this.unsubscribe()}}:r.prototype._complete,c}return e.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;r.prototype.unsubscribe.call(this),!n&&((t=this.onFinalize)===null||t===void 0||t.call(this))}},e})(Te);var ut=(function(r){return r&&typeof r.length=="number"&&typeof r!="function"});function mt(r){return P(r?.then)}function gt(r){return P(r[Se])}function yt(r){return Symbol.asyncIterator&&P(r?.[Symbol.asyncIterator])}function wt(r){return new TypeError("You provided "+(r!==null&&typeof r=="object"?"an invalid object":"'"+r+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Zo(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var xt=Zo();function bt(r){return P(r?.[xt])}function St(r){return ar(this,arguments,function(){var t,n,o,s;return at(this,function(i){switch(i.label){case 0:t=r.getReader(),i.label=1;case 1:i.trys.push([1,,9,10]),i.label=2;case 2:return[4,le(t.read())];case 3:return n=i.sent(),o=n.value,s=n.done,s?[4,le(void 0)]:[3,5];case 4:return[2,i.sent()];case 5:return[4,le(o)];case 6:return[4,i.sent()];case 7:return i.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}})})}function vt(r){return P(r?.getReader)}function J(r){if(r instanceof j)return r;if(r!=null){if(gt(r))return Jo(r);if(ut(r))return es(r);if(mt(r))return ts(r);if(yt(r))return xr(r);if(bt(r))return ns(r);if(vt(r))return rs(r)}throw wt(r)}function Jo(r){return new j(function(e){var t=r[Se]();if(P(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function es(r){return new j(function(e){for(var t=0;t<r.length&&!e.closed;t++)e.next(r[t]);e.complete()})}function ts(r){return new j(function(e){r.then(function(t){e.closed||(e.next(t),e.complete())},function(t){return e.error(t)}).then(null,pt)})}function ns(r){return new j(function(e){var t,n;try{for(var o=ce(r),s=o.next();!s.done;s=o.next()){var i=s.value;if(e.next(i),e.closed)return}}catch(a){t={error:a}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}e.complete()})}function xr(r){return new j(function(e){os(r,e).catch(function(t){return e.error(t)})})}function rs(r){return xr(St(r))}function os(r,e){var t,n,o,s;return ir(this,void 0,void 0,function(){var i,a;return at(this,function(c){switch(c.label){case 0:c.trys.push([0,5,6,11]),t=fr(r),c.label=1;case 1:return[4,t.next()];case 2:if(n=c.sent(),!!n.done)return[3,4];if(i=n.value,e.next(i),e.closed)return[2];c.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return a=c.sent(),o={error:a},[3,11];case 6:return c.trys.push([6,,9,10]),n&&!n.done&&(s=t.return)?[4,s.call(t)]:[3,8];case 7:c.sent(),c.label=8;case 8:return[3,10];case 9:if(o)throw o.error;return[7];case 10:return[7];case 11:return e.complete(),[2]}})})}function Q(r,e,t,n,o){n===void 0&&(n=0),o===void 0&&(o=!1);var s=e.schedule(function(){t(),o?r.add(this.schedule(null,n)):this.unsubscribe()},n);if(r.add(s),!o)return s}function It(r,e){return e===void 0&&(e=0),W(function(t,n){t.subscribe(re(n,function(o){return Q(n,r,function(){return n.next(o)},e)},function(){return Q(n,r,function(){return n.complete()},e)},function(o){return Q(n,r,function(){return n.error(o)},e)}))})}function At(r,e){return e===void 0&&(e=0),W(function(t,n){n.add(r.schedule(function(){return t.subscribe(n)},e))})}function br(r,e){return J(r).pipe(At(e),It(e))}function Sr(r,e){return J(r).pipe(At(e),It(e))}function vr(r,e){return new j(function(t){var n=0;return e.schedule(function(){n===r.length?t.complete():(t.next(r[n++]),t.closed||this.schedule())})})}function Ir(r,e){return new j(function(t){var n;return Q(t,e,function(){n=r[xt](),Q(t,e,function(){var o,s,i;try{o=n.next(),s=o.value,i=o.done}catch(a){t.error(a);return}i?t.complete():t.next(s)},0,!0)}),function(){return P(n?.return)&&n.return()}})}function Et(r,e){if(!r)throw new Error("Iterable cannot be null");return new j(function(t){Q(t,e,function(){var n=r[Symbol.asyncIterator]();Q(t,e,function(){n.next().then(function(o){o.done?t.complete():t.next(o.value)})},0,!0)})})}function Ar(r,e){return Et(St(r),e)}function Er(r,e){if(r!=null){if(gt(r))return br(r,e);if(ut(r))return vr(r,e);if(mt(r))return Sr(r,e);if(yt(r))return Et(r,e);if(bt(r))return Ir(r,e);if(vt(r))return Ar(r,e)}throw wt(r)}function Zt(r,e){return e?Er(r,e):J(r)}function Ne(r,e){return W(function(t,n){var o=0;t.subscribe(re(n,function(s){n.next(r.call(e,s,o++))}))})}function Cr(r,e,t,n,o,s,i,a){var c=[],f=0,l=0,p=!1,d=function(){p&&!c.length&&!f&&e.complete()},h=function(m){return f<n?u(m):c.push(m)},u=function(m){s&&e.next(m),f++;var y=!1;J(t(m,l++)).subscribe(re(e,function(x){o?.(x),s?h(x):e.next(x)},function(){y=!0},void 0,function(){if(y)try{f--;for(var x=function(){var S=c.shift();i?Q(e,i,function(){return u(S)}):u(S)};c.length&&f<n;)x();d()}catch(S){e.error(S)}}))};return r.subscribe(re(e,h,function(){p=!0,d()})),function(){a?.()}}function ve(r,e,t){return t===void 0&&(t=1/0),P(e)?ve(function(n,o){return Ne(function(s,i){return e(n,s,o,i)})(J(r(n,o)))},t):(typeof e=="number"&&(t=e),W(function(n,o){return Cr(n,o,r,t)}))}function Rr(r,e,t,n,o){return function(s,i){var a=t,c=e,f=0;s.subscribe(re(i,function(l){var p=f++;c=a?r(c,l,p):(a=!0,l),n&&i.next(c)},o&&(function(){a&&i.next(c),i.complete()})))}}function _r(r,e){return W(Rr(r,e,arguments.length>=2,!1,!0))}var ss=function(r,e){return r.push(e),r};function Ct(){return W(function(r,e){_r(ss,[])(r).subscribe(e)})}function Pr(r){let e=[],t=0,n;for(let o=0,s=r.length;o<s;o++){let i=r.charCodeAt(o);if(i>=48&&i<=57)t=t*10+i-48;else if(i===58)n=t,t=0;else{let a=r[o];a==="M"||a==="="||a==="X"?e.push({own:n===void 0?t:n,mate:t,op:"M"}):a==="I"?e.push({own:0,mate:t,op:a}):(a==="D"||a==="N")&&e.push({own:t,mate:0,op:a}),n=void 0,t=0}}return e}function tn(r){let e="";for(let{own:t,mate:n,op:o}of Pr(r))e+=o==="M"?t===0?`${n}I`:n===0?`${t}D`:`${t}M`:`${o==="I"?n:t}${o}`;return e}var Jt=2**28-1;function en(r,e,t){for(let n=e;n>0;n-=Jt)r.push((Math.min(n,Jt)<<4|t)>>>0)}function is(r,e,t){if(e===t)en(r,e,0);else{let n=Math.ceil(Math.max(e,t)/Jt);for(let o=0;o<n;o++){let s=Math.floor(e*(o+1)/n)-Math.floor(e*o/n),i=Math.floor(t*(o+1)/n)-Math.floor(t*o/n);r.push((s<<4|9)>>>0,(i<<4|9)>>>0)}}}function nn(r){let e=[];for(let{own:t,mate:n,op:o}of Pr(r))o==="M"?is(e,t,n):o==="I"?en(e,n,1):en(e,t,o==="N"?3:2);return Uint32Array.from(e)}function as(r){return r>=48&&r<=57}function fs(r){return r!==void 0&&/[A-Za-z]/.test(r)}function kr(r,e){let t=e;for(;t<r.length&&fs(r[t]);)t++;return t}function Mr(r,e){let t=e,n=0;for(;t<r.length&&as(r.charCodeAt(t));)n=n*10+(r.charCodeAt(t)-48),t++;return{value:n,next:t}}function Fr(r,e){let t=0;for(;t<r.length;){let n=r[t];if(n===":"){let{value:o,next:s}=Mr(r,t+1);e(":",o,o,t+1,s),t=s}else if(n==="="){let o=kr(r,t+1),s=o-t-1;e("=",s,s,t+1,o),t=o}else if(n==="*")e("*",1,1,t+1,Math.min(t+3,r.length)),t+=3;else if(n==="+"||n==="-"){let o=kr(r,t+1),s=o-t-1;e(n,n==="-"?s:0,n==="+"?s:0,t+1,o),t=o}else if(n==="~"){let{value:o,next:s}=Mr(r,t+3),i=Math.min(s+2,r.length);e("~",o,0,t+1,i),t=i}else t++}}function rn(r,e,t,n){let o=t??Number.NEGATIVE_INFINITY,s=n??Number.POSITIVE_INFINITY,i=0;Fr(r,(a,c,f,l,p)=>{if(a==="*")i>=o&&i<s&&e(88,i,1,r[l+1]??"",-1,0,0);else if(a==="+"){if(i>=o&&i<=s){let d=r.slice(l,p);e(73,i,f,d,-1,0,f)}}else(a==="-"||a==="~")&&i<s&&i+c>o&&e(a==="-"?68:78,i,c,"",-1,0,0);i+=c})}function Hr(r,e,t,n){let o=0,s=0,i=[],a=t&&e;for(let c=0,f=r.length;c<f;c++){let l=r[c],p=l>>>4,d=l&15;if(d===0||d===7){if(a)for(let h=0;h<p;h++)(e.charCodeAt(s+h)|32)!==(t.charCodeAt(o+h)|32)&&i.push({start:o+h,type:"mismatch",base:e[s+h],altbase:t[o+h],length:1});s+=p,o+=p}else if(d===1)i.push({start:o,type:"insertion",insertlen:p,insertedBases:e?.slice(s,s+p),length:0}),s+=p;else if(d===2)i.push({start:o,type:"deletion",length:p}),o+=p;else if(d===3)i.push({start:o,type:"skip",length:p}),o+=p;else if(d===8){for(let h=0;h<p;h++)i.push({start:o+h,type:"mismatch",base:e?.[s+h]||"X",qual:n?.[s+h],length:1});s+=p,o+=p}else d===5?i.push({start:o,type:"hardclip",cliplen:p,length:1}):d===4&&(i.push({start:o,type:"softclip",cliplen:p,length:1}),s+=p)}return i}function qr(r,e,t,n,o){if(!e)return[];let s=[],i=e.length,a=n.length,c=o!==void 0,f=t.length,l=!1;for(let S=0;S<f;S++)if(t[S].type==="skip"){l=!0;break}let p=0,d=0,h=0,u=0,m=0,y=0,x=r.length;for(;y<x;){let S=r.charCodeAt(y);if(S>=48&&S<=57){let g=0;for(;y<x;){let b=r.charCodeAt(y);if(b>=48&&b<=57)g=g*10+(b-48),y++;else break}p+=g}else if(S===94)for(y++;y<x&&r.charCodeAt(y)>=65;)y++,p++;else if(S>=65){let g=r[y];if(y++,l&&f>0)for(let R=m;R<f;R++){let C=t[R];C.type==="skip"&&p>=C.start&&(p+=C.length,m=R+1)}let b=h,w=u;for(let R=d;R<i&&w<=p;R++,d=R){let C=e[R],_=C>>>4,E=C&15;E===4||E===1?b+=_:E===2||E===6||E===3?w+=_:E!==5&&(b+=_,w+=_)}h=b,u=w;let v=b-(w-p),I=v<a?n[v]:"X";s.push({start:p,base:I,qual:c?o[v]:void 0,altbase:g,length:1,type:"mismatch"}),p++}else y++}return s}var $r={77:0,73:1,68:2,78:3,83:4,72:5,80:6,61:7,88:8};function Br(r=""){let e=0,t=[];for(let n=0,o=r.length;n<o;n++){let s=r.charCodeAt(n);if(s>=48&&s<=57)e=e*10+(s-48);else{let i=$r[s];t.push(e<<4|i),e=0}}return t}function an(r=""){let e=0;for(let s=0,i=r.length;s<i;s++){let a=r.charCodeAt(s);(a<48||a>57)&&e++}let t=new Uint32Array(e),n=0,o=0;for(let s=0,i=r.length;s<i;s++){let a=r.charCodeAt(s);a>=48&&a<=57?n=n*10+(a-48):(t[o++]=n<<4|$r[a],n=0)}return t}function Mt(r,e,t,n,o){let s=Br(r),i=r?Hr(s,t,n,o):[];return e&&t?i.concat(qr(e,s,i,t,o)):i}var ps=397,hs=387,ds=385;function Gr(r){return(1<<r&ps)!==0}function Dr(r){return(1<<r&hs)!==0}function zr(r){return(1<<r&ds)!==0}function fn(r,e,t,n,o,s,i){let a=o===-1?-1:1,c=e,f=o===-1?n:t,l=[],p=1/0,d=-1/0,h=1/0,u=-1/0,m=(y,x)=>{h=Math.min(h,y,x),u=Math.max(u,y,x)};for(let y=0;y<r.length;y++){let x=r[y],S=x>>>4,g=x&15,b=g===9,w=b||Gr(g)?S:0,v=b?r[++y]>>>4:Dr(g)?S:0,I=c+w,R=f+v*a,C=c,_=I;if(_>=s&&C<=i)if(w>0){let E=Math.max(C,s),k=Math.min(_,i);if(k>E)if(p=Math.min(p,E),d=Math.max(d,k),b){let O=v/S,N=k-E,F=Math.round(N*O),H=Math.round(f+(E-c)*O*a);l.push(N<<4|9,F<<4|9),m(H,H+F*a)}else l.push(k-E<<4|g),zr(g)?m(f+(E-c)*a,f+(k-c)*a):m(f,f)}else v>0&&(b?l.push(x,r[y]):l.push(x),p=Math.min(p,c),d=Math.max(d,c),m(f,R));if(c=I,f=R,c>i)break}if(l.length!==0)return{start:p,end:d,mateStart:h,mateEnd:u,cigar:Uint32Array.from(l)}}function us(r){return r===1||r===2||r===3}function cn(r,e,t,n,o,s){let i=o===-1?-1:1,a=[],c=e,f=o===-1?n:t,l,p=!1,d=()=>{l!==void 0&&p&&l.qHi>l.qLo&&a.push({start:l.qLo,end:l.qHi,mateStart:l.tLo,mateEnd:l.tHi,cigar:Uint32Array.from(l.ops)}),l=void 0,p=!1};for(let h=0;h<r.length;h++){let u=r[h],m=u>>>4,y=u&15,x=y===9,S=x?r[++h]:void 0,g=x||Gr(y)?m:0,b=S!==void 0?S>>>4:Dr(y)?m:0,w=f+b*i;us(y)&&m>=s?d():(g>0||b>0)&&(l===void 0&&(l={qLo:c,qHi:c,tLo:f,tHi:f,ops:[]}),l.qHi=c+g,l.tLo=Math.min(l.tLo,f,w),l.tHi=Math.max(l.tHi,f,w),l.ops.push(u),S!==void 0&&l.ops.push(S),p=p||x||zr(y)),c+=g,f=w}return d(),a}function jr(r){let e=r.get("CIGAR");return typeof e=="string"?e:void 0}function Ur(r){let e=r.get("coarseCigar");return typeof e=="string"?e:void 0}function ln(r){let e=jr(r),t=e===void 0?Ur(r):void 0;return e!==void 0?an(e):t!==void 0?nn(t):void 0}var ms=Y(Ae(),1),gs=Y(Qr(),1);var ys=Y(Ae(),1);var ws=Y(so(),1);var Yr=Y(Ae(),1),se=class extends Yr.SimpleFeature{get(e){return e==="mismatches"?Mt(this.walkableCigar):e==="clipLengthAtStartOfRead"?this.clipLengthAtStartOfRead:e==="name"?super.get("name")??this.mate?.refName:super.get(e)}get mate(){return super.get("mate")}get walkableCigar(){let e=super.get("CIGAR"),t=super.get("coarseCigar");return typeof e=="string"?e:typeof t=="string"?tn(t):void 0}get clipLengthAtStartOfRead(){return this.mate?.start??0}forEachMismatch(e,t){let n=this.get("start"),o=t?.start===void 0?void 0:t.start-n,s=t?.end===void 0?void 0:t.end-n,i=this.get("cs");if(i)rn(i,e,o,s);else{let a=o??Number.NEGATIVE_INFINITY,c=s??Number.POSITIVE_INFINITY;for(let f of Mt(this.walkableCigar))(f.type==="deletion"||f.type==="skip"?f.start<c&&f.start+f.length>a:f.start>=a&&f.start<=c)&&(f.type==="mismatch"?e(88,f.start,f.length,f.base,f.qual??-1,0,0):f.type==="insertion"?e(73,f.start,f.length,f.insertedBases??"",-1,0,f.insertlen):f.type==="deletion"?e(68,f.start,f.length,"",-1,0,0):f.type==="skip"&&e(78,f.start,f.length,"",-1,0,0))}}};var xs=["CIGAR","cs","coarseCigar","cg","cr"];function bs(r){return typeof r=="object"&&r!==null&&"refName"in r&&"start"in r&&"end"in r&&typeof r.refName=="string"&&typeof r.start=="number"&&typeof r.end=="number"}function Ss(r){let e=r.get("mate");return bs(e)?e:void 0}function vs(r,e,t,n){let o=Math.max(r.start,n.start),s=Math.min(r.end,n.end),i=(e.end-e.start)/Math.max(r.end-r.start,1),a=l=>t===-1?e.end-(l-r.start)*i:e.start+(l-r.start)*i,c=Math.round(a(o)),f=Math.round(a(s));return s>o?{start:o,end:s,mateStart:Math.min(c,f),mateEnd:Math.max(c,f)}:void 0}function Is(r,e,t,n){let o={start:r.get("start"),end:r.get("end")},s=r.get("strand")===-1?-1:1,i=o.start>=t.start&&o.end<=t.end,a=i&&n===void 0?void 0:ln(r);if(a===void 0){let c=i?{...o,mateStart:e.start,mateEnd:e.end}:vs(o,e,s,t);return c===void 0?[]:[c]}else return(n===void 0?[{...o,mateStart:e.start,mateEnd:e.end,cigar:a}]:cn(a,o.start,e.start,e.end,s,n)).flatMap(f=>{let l=fn(f.cigar,f.start,f.mateStart,f.mateEnd,s,t.start,t.end);return l===void 0?[]:[l]})}function As(r,e,t,n,o){let s=`:${n.start}-${n.end}${o}`,i=r.toJSON(),a={...i,uniqueId:`${r.id()}${s}`,start:t.start,end:t.end,mate:{...e,start:t.mateStart,end:t.mateEnd}};i.syntenyId!==void 0&&(a.syntenyId=`${String(i.syntenyId)}${s}`);for(let c of xs)delete a[c];return new se(a)}function Vr(r,e,t){let n=Ss(r);if(n===void 0)return[r];{let o=Is(r,n,e,t);return o.map((s,i)=>As(r,n,s,e,o.length>1?`/${i}`:""))}}var Ot=class extends Kr.BaseFeatureDataAdapter{constructor(){super(...arguments);this.recordsAreAlignments=!0}static{this.capabilities=["getFeatures","getRefNames"]}async hasDataForRefName(){return!0}getFeaturesInMultipleRegions(t,n={}){let{clipToRegion:o,splitAtGapBp:s,...i}=n,a=o&&this.recordsAreAlignments,c=(0,Xr.createStatusFanOut)(i.statusCallback);return Zt(t).pipe(ve((f,l)=>this.getFeatures(f,{...i,statusCallback:c()}).pipe(ve(p=>a?Vr(p,p.get("assemblyName")===f.assemblyName?f:{start:p.get("start"),end:p.get("end")},s):[p]),Ct(),Ne(p=>({index:l,features:p})))),Ct(),ve(f=>f.sort((l,p)=>l.index-p.index).flatMap(l=>l.features)))}};var un=class extends Error{constructor(){super("this .gbz.db has no HaplotypeSamples/HaplotypeLengths tables, so its walks cannot be named; run gbz-haplotype-index (from @gmod/gbz-base) over it first");this.name="NoHaplotypeIndexError"}},mn=class extends Error{constructor(t,n){super(n.length===0?`the graph names no reference sample (gbwt_reference_samples) and the anchor "${t}" maps to none; set referenceSample`:`the anchor "${t}" is none of the graph's reference samples (${n.join(", ")}); set referenceSample or map it through assemblyNameToPanSN`);this.name="NoReferenceSampleError"}};function ie(r){return`${r.sample}#${r.haplotype}`}var gn=class extends Error{constructor(t){super(`a pair query names both lanes: queryAssemblyName ${t} came without a targetAssemblyName`);this.name="PairTargetError"}};function Es(r,e){let t=ie(r);return e===void 0||e.some(n=>Ee(t,n))}var yn=class extends Error{constructor(t,n){super(`the graph is cut on its reference, ${n}; a window on ${t} has no reference coordinates to cut at. Open the graph from a ${n} view, and find this haplotype's lane there`);this.name="HaplotypeWindowError"}},wn=class extends Error{constructor(t,n,o){super(`this ${n.toLocaleString()} bp window reads more than nodeLimit (${t.toLocaleString()}) graph nodes; zoom in to about ${o.toLocaleString()} bp or raise nodeLimit`);this.name="NodeLimitError"}};function pn(r,e,t){if(r instanceof Error&&(r.name==="SubgraphLimitError"||/^Subgraph size limit of \d+ nodes exceeded/.test(r.message))){let o=r.walkedBp,s=typeof o=="number"&&o>0?Math.floor(o*.8):Math.floor(t/2);return new wn(e,t,Math.max(s,1))}else return}function Zr(r,e){let t=ie(e);return r[t]??r[e.sample]??t}function Cs({configured:r,anchorPrefix:e,referenceSamples:t}){let n=Sn(e);if(r!=="")return r;if(t.includes(n))return n;if(t.length===1)return t[0];throw new mn(e,t)}function Rs(r,e){return`${ie(r)}#${r.contig}@${e.start.node}.${e.start.offset}`}function _s({alignment:r,assemblyName:e,refName:t,lane:n}){let{refStart:o,refEnd:s,strand:i,cigar:a}=r;if(!(!r.resolved||s<=o)){let{name:c,hapStart:f,hapEnd:l}=r,p=Rs(c,r),d={uniqueId:p,assemblyName:e,refName:t,start:o,end:s,type:"match",strand:i==="-"?-1:1,CIGAR:a,syntenyId:p,mate:{refName:c.contig,start:f,end:l,assemblyName:n}};return new se(d)}}function Ps({pair:r,lane:e,mateLane:t}){let n=`${ie(r.target)}#${r.target.contig}:${r.targetStart}-${r.targetEnd}|${ie(r.query)}#${r.query.contig}:${r.queryStart}-${r.queryEnd}`;return new se({uniqueId:n,assemblyName:e,refName:r.target.contig,start:r.targetStart,end:r.targetEnd,type:"match",strand:r.strand==="-"?-1:1,CIGAR:r.cigar,syntenyId:n,identity:r.matches/Math.max(r.columns,1),numMatches:r.matches,blockLen:r.columns,mate:{refName:r.query.contig,start:r.queryStart,end:r.queryEnd,assemblyName:t}})}var xn=class extends Ot{constructor(){super(...arguments);this.graph=(0,Jr.cachedSetup)({label:"Opening pangenome database",setup:async()=>{let t=this.getConf("haplotypeIndexLocation"),n=!("uri"in t)||t.uri!=="",o=await Oe.open((0,dn.openLocation)(this.getConf("gbzDbLocation"),this.pluginManager),n?{haplotypeIndex:(0,dn.openLocation)(t,this.pluginManager)}:{}),s=this.getConf("assemblyNames")[0];if(s===void 0)throw new Error("GbzBaseSyntenyAdapter needs assemblyNames: its first entry is the assembly the reference sample is loaded as");let i=(await o.tag("gbwt_reference_samples")??"").split(/\s+/).filter(c=>c!==""),a=Cs({configured:this.getConf("referenceSample"),anchorPrefix:ue(this,s),referenceSamples:i});return{db:o,anchor:s,referenceSample:a,referenceSamples:i}}})}async referenceQuery(t,n){let{db:o,referenceSample:s}=await this.graph(n),i=(await o.paths()).find(a=>a.isIndexed&&a.name.sample===s&&a.name.contig===t);return i?{sample:i.name.sample,contig:t,haplotype:i.name.haplotype}:void 0}async getHaplotypes(t={}){let{db:n,referenceSamples:o}=await this.graph(t),s=new Map;for(let i of await n.paths()){let a=ie(i.name),c=s.get(a);c?c.contigs.includes(i.name.contig)||c.contigs.push(i.name.contig):s.set(a,{prefix:a,sample:i.name.sample,haplotype:i.name.haplotype,contigs:[i.name.contig],isReference:o.includes(i.name.sample)})}return[...s.values()]}async getHeader(t={}){let{anchor:n,referenceSample:o,referenceSamples:s}=await this.graph(t),i=Lt(this),a=[];for(let c of await this.getHaplotypes(t))c.sample!==o&&a.push({name:Zr(i,c),label:c.prefix,group:c.sample});return{hasCoarseTier:!1,anchorAssemblyName:n,referenceSample:o,referenceSamples:s,lanes:a}}async getRefNames(t={}){let{db:n,anchor:o,referenceSample:s}=await this.graph(t),{assemblyName:i}=t,a=i===o?void 0:ue(this,i),c=(await n.paths()).filter(f=>i===o?f.isIndexed&&f.name.sample===s:Ee(ie(f.name),a)).map(f=>f.name.contig);return[...new Set(c)]}keepPredicate(t,n){let o=t===void 0||t.length===0?void 0:t.map(s=>ue(this,s));return o===void 0&&n===void 0?void 0:s=>Es(s,o)&&(n===void 0||Ee(ie(s),n))}async getSubgraph(t,n={}){let{db:o,anchor:s}=await this.graph(),{assemblyName:i,refName:a,start:c,end:f}=t;if(i!==s)throw new yn(i,s);let l=await this.referenceQuery(a,{}),p=this.getConf("nodeLimit"),d=this.keepPredicate(n.haplotypes),h=l?await o.getSubgraphForRange(l,c,f,{context:this.getConf("context"),snarls:this.getConf("subgraphSnarls"),haplotypes:"all",limit:p,signal:n.signal,...d===void 0?{}:{keep:d}}).catch(u=>{throw pn(u,p,f-c)??u}):void 0;return h?h.toGFA({names:"resolved"}):""}async laneHaplotypes(t,n){let o=ue(this,t);return(await this.getHaplotypes(n)).filter(s=>Ee(s.prefix,o))}async referencePieces(t,n,o,s){let{db:i,referenceSample:a}=await this.graph(s),c=(await i.paths()).filter(l=>l.isIndexed&&l.name.sample===a&&l.name.contig===t&&l.name.fragment>n&&l.name.fragment<o).map(l=>l.name.fragment),f=[n,...[...new Set(c)].sort((l,p)=>l-p),o];return f.slice(1).map((l,p)=>({start:f[p],end:l}))}async anchorFeatures(t,n){let{db:o}=await this.graph(n),{assemblyName:s,refName:i,start:a,end:c}=t,f=ue(this,n.targetAssemblyName),l=Lt(this),p=this.keepPredicate(n.haplotypes,f),d=await this.referenceQuery(i,n),h=this.getConf("nodeLimit");return(d?await(0,hn.updateStatus)(`Reading graph ${i}:${a.toLocaleString()}-${c.toLocaleString()}`,n.statusCallback,()=>o.getAlignmentsForRange(d,a,c,{context:this.getConf("context"),haplotypes:"all",limit:h,signal:n.signal,...p===void 0?{}:{keep:p}}).catch(m=>{throw pn(m,h,c-a)??m})):[]).flatMap(m=>{let y=m.resolved?_s({alignment:m,assemblyName:s,refName:i,lane:Zr(l,m.name)}):void 0;return y===void 0?[]:[y]})}async pairFeatures(t,n,o){let{targetAssemblyName:s}=o;if(s===void 0)throw new gn(n);let{db:i}=await this.graph(o),{refName:a,start:c,end:f}=t,l=await this.laneHaplotypes(n,o),p=await this.laneHaplotypes(s,o),d=[...l,...p],h=await this.referenceQuery(a,o),u=this.getConf("nodeLimit"),m=await i.haplotypeAnchorSpacing()!==void 0,y=(g,b)=>i.getSubgraphForRange(g,b.start,b.end,{context:this.getConf("context"),haplotypes:"all",limit:u,signal:o.signal,keep:w=>d.some(v=>v.sample===w.sample&&v.haplotype===w.haplotype)}).catch(w=>{throw pn(w,u,f-c)??w}),x=h&&m&&l.length>0&&p.length>0?(await(0,hn.updateStatus)(`Aligning ${n} to ${s}`,o.statusCallback,async()=>Promise.all((await this.referencePieces(a,c,f,o)).map(g=>y(h,g))))).filter(g=>g!==void 0):[];return x.every(g=>{let b=g.stats.anchorWalk;return b!==void 0&&b.fallback===void 0})?x.flatMap(g=>l.flatMap(b=>p.flatMap(w=>g.pairAlignments({target:b,query:w}).map(v=>Ps({pair:v,lane:n,mateLane:s}))))):[]}getFeatures(t,n={}){return(0,eo.ObservableCreate)(async o=>{let{db:s,anchor:i}=await this.graph(n);if(!s.hasHaplotypeIndex)throw new un;if(t.assemblyName===i){let a=n.queryAssemblyName===void 0?await this.anchorFeatures(t,n):await this.pairFeatures(t,n.queryAssemblyName,n);for(let c of a)o.next(c)}o.complete()},n.signal)}};export{yn as HaplotypeWindowError,un as NoHaplotypeIndexError,mn as NoReferenceSampleError,wn as NodeLimitError,gn as PairTargetError,xn as default,_s as fragmentFeature,ie as haplotypePrefix,Zr as laneAssemblyName,pn as nodeLimitError,Ps as pairFeature,Cs as resolveReferenceSample};
|
|
8
|
+
//# sourceMappingURL=GbzBaseSyntenyAdapter-6UTRY4CV.js.map
|