jbrowse-plugin-graphgenomeviewer 3.0.5 → 4.0.0

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.
Files changed (81) hide show
  1. package/README.md +55 -3
  2. package/dist/chunks/{AddTrackWorkflow-Y3OBHM33.js → AddTrackWorkflow-TPCKXM2H.js} +2 -2
  3. package/dist/chunks/GbzBaseSyntenyAdapter-BLSUE5LT.js +8 -0
  4. package/dist/chunks/GbzBaseSyntenyAdapter-BLSUE5LT.js.map +7 -0
  5. package/dist/chunks/GraphGenomeView-WPKSNN4I.js +10 -0
  6. package/dist/chunks/GraphGenomeView-WPKSNN4I.js.map +7 -0
  7. package/dist/chunks/GraphSettingsDialog-KQK4YZN5.js +2 -0
  8. package/dist/chunks/GraphSettingsDialog-KQK4YZN5.js.map +7 -0
  9. package/dist/chunks/LinearGraphDisplay-P7U6NCZF.js +2 -0
  10. package/dist/chunks/LinearGraphDisplay-P7U6NCZF.js.map +7 -0
  11. package/dist/chunks/MinigraphBubbleAdapter-FJIBTKQY.js +2 -0
  12. package/dist/chunks/MinigraphBubbleAdapter-FJIBTKQY.js.map +7 -0
  13. package/dist/chunks/RgfaTabixAdapter-7ZGKJJYW.js +3 -0
  14. package/dist/chunks/RgfaTabixAdapter-7ZGKJJYW.js.map +7 -0
  15. package/dist/chunks/chunk-A4ZWFDQY.js +2 -0
  16. package/dist/chunks/chunk-A4ZWFDQY.js.map +7 -0
  17. package/dist/chunks/{chunk-JCG7RLMB.js → chunk-HOM2Y6XS.js} +2 -2
  18. package/dist/chunks/chunk-HOM2Y6XS.js.map +7 -0
  19. package/dist/chunks/chunk-OHT6UX4C.js +4 -0
  20. package/dist/chunks/chunk-OHT6UX4C.js.map +7 -0
  21. package/dist/chunks/chunk-OP7IRVG6.js +2 -0
  22. package/dist/chunks/chunk-OP7IRVG6.js.map +7 -0
  23. package/dist/chunks/chunk-SDTCVLC3.js +4 -0
  24. package/dist/chunks/chunk-SDTCVLC3.js.map +7 -0
  25. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +2 -2
  26. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  27. package/package.json +22 -21
  28. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +329 -0
  29. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +187 -3
  30. package/src/GbzBaseSyntenyAdapter/index.ts +8 -1
  31. package/src/GetSubgraph.ts +5 -1
  32. package/src/GraphGenomeView/components/GraphCanvas.tsx +19 -1
  33. package/src/GraphGenomeView/components/GraphStats.tsx +1 -0
  34. package/src/GraphGenomeView/components/LayoutSelect.tsx +1 -2
  35. package/src/GraphGenomeView/host.ts +126 -0
  36. package/src/GraphGenomeView/laneRamp.test.ts +1 -1
  37. package/src/GraphGenomeView/laneRamp.ts +2 -1
  38. package/src/GraphGenomeView/layout/sampleRowLayout.test.ts +16 -0
  39. package/src/GraphGenomeView/layout/sampleRowLayout.ts +13 -4
  40. package/src/GraphGenomeView/layoutModes.ts +3 -1
  41. package/src/GraphGenomeView/model.ts +326 -56
  42. package/src/GraphGenomeView/types.ts +4 -0
  43. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +355 -0
  44. package/src/LinearGraphDisplay/components/LinearGraphDisplay.tsx +51 -0
  45. package/src/LinearGraphDisplay/configSchema.ts +51 -0
  46. package/src/LinearGraphDisplay/index.ts +23 -0
  47. package/src/LinearGraphDisplay/model.ts +227 -0
  48. package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +1 -1
  49. package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +73 -0
  50. package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +48 -16
  51. package/src/RgfaTabixAdapter/configSchema.ts +70 -3
  52. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.links.bed.gz +0 -0
  53. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.links.bed.gz.tbi +0 -0
  54. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.segs.bed.gz +0 -0
  55. package/src/RgfaTabixAdapter/test_data/rgfa_ecoli.tier1000.segs.bed.gz.tbi +0 -0
  56. package/src/index.ts +2 -4
  57. package/src/launchSubgraph/launchSubgraphView.ts +10 -6
  58. package/src/launchSubgraph/testEnv.ts +2 -5
  59. package/src/panSNTabix.ts +6 -5
  60. package/src/synteny/ComparativeAdapterBase.ts +13 -10
  61. package/src/synteny/clipFeatureToRegion.test.ts +41 -1
  62. package/src/synteny/clipFeatureToRegion.ts +22 -5
  63. package/src/version.ts +1 -1
  64. package/dist/chunks/GbzBaseSyntenyAdapter-QT5CVRL2.js +0 -8
  65. package/dist/chunks/GbzBaseSyntenyAdapter-QT5CVRL2.js.map +0 -7
  66. package/dist/chunks/GraphGenomeView-UD5WCV3Q.js +0 -14
  67. package/dist/chunks/GraphGenomeView-UD5WCV3Q.js.map +0 -7
  68. package/dist/chunks/MinigraphBubbleAdapter-B75VQK7T.js +0 -2
  69. package/dist/chunks/MinigraphBubbleAdapter-B75VQK7T.js.map +0 -7
  70. package/dist/chunks/RgfaTabixAdapter-IT7I5RR3.js +0 -3
  71. package/dist/chunks/RgfaTabixAdapter-IT7I5RR3.js.map +0 -7
  72. package/dist/chunks/chunk-JCG7RLMB.js.map +0 -7
  73. package/dist/chunks/chunk-X3X74OGB.js +0 -2
  74. package/dist/chunks/chunk-X3X74OGB.js.map +0 -7
  75. package/src/launchSubgraph/index.ts +0 -152
  76. package/src/launchSubgraph/launchSubgraph.test.ts +0 -264
  77. package/src/launchSubgraph/linearViewMenuItems.test.ts +0 -176
  78. package/src/launchSubgraph/linearViewMenuItems.ts +0 -107
  79. package/src/launchSubgraph/multiWayLaunch.test.ts +0 -289
  80. package/src/launchSubgraph/subgraphMenuItems.ts +0 -73
  81. /package/dist/chunks/{AddTrackWorkflow-Y3OBHM33.js.map → AddTrackWorkflow-TPCKXM2H.js.map} +0 -0
package/README.md CHANGED
@@ -1,8 +1,7 @@
1
1
  # jbrowse-plugin-graphgenomeviewer
2
2
 
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.
3
+ A JBrowse 2 plugin that draws a pangenome graph (GFA / rGFA) as a track of a
4
+ linear genome view, and as a **GraphGenomeView** of its own for a whole file.
6
5
 
7
6
  ## Screenshots
8
7
 
@@ -75,6 +74,59 @@ no index, a GBZ cut, a pggb file or a popped bubble, from the graph itself off
75
74
  the ordered layout's layering. Every node layout marks them as halos; the
76
75
  variant map draws them as glyphs.
77
76
 
77
+ ### The graph as a track
78
+
79
+ A graph track's display is `LinearGraphDisplay`. It cuts the view's window plus
80
+ a window-width each side and re-cuts once the view leaves the cut, keeping its
81
+ sample rows in the order they were drawn. On a layout whose x is reference bp,
82
+ such as Anchored or Sample rows, the graph draws under the view's own
83
+ coordinates and pans and zooms with it. The force-directed, ordered and walk-row
84
+ layouts draw in their own coordinates inside the track, fitted to it, with their
85
+ own zoom in the track menu, the way a variant matrix does. The track menu also
86
+ picks the layout, the colour, a walk to lift out, and opens the settings.
87
+
88
+ ```json
89
+ {
90
+ "type": "FeatureTrack",
91
+ "trackId": "hprc_graph",
92
+ "name": "HPRC release 2 graph",
93
+ "assemblyNames": ["hg38"],
94
+ "adapter": { "type": "RgfaTabixAdapter", "uri": "https://example.com/hprc" },
95
+ "displays": [
96
+ {
97
+ "type": "LinearGraphDisplay",
98
+ "displayId": "hprc_graph-LinearGraphDisplay"
99
+ },
100
+ {
101
+ "type": "LinearBasicDisplay",
102
+ "displayId": "hprc_graph-LinearBasicDisplay"
103
+ }
104
+ ]
105
+ }
106
+ ```
107
+
108
+ The first display is the one the track opens with; the second is the segments
109
+ lane, one block per segment, reachable from the track menu.
110
+
111
+ A fine cut spans at most 5 Mb. An rGFA track can carry a coarse tier, one node
112
+ per bubble, built by `build_bubble_tier.sh` in jbrowse-components; past
113
+ `aboveBpPerPx` in the linear view the track cuts that pair instead, with no bp
114
+ cap:
115
+
116
+ ```json
117
+ {
118
+ "type": "RgfaTabixAdapter",
119
+ "uri": "https://example.com/hprc-v2.0-mc-grch38",
120
+ "coarse": {
121
+ "uri": "https://example.com/hprc-v2.0-mc-grch38.tier10000",
122
+ "aboveBpPerPx": 1000
123
+ }
124
+ }
125
+ ```
126
+
127
+ **Add → Graph genome view** opens a whole GFA file in a view of its own, with
128
+ the same layouts and its own pan and zoom.
129
+
78
130
  ### Demonstration loci
79
131
 
80
132
  Six HPRC release 2 windows, the ones the
@@ -1,2 +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
1
+ import{a as z}from"./chunk-FCWXYIFC.js";import{a as $}from"./chunk-D7XFR2IV.js";import{a as H}from"./chunk-J4OLMLS5.js";import{a as L,b as j,c as O,d as J,e as U}from"./chunk-XEJ47DLD.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-TPCKXM2H.js.map
@@ -0,0 +1,8 @@
1
+ import{a as Sn,b as so}from"./chunk-TN6FK5UD.js";import{a as oo}from"./chunk-KWAXLUPQ.js";import"./chunk-LGKM2PZH.js";import{a as io}from"./chunk-D7XFR2IV.js";import{a as Ae}from"./chunk-J4OLMLS5.js";import{a as vn,d as Ee,e as ue,f as Lt}from"./chunk-F4C3BEPV.js";import{a as ro,b as Y}from"./chunk-FY3BTKY4.js";var Yr=ro((Oc,Qr)=>{Qr.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 In(r){return r==="left"?"right":"left"}function He(r){return r==="forward"?"left":"right"}function qe(r){return r==="forward"?"right":"left"}function An(r){return r==="left"?"forward":"reverse"}function En(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 Cn(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}}},Rn=255,fo=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<Rn?Math.floor(fo/this.sigma):0}next(){if(this.sigma>=Rn){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 _n(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),f=e[i.value];for(let c=0;c<i.len;c++)n[s]=a.node,o[s]=f,f+=1,s+=1;e[i.value]=f}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 co=["","A","C","G","T","N"];function Pn(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 kn(r){let e="";for(let t of r){let n=t;for(let o=0;o<3;o++){let s=co[n%6];if(s==="")return e;n=Math.floor(n/6),e+=s}}return e}var lo={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+=lo[r[t]]??"N";return e}function Mn(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 Tn(r){return{name:r.get("pggname"),subgraph:Mn(r.get("subgraph"),"subgraph"),translation:Mn(r.get("translation"),"translation")}}function On(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 Nn(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])),On(t.subgraph,e.subgraph),On(t.translation,e.translation)),t}function Ln(r){return[...r.entries()].sort(([e],[t])=>e<t?-1:e>t?1:0).flatMap(([e,t])=>[...t].sort().map(n=>[e,n]))}function Fn(r){let e=[];r.name!==void 0&&e.push(`H NM:Z:${r.name}`);for(let[t,n]of Ln(r.subgraph))e.push(`H SG:Z:${t},${n}`);for(let[t,n]of Ln(r.translation))e.push(`H TL:Z:${t},${n}`);return e}async function Hn(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 po="_gbwt_ref";function q(r,e){return`${r.sample}#${r.haplotype}#${r.contig}[${r.fragment}-${e}]`}var ho=/^([^#]+)#(\d+)#([^#]+?)(?:\[\d+-\d+\])?$/,uo=/^([^#]+?)(?:\[\d+-\d+\])?$/;function mo(r){let e=ho.exec(r);if(e)return{sample:e[1],haplotype:Number(e[2]),contig:e[3]};let t=uo.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 qn(r){return typeof r=="string"?mo(r):r}function Re(r,e){return{sample:r.sample??po,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 f=e;f!==t;f+=n){let c=this.occurrences.get(this.a[f]);if(!c)continue;let l=this.weight(this.a[f]),p=ze(c,o),h=ze(c,s);for(let d=0;d<h-p;d++){let u=n===1?c[h-1-d]-o:s-1-c[p+d],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]=f,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 f=i.bestBefore(o-n);if(f===-1)return;this.total+=i.ending[f];let c=[];for(let l=a.endingMatch[f];l!==-1;l=a.previous[l])c.push([a.row[l],n+a.column[l]]);for(let l=c.length-1;l>=0;l--)this.pairs.push(c[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 f=0;f<s-o;f++)a[f+1]=Math.max(a[f],i.ending[f]);return a}split(e,t,n,o,s){let i=s-o,a=this.frontier(e,t,1,o,s),f=this.frontier(n-1,t-1,-1,o,s),c=0,l=-1;for(let p=0;p<=i;p++){let h=a[p]+f[i-p];h>l&&(l=h,c=p)}return o+c}};function $n(r,e,t){let n=new Tt(r,e,t);return n.solve(0,r.length,0,e.length),[n.pairs,n.total]}var go=100,Ht=4e6,yo=5e3,D=15,wo=64,xo=8,Wn=1,qt=-4,B=-6,ee=-1,ye=-(2**30),We=0,Nt=1,Qn=2;function ae(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?Qn:Nt}function Yn(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),f=new Int32Array(s).fill(ye),c=new Int32Array(s).fill(ye);a[0]=0;for(let u=1;u<=o;u++)c[u]=B+(u-1)*ee,i[u]=(u===1?We:Qn)<<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],f[g-1],c[g-1]);m[g]=Math.max(a[g-1],f[g-1],c[g-1])+(S===e.charCodeAt(g-1)?Wn:qt);let w=Ue(a[g]+B,f[g]+ee,c[g]+B);y[g]=Math.max(a[g]+B,f[g]+ee,c[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,f=y,c=x}let l=[],p=n,h=o,d=Ue(a[o],f[o],c[o]);for(;p>0||h>0;){let u=i[p*s+h]>>2*d&3;d===We?(l.push(r[p-1]===e[h-1]?"=":"X"),p-=1,h-=1):d===Nt?(l.push("I"),p-=1):(l.push("D"),h-=1),d=u}for(let u of l.reverse())ae(t,u,1)}function bo(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 Vn(r,e){let t=Math.abs(r-e);return t===0?0:.01*D*t+.5*Math.log2(t)}function Bn(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 So(r,e,t){let n=r.qe-r.qs,o=[];for(let[a,f]of e){let c=Math.max(0,a-r.qs),l=Math.min(n,f-r.qs);c<l&&o.push([c,l])}for(let[a,f]of t){let c=Math.max(0,r.flipped?r.te-f:a-r.ts),l=Math.min(n,r.flipped?r.te-a:f-r.ts);c<l&&o.push([c,l])}if(o.length===0)return[r];o.sort((a,f)=>a[0]-f[0]);let s=[],i=0;for(let[a,f]of o)a-i>=D&&s.push(Bn(r,i,a)),i=Math.max(i,f);return n-i>=D&&s.push(Bn(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:[]}},f=[...r].sort((c,l)=>c.qs-l.qs||c.ts-l.ts);for(;f.length>0&&s.length<o;){let c=f.map(g=>g.qe-g.qs),l=new Int32Array(f.length).fill(-1),p=new Int32Array(f.length);for(let g=0;g<f.length;g++){let b=f[g],w=b.qe-b.qs;for(let v=g-1;v>=Math.max(0,g-yo);v--){if(c[v]+w<=c[g])continue;let I=f[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=c[v]+w-C-n(_,E);k>c[g]&&(c[g]=k,l[g]=v,p[g]=C)}}}}let h=0;for(let g=1;g<f.length;g++)c[g]>c[h]&&(h=g);let d=[];for(let g=h;g>=0;g=l[g])d.push({run:f[g],trim:p[g]});if(d.reverse(),d.reduce((g,{run:b,trim:w})=>g+b.qe-b.qs-w,0)<t)break;s.push(d);let m=d[0],y=d.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 d)i.query.push([g.qs+b,g.qe]),i.target.push(g.flipped?[g.ts,g.te-b]:[g.ts+b,g.te]);f=f.flatMap(g=>{let b=g.flipped?a.flipped:a.forward;return So(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<=wo)for(let a of i){let f=a-s,c=o.get(f);if(c&&s<=c.qe)c.qe=s+D,c.te=a+D;else{let l={qs:s,qe:s+D,ts:a,te:a+D,flipped:!1};o.set(f,l),n.push(l)}}}return n}function vo(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 f=i.qs+a;if(s){let c=i.flipped?i.te-a:s.te,l=i.flipped?s.ts:i.ts+a,p=t.slice(c,l);o(e.slice(s.qe,f),i.flipped?De(p):p,n,s.qe,c)}ae(n,"=",i.qe-f),s=i}}function Bt(r,e,t){ae(t,"I",r.length),ae(t,"D",e.length)}function Kn(r,e,t){r.length*e.length<=Ht?Yn(r,e,t):Bt(r,e,t)}function Gt(r,e,t,n=0){let[o]=r.length*e.length>Ht&&n<xo?$t(Ft(r,e),1/0,D,Vn,1):[];if(!o){Kn(r,e,t);return}let s=(f,c,l)=>{Gt(f,c,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 Io(r,e,t){Gt(r,e,t)}function Ao(r,e,t){let n=[];Qe(r,e,t,n,Io);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 Eo(r,e,t,n){let o=[];if(r.length*e.length<=Ht)Yn(r,e,t);else{let s=$t(vo(r,e),1/0,Math.max(n,D),Vn),i=s.find(a=>!a[0].run.flipped);if(o=s.filter(a=>a[0].run.flipped).map(a=>Ao(a,r,e)),i){let a=(l,p,h,d,u)=>{o.some(y=>d<y.queryEnd&&y.queryStart<d+l.length||u<y.targetEnd&&y.targetStart<u+p.length)?Kn(l,p,h):Gt(l,p,h)},f=i[0].run,c=i.at(-1).run;a(r.slice(0,f.qs),e.slice(0,f.ts),t,0,0),Qe(i,r,e,t,a),a(r.slice(c.qe),e.slice(c.te),t,c.qe,c.te)}else Bt(r,e,t)}return o}function Dt(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 Gn(r,e,t,n){let o=e==="query"&&r.strand==="-"?-1:1,s=0;return Dt(r,(i,a,f,c)=>{let l=e==="query"?f:c,p=h=>{let d=l+o*h;return d>=t&&d<n};if(i==="="||i==="X")for(let h=0;h<a;h++)p(h)&&(s+=i==="="?Wn:qt);else if(i==="I"==(e==="query"))for(let h=0;h<a;h++)p(h)&&(s+=h===0?B:ee);else p(0)&&(s+=B+(a-1)*ee)}),s}function Dn(r,e){return e==="query"?[r.queryStart,r.queryEnd]:[r.targetStart,r.targetEnd]}function Co(r,e){let t=r.strand==="-",n=[],o=0,s=0,i=0,a=0,f=new Uint8Array(r.queryEnd-r.queryStart);for(let[d,u]of r.shared)f.fill(1,d-r.queryStart,u-r.queryStart);let c=d=>f[d-r.queryStart]===1,l=()=>{ae(n,"I",o),ae(n,"D",s),o=0,s=0};Dt(r,(d,u,m)=>{if(d==="I")o+=u;else if(d==="D")s+=u;else{for(let y=0;y<u;y++)e[i+y]?(o+=1,s+=1,c(t?m-y:m+y)&&(a+=1)):((o>0||s>0)&&l(),ae(n,d,1));i+=u}}),l();let p={I:0,D:0};for(;n[0]?.[0]==="I"||n[0]?.[0]==="D";){let[d,u]=n.shift();p[d]+=u}let h={I:0,D:0};for(;n.at(-1)?.[0]==="I"||n.at(-1)?.[0]==="D";){let[d,u]=n.pop();h[d]+=u}return n.length===0?void 0:{...r,queryStart:r.queryStart+(t?h.I:p.I),queryEnd:r.queryEnd-(t?p.I:h.I),targetStart:r.targetStart+p.D,targetEnd:r.targetEnd-h.D,edits:n,sharedBases:r.sharedBases-a}}function Ro(r,e,t,n){let o={query:new Uint8Array(e),target:new Uint8Array(t)},s=r.map(c=>{let l=[];Dt(c,(p,h,d,u)=>{if(p==="="||p==="X")for(let m=0;m<h;m++)l.push([c.strand==="-"?d-m:d+m,u+m])});for(let[p,h]of l)o.query[p]=Math.min(255,o.query[p]+1),o.target[h]=Math.min(255,o.target[h]+1);return l}),i={query:new Map,target:new Map};s.forEach((c,l)=>{for(let[p,h]of c)for(let[d,u]of[["query",p],["target",h]])if(o[d][u]>1){let m=i[d].get(u);m?m.at(-1)!==l&&m.push(l):i[d].set(u,[l])}});let a=new Map,f=(c,l,p)=>{let h=`${p}:${c}:${l}`,d=a.get(h);if(d===void 0){let[u,m]=Dn(r[c],p),[y,x]=Dn(r[l],p),S=Math.max(u,y),g=Math.min(m,x),[b,w]=[r[c],r[l]];d=[Gn(w,p,S,g)-Gn(b,p,S,g),w.sharedBases-b.sharedBases,c-l].find(I=>I!==0)>0,a.set(h,d)}return d};return r.flatMap((c,l)=>{let p=s[l],h=new Uint8Array(p.length);if(p.forEach(([m,y],x)=>{for(let[S,g]of[["query",m],["target",y]])!h[x]&&i[S].get(g)?.some(b=>b!==l&&f(l,b,S))&&(h[x]=1)}),!h.includes(1))return[c];let d=Co(c,h),u=d?.edits.reduce((m,[y,x])=>m+(y==="="?x:0),0)??0;return d&&u>=n?[d]:[]})}function zn(r,e){return r.map(t=>{let n=e(A(t));return L(t)?De(n):n}).join("")}function jn(r,e){let t=[0];for(let n of r)t.push(t.at(-1)+e(A(n)).length);return t}function Un(r){let e=new Map,t=new Map;r.forEach((i,a)=>{let f=A(i);e.has(f)?t.set(f,a):e.set(f,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 _o(r,e,t,n){let o=Un(r),s=Un(e),i=new Map;e.forEach((p,h)=>{s[h]||i.set(A(p),[h])});let a=2*e.length,f=(p,h,d)=>p*a+2*h+(d?1:0),c=new Set;r.forEach((p,h)=>{for(let d of o[h]?[]:i.get(A(p))??[])c.add(f(h,d,L(p)!==L(e[d])))});let l=[];return r.forEach((p,h)=>{for(let d of o[h]?[]:i.get(A(p))??[]){let u=L(p)!==L(e[d]),m=u?-1:1;if(!c.has(f(h-1,d-m,u))){let y=h,x=d;for(;y<r.length&&x>=0&&x<e.length&&c.has(f(y,x,u));)y+=1,x+=m;let S=x-m;l.push({qs:t[h],qe:t[y],ts:n[Math.min(d,S)],te:n[Math.max(d,S)+1],flipped:u})}}}),l}function Xn(r,e,t,n={}){let o=zn(r,t),s=zn(e,t),i=_o(r,e,jn(r,t),jn(e,t)),a=n.minMatch??go,f=n.bases??!0,c=[];for(let l of $t(i,n.maxGap??1/0,a,bo)){let p=[],h=l[0],d=l.at(-1),{flipped:u}=h.run;Qe(l,o,s,p,f?(y,x,S,g,b)=>{for(let w of Eo(y,x,S,a)){let v=b+x.length;c.push({...w,queryStart:g+w.queryStart,queryEnd:g+w.queryEnd,targetStart:u?v-w.targetEnd:b+w.targetStart,targetEnd:u?v-w.targetStart:b+w.targetEnd,strand:u?"+":"-",edits:u?w.edits.reverse():w.edits,shared:[]})}}:Bt),c.push({queryStart:h.run.qs+h.trim,queryEnd:d.run.qe,targetStart:u?d.run.ts:h.run.ts+h.trim,targetEnd:u?h.run.te-h.trim:d.run.te,strand:u?"-":"+",edits:u?p.reverse():p,sharedBases:l.reduce((y,{run:x,trim:S})=>y+x.qe-x.qs-S,0),shared:l.map(({run:y,trim:x})=>[y.qs+x,y.qe])})}return Ro(c,o.length,s.length,a).map(({shared:l,...p})=>p).sort((l,p)=>l.queryStart-p.queryStart)}function Zn(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 zt(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(zt(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&&zt(e[s],e[a])&&(a=s),i<e.length&&zt(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 Po(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 ko(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 Mo(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 Oo(r,e,t){let[n,o]=r.strand==="+"?[r,e]:[e,r],s=n.edits.map(([c,l])=>[c,l]);er(s,t.insertion,t.deletion);for(let[c,l]of o.edits)z(s,c,l);let i=r.identity.walkForward,[a,f]=i?[r,e]:[e,r];return{strand:r.strand,refStart:n.refStart,refEnd:o.refEnd,edits:s,weight:void 0,path:[...a.path,...f.path],start:a.start,identity:{pathHandle:r.identity.pathHandle,name:r.identity.name,hapStart:r.identity.hapStart,hapEnd:e.identity.hapEnd,walkForward:i}}}function Lo(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,f)=>r[a].identity.hapStart-r[f].identity.hapStart);let s=o[0],i=r[s];for(let a of o.slice(1)){let f=r[a],c=Mo(i,f);c?(i=Oo(i,f,c),n.add(a)):(t.set(s,i),s=a,i=f)}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 To=4096;function Jn(r){let e=[];for(let t of r){let n=e[e.length-1];n&&t-n[1]<=To?n[1]=t:e.push([t,t])}return e}var No=32768,Fo=65536;function Ho(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]<=No?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 f=a.gbwt().lf(i.offset);if(!f)throw new Error(`Path ${q(e.name,e.name.fragment)} does not contain offset ${t}`);i=f}}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 c=await this.db.indexedPositionsBetween(e,t,n),l=Ho(c.map(p=>p.pos.node));await Promise.all(l.map(([p,h])=>this.db.prefetchRecords(p,h+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 f=A(o.node),c=me(o.node);this.walkedBp=t-i,await this.ensureNode(f);let l=this.record(o.node);if(s>=l.sequenceLen)throw new Error(`Offset ${s} in node ${f} of length ${l.sequenceLen}`);a.push(s,f,He(c));let p=l.sequenceLen-s;if(i<=p){a.push(i===p?0:p-i-1,f,qe(c));break}a.push(0,f,qe(c));let h=l.gbwt().lf(o.offset);if(!h)throw new Error(`No successor for GBWT position (${o.node}, ${o.offset})`);o=h,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,f]=e.pop(),c=`${a}:${f}`;if(n.has(c))continue;n.add(c),o.delete(a),this.hasNode(a)||(await this.addNode(a),s+=1);let l=In(f);if(!n.has(`${a}:${l}`)){let d=this.record(V(a,An(f))),u=i+d.sequenceLen-1;u<=t&&e.push(u,a,l)}let p=this.record(V(a,En(f))),h=i+1;if(h<=t)for(let d of p.successors()){let u=A(d),m=He(me(d));n.has(`${u}:${m}`)||e.push(h,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 f of this.record(i).successors()){let c=A(f);o.has(c)||(n.push(f,G(f)),o.add(c))}}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 f=>{let c=f.successors(),l=c[0];return l===void 0?!1:c.length>1||(await e(G(l))).successors().length>1},n=async f=>{let c=await e(G(f));return c.next!==void 0?await t(c)?{kind:"snarl-exit",snarl:[G(f),c.next]}:{kind:"chain"}:(await e(f)).next!==void 0?{kind:"chain"}:{kind:"regular"}},o=new Set,s=this.sortedHandles().flatMap(f=>this.record(f).successors()),i,a=!1;for(;!a&&s.length>0;){let f=s.shift(),c=A(f);if(!this.hasHandle(f)&&!o.has(c)){o.add(c);let l=await n(f);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(c,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),f=new Int32Array(s),c=[];for(let w=0;w<s;w++){let v=this.record(o[w]),I=v.gbwt().decompressArrays();f[w]=v.sequenceLen,c.push(I),a[w+1]=a[w]+I.nodes.length}let l=a[s],p=new Int32Array(l),h=new Int32Array(l),d=new Uint8Array(l);for(let w=0;w<s;w++){let v=c[w];p.set(v.nodes,a[w]),h.set(v.offsets,a[w])}c.length=0;for(let w=0;w<l;w++){let v=i.get(p[w]);v===void 0?p[w]=-1:(p[w]=v,d[a[v]+h[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,_+=f[k];let N=a[k]+O,F=p[N];if(F<0)break;O=h[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(d[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++)d[I+E]===0&&(C+=1);let _=!b&&C===g[w];for(let E=0;E<R;E++)if(d[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)=>jt(o.path,s.path)||o.len-s.len);let t=[],n;for(let o of this.paths){let s=t[t.length-1];s&&jt(s.path,o.path)===0?s.weight=(s.weight??0)+1:(e&&jt(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,f=Math.floor(i/n)*n,c=Math.min(n,Fo),l=4*(n+t)+c,p={spacing:n,anchorOffset:f,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 h=performance.now(),d=()=>{let M=performance.now(),U=M-h;return h=M,U};this.clearPaths(),this.records.clear();let u=this.recordReader(()=>{p.graphFetches+=1}),m=await this.db.haplotypeAnchor(e.handle,f);if(m===void 0)throw new Error(`The haplotype index names no anchor for ${q(e.name,e.name.fragment)} at offset ${f}; 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+c);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+c),{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=d();let _=await this.db.haplotypeSamplesAtNode(S.pos.node);p.rows=_.length,p.ms.rows=d();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=ie=>Math.abs(ie.offset-E.offset);U.sort((ie,no)=>he(ie)-he(no));let de;for(let ie of U)N.has(M)||(de=await this.walkAndKeep(u,ie,"anchor",O(M),g,a,l,s,N,p));N.has(M)||(H=de)}p.ms.walks=d();let Ie=H===void 0?await this.samplesOfUnwalkedContigs(v,g,b,o,N,O,p):new Map;if(p.ms.scan=d(),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 ie of U)de??=await this.entryBefore(u,ie,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=d()}return p.fallback=H,H}async walkAndKeep(e,t,n,o,s,i,a,f,c,l){let p=await this.walkFromRow(e,t,o,s,this.refInterval[0],i,a,f);l.walks.push({pathHandle:t.pathHandle,from:n,steps:p.steps,pieces:p.infos.length,end:p.end});let h;return p.end==="bound"||p.infos.length===0?h=`${q(o,t.pathOffset)} walked ${p.steps} steps from its ${n} without writing a walk through the window (${p.end})`:(c.add(t.pathHandle),this.paths.push(...p.infos)),h}async mapReferenceBefore(e,t,n,o,s,i){let a=await this.prefetchReferenceRange(t,n,o),f=a?.pos,c=a?.pathOffset??o;for(;f!==void 0&&f.node!==0&&c<o;){this.signal?.throwIfAborted();let l=await e(f.node),p=A(f.node);s.has(p)||(s.set(p,c),i.add(f.node)),c+=l.sequenceLen,f=l.gbwt().lf(f.offset)}}async runsWithReference(e,t,n,o,s){let i={node:t.node,offset:t.offset},a=0,f;for(;f===void 0;)if(this.signal?.throwIfAborted(),i===void 0||i.node===0||a>s)f=!1;else if(n.has(A(i.node)))f=o.has(i.node);else{let c=await e(i.node);a+=c.sequenceLen,i=c.gbwt().lf(i.offset)}return f}async entryBefore(e,t,n,o,s,i){let a=(await e(t.node)).sequenceLen,f=async(d,u)=>{let m=(await e(d.node)).sequenceLen;return{node:d.node,offset:d.offset,pathHandle:t.pathHandle,orientation:t.orientation,pathOffset:t.orientation==="forward"?t.pathOffset-u:t.pathOffset+a+u-m}},c={node:t.node,offset:t.offset},l=0,p,h=!await this.runsWithReference(e,t,n,o,i);for(;!h;){this.signal?.throwIfAborted();let d=n.get(A(c.node));if(d!==void 0&&d<s)p=await f(c,l),h=!0;else if(l>i)p={...t},h=!0;else{let m=(await e(G(c.node))).gbwt().predecessorAt(c.offset);if(m===void 0)p=await f(c,l),h=!0;else{let y=await e(m),x=y.gbwt().offsetTo(c);if(x===void 0)throw new Error(`No offset in ${m} leads to ${c.node}:${c.offset}`);c={node:m,offset:x},l+=y.sequenceLen}}}return p}async walkReference(e,t,n,o,s,i){let a=new Map,f=new Set,c=[],l,p=t.pos,h=t.pathOffset,d=0;for(;p!==void 0&&p.node!==0&&h<i;){this.signal?.throwIfAborted();let u=await e(p.node),m=h+u.sequenceLen;if(l===void 0&&h===n.pathOffset){if(p.node!==n.node)throw new Error(`The reference walk reaches node ${A(p.node)} at offset ${h} where the haplotype index names node ${A(n.node)} as the anchor`);l={pos:p,offset:h}}if(l!==void 0){d+=1;let y=A(p.node);a.has(y)||(a.set(y,h),f.add(p.node)),h<s&&m>o&&c.push({pos:p,refOffset:h})}h=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:f,windowSteps:c,steps:d}}async walkFromRow(e,t,n,o,s,i,a,f){let c=(await e(t.node)).sequenceLen,l=t.orientation==="forward"?t.pathOffset:t.pathOffset+c,p=[],h=[],d=[],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?(d.push(R),u+=R.len):(u>f&&w<s?(p.push(h),h=[]):h.push(...d),d=[],u=0,h.push(R))}y+=1,m+=I.sequenceLen,g=I.gbwt().lf(g.offset)}}p.push(h);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 f=Jn([...e].sort((l,p)=>l-p));a.scans=f;let c=new Map;for(let[l,p]of f){let h=await this.db.haplotypeSamplesInRange(l,p);a.scanRows+=h.length;for(let d of h){let u=t.has(A(d.node));if(!s.has(d.pathHandle)&&(!u||n.has(d.node))&&o(i(d.pathHandle))){let m=c.get(d.pathHandle)??[];u?m.unshift(d):m.push(d),c.set(d.pathHandle,m)}}}return c}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=Jn(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}),f=u=>(i.graphLookups+=1,a(u)),c=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},h=(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},d=(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=h(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=d(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 c(v,S),_=await f(v.node);if(C){g=h(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 f=0;f<e.length;f++){let c=n.get(e[f]);if(c){let l=ko(c,a);if(l===void 0)return;o[i]=f,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 f=this.record(e[o]).sequence,c=this.record(t[s]).sequence;for(;i<f.length&&a<c.length;){if(f[i]!==c[a])return n;i+=1,a+=1,n+=1}i===f.length&&(o+=1,i=0),a===c.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 f=this.record(e[e.length-o-1]).sequence,c=this.record(t[t.length-s-1]).sequence;for(;i<f.length&&a<c.length;){if(f[f.length-i-1]!==c[c.length-a-1])return n;i+=1,a+=1,n+=1}i===f.length&&(o+=1,i=0),a===c.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),er(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??Po($n(e,t,p=>this.record(p).sequenceLen)[0]),s=[],i=this.refPrefix(t),a=(p,h,d,u)=>{p===h?z(s,"D",i[u]-i[d]):d===u?z(s,"I",this.pathLen(e.slice(p,h))):this.align(e.slice(p,h),t.slice(d,u),s)},f=0,c=0,l=0;for(let p=0;p<o.count;p++){let h=o.pathAt[p],d=o.refAt[p];(c!==h||l!==d)&&a(c,h,l,d);let u=this.record(e[h]).sequenceLen;z(s,"M",u),f+=u,c=h+1,l=d+1}return a(c,e.length,l,t.length),{edits:s,matched:f}}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(Cn(n))o={edits:this.editsAgainst(t.path,n).edits,flipped:!1};else{let s=t.path.map(f=>G(f)).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 f=this.editsAgainst(t.path,n),c=this.editsAgainst(s,n);o=c.matched>f.matched?{edits:c.edits,flipped:!0}:{edits:f.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:f}=this.alignment(i),c=0,l=0;for(;c<a.length&&a[c][0]==="D";)l+=a[c][1],c+=1;let p=a.length,h=0;for(;p>c&&a[p-1][0]==="D";)h+=a[p-1][1],p-=1;let d=s.identity,u=d?d.orientation==="forward"!==f:!f;o.push({strand:u?"+":"-",refStart:e.start+l,refEnd:e.start+n-h,edits:a.slice(c,p),weight:s.weight,path:s.path,start:Ye(s,0),identity:d===void 0?void 0:{pathHandle:d.pathHandle,name:d.name,hapStart:d.name.fragment+d.hapStart,hapEnd:d.name.fragment+d.hapEnd,walkForward:d.orientation==="forward"}})}),Lo(o).map(s=>{let{edits:i,identity:a,...f}=s,c={...f,cigar:$o(i)};return a?{...c,resolved:!0,name:a.name,label:q({...a.name,fragment:a.hapStart},a.hapEnd),pathHandle:a.pathHandle,hapStart:a.hapStart,hapEnd:a.hapEnd}:{...c,resolved:!1}})}pairAlignments(e){let{target:t,query:n,...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),f=n?i(n):l=>!a(l),c=l=>this.record(V(l,"forward")).sequence;return s.filter(l=>a(l.name)).flatMap(l=>s.filter(p=>f(p.name)).flatMap(p=>Xn(p.steps,l.steps,c,o).map(h=>({query:p.name,queryStart:p.start+h.queryStart,queryEnd:p.start+h.queryEnd,strand:h.strand,target:l.name,targetStart:l.start+h.targetStart,targetEnd:l.start+h.targetEnd,cigar:Zn(h.edits),matches:h.edits.reduce((d,[u,m])=>d+(u==="="?m:0),0),columns:h.edits.reduce((d,[,u])=>d+u,0),sharedBases:h.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,f]of this.canonicalEdges(o))s+=`L ${o} ${i?"-":"+"} ${a} ${f?"-":"+"}
3
+ `;t.push(e.encode(s))}return Hn(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",...Fn(Nn(await this.stableName(),await this.db.graphName()))],o=this.sortedHandles();for(let c of o)L(c)||n.push(`S ${A(c)} ${this.record(c).sequence}`);let s=c=>L(c)?"-":"+";for(let c of o)for(let l of this.record(c).successors())this.hasHandle(l)&&ge(c,l)&&n.push(`L ${A(c)} ${s(c)} ${A(l)} ${s(l)} 0M`);let i=(c,l,p,h,d)=>{let u=Ke(c,l).map(x=>`${L(x)?"<":">"}${A(x)}`).join(""),m=c.weight===void 0?"":` WT:i:${c.weight}`,y=d===void 0?"":` CG:Z:${d}`;return`W ${p.sample} ${p.haplotype} ${p.contig} ${p.fragment} ${h} ${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 f=1;return this.paths.forEach((c,l)=>{if(l!==this.refId){let p=e.names==="resolved"?c.identity:void 0,h=t?this.alignToRef(l):void 0;n.push(p?i(c,p,{...p.name,fragment:p.name.fragment+p.hapStart},p.name.fragment+p.hapEnd,h):i(c,void 0,{sample:"unknown",contig:a,haplotype:f,fragment:0},c.len,h)),f+=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 f=e.names==="resolved"?i.identity:void 0;n.push({info:i,identity:f,name:f?q({...f.name,fragment:f.name.fragment+f.hapStart},f.name.fragment+f.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=>qo(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 qo(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 jt(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 er(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 $o(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 tr(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 f=new Pe(r,o);try{let c=await f.pathPosition(Re(e,t));a=await f.walkHaplotypesFromAnchor(c,n-t,s,o.keep,o.context??100)}catch(c){throw c instanceof X&&c.windowBp===void 0?new X(c.limit,{windowBp:n-t,walkedBp:f.referenceWalkedBp??0}):c}if(a===void 0)i=f;else{a=`${a}; identified from the per-path samples instead`;let c=await Xe(r,e,t,n,o);await c.identifyPaths(),c.keepHaplotypes(o.keep),c.stats.anchorWalk=f.stats.anchorWalk,c.stats.anchorWalk&&(c.stats.anchorWalk.fallback=a),i=c}}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 Bo(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 Go=new TextDecoder;function Ze(r){let[e,t]=Z(r,0),n=[],o=t;for(;o<e;){let[a,f]=Z(r,o);n.push(a),o=f}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 f=a<=4?a:a===5?6:8,c=Bo(s,i,f);return i+=f,c}if(a===7){let f=s.getFloat64(i);return i+=8,f}if(a===8)return 0;if(a===9)return 1;if(a>=12){let f=a-12>>1,c=r.subarray(i,i+f);return i+=f,a%2===0?c:Go.decode(c)}throw new Error(`SQLite serial type ${a} is reserved`)})}var ke=2,et=5,rr=10,Je=13;function or(r,e){return r[e]*256+r[e+1]}function re(r,e){return r[e]*16777216+r[e+1]*65536+r[e+2]*256+r[e+3]}function Do(r,e){let t=r[e];if(t!==ke&&t!==et&&t!==rr&&t!==Je)throw new Error(`SQLite page has unknown b-tree type ${t}`);let n=t===ke||t===et;return{type:t,cellCount:or(r,e+3),rightChild:n?re(r,e+8):0,cellPointers:e+(n?12:8)}}function te(r,e,t){return or(r,e.cellPointers+2*t)}var zo=4096,jo=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,f=re(e,t+s);for(;f!==0&&a<n;){let c=await this.pager.page(f),l=c.subarray(4,4+Math.min(this.usable-4,n-a));i.set(l,a),a+=l.length,f=re(c,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:Do(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 f=this.childIndexFor(i,a,t);o=f===a.cellCount?a.rightChild:re(i,te(i,a,f))}})(),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,te(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(c=>this.pageAt(c))),f=[];if(a.forEach(({page:c,header:l},p)=>{let h=p===0?this.childIndexFor(c,l,t):0,d=p===a.length-1?this.childIndexFor(c,l,n):l.cellCount;for(let u=h;u<=d;u++)f.push(u===l.cellCount?l.rightChild:re(c,te(c,l,u)))}),f.length>jo)return!1;this.pager.prefetch(f),s=f}return!0}async tableRowid(e,t){let n=e;for(;;){let{page:o,header:s}=await this.pageAt(n);if(s.type===Je){let f=0,c=s.cellCount;for(;f<c;){let l=f+c>>1,p=te(o,s,l),[h,d]=Z(o,p),[u,m]=Z(o,d);if(u===t)return Ze(await this.payload(o,m,h,!1));u<t?f=l+1:c=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 f=i+a>>1,c=te(o,s,f),[l]=Z(o,c+4);l<t?i=f+1:a=f}n=i===s.cellCount?s.rightChild:re(o,te(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=te(t,n,o),[i,a]=Z(t,s),[f,c]=Z(t,a);yield{rowid:f,values:Ze(await this.payload(t,c,i,!1))}}else{let o=[];for(let s=0;s<n.cellCount;s++)o.push(re(t,te(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>=zo){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=te(t,n,o),f=n.type===ke,[c,l]=Z(t,f?a+4:a);i={values:Ze(await this.payload(t,l,c,!0)),leftChild:f?re(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,f=await this.indexCell(e,n,o,a);nr(f.values,t)<0?s=a+1:i=a}for(let a=s;a<o.cellCount;a++){let f=await this.indexCell(e,n,o,a);o.type===ke&&(yield*this.indexScanFrom(f.leftChild,t)),yield f.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,f=i.cellCount,c=0;for(;a<f;){let l=a+f>>1,p=await this.indexCell(o,s,i,l);nr(p.values,t)<=0?(n=p.values,a=l+1):(c=p.leftChild,f=l)}if(i.type===rr)return n;o=a===i.cellCount?i.rightChild:c}}};function nr(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 f=a*this.blockSize;i.push(e+a),this.blocks.set(e+a,s.then(c=>c.subarray(f,f+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),f=a.getUint16(16),c=f===1?65536:f,l=s[20]??0,p=a.getUint32(56);if(p!==1)throw new Error(`SQLite text encoding ${p} is not UTF-8`);let h=new nt(e,c,n,t);h.seed(0,o),h.fetches+=1,h.bytesFetched+=o.length;let d=new tt(h,l),u=new Map;for await(let{values:m}of d.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(h,d,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 Wt="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 "${Wt}"`),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=Pn(o)}get id(){return A(this.handle)}get orientation(){return me(this.handle)}get sequence(){return this.decoded??=kn(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 Ut(r,e){if(!(r instanceof Uint8Array))throw new Error(`${e} is not a blob in the database`);return r}function sr(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 ir(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 c of["Tags","Nodes","Paths","ReferenceIndex"])s.rootPage(c);let i=n?await Me.open(n,o):s,a=new r(s,i),f=await a.tag("version");if(f!==Wt)throw new ot(f);if(n){for(let d of["Tags","HaplotypeSamples","HaplotypeLengths"])i.rootPage(d);a.indexTags=await ir(i);let c=a.indexTags.get("haplotype_index_paths"),l=await a.tag("paths");if(c!==l)throw new Error(`haplotype index was built for ${c??"an unknown number of"} paths but the graph has ${l}`);let p=a.indexTags.get("haplotype_index_nodes"),h=await a.tag("nodes");if(p!==void 0&&p!==h)throw new Error(`haplotype index was built for a graph with ${p} nodes but this one has ${h}`)}if(a.hasHaplotypeIndex&&await a.haplotypeIndexTag("haplotype_index_orientations")==="forward")throw new rt;return a}tags(){return this.tagCache??=ir(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,_n(Ut(t[1],"Nodes.edges")),Ut(t[2],"Nodes.bwt"),Ut(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(sr(t,n));return e})(),this.pathCache}async getPath(e){let t=await this.sqlite.byRowid("Paths",e);return t?sr(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(qn(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(f=>f.name.fragment<=t).slice(-1),i=o.filter(f=>f.name.fragment>t&&f.name.fragment<n);return(await Promise.all([...s,...i].map(async f=>({path:f,start:f.name.fragment,end:f.name.fragment+await this.pathLength(f.handle)})))).filter(f=>t<f.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:f,haplotype:c}=e.path.name,l={sample:a,contig:f,haplotype:c},p=Math.max(t,e.start),h=Math.min(n,e.end),d=o.haplotypes??"all",u=d==="all"||d==="distinct",m;return s!==void 0&&d==="all"?m=await tr(this,l,p,h,{...i,keep:s}):(m=await Xe(this,l,p,h,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=Tn(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 eo=Y(Sn(),1),dn=Y(Ae(),1),un=Y(oo(),1),to=Y(so(),1);var Xr=Y(Sn(),1),Zr=Y(Ae(),1);var Qt=function(r,e){return Qt=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])},Qt(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");Qt(r,e);function t(){this.constructor=r}r.prototype=e===null?Object.create(e):(t.prototype=e.prototype,new t)}function ar(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{c(n.next(l))}catch(p){i(p)}}function f(l){try{c(n.throw(l))}catch(p){i(p)}}function c(l){l.done?s(l.value):o(l.value).then(a,f)}c((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(c){return function(l){return f([c,l])}}function f(c){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,c[0]&&(t=0)),t;)try{if(n=1,o&&(s=c[0]&2?o.return:c[0]?o.throw||((s=o.return)&&s.call(o),0):o.next)&&!(s=s.call(o,c[1])).done)return s;switch(o=0,s&&(c=[c[0]&2,s.value]),c[0]){case 0:case 1:s=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,o=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(s=t.trys,!(s=s.length>0&&s[s.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!s||c[1]>s[0]&&c[1]<s[3])){t.label=c[1];break}if(c[0]===6&&t.label<s[1]){t.label=s[1],s=c;break}if(s&&t.label<s[2]){t.label=s[2],t.ops.push(c);break}s[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(r,t)}catch(l){c=[6,l],o=0}finally{n=s=0}if(c[0]&5)throw c[1];return{value:c[0]?c[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 fr(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(d){return function(u){return Promise.resolve(u).then(d,p)}}function a(d,u){n[d]&&(o[d]=function(m){return new Promise(function(y,x){s.push([d,m,y,x])>1||f(d,m)})},u&&(o[d]=u(o[d])))}function f(d,u){try{c(n[d](u))}catch(m){h(s[0][3],m)}}function c(d){d.value instanceof le?Promise.resolve(d.value.v).then(l,p):h(s[0][2],d)}function l(d){f("next",d)}function p(d){f("throw",d)}function h(d,u){d(u),s.shift(),s.length&&f(s[0][0],s[0][1])}}function cr(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,f){i=r[s](i),o(a,f,i.done,i.value)})}}function o(s,i,a,f){Promise.resolve(f).then(function(c){s({value:c,done:a})},i)}}function P(r){return typeof r=="function"}function lr(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=lr(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 Yt(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),f=a.next();!f.done;f=a.next()){var c=f.value;c.remove(this)}}catch(m){e={error:m}}finally{try{f&&!f.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 h=ce(p),d=h.next();!d.done;d=h.next()){var u=d.value;try{pr(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{d&&!d.done&&(o=h.return)&&o.call(h)}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)pr(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)&&Yt(t,e)},r.prototype.remove=function(e){var t=this._finalizers;t&&Yt(t,e),e instanceof r&&e._removeParent(this)},r.EMPTY=(function(){var e=new r;return e.closed=!0,e})(),r})();var Ai=ct.EMPTY;function lt(r){return r instanceof ct||r&&"closed"in r&&P(r.remove)&&P(r.add)&&P(r.unsubscribe)}function pr(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 Vt(){}var hr=(function(){return Kt("C",void 0,void 0)})();function dr(r){return Kt("E",void 0,r)}function ur(r){return Kt("N",r,void 0)}function Kt(r,e,t){return{kind:r,value:e,error:t}}var pe=null;function mr(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 gr(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=Yo,n}return e.create=function(t,n,o){return new dt(t,n,o)},e.prototype.next=function(t){this.isStopped?Zt(ur(t),this):this._next(t)},e.prototype.error=function(t){this.isStopped?Zt(dr(t),this):(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped?Zt(hr,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 Uo=Function.prototype.bind;function Xt(r,e){return Uo.call(r,e)}var Wo=(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&&Xt(t.next,a),error:t.error&&Xt(t.error,a),complete:t.complete&&Xt(t.complete,a)}):i=t}return s.destination=new Wo(i),s}return e})(Te);function ht(r){K.useDeprecatedSynchronousErrorHandling?gr(r):pt(r)}function Qo(r){throw r}function Zt(r,e){var t=K.onStoppedNotification;t&&be.setTimeout(function(){return t(r,e)})}var Yo={closed:!0,next:Vt,error:Qo,complete:Vt};var Se=(function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"})();function yr(r){return r}function wr(r){return r.length===0?yr: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=Ko(e)?e:new dt(e,t,n);return mr(function(){var i=o,a=i.operator,f=i.source;s.add(a?a.call(s,f):f?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=xr(t),new t(function(o,s){var i=new dt({next:function(a){try{e(a)}catch(f){s(f),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 wr(e)(this)},r.prototype.toPromise=function(e){var t=this;return e=xr(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 xr(r){var e;return(e=r??K.Promise)!==null&&e!==void 0?e:Promise}function Vo(r){return r&&P(r.next)&&P(r.error)&&P(r.complete)}function Ko(r){return r&&r instanceof Te||Vo(r)&&lt(r)}function Xo(r){return P(r?.lift)}function W(r){return function(e){if(Xo(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 ne(r,e,t,n,o){return new Zo(r,e,t,n,o)}var Zo=(function(r){Le(e,r);function e(t,n,o,s,i,a){var f=r.call(this,t)||this;return f.onFinalize=i,f.shouldUnsubscribe=a,f._next=n?function(c){try{n(c)}catch(l){t.error(l)}}:r.prototype._next,f._error=s?function(c){try{s(c)}catch(l){t.error(l)}finally{this.unsubscribe()}}:r.prototype._error,f._complete=o?function(){try{o()}catch(c){t.error(c)}finally{this.unsubscribe()}}:r.prototype._complete,f}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 Jo(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var xt=Jo();function bt(r){return P(r?.[xt])}function St(r){return fr(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 es(r);if(ut(r))return ts(r);if(mt(r))return ns(r);if(yt(r))return br(r);if(bt(r))return rs(r);if(vt(r))return os(r)}throw wt(r)}function es(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 ts(r){return new j(function(e){for(var t=0;t<r.length&&!e.closed;t++)e.next(r[t]);e.complete()})}function ns(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 rs(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 br(r){return new j(function(e){ss(r,e).catch(function(t){return e.error(t)})})}function os(r){return br(St(r))}function ss(r,e){var t,n,o,s;return ar(this,void 0,void 0,function(){var i,a;return at(this,function(f){switch(f.label){case 0:f.trys.push([0,5,6,11]),t=cr(r),f.label=1;case 1:return[4,t.next()];case 2:if(n=f.sent(),!!n.done)return[3,4];if(i=n.value,e.next(i),e.closed)return[2];f.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return a=f.sent(),o={error:a},[3,11];case 6:return f.trys.push([6,,9,10]),n&&!n.done&&(s=t.return)?[4,s.call(t)]:[3,8];case 7:f.sent(),f.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(ne(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 Sr(r,e){return J(r).pipe(At(e),It(e))}function vr(r,e){return J(r).pipe(At(e),It(e))}function Ir(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 Ar(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 Er(r,e){return Et(St(r),e)}function Cr(r,e){if(r!=null){if(gt(r))return Sr(r,e);if(ut(r))return Ir(r,e);if(mt(r))return vr(r,e);if(yt(r))return Et(r,e);if(bt(r))return Ar(r,e);if(vt(r))return Er(r,e)}throw wt(r)}function Jt(r,e){return e?Cr(r,e):J(r)}function Ne(r,e){return W(function(t,n){var o=0;t.subscribe(ne(n,function(s){n.next(r.call(e,s,o++))}))})}function Rr(r,e,t,n,o,s,i,a){var f=[],c=0,l=0,p=!1,h=function(){p&&!f.length&&!c&&e.complete()},d=function(m){return c<n?u(m):f.push(m)},u=function(m){s&&e.next(m),c++;var y=!1;J(t(m,l++)).subscribe(ne(e,function(x){o?.(x),s?d(x):e.next(x)},function(){y=!0},void 0,function(){if(y)try{c--;for(var x=function(){var S=f.shift();i?Q(e,i,function(){return u(S)}):u(S)};f.length&&c<n;)x();h()}catch(S){e.error(S)}}))};return r.subscribe(ne(e,d,function(){p=!0,h()})),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 Rr(n,o,r,t)}))}function _r(r,e,t,n,o){return function(s,i){var a=t,f=e,c=0;s.subscribe(ne(i,function(l){var p=c++;f=a?r(f,l,p):(a=!0,l),n&&i.next(f)},o&&(function(){a&&i.next(f),i.complete()})))}}function Pr(r,e){return W(_r(r,e,arguments.length>=2,!1,!0))}var is=function(r,e){return r.push(e),r};function Ct(){return W(function(r,e){Pr(is,[])(r).subscribe(e)})}function kr(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 nn(r){let e="";for(let{own:t,mate:n,op:o}of kr(r))e+=o==="M"?t===0?`${n}I`:n===0?`${t}D`:`${t}M`:`${o==="I"?n:t}${o}`;return e}var en=2**28-1;function tn(r,e,t){for(let n=e;n>0;n-=en)r.push((Math.min(n,en)<<4|t)>>>0)}function as(r,e,t){if(e===t)tn(r,e,0);else{let n=Math.ceil(Math.max(e,t)/en);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 rn(r){let e=[];for(let{own:t,mate:n,op:o}of kr(r))o==="M"?as(e,t,n):o==="I"?tn(e,n,1):tn(e,t,o==="N"?3:2);return Uint32Array.from(e)}function fs(r){return r>=48&&r<=57}function cs(r){return r!==void 0&&/[A-Za-z]/.test(r)}function Mr(r,e){let t=e;for(;t<r.length&&cs(r[t]);)t++;return t}function Or(r,e){let t=e,n=0;for(;t<r.length&&fs(r.charCodeAt(t));)n=n*10+(r.charCodeAt(t)-48),t++;return{value:n,next:t}}function Hr(r,e){let t=0;for(;t<r.length;){let n=r[t];if(n===":"){let{value:o,next:s}=Or(r,t+1);e(":",o,o,t+1,s),t=s}else if(n==="="){let o=Mr(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=Mr(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}=Or(r,t+3),i=Math.min(s+2,r.length);e("~",o,0,t+1,i),t=i}else t++}}function on(r,e,t,n){let o=t??Number.NEGATIVE_INFINITY,s=n??Number.POSITIVE_INFINITY,i=0;Hr(r,(a,f,c,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 h=r.slice(l,p);e(73,i,c,h,-1,0,c)}}else(a==="-"||a==="~")&&i<s&&i+f>o&&e(a==="-"?68:78,i,f,"",-1,0,0);i+=f})}function qr(r,e,t,n){let o=0,s=0,i=[],a=t&&e;for(let f=0,c=r.length;f<c;f++){let l=r[f],p=l>>>4,h=l&15;if(h===0||h===7){if(a)for(let d=0;d<p;d++)(e.charCodeAt(s+d)|32)!==(t.charCodeAt(o+d)|32)&&i.push({start:o+d,type:"mismatch",base:e[s+d],altbase:t[o+d],length:1});s+=p,o+=p}else if(h===1)i.push({start:o,type:"insertion",insertlen:p,insertedBases:e?.slice(s,s+p),length:0}),s+=p;else if(h===2)i.push({start:o,type:"deletion",length:p}),o+=p;else if(h===3)i.push({start:o,type:"skip",length:p}),o+=p;else if(h===8){for(let d=0;d<p;d++)i.push({start:o+d,type:"mismatch",base:e?.[s+d]||"X",qual:n?.[s+d],length:1});s+=p,o+=p}else h===5?i.push({start:o,type:"hardclip",cliplen:p,length:1}):h===4&&(i.push({start:o,type:"softclip",cliplen:p,length:1}),s+=p)}return i}function $r(r,e,t,n,o){if(!e)return[];let s=[],i=e.length,a=n.length,f=o!==void 0,c=t.length,l=!1;for(let S=0;S<c;S++)if(t[S].type==="skip"){l=!0;break}let p=0,h=0,d=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&&c>0)for(let R=m;R<c;R++){let C=t[R];C.type==="skip"&&p>=C.start&&(p+=C.length,m=R+1)}let b=d,w=u;for(let R=h;R<i&&w<=p;R++,h=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+=_)}d=b,u=w;let v=b-(w-p),I=v<a?n[v]:"X";s.push({start:p,base:I,qual:f?o[v]:void 0,altbase:g,length:1,type:"mismatch"}),p++}else y++}return s}var Br={77:0,73:1,68:2,78:3,83:4,72:5,80:6,61:7,88:8};function Gr(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=Br[s];t.push(e<<4|i),e=0}}return t}function fn(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|Br[a],n=0)}return t}function Mt(r,e,t,n,o){let s=Gr(r),i=r?qr(s,t,n,o):[];return e&&t?i.concat($r(e,s,i,t,o)):i}var hs=397,ds=387,us=385;function Dr(r){return(1<<r&hs)!==0}function zr(r){return(1<<r&ds)!==0}function jr(r){return(1<<r&us)!==0}function cn(r,e,t,n,o,s,i){let a=o===-1?-1:1,f=e,c=o===-1?n:t,l=[],p=1/0,h=-1/0,d=1/0,u=-1/0,m=(y,x)=>{d=Math.min(d,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||Dr(g)?S:0,v=b?r[++y]>>>4:zr(g)?S:0,I=f+w,R=c+v*a,C=f,_=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),h=Math.max(h,k),b){let O=v/S,N=k-E,F=Math.round(N*O),H=Math.round(c+(E-f)*O*a);l.push(N<<4|9,F<<4|9),m(H,H+F*a)}else l.push(k-E<<4|g),jr(g)?m(c+(E-f)*a,c+(k-f)*a):m(c,c)}else v>0&&(b?l.push(x,r[y]):l.push(x),p=Math.min(p,f),h=Math.max(h,f),m(c,R));if(f=I,c=R,f>i)break}if(l.length!==0)return{start:p,end:h,mateStart:d,mateEnd:u,cigar:Uint32Array.from(l)}}function ms(r){return r===1||r===2||r===3}function ln(r,e,t,n,o,s){let i=o===-1?-1:1,a=[],f=e,c=o===-1?n:t,l,p=!1,h=()=>{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 d=0;d<r.length;d++){let u=r[d],m=u>>>4,y=u&15,x=y===9,S=x?r[++d]:void 0,g=x||Dr(y)?m:0,b=S!==void 0?S>>>4:zr(y)?m:0,w=c+b*i;ms(y)&&m>=s?h():(g>0||b>0)&&(l===void 0&&(l={qLo:f,qHi:f,tLo:c,tHi:c,ops:[]}),l.qHi=f+g,l.tLo=Math.min(l.tLo,c,w),l.tHi=Math.max(l.tHi,c,w),l.ops.push(u),S!==void 0&&l.ops.push(S),p=p||x||jr(y)),f+=g,c=w}return h(),a}function Ur(r){let e=r.get("CIGAR");return typeof e=="string"?e:void 0}function Wr(r){let e=r.get("coarseCigar");return typeof e=="string"?e:void 0}function pn(r){let e=Ur(r),t=e===void 0?Wr(r):void 0;return e!==void 0?fn(e):t!==void 0?rn(t):void 0}var gs=Y(Ae(),1),ys=Y(Yr(),1);var ws=Y(Ae(),1);var xs=Y(io(),1);var Vr=Y(Ae(),1),oe=class extends Vr.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"?nn(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)on(i,e,o,s);else{let a=o??Number.NEGATIVE_INFINITY,f=s??Number.POSITIVE_INFINITY;for(let c of Mt(this.walkableCigar))(c.type==="deletion"||c.type==="skip"?c.start<f&&c.start+c.length>a:c.start>=a&&c.start<=f)&&(c.type==="mismatch"?e(88,c.start,c.length,c.base,c.qual??-1,0,0):c.type==="insertion"?e(73,c.start,c.length,c.insertedBases??"",-1,0,c.insertlen):c.type==="deletion"?e(68,c.start,c.length,"",-1,0,0):c.type==="skip"&&e(78,c.start,c.length,"",-1,0,0))}}};var bs=["CIGAR","cs","coarseCigar","cg","cr"];function Ss(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 vs(r){let e=r.get("mate");return Ss(e)?e:void 0}function Is(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,f=Math.round(a(o)),c=Math.round(a(s));return s>o?{start:o,end:s,mateStart:Math.min(f,c),mateEnd:Math.max(f,c)}:void 0}function As(r,e,t,n,o){let s={start:r.get("start"),end:r.get("end")},i=r.get("strand")===-1?-1:1,a=s.start>=t.start&&s.end<=t.end,f=a&&n===void 0&&!o?void 0:pn(r);if(f===void 0){let c=a?{...s,mateStart:e.start,mateEnd:e.end}:Is(s,e,i,t);return c===void 0?[]:[c]}else return(n===void 0?[{...s,mateStart:e.start,mateEnd:e.end,cigar:f}]:ln(f,s.start,e.start,e.end,i,n)).flatMap(l=>{let p=cn(l.cigar,l.start,l.mateStart,l.mateEnd,i,t.start,t.end);return p===void 0?[]:[p]})}function Es(r,e,t,n,o,s){let i=`:${n.start}-${n.end}${o}`,a=r.toJSON(),f={...a,uniqueId:`${r.id()}${i}`,start:t.start,end:t.end,mate:{...e,start:t.mateStart,end:t.mateEnd}};a.syntenyId!==void 0&&(f.syntenyId=`${String(a.syntenyId)}${i}`);for(let c of bs)delete f[c];return s&&t.cigar&&(f.alignmentOps=t.cigar),new oe(f)}function Kr(r,e,t,n=!1){let o=vs(r);if(o===void 0)return[r];{let s=As(r,o,e,t,n);return s.map((i,a)=>Es(r,o,i,e,s.length>1?`/${a}`:"",n))}}var Ot=class extends Xr.BaseFeatureDataAdapter{constructor(){super(...arguments);this.recordsAreAlignments=!0}static{this.capabilities=["getFeatures","getRefNames"]}async hasDataForRefName(){return!0}getFeaturesInMultipleRegions(t,n={}){let{clipToRegion:o,splitAtGapBp:s,keepAlignment:i,...a}=n,f=o&&this.recordsAreAlignments,c=(0,Zr.createStatusFanOut)(a.statusCallback);return Jt(t).pipe(ve((l,p)=>this.getFeatures(l,{...a,statusCallback:c()}).pipe(ve(h=>f?Kr(h,h.get("assemblyName")===l.assemblyName?l:{start:h.get("start"),end:h.get("end")},s,i):[h]),Ct(),Ne(h=>({index:p,features:h})))),Ct(),ve(l=>l.sort((p,h)=>p.index-h.index).flatMap(p=>p.features)))}};var mn=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"}},gn=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 se(r){return`${r.sample}#${r.haplotype}`}var yn=class extends Error{constructor(t){super(`a pair query names both lanes: queryAssemblyName ${t} came without a targetAssemblyName`);this.name="PairTargetError"}};function Cs(r,e){let t=se(r);return e===void 0||e.some(n=>Ee(t,n))}var wn=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"}},xn=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 hn(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 xn(e,t,Math.max(s,1))}else return}function Jr(r,e){let t=se(e);return r[t]??r[e.sample]??t}function Rs({configured:r,anchorPrefix:e,referenceSamples:t}){let n=vn(e);if(r!=="")return r;if(t.includes(n))return n;if(t.length===1)return t[0];throw new gn(e,t)}function _s(r,e){return`${se(r)}#${r.contig}@${e.start.node}.${e.start.offset}`}function Ps({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:f,hapStart:c,hapEnd:l}=r,p=_s(f,r),h={uniqueId:p,assemblyName:e,refName:t,start:o,end:s,type:"match",strand:i==="-"?-1:1,CIGAR:a,syntenyId:p,mate:{refName:f.contig,start:c,end:l,assemblyName:n}};return new oe(h)}}function ks({pair:r,lane:e,mateLane:t}){let n=`${se(r.target)}#${r.target.contig}:${r.targetStart}-${r.targetEnd}|${se(r.query)}#${r.query.contig}:${r.queryStart}-${r.queryEnd}`;return new oe({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 bn=class extends Ot{constructor(){super(...arguments);this.graph=(0,eo.cachedSetup)({label:"Opening pangenome database",setup:async()=>{let t=this.getConf("haplotypeIndexLocation"),n=!("uri"in t)||t.uri!=="",o=await Oe.open((0,un.openLocation)(this.getConf("gbzDbLocation"),this.pluginManager),n?{haplotypeIndex:(0,un.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(f=>f!==""),a=Rs({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=se(i.name),f=s.get(a);f?f.contigs.includes(i.name.contig)||f.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 f of await this.getHaplotypes(t))f.sample!==o&&a.push({name:Jr(i,f),label:f.prefix,group:f.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),f=(await n.paths()).filter(c=>i===o?c.isIndexed&&c.name.sample===s:Ee(se(c.name),a)).map(c=>c.name.contig);return[...new Set(f)]}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=>Cs(s,o)&&(n===void 0||Ee(se(s),n))}async getSubgraph(t,n={}){let{db:o,anchor:s}=await this.graph(),{assemblyName:i,refName:a,start:f,end:c}=t;if(i!==s)throw new wn(i,s);let l=await this.referenceQuery(a,{}),p=this.getConf("nodeLimit"),h=this.keepPredicate(n.haplotypes),d=l?await o.getSubgraphForRange(l,f,c,{context:this.getConf("context"),snarls:this.getConf("subgraphSnarls"),haplotypes:"all",limit:p,signal:n.signal,...h===void 0?{}:{keep:h}}).catch(u=>{throw hn(u,p,c-f)??u}):void 0;return d?d.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),f=(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),c=[n,...[...new Set(f)].sort((l,p)=>l-p),o];return c.slice(1).map((l,p)=>({start:c[p],end:l}))}async anchorFeatures(t,n){let{db:o}=await this.graph(n),{assemblyName:s,refName:i,start:a,end:f}=t,c=ue(this,n.targetAssemblyName),l=Lt(this),p=this.keepPredicate(n.haplotypes,c),h=await this.referenceQuery(i,n),d=this.getConf("nodeLimit");return(h?await(0,dn.updateStatus)(`Reading graph ${i}:${a.toLocaleString()}-${f.toLocaleString()}`,n.statusCallback,()=>o.getAlignmentsForRange(h,a,f,{context:this.getConf("context"),haplotypes:"all",limit:d,signal:n.signal,...p===void 0?{}:{keep:p}}).catch(m=>{throw hn(m,d,f-a)??m})):[]).flatMap(m=>{let y=m.resolved?Ps({alignment:m,assemblyName:s,refName:i,lane:Jr(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 yn(n);let{db:i}=await this.graph(o),{refName:a,start:f,end:c}=t,l=await this.laneHaplotypes(n,o),p=await this.laneHaplotypes(s,o),h=[...l,...p],d=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=>h.some(v=>v.sample===w.sample&&v.haplotype===w.haplotype)}).catch(w=>{throw hn(w,u,c-f)??w}),x=d&&m&&l.length>0&&p.length>0?(await(0,dn.updateStatus)(`Reading ${n} against ${s}`,o.statusCallback,async()=>Promise.all((await this.referencePieces(a,f,c,o)).map(g=>y(d,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,bases:!1}).map(v=>ks({pair:v,lane:n,mateLane:s}))))):[]}getFeatures(t,n={}){return(0,to.ObservableCreate)(async o=>{let{db:s,anchor:i}=await this.graph(n);if(!s.hasHaplotypeIndex)throw new mn;if(t.assemblyName===i){let a=n.queryAssemblyName===void 0?await this.anchorFeatures(t,n):await this.pairFeatures(t,n.queryAssemblyName,n);for(let f of a)o.next(f)}o.complete()},n.signal)}};export{wn as HaplotypeWindowError,mn as NoHaplotypeIndexError,gn as NoReferenceSampleError,xn as NodeLimitError,yn as PairTargetError,bn as default,Ps as fragmentFeature,se as haplotypePrefix,Jr as laneAssemblyName,hn as nodeLimitError,ks as pairFeature,Rs as resolveReferenceSample};
8
+ //# sourceMappingURL=GbzBaseSyntenyAdapter-BLSUE5LT.js.map