jbrowse-plugin-graphgenomeviewer 4.0.13 → 4.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/chunks/{GbzBaseSyntenyAdapter-Y5NBXK7P.js → GbzBaseSyntenyAdapter-3ZTHTTHA.js} +2 -2
- package/dist/chunks/{GraphGenomeView-TTQEJJQD.js → GraphGenomeView-35HMVXRP.js} +2 -2
- package/dist/chunks/{GraphTrackSettingsDialog-3A2PKZRI.js → GraphTrackSettingsDialog-2QV6TPX7.js} +2 -2
- package/dist/chunks/{LinearGraphDisplay-MJ5XZFE5.js → LinearGraphDisplay-3M3LNC5H.js} +2 -2
- package/dist/chunks/{MinigraphBubbleAdapter-APC7JYOM.js → MinigraphBubbleAdapter-NRDD66AK.js} +2 -2
- package/dist/chunks/{RgfaTabixAdapter-4E365PXO.js → RgfaTabixAdapter-NQEERXXI.js} +2 -2
- package/dist/chunks/{chunk-5DP7IXD3.js → chunk-33VHHB43.js} +2 -2
- package/dist/chunks/{chunk-LA7MQS33.js → chunk-5E7TVPCI.js} +2 -2
- package/dist/chunks/chunk-IUIIYSGF.js +2 -0
- package/dist/chunks/{chunk-M4YEAXSR.js.map → chunk-IUIIYSGF.js.map} +3 -3
- package/dist/chunks/chunk-JXAJ7YLT.js +2 -0
- package/dist/chunks/chunk-JXAJ7YLT.js.map +7 -0
- package/dist/chunks/chunk-KULNKXPT.js +2 -0
- package/dist/chunks/chunk-KULNKXPT.js.map +7 -0
- package/dist/chunks/chunk-QSH263Y6.js +2 -0
- package/dist/chunks/chunk-QSH263Y6.js.map +7 -0
- package/dist/chunks/chunk-UQEPPJEO.js +2 -0
- package/dist/chunks/{chunk-VAGPKHHS.js.map → chunk-UQEPPJEO.js.map} +3 -3
- package/dist/chunks/chunk-YWJ3RWYB.js +4 -0
- package/dist/chunks/chunk-YWJ3RWYB.js.map +7 -0
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +2 -2
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +3 -3
- package/package.json +2 -2
- package/src/GraphGenomeView/components/BubbleHalos.tsx +67 -3
- package/src/GraphGenomeView/components/BubbleOverlay.tsx +6 -0
- package/src/GraphGenomeView/components/GraphCanvas.tsx +46 -9
- package/src/GraphGenomeView/components/LabelChip.tsx +9 -1
- package/src/GraphGenomeView/components/LabelLayer.tsx +3 -0
- package/src/GraphGenomeView/components/ReferenceStripOverlay.tsx +116 -0
- package/src/GraphGenomeView/components/TubeMapOverlay.tsx +109 -41
- package/src/GraphGenomeView/model.test.ts +3 -0
- package/src/GraphGenomeView/model.ts +204 -43
- package/src/LinearGraphDisplay/model.ts +2 -0
- package/src/version.ts +1 -1
- package/dist/chunks/chunk-CJ56O2VG.js +0 -2
- package/dist/chunks/chunk-CJ56O2VG.js.map +0 -7
- package/dist/chunks/chunk-IFRDWMQ2.js +0 -2
- package/dist/chunks/chunk-IFRDWMQ2.js.map +0 -7
- package/dist/chunks/chunk-M4YEAXSR.js +0 -2
- package/dist/chunks/chunk-MUK3KYB4.js +0 -2
- package/dist/chunks/chunk-MUK3KYB4.js.map +0 -7
- package/dist/chunks/chunk-VAGPKHHS.js +0 -2
- package/dist/chunks/chunk-XDOIZTY6.js +0 -4
- package/dist/chunks/chunk-XDOIZTY6.js.map +0 -7
- /package/dist/chunks/{GbzBaseSyntenyAdapter-Y5NBXK7P.js.map → GbzBaseSyntenyAdapter-3ZTHTTHA.js.map} +0 -0
- /package/dist/chunks/{GraphGenomeView-TTQEJJQD.js.map → GraphGenomeView-35HMVXRP.js.map} +0 -0
- /package/dist/chunks/{GraphTrackSettingsDialog-3A2PKZRI.js.map → GraphTrackSettingsDialog-2QV6TPX7.js.map} +0 -0
- /package/dist/chunks/{LinearGraphDisplay-MJ5XZFE5.js.map → LinearGraphDisplay-3M3LNC5H.js.map} +0 -0
- /package/dist/chunks/{MinigraphBubbleAdapter-APC7JYOM.js.map → MinigraphBubbleAdapter-NRDD66AK.js.map} +0 -0
- /package/dist/chunks/{RgfaTabixAdapter-4E365PXO.js.map → RgfaTabixAdapter-NQEERXXI.js.map} +0 -0
- /package/dist/chunks/{chunk-5DP7IXD3.js.map → chunk-33VHHB43.js.map} +0 -0
- /package/dist/chunks/{chunk-LA7MQS33.js.map → chunk-5E7TVPCI.js.map} +0 -0
package/README.md
CHANGED
|
@@ -6,7 +6,11 @@ Pangenome graphs in JBrowse 2.
|
|
|
6
6
|
|
|
7
7
|
A `GraphTrack` cuts the graph for the view's window and redraws it as you pan.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
A force-directed track draws a strip of the reference segments at their bp above
|
|
10
|
+
the graph, each in its node's colour, so the reference-position ramp ties the
|
|
11
|
+
graph back to the linear view's coordinates.
|
|
12
|
+
|
|
13
|
+

|
|
10
14
|
|
|
11
15
|

|
|
12
16
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{a as Cn,b as Rn,c as Mn,d as Eo}from"./chunk-JAQ2RQAE.js";import{a as _n}from"./chunk-IFRDWMQ2.js";import{a as kn}from"./chunk-KWAXLUPQ.js";import"./chunk-LGKM2PZH.js";import{a as Co,e as Ln,f as On}from"./chunk-XK7OPCRQ.js";import{a as Ce}from"./chunk-J4OLMLS5.js";import{a as Tn,b as Nn}from"./chunk-SCMIJAAX.js";import"./chunk-EFVAQ2KM.js";import{a as Pn,d as ue,e as me,f as $t}from"./chunk-MUK3KYB4.js";import{a as Ao,b as W}from"./chunk-FY3BTKY4.js";var go=Ao((fl,mo)=>{mo.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 ge(r){return r%2===0?"forward":"reverse"}function O(r){return r%2===1}function B(r){return r%2===0?r+1:r-1}function Fn(r){return r==="left"?"right":"left"}function He(r){return r==="forward"?"left":"right"}function Ge(r){return r==="forward"?"right":"left"}function qn(r){return r==="left"?"forward":"reverse"}function $n(r){return r==="right"?"forward":"reverse"}function we(r,e){let t=A(r),n=A(e);return O(r)?n>t||n===t&&!O(e):n>=t}function Hn(r){return Be(r[0],r[r.length-1])}function Be(r,e){return r===void 0||e===void 0?!0:O(r)===O(e)?!O(r):we(r,e)}var Re=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}}},Gn=255,Po=256,De=class{source;sigma;threshold;constructor(e,t){this.source=new Re(e),this.sigma=t===0?Number.MAX_SAFE_INTEGER:t,this.threshold=this.sigma<Gn?Math.floor(Po/this.sigma):0}next(){if(this.sigma>=Gn){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 Bn(r){let e=new Re(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 ze=class{edges;bwt;constructor(e,t){this.edges=e,this.bwt=t}runs(){return new De(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:B(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 _o=["","A","C","G","T","N"];function Dn(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 zn(r){let e="";for(let t of r){let n=t;for(let o=0;o<3;o++){let s=_o[n%6];if(s==="")return e;n=Math.floor(n/6),e+=s}}return e}var Mo={A:"T",C:"G",G:"C",T:"A",N:"N"};function je(r){let e="";for(let t=r.length-1;t>=0;t--)e+=Mo[r[t]]??"N";return e}function jn(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 Qn(r){return{name:r.get("pggname"),subgraph:jn(r.get("subgraph"),"subgraph"),translation:jn(r.get("translation"),"translation")}}function Un(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 Yn(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])),Un(t.subgraph,e.subgraph),Un(t.translation,e.translation)),t}function Wn(r){return[...r.entries()].sort(([e],[t])=>e<t?-1:e>t?1:0).flatMap(([e,t])=>[...t].sort().map(n=>[e,n]))}function Vn(r){let e=[];r.name!==void 0&&e.push(`H NM:Z:${r.name}`);for(let[t,n]of Wn(r.subgraph))e.push(`H SG:Z:${t},${n}`);for(let[t,n]of Wn(r.translation))e.push(`H TL:Z:${t},${n}`);return e}async function Kn(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 ko="_gbwt_ref";function $(r,e){return`${r.sample}#${r.haplotype}#${r.contig}[${r.fragment}-${e}]`}var Lo=/^([^#]+)#(\d+)#([^#]+?)(?:\[\d+-\d+\])?$/,Oo=/^([^#]+?)(?:\[\d+-\d+\])?$/;function To(r){let e=Lo.exec(r);if(e)return{sample:e[1],haplotype:Number(e[2]),contig:e[3]};let t=Oo.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 Xn(r){return typeof r=="string"?To(r):r}function Pe(r,e){return{sample:r.sample??ko,contig:r.contig,haplotype:r.haplotype??0,fragment:e}}function Ue(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 We=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)}}},Ht=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+=Ue(a,o)-Ue(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=Ue(c,o),d=Ue(c,s);for(let h=0;h<d-p;h++){let u=n===1?c[d-1-h]-o:s-1-c[p+h],m=i.bestBefore(u),w=(m===-1?0:i.ending[m])+l;if(w>i.ending[u]&&(i.raise(u,w),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 We(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 We(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 d=a[p]+f[i-p];d>l&&(l=d,c=p)}return o+c}};function Zn(r,e,t){let n=new Ht(r,e,t);return n.solve(0,r.length,0,e.length),[n.pairs,n.total]}var No=100,Dt=4e6,Fo=5e3,D=15,qo=64,$o=8,sr=1,zt=-4,G=-6,te=-1,ye=-(2**30),Ye=0,Gt=1,ir=2;function ae(r,e,t){let n=r.at(-1);t>0&&(n?.[0]===e?n[1]+=t:r.push([e,t]))}function Qe(r,e,t){return r>=t&&r>=e?Ye:t>=e?ir:Gt}function ar(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]=G+(u-1)*te,i[u]=(u===1?Ye:ir)<<4;for(let u=1;u<=n;u++){let m=new Int32Array(s).fill(ye),w=new Int32Array(s).fill(ye),x=new Int32Array(s).fill(ye);w[0]=G+(u-1)*te,i[u*s]=(u===1?Ye:Gt)<<2;let S=r.charCodeAt(u-1);for(let g=1;g<=o;g++){let b=Qe(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)?sr:zt);let y=Qe(a[g]+G,f[g]+te,c[g]+G);w[g]=Math.max(a[g]+G,f[g]+te,c[g]+G);let v=Qe(m[g-1]+G,w[g-1]+G,x[g-1]+te);x[g]=Math.max(m[g-1]+G,w[g-1]+G,x[g-1]+te),i[u*s+g]=b|y<<2|v<<4}a=m,f=w,c=x}let l=[],p=n,d=o,h=Qe(a[o],f[o],c[o]);for(;p>0||d>0;){let u=i[p*s+d]>>2*h&3;h===Ye?(l.push(r[p-1]===e[d-1]?"=":"X"),p-=1,d-=1):h===Gt?(l.push("I"),p-=1):(l.push("D"),d-=1),h=u}for(let u of l.reverse())ae(t,u,1)}function Ho(r,e){let t=Math.abs(r-e);return(t===0?0:Math.min(-G-(t-1)*te,-G+10*Math.log2(t)))+(Math.min(r,e)>0?-zt:0)}function fr(r,e){let t=Math.abs(r-e);return t===0?0:.01*D*t+.5*Math.log2(t)}function Jn(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 Go(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(Jn(r,i,a)),i=Math.max(i,f);return n-i>=D&&s.push(Jn(r,i,n)),s}function jt(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],y=b.qe-b.qs;for(let v=g-1;v>=Math.max(0,g-Fo);v--){if(c[v]+y<=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),P=b.qs+C-I.qe,E=b.flipped?I.ts-(b.te-C):b.ts+C-I.te;if(C<y&&P<=e&&E<=e){let M=c[v]+y-C-n(P,E);M>c[g]&&(c[g]=M,l[g]=v,p[g]=C)}}}}let d=0;for(let g=1;g<f.length;g++)c[g]>c[d]&&(d=g);let h=[];for(let g=d;g>=0;g=l[g])h.push({run:f[g],trim:p[g]});if(h.reverse(),h.reduce((g,{run:b,trim:y})=>g+b.qe-b.qs-y,0)<t)break;s.push(h);let m=h[0],w=h.at(-1),{flipped:x}=m.run,S=x?a.flipped:a.forward;S.query.push([m.run.qs+m.trim,w.run.qe]),S.target.push(x?[w.run.ts,m.run.te-m.trim]:[m.run.ts+m.trim,w.run.te]);for(let{run:g,trim:b}of h)i.query.push([g.qs+b,g.qe]),i.target.push(g.flipped?[g.ts,g.te-b]:[g.ts+b,g.te]);f=f.flatMap(g=>{let b=g.flipped?a.flipped:a.forward;return Go(g,[...i.query,...b.query],[...i.target,...b.target])}).sort((g,b)=>g.qs-b.qs||g.ts-b.ts)}return s}function Bt(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<=qo)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 Bo(r,e){return[...Bt(r,e),...Bt(r,je(e)).map(t=>({...t,ts:e.length-t.te,te:e.length-t.ts,flipped:!0}))]}function Ve(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?je(p):p,n,s.qe,c)}ae(n,"=",i.qe-f),s=i}}function Ut(r,e,t){ae(t,"I",r.length),ae(t,"D",e.length)}function cr(r,e,t){r.length*e.length<=Dt?ar(r,e,t):Ut(r,e,t)}function Wt(r,e,t,n=0){let[o]=r.length*e.length>Dt&&n<$o?jt(Bt(r,e),1/0,D,fr,1):[];if(!o){cr(r,e,t);return}let s=(f,c,l)=>{Wt(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),Ve(o,r,e,t,s),s(r.slice(a.qe),e.slice(a.te),t)}function Do(r,e,t){Wt(r,e,t)}function zo(r,e,t){let n=[];Ve(r,e,t,n,Do);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 jo(r,e,t,n){let o=[];if(r.length*e.length<=Dt)ar(r,e,t);else{let s=jt(Bo(r,e),1/0,Math.max(n,D),fr),i=s.find(a=>!a[0].run.flipped);if(o=s.filter(a=>a[0].run.flipped).map(a=>zo(a,r,e)),i){let a=(l,p,d,h,u)=>{o.some(w=>h<w.queryEnd&&w.queryStart<h+l.length||u<w.targetEnd&&w.targetStart<u+p.length)?cr(l,p,d):Wt(l,p,d)},f=i[0].run,c=i.at(-1).run;a(r.slice(0,f.qs),e.slice(0,f.ts),t,0,0),Ve(i,r,e,t,a),a(r.slice(c.qe),e.slice(c.te),t,c.qe,c.te)}else Ut(r,e,t)}return o}function Qt(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 er(r,e,t,n){let o=e==="query"&&r.strand==="-"?-1:1,s=0;return Qt(r,(i,a,f,c)=>{let l=e==="query"?f:c,p=d=>{let h=l+o*d;return h>=t&&h<n};if(i==="="||i==="X")for(let d=0;d<a;d++)p(d)&&(s+=i==="="?sr:zt);else if(i==="I"==(e==="query"))for(let d=0;d<a;d++)p(d)&&(s+=d===0?G:te);else p(0)&&(s+=G+(a-1)*te)}),s}function tr(r,e){return e==="query"?[r.queryStart,r.queryEnd]:[r.targetStart,r.targetEnd]}function Uo(r,e){let t=r.strand==="-",n=[],o=0,s=0,i=0,a=0,f=new Uint8Array(r.queryEnd-r.queryStart);for(let[h,u]of r.shared)f.fill(1,h-r.queryStart,u-r.queryStart);let c=h=>f[h-r.queryStart]===1,l=()=>{ae(n,"I",o),ae(n,"D",s),o=0,s=0};Qt(r,(h,u,m)=>{if(h==="I")o+=u;else if(h==="D")s+=u;else{for(let w=0;w<u;w++)e[i+w]?(o+=1,s+=1,c(t?m-w:m+w)&&(a+=1)):((o>0||s>0)&&l(),ae(n,h,1));i+=u}}),l();let p={I:0,D:0};for(;n[0]?.[0]==="I"||n[0]?.[0]==="D";){let[h,u]=n.shift();p[h]+=u}let d={I:0,D:0};for(;n.at(-1)?.[0]==="I"||n.at(-1)?.[0]==="D";){let[h,u]=n.pop();d[h]+=u}return n.length===0?void 0:{...r,queryStart:r.queryStart+(t?d.I:p.I),queryEnd:r.queryEnd-(t?p.I:d.I),targetStart:r.targetStart+p.D,targetEnd:r.targetEnd-d.D,edits:n,sharedBases:r.sharedBases-a}}function Wo(r,e,t,n){let o={query:new Uint8Array(e),target:new Uint8Array(t)},s=r.map(c=>{let l=[];Qt(c,(p,d,h,u)=>{if(p==="="||p==="X")for(let m=0;m<d;m++)l.push([c.strand==="-"?h-m:h+m,u+m])});for(let[p,d]of l)o.query[p]=Math.min(255,o.query[p]+1),o.target[d]=Math.min(255,o.target[d]+1);return l}),i={query:new Map,target:new Map};s.forEach((c,l)=>{for(let[p,d]of c)for(let[h,u]of[["query",p],["target",d]])if(o[h][u]>1){let m=i[h].get(u);m?m.at(-1)!==l&&m.push(l):i[h].set(u,[l])}});let a=new Map,f=(c,l,p)=>{let d=`${p}:${c}:${l}`,h=a.get(d);if(h===void 0){let[u,m]=tr(r[c],p),[w,x]=tr(r[l],p),S=Math.max(u,w),g=Math.min(m,x),[b,y]=[r[c],r[l]];h=[er(y,p,S,g)-er(b,p,S,g),y.sharedBases-b.sharedBases,c-l].find(I=>I!==0)>0,a.set(d,h)}return h};return r.flatMap((c,l)=>{let p=s[l],d=new Uint8Array(p.length);if(p.forEach(([m,w],x)=>{for(let[S,g]of[["query",m],["target",w]])!d[x]&&i[S].get(g)?.some(b=>b!==l&&f(l,b,S))&&(d[x]=1)}),!d.includes(1))return[c];let h=Uo(c,d),u=h?.edits.reduce((m,[w,x])=>m+(w==="="?x:0),0)??0;return h&&u>=n?[h]:[]})}function nr(r,e){return r.map(t=>{let n=e(A(t));return O(t)?je(n):n}).join("")}function rr(r,e){let t=[0];for(let n of r)t.push(t.at(-1)+e(A(n)).length);return t}function or(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 Qo(r,e,t,n){let o=or(r),s=or(e),i=new Map;e.forEach((p,d)=>{s[d]||i.set(A(p),[d])});let a=2*e.length,f=(p,d,h)=>p*a+2*d+(h?1:0),c=new Set;r.forEach((p,d)=>{for(let h of o[d]?[]:i.get(A(p))??[])c.add(f(d,h,O(p)!==O(e[h])))});let l=[];return r.forEach((p,d)=>{for(let h of o[d]?[]:i.get(A(p))??[]){let u=O(p)!==O(e[h]),m=u?-1:1;if(!c.has(f(d-1,h-m,u))){let w=d,x=h;for(;w<r.length&&x>=0&&x<e.length&&c.has(f(w,x,u));)w+=1,x+=m;let S=x-m;l.push({qs:t[d],qe:t[w],ts:n[Math.min(h,S)],te:n[Math.max(h,S)+1],flipped:u})}}}),l}function lr(r,e,t,n={}){let o=nr(r,t),s=nr(e,t),i=Qo(r,e,rr(r,t),rr(e,t)),a=n.minMatch??No,f=n.bases??!0,c=[];for(let l of jt(i,n.maxGap??1/0,a,Ho)){let p=[],d=l[0],h=l.at(-1),{flipped:u}=d.run;Ve(l,o,s,p,f?(w,x,S,g,b)=>{for(let y of jo(w,x,S,a)){let v=b+x.length;c.push({...y,queryStart:g+y.queryStart,queryEnd:g+y.queryEnd,targetStart:u?v-y.targetEnd:b+y.targetStart,targetEnd:u?v-y.targetStart:b+y.targetEnd,strand:u?"+":"-",edits:u?y.edits.reverse():y.edits,shared:[]})}}:Ut),c.push({queryStart:d.run.qs+d.trim,queryEnd:h.run.qe,targetStart:u?h.run.ts:d.run.ts+d.trim,targetEnd:u?d.run.te-d.trim:h.run.te,strand:u?"-":"+",edits:u?p.reverse():p,sharedBases:l.reduce((w,{run:x,trim:S})=>w+x.qe-x.qs-S,0),shared:l.map(({run:w,trim:x})=>[w.qs+x,w.qe])})}return Wo(c,o.length,s.length,a).map(({shared:l,...p})=>p).sort((l,p)=>l.queryStart-p.queryStart)}function pr(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 Yt(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(Yt(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&&Yt(e[s],e[a])&&(a=s),i<e.length&&Yt(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 Yo(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 Vo(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>1;r[o]>e?n=o:t=o+1}return r[t]}function fe(r){return`${r.node}:${r.offset}`}function Ko(r,e){let t=e.identity.hapStart-r.identity.hapEnd,n=r.strand==="+"?e.refStart-r.refEnd:r.refStart-e.refEnd;return r.strand===e.strand&&t>=0&&n>=0?{insertion:t,deletion:n}:void 0}function Xo(r,e,t){let[n,o]=r.strand==="+"?[r,e]:[e,r],s=n.edits.map(([c,l])=>[c,l]);hr(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 Zo(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=Ko(i,f);c?(i=Xo(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 Ke(r,e){return{node:r.path[e],offset:r.offsets[e]}}var Jo=4096;function dr(r){let e=[];for(let t of r){let n=e[e.length-1];n&&t-n[1]<=Jo?n[1]=t:e.push([t,t])}return e}var es=32768,ts=65536;function ns(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]<=es?o[1]=n:t.push([n,n])}return t}var Me=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 ${$(e,e.fragment)}`);if(!t.isIndexed)throw new Error(`Path ${$(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 ${$(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 ${$(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=ge(e),a=new _e;return a.push(t,o,He(i)),a.push(s.sequenceLen-t-1,o,Ge(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=ns(c.map(p=>p.pos.node));await Promise.all(l.map(([p,d])=>this.db.prefetchRecords(p,d+2)))}}return o}async aroundInterval(e,t,n){if(t===0)throw new Error("Interval length must be greater than 0");this.walkedBp=0;try{return await this.walkInterval(e,t,n)}catch(o){throw o instanceof X&&o.windowBp===void 0?new X(o.limit,{windowBp:t,walkedBp:this.walkedBp}):o}}get referenceWalkedBp(){return this.walkedBp}async walkInterval(e,t,n){let o={node:e.handle,offset:e.gbwtOffset},s=e.nodeOffset,i=t,a=new _e;for(;;){let f=A(o.node),c=ge(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,Ge(c));break}a.push(0,f,Ge(c));let d=l.gbwt().lf(o.offset);if(!d)throw new Error(`No successor for GBWT position (${o.node}, ${o.offset})`);o=d,s=0,i-=p}return this.walkedBp=t,this.insertContext(a,n)}async aroundNodes(e,t){let n=new _e;for(let o of e)await this.ensureNode(o),n.push(0,o,"left"),n.push(0,o,"right");return this.insertContext(n,t)}async insertContext(e,t){this.clearPaths();let n=new Set,o=new Set;for(let i of this.records.keys())o.add(A(i));let s=0;for(;e.size>0;){let[i,a,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=Fn(f);if(!n.has(`${a}:${l}`)){let h=this.record(V(a,qn(f))),u=i+h.sequenceLen-1;u<=t&&e.push(u,a,l)}let p=this.record(V(a,$n(f))),d=i+1;if(d<=t)for(let h of p.successors()){let u=A(h),m=He(ge(h));n.has(`${u}:${m}`)||e.push(d,u,m)}}for(let i of o)this.records.delete(V(i,"forward")),this.records.delete(V(i,"reverse"));return{inserted:s,removed:o.size}}async betweenNodes(e,t){this.clearPaths();let n=[e,B(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,B(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)?we(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(B(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(B(l))).successors().length>1},n=async f=>{let c=await e(B(f));return c.next!==void 0?await t(c)?{kind:"snarl-exit",snarl:[B(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((y,v)=>i.set(y,v));let a=new Int32Array(s+1),f=new Int32Array(s),c=[];for(let y=0;y<s;y++){let v=this.record(o[y]),I=v.gbwt().decompressArrays();f[y]=v.sequenceLen,c.push(I),a[y+1]=a[y]+I.nodes.length}let l=a[s],p=new Int32Array(l),d=new Int32Array(l),h=new Uint8Array(l);for(let y=0;y<s;y++){let v=c[y];p.set(v.nodes,a[y]),d.set(v.offsets,a[y])}c.length=0;for(let y=0;y<l;y++){let v=i.get(p[y]);v===void 0?p[y]=-1:(p[y]=v,h[a[v]+d[y]]=1)}let u=n===void 0?void 0:i.get(n.handle),m=n?.gbwtOffset,w,x=(y,v,I)=>{let R=[],C=0,P=0,E=-1,M=y,L=v;for(;;){M===u&&L===m&&(E=C),I&&(I.push(o[M]),R.push(L)),C+=1,P+=f[M];let N=a[M]+L,F=p[N];if(F<0)break;L=d[N],M=F}return{offsets:R,len:P,refAt:E,last:M}},S=(y,v,I,R)=>{R>=0&&(this.refId=this.paths.length,w=R),this.paths.push({path:y,offsets:v,len:I,weight:void 0,identity:void 0})},g=new Int32Array(s),b=u!==void 0&&O(o[u]);for(let y=0;y<s;y++){let v=o[y];if(!O(v)){let I=a[y],R=a[y+1]-I;for(let C=0;C<R;C++)if(h[I+C]===0){let P=[],{offsets:E,len:M,refAt:L,last:N}=x(y,C,P),F=o[N];if(L>=0||Be(v,F)){if(S(P,E,M,L),!O(F)){let q=i.get(B(F));g[q]=g[q]+1}}else this.twinStarts.add(fe({node:v,offset:C}))}}}for(let y=0;y<s;y++){let v=o[y];if(O(v)){let I=a[y],R=a[y+1]-I,C=0;for(let E=0;E<R;E++)h[I+E]===0&&(C+=1);let P=!b&&C===g[y];for(let E=0;E<R;E++)if(h[I+E]===0){let M=P?void 0:x(y,E,void 0);if(M&&(M.refAt>=0||Be(v,o[M.last]))){let L=[],{offsets:N,len:F,refAt:q}=x(y,E,L);S(L,N,F,q)}else this.twinStarts.add(fe({node:v,offset:E}))}}}if(n){if(w===void 0||this.refId===void 0)throw this.clearPaths(),new Error("Could not find the reference path");let y=this.paths[this.refId],v=n.nodeOffset;for(let R of y.path.slice(0,w))v+=this.record(R).sequenceLen;let I=n.seqOffset-v;this.refInterval=[I,I+y.len],y.identity={pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:I,hapEnd:I+y.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)=>Vt(o.path,s.path)||o.len-s.len);let t=[],n;for(let o of this.paths){let s=t[t.length-1];s&&Vt(s.path,o.path)===0?s.weight=(s.weight??0)+1:(e&&Vt(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,ts),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 d=performance.now(),h=()=>{let k=performance.now(),U=k-d;return d=k,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 ${$(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 w=await this.prefetchReferenceRange(e.handle,m.pathOffset,a+c);if(!w)throw new Error(`Path ${$(e.name,e.name.fragment)} has not been indexed for random access`);let x=await this.walkReference(u,w,m,i,a,a+c),{anchor:S,refOffsetOf:g,refHandles:b,windowSteps:y}=x;p.anchorHandle=S.pos.node,p.referenceSteps=x.steps,this.walkedBp=t;let v=[],I=[],R=0;for(let k of y)await this.ensureNode(A(k.pos.node)),v.push(k.pos.node),I.push(k.pos.offset),R+=this.record(k.pos.node).sequenceLen;let C=y[0];if(C===void 0)throw new Error("The reference walk has no node in the window");this.refPath=e.name,this.refHandle=e.handle,this.refInterval=[C.refOffset,C.refOffset+R],this.refId=0,this.paths.push({path:v,offsets:I,len:R,weight:void 0,identity:{pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:C.refOffset,hapEnd:C.refOffset+R}}),p.ms.reference=h();let P=await this.db.haplotypeSamplesAtNode(S.pos.node);p.rows=P.length,p.ms.rows=h();let E=P.find(k=>k.offset===S.pos.offset&&k.pathHandle===e.handle&&k.pathOffset===S.offset);if(E===void 0)throw new Error(`The haplotype index has no anchor row for ${$(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 M=await this.db.pathsByHandle(),L=k=>{let U=M.get(k);if(!U)throw new Error(`Path ${k} is missing from the database`);return U.name},N=new Set([e.handle]),F=new Map;for(let k of P)if(k!==E&&o(L(k.pathHandle))){let U=F.get(k.pathHandle);U?U.push(k):F.set(k.pathHandle,[k])}let q;for(let[k,U]of F)if(q===void 0){let de=ie=>Math.abs(ie.offset-E.offset);U.sort((ie,Io)=>de(ie)-de(Io));let he;for(let ie of U)N.has(k)||(he=await this.walkAndKeep(u,ie,"anchor",L(k),g,a,l,s,N,p));N.has(k)||(q=he)}p.ms.walks=h();let Ee=q===void 0?await this.samplesOfUnwalkedContigs(v,g,b,o,N,L,p):new Map;if(p.ms.scan=h(),Ee.size>0){await this.mapReferenceBefore(u,e.handle,Math.max(0,m.pathOffset-2*n),m.pathOffset,g,b);for(let[k,U]of Ee)if(q===void 0){let de=L(k),he;for(let ie of U)he??=await this.entryBefore(u,ie,g,b,this.refInterval[0],l);q=he===void 0?`no sample of ${$(de,de.fragment)} on the window's nodes runs with the reference`:await this.walkAndKeep(u,he,"sample",de,g,a,l,s,N,p)}p.ms.sampled=h()}return p.fallback=q,q}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 d;return p.end==="bound"||p.infos.length===0?d=`${$(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)),d}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(h,u)=>{let m=(await e(h.node)).sequenceLen;return{node:h.node,offset:h.offset,pathHandle:t.pathHandle,orientation:t.orientation,pathOffset:t.orientation==="forward"?t.pathOffset-u:t.pathOffset+a+u-m}},c={node:t.node,offset:t.offset},l=0,p,d=!await this.runsWithReference(e,t,n,o,i);for(;!d;){this.signal?.throwIfAborted();let h=n.get(A(c.node));if(h!==void 0&&h<s)p=await f(c,l),d=!0;else if(l>i)p={...t},d=!0;else{let m=(await e(B(c.node))).gbwt().predecessorAt(c.offset);if(m===void 0)p=await f(c,l),d=!0;else{let w=await e(m),x=w.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+=w.sequenceLen}}}return p}async walkReference(e,t,n,o,s,i){let a=new Map,f=new Set,c=[],l,p=t.pos,d=t.pathOffset,h=0;for(;p!==void 0&&p.node!==0&&d<i;){this.signal?.throwIfAborted();let u=await e(p.node),m=d+u.sequenceLen;if(l===void 0&&d===n.pathOffset){if(p.node!==n.node)throw new Error(`The reference walk reaches node ${A(p.node)} at offset ${d} where the haplotype index names node ${A(n.node)} as the anchor`);l={pos:p,offset:d}}if(l!==void 0){h+=1;let w=A(p.node);a.has(w)||(a.set(w,d),f.add(p.node)),d<s&&m>o&&c.push({pos:p,refOffset:d})}d=m,p=u.gbwt().lf(p.offset)}if(l===void 0)throw new Error(`The reference walk from offset ${t.pathOffset} never starts a node at the anchor offset ${n.pathOffset}`);return{anchor:l,refOffsetOf:a,refHandles:f,windowSteps:c,steps:h}}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=[],d=[],h=[],u=0,m=0,w=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 y=o.get(A(g.node)),v=x!==void 0;if(y!==void 0&&y>=i)S=v?"through the window":"past the window";else{!v&&y!==void 0&&y>=s&&(x=m);let I=await e(g.node);if(x!==void 0){let R={pos:g,at:m,len:I.sequenceLen};y===void 0?(h.push(R),u+=R.len):(u>f&&y<s?(p.push(d),d=[]):d.push(...h),h=[],u=0,d.push(R))}w+=1,m+=I.sequenceLen,g=I.gbwt().lf(g.offset)}}p.push(d);let b=[];for(let y of p){let v=y[0],I=y[y.length-1];if(v!==void 0&&I!==void 0){let R=[],C=[],P=0;for(let L of y)await this.ensureNode(A(L.pos.node)),R.push(L.pos.node),C.push(L.pos.offset),P+=L.len;let E=v.at,M=I.at+I.len;b.push({path:R,offsets:C,len:P,weight:void 0,identity:t.orientation==="forward"?{pathHandle:t.pathHandle,name:n,orientation:"forward",hapStart:l+E,hapEnd:l+M}:{pathHandle:t.pathHandle,name:n,orientation:"reverse",hapStart:l-M,hapEnd:l-E}})}}return{steps:w,end:S,infos:b}}async samplesOfUnwalkedContigs(e,t,n,o,s,i,a){let f=dr([...e].sort((l,p)=>l-p));a.scans=f;let c=new Map;for(let[l,p]of f){let d=await this.db.haplotypeSamplesInRange(l,p);a.scanRows+=d.length;for(let h of d){let u=t.has(A(h.node));if(!s.has(h.pathHandle)&&(!u||n.has(h.node))&&o(i(h.pathHandle))){let m=c.get(h.pathHandle)??[];u?m.unshift(h):m.push(h),c.set(h.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=dr(this.sortedHandles());if(t.length===0)return;let n=new Map;for(let[u,m]of t)for(let w of await this.db.haplotypeSamplesInRange(u,m))n.set(fe(w),w);let o=u=>{let m=0,w=t.length-1;for(;m<w;){let S=m+w+1>>1;t[S][0]<=u?m=S:w=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(Ke(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 w=await this.db.haplotypeSampleAt(u.node,u.offset);return w||(i.companionMisses+=1),w},l=new Map,p=async u=>{let m=l.get(u);if(!m){let w=await this.db.getPath(u);if(!w)throw new Error(`Path ${u} is missing from the database`);m=w.name,l.set(u,m)}return m},d=(u,m,w)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.pathOffset-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.pathOffset+m+w},h=(u,m)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.hapStart-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.hapEnd+m};for(let u=0;u<this.paths.length;u++){let m=this.paths[u];if(u===this.refId||m.identity)continue;let w=[],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,y=u,v;for(;g===void 0;){if(this.signal?.throwIfAborted(),y!==void 0){if(x.has(y)){S.end="cycle";break}x.add(y);let E=this.paths[y];w.push({index:y,startBp:b}),S.fragments+=1;let M=b;for(let N=0;N<E.path.length;N++){let F=Ke(E,N),q=n.get(fe(F)),Ee=this.record(F.node).sequenceLen;if(q){g=d(q,M,Ee);break}M+=Ee}if(b+=E.len,g){S.end="in-fragment sample";break}let L=Ke(E,E.path.length-1);v=this.record(L.node).gbwt().lf(L.offset),y=void 0}if(v===void 0||v.node===0){S.end="endmarker";break}let I=fe(v),R=s.get(I);if(R!==void 0){let E=this.paths[R].identity;if(E){g=h(E,b),S.end="identified sibling";break}y=R;continue}this.records.has(v.node)&&(S.reentries+=1),this.twinStarts.has(I)&&(S.twinLandings+=1);let C=await c(v,S),P=await f(v.node);if(C){g=d(C,b,P.sequenceLen),S.end="out-of-window sample";break}if(this.stats.identificationSteps+=1,S.steps+=1,b-w[w.length-1].startBp>4*e+4*P.sequenceLen){S.end="bound";break}b+=P.sequenceLen,v=P.gbwt().lf(v.offset)}if(g){S.pathHandle=g.pathHandle;let I=await p(g.pathHandle);for(let{index:R,startBp:C}of w){let P=this.paths[R];P.identity=g.orientation==="forward"?{pathHandle:g.pathHandle,name:I,orientation:"forward",hapStart:g.base+C,hapEnd:g.base+C+P.len}:{pathHandle:g.pathHandle,name:I,orientation:"reverse",hapStart:g.base-C-P.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=Vo(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),hr(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??Yo(Zn(e,t,p=>this.record(p).sequenceLen)[0]),s=[],i=this.refPrefix(t),a=(p,d,h,u)=>{p===d?z(s,"D",i[u]-i[h]):h===u?z(s,"I",this.pathLen(e.slice(p,d))):this.align(e.slice(p,d),t.slice(h,u),s)},f=0,c=0,l=0;for(let p=0;p<o.count;p++){let d=o.pathAt[p],h=o.refAt[p];(c!==d||l!==h)&&a(c,d,l,h);let u=this.record(e[d]).sequenceLen;z(s,"M",u),f+=u,c=d+1,l=h+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(Hn(n))o={edits:this.editsAgainst(t.path,n).edits,flipped:!1};else{let s=t.path.map(f=>B(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,d=0;for(;p>c&&a[p-1][0]==="D";)d+=a[p-1][1],p-=1;let h=s.identity,u=h?h.orientation==="forward"!==f:!f;o.push({strand:u?"+":"-",refStart:e.start+l,refEnd:e.start+n-d,edits:a.slice(c,p),weight:s.weight,path:s.path,start:Ke(s,0),identity:h===void 0?void 0:{pathHandle:h.pathHandle,name:h.name,hapStart:h.name.fragment+h.hapStart,hapEnd:h.name.fragment+h.hapEnd,walkForward:h.orientation==="forward"}})}),Zo(o).map(s=>{let{edits:i,identity:a,...f}=s,c={...f,cigar:os(i)};return a?{...c,resolved:!0,name:a.name,label:$({...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:Ze(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=>lr(p.steps,l.steps,c,o).map(d=>({query:p.name,queryStart:p.start+d.queryStart,queryEnd:p.start+d.queryEnd,strand:d.strand,target:l.name,targetStart:l.start+d.targetStart,targetEnd:l.start+d.targetEnd,cigar:pr(d.edits),matches:d.edits.reduce((h,[u,m])=>h+(u==="="?m:0),0),columns:d.edits.reduce((h,[,u])=>h+u,0),sharedBases:d.sharedBases}))))}canonicalEdges(e){let t=[];for(let n of["forward","reverse"]){let o=V(e,n);for(let s of this.record(o).successors())this.hasHandle(s)&&we(o,s)&&t.push([n==="reverse"?1:0,A(s),O(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(!O(n)){let o=A(n),s=`S ${o} ${this.record(n).sequence}
|
|
1
|
+
import{a as Cn,b as Rn,c as Mn,d as Eo}from"./chunk-JAQ2RQAE.js";import{a as _n}from"./chunk-QSH263Y6.js";import{a as kn}from"./chunk-KWAXLUPQ.js";import"./chunk-LGKM2PZH.js";import{a as Co,e as Ln,f as On}from"./chunk-XK7OPCRQ.js";import{a as Ce}from"./chunk-J4OLMLS5.js";import{a as Tn,b as Nn}from"./chunk-SCMIJAAX.js";import"./chunk-EFVAQ2KM.js";import{a as Pn,e as ue,f as me,g as $t}from"./chunk-KULNKXPT.js";import{a as Ao,b as W}from"./chunk-FY3BTKY4.js";var go=Ao((fl,mo)=>{mo.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 ge(r){return r%2===0?"forward":"reverse"}function O(r){return r%2===1}function B(r){return r%2===0?r+1:r-1}function Fn(r){return r==="left"?"right":"left"}function He(r){return r==="forward"?"left":"right"}function Ge(r){return r==="forward"?"right":"left"}function qn(r){return r==="left"?"forward":"reverse"}function $n(r){return r==="right"?"forward":"reverse"}function we(r,e){let t=A(r),n=A(e);return O(r)?n>t||n===t&&!O(e):n>=t}function Hn(r){return Be(r[0],r[r.length-1])}function Be(r,e){return r===void 0||e===void 0?!0:O(r)===O(e)?!O(r):we(r,e)}var Re=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}}},Gn=255,Po=256,De=class{source;sigma;threshold;constructor(e,t){this.source=new Re(e),this.sigma=t===0?Number.MAX_SAFE_INTEGER:t,this.threshold=this.sigma<Gn?Math.floor(Po/this.sigma):0}next(){if(this.sigma>=Gn){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 Bn(r){let e=new Re(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 ze=class{edges;bwt;constructor(e,t){this.edges=e,this.bwt=t}runs(){return new De(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:B(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 _o=["","A","C","G","T","N"];function Dn(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 zn(r){let e="";for(let t of r){let n=t;for(let o=0;o<3;o++){let s=_o[n%6];if(s==="")return e;n=Math.floor(n/6),e+=s}}return e}var Mo={A:"T",C:"G",G:"C",T:"A",N:"N"};function je(r){let e="";for(let t=r.length-1;t>=0;t--)e+=Mo[r[t]]??"N";return e}function jn(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 Qn(r){return{name:r.get("pggname"),subgraph:jn(r.get("subgraph"),"subgraph"),translation:jn(r.get("translation"),"translation")}}function Un(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 Yn(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])),Un(t.subgraph,e.subgraph),Un(t.translation,e.translation)),t}function Wn(r){return[...r.entries()].sort(([e],[t])=>e<t?-1:e>t?1:0).flatMap(([e,t])=>[...t].sort().map(n=>[e,n]))}function Vn(r){let e=[];r.name!==void 0&&e.push(`H NM:Z:${r.name}`);for(let[t,n]of Wn(r.subgraph))e.push(`H SG:Z:${t},${n}`);for(let[t,n]of Wn(r.translation))e.push(`H TL:Z:${t},${n}`);return e}async function Kn(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 ko="_gbwt_ref";function $(r,e){return`${r.sample}#${r.haplotype}#${r.contig}[${r.fragment}-${e}]`}var Lo=/^([^#]+)#(\d+)#([^#]+?)(?:\[\d+-\d+\])?$/,Oo=/^([^#]+?)(?:\[\d+-\d+\])?$/;function To(r){let e=Lo.exec(r);if(e)return{sample:e[1],haplotype:Number(e[2]),contig:e[3]};let t=Oo.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 Xn(r){return typeof r=="string"?To(r):r}function Pe(r,e){return{sample:r.sample??ko,contig:r.contig,haplotype:r.haplotype??0,fragment:e}}function Ue(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 We=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)}}},Ht=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+=Ue(a,o)-Ue(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=Ue(c,o),d=Ue(c,s);for(let h=0;h<d-p;h++){let u=n===1?c[d-1-h]-o:s-1-c[p+h],m=i.bestBefore(u),w=(m===-1?0:i.ending[m])+l;if(w>i.ending[u]&&(i.raise(u,w),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 We(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 We(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 d=a[p]+f[i-p];d>l&&(l=d,c=p)}return o+c}};function Zn(r,e,t){let n=new Ht(r,e,t);return n.solve(0,r.length,0,e.length),[n.pairs,n.total]}var No=100,Dt=4e6,Fo=5e3,D=15,qo=64,$o=8,sr=1,zt=-4,G=-6,te=-1,ye=-(2**30),Ye=0,Gt=1,ir=2;function ae(r,e,t){let n=r.at(-1);t>0&&(n?.[0]===e?n[1]+=t:r.push([e,t]))}function Qe(r,e,t){return r>=t&&r>=e?Ye:t>=e?ir:Gt}function ar(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]=G+(u-1)*te,i[u]=(u===1?Ye:ir)<<4;for(let u=1;u<=n;u++){let m=new Int32Array(s).fill(ye),w=new Int32Array(s).fill(ye),x=new Int32Array(s).fill(ye);w[0]=G+(u-1)*te,i[u*s]=(u===1?Ye:Gt)<<2;let S=r.charCodeAt(u-1);for(let g=1;g<=o;g++){let b=Qe(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)?sr:zt);let y=Qe(a[g]+G,f[g]+te,c[g]+G);w[g]=Math.max(a[g]+G,f[g]+te,c[g]+G);let v=Qe(m[g-1]+G,w[g-1]+G,x[g-1]+te);x[g]=Math.max(m[g-1]+G,w[g-1]+G,x[g-1]+te),i[u*s+g]=b|y<<2|v<<4}a=m,f=w,c=x}let l=[],p=n,d=o,h=Qe(a[o],f[o],c[o]);for(;p>0||d>0;){let u=i[p*s+d]>>2*h&3;h===Ye?(l.push(r[p-1]===e[d-1]?"=":"X"),p-=1,d-=1):h===Gt?(l.push("I"),p-=1):(l.push("D"),d-=1),h=u}for(let u of l.reverse())ae(t,u,1)}function Ho(r,e){let t=Math.abs(r-e);return(t===0?0:Math.min(-G-(t-1)*te,-G+10*Math.log2(t)))+(Math.min(r,e)>0?-zt:0)}function fr(r,e){let t=Math.abs(r-e);return t===0?0:.01*D*t+.5*Math.log2(t)}function Jn(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 Go(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(Jn(r,i,a)),i=Math.max(i,f);return n-i>=D&&s.push(Jn(r,i,n)),s}function jt(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],y=b.qe-b.qs;for(let v=g-1;v>=Math.max(0,g-Fo);v--){if(c[v]+y<=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),P=b.qs+C-I.qe,E=b.flipped?I.ts-(b.te-C):b.ts+C-I.te;if(C<y&&P<=e&&E<=e){let M=c[v]+y-C-n(P,E);M>c[g]&&(c[g]=M,l[g]=v,p[g]=C)}}}}let d=0;for(let g=1;g<f.length;g++)c[g]>c[d]&&(d=g);let h=[];for(let g=d;g>=0;g=l[g])h.push({run:f[g],trim:p[g]});if(h.reverse(),h.reduce((g,{run:b,trim:y})=>g+b.qe-b.qs-y,0)<t)break;s.push(h);let m=h[0],w=h.at(-1),{flipped:x}=m.run,S=x?a.flipped:a.forward;S.query.push([m.run.qs+m.trim,w.run.qe]),S.target.push(x?[w.run.ts,m.run.te-m.trim]:[m.run.ts+m.trim,w.run.te]);for(let{run:g,trim:b}of h)i.query.push([g.qs+b,g.qe]),i.target.push(g.flipped?[g.ts,g.te-b]:[g.ts+b,g.te]);f=f.flatMap(g=>{let b=g.flipped?a.flipped:a.forward;return Go(g,[...i.query,...b.query],[...i.target,...b.target])}).sort((g,b)=>g.qs-b.qs||g.ts-b.ts)}return s}function Bt(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<=qo)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 Bo(r,e){return[...Bt(r,e),...Bt(r,je(e)).map(t=>({...t,ts:e.length-t.te,te:e.length-t.ts,flipped:!0}))]}function Ve(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?je(p):p,n,s.qe,c)}ae(n,"=",i.qe-f),s=i}}function Ut(r,e,t){ae(t,"I",r.length),ae(t,"D",e.length)}function cr(r,e,t){r.length*e.length<=Dt?ar(r,e,t):Ut(r,e,t)}function Wt(r,e,t,n=0){let[o]=r.length*e.length>Dt&&n<$o?jt(Bt(r,e),1/0,D,fr,1):[];if(!o){cr(r,e,t);return}let s=(f,c,l)=>{Wt(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),Ve(o,r,e,t,s),s(r.slice(a.qe),e.slice(a.te),t)}function Do(r,e,t){Wt(r,e,t)}function zo(r,e,t){let n=[];Ve(r,e,t,n,Do);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 jo(r,e,t,n){let o=[];if(r.length*e.length<=Dt)ar(r,e,t);else{let s=jt(Bo(r,e),1/0,Math.max(n,D),fr),i=s.find(a=>!a[0].run.flipped);if(o=s.filter(a=>a[0].run.flipped).map(a=>zo(a,r,e)),i){let a=(l,p,d,h,u)=>{o.some(w=>h<w.queryEnd&&w.queryStart<h+l.length||u<w.targetEnd&&w.targetStart<u+p.length)?cr(l,p,d):Wt(l,p,d)},f=i[0].run,c=i.at(-1).run;a(r.slice(0,f.qs),e.slice(0,f.ts),t,0,0),Ve(i,r,e,t,a),a(r.slice(c.qe),e.slice(c.te),t,c.qe,c.te)}else Ut(r,e,t)}return o}function Qt(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 er(r,e,t,n){let o=e==="query"&&r.strand==="-"?-1:1,s=0;return Qt(r,(i,a,f,c)=>{let l=e==="query"?f:c,p=d=>{let h=l+o*d;return h>=t&&h<n};if(i==="="||i==="X")for(let d=0;d<a;d++)p(d)&&(s+=i==="="?sr:zt);else if(i==="I"==(e==="query"))for(let d=0;d<a;d++)p(d)&&(s+=d===0?G:te);else p(0)&&(s+=G+(a-1)*te)}),s}function tr(r,e){return e==="query"?[r.queryStart,r.queryEnd]:[r.targetStart,r.targetEnd]}function Uo(r,e){let t=r.strand==="-",n=[],o=0,s=0,i=0,a=0,f=new Uint8Array(r.queryEnd-r.queryStart);for(let[h,u]of r.shared)f.fill(1,h-r.queryStart,u-r.queryStart);let c=h=>f[h-r.queryStart]===1,l=()=>{ae(n,"I",o),ae(n,"D",s),o=0,s=0};Qt(r,(h,u,m)=>{if(h==="I")o+=u;else if(h==="D")s+=u;else{for(let w=0;w<u;w++)e[i+w]?(o+=1,s+=1,c(t?m-w:m+w)&&(a+=1)):((o>0||s>0)&&l(),ae(n,h,1));i+=u}}),l();let p={I:0,D:0};for(;n[0]?.[0]==="I"||n[0]?.[0]==="D";){let[h,u]=n.shift();p[h]+=u}let d={I:0,D:0};for(;n.at(-1)?.[0]==="I"||n.at(-1)?.[0]==="D";){let[h,u]=n.pop();d[h]+=u}return n.length===0?void 0:{...r,queryStart:r.queryStart+(t?d.I:p.I),queryEnd:r.queryEnd-(t?p.I:d.I),targetStart:r.targetStart+p.D,targetEnd:r.targetEnd-d.D,edits:n,sharedBases:r.sharedBases-a}}function Wo(r,e,t,n){let o={query:new Uint8Array(e),target:new Uint8Array(t)},s=r.map(c=>{let l=[];Qt(c,(p,d,h,u)=>{if(p==="="||p==="X")for(let m=0;m<d;m++)l.push([c.strand==="-"?h-m:h+m,u+m])});for(let[p,d]of l)o.query[p]=Math.min(255,o.query[p]+1),o.target[d]=Math.min(255,o.target[d]+1);return l}),i={query:new Map,target:new Map};s.forEach((c,l)=>{for(let[p,d]of c)for(let[h,u]of[["query",p],["target",d]])if(o[h][u]>1){let m=i[h].get(u);m?m.at(-1)!==l&&m.push(l):i[h].set(u,[l])}});let a=new Map,f=(c,l,p)=>{let d=`${p}:${c}:${l}`,h=a.get(d);if(h===void 0){let[u,m]=tr(r[c],p),[w,x]=tr(r[l],p),S=Math.max(u,w),g=Math.min(m,x),[b,y]=[r[c],r[l]];h=[er(y,p,S,g)-er(b,p,S,g),y.sharedBases-b.sharedBases,c-l].find(I=>I!==0)>0,a.set(d,h)}return h};return r.flatMap((c,l)=>{let p=s[l],d=new Uint8Array(p.length);if(p.forEach(([m,w],x)=>{for(let[S,g]of[["query",m],["target",w]])!d[x]&&i[S].get(g)?.some(b=>b!==l&&f(l,b,S))&&(d[x]=1)}),!d.includes(1))return[c];let h=Uo(c,d),u=h?.edits.reduce((m,[w,x])=>m+(w==="="?x:0),0)??0;return h&&u>=n?[h]:[]})}function nr(r,e){return r.map(t=>{let n=e(A(t));return O(t)?je(n):n}).join("")}function rr(r,e){let t=[0];for(let n of r)t.push(t.at(-1)+e(A(n)).length);return t}function or(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 Qo(r,e,t,n){let o=or(r),s=or(e),i=new Map;e.forEach((p,d)=>{s[d]||i.set(A(p),[d])});let a=2*e.length,f=(p,d,h)=>p*a+2*d+(h?1:0),c=new Set;r.forEach((p,d)=>{for(let h of o[d]?[]:i.get(A(p))??[])c.add(f(d,h,O(p)!==O(e[h])))});let l=[];return r.forEach((p,d)=>{for(let h of o[d]?[]:i.get(A(p))??[]){let u=O(p)!==O(e[h]),m=u?-1:1;if(!c.has(f(d-1,h-m,u))){let w=d,x=h;for(;w<r.length&&x>=0&&x<e.length&&c.has(f(w,x,u));)w+=1,x+=m;let S=x-m;l.push({qs:t[d],qe:t[w],ts:n[Math.min(h,S)],te:n[Math.max(h,S)+1],flipped:u})}}}),l}function lr(r,e,t,n={}){let o=nr(r,t),s=nr(e,t),i=Qo(r,e,rr(r,t),rr(e,t)),a=n.minMatch??No,f=n.bases??!0,c=[];for(let l of jt(i,n.maxGap??1/0,a,Ho)){let p=[],d=l[0],h=l.at(-1),{flipped:u}=d.run;Ve(l,o,s,p,f?(w,x,S,g,b)=>{for(let y of jo(w,x,S,a)){let v=b+x.length;c.push({...y,queryStart:g+y.queryStart,queryEnd:g+y.queryEnd,targetStart:u?v-y.targetEnd:b+y.targetStart,targetEnd:u?v-y.targetStart:b+y.targetEnd,strand:u?"+":"-",edits:u?y.edits.reverse():y.edits,shared:[]})}}:Ut),c.push({queryStart:d.run.qs+d.trim,queryEnd:h.run.qe,targetStart:u?h.run.ts:d.run.ts+d.trim,targetEnd:u?d.run.te-d.trim:h.run.te,strand:u?"-":"+",edits:u?p.reverse():p,sharedBases:l.reduce((w,{run:x,trim:S})=>w+x.qe-x.qs-S,0),shared:l.map(({run:w,trim:x})=>[w.qs+x,w.qe])})}return Wo(c,o.length,s.length,a).map(({shared:l,...p})=>p).sort((l,p)=>l.queryStart-p.queryStart)}function pr(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 Yt(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(Yt(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&&Yt(e[s],e[a])&&(a=s),i<e.length&&Yt(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 Yo(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 Vo(r,e){let t=0,n=r.length;for(;t<n;){let o=t+n>>1;r[o]>e?n=o:t=o+1}return r[t]}function fe(r){return`${r.node}:${r.offset}`}function Ko(r,e){let t=e.identity.hapStart-r.identity.hapEnd,n=r.strand==="+"?e.refStart-r.refEnd:r.refStart-e.refEnd;return r.strand===e.strand&&t>=0&&n>=0?{insertion:t,deletion:n}:void 0}function Xo(r,e,t){let[n,o]=r.strand==="+"?[r,e]:[e,r],s=n.edits.map(([c,l])=>[c,l]);hr(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 Zo(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=Ko(i,f);c?(i=Xo(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 Ke(r,e){return{node:r.path[e],offset:r.offsets[e]}}var Jo=4096;function dr(r){let e=[];for(let t of r){let n=e[e.length-1];n&&t-n[1]<=Jo?n[1]=t:e.push([t,t])}return e}var es=32768,ts=65536;function ns(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]<=es?o[1]=n:t.push([n,n])}return t}var Me=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 ${$(e,e.fragment)}`);if(!t.isIndexed)throw new Error(`Path ${$(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 ${$(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 ${$(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=ge(e),a=new _e;return a.push(t,o,He(i)),a.push(s.sequenceLen-t-1,o,Ge(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=ns(c.map(p=>p.pos.node));await Promise.all(l.map(([p,d])=>this.db.prefetchRecords(p,d+2)))}}return o}async aroundInterval(e,t,n){if(t===0)throw new Error("Interval length must be greater than 0");this.walkedBp=0;try{return await this.walkInterval(e,t,n)}catch(o){throw o instanceof X&&o.windowBp===void 0?new X(o.limit,{windowBp:t,walkedBp:this.walkedBp}):o}}get referenceWalkedBp(){return this.walkedBp}async walkInterval(e,t,n){let o={node:e.handle,offset:e.gbwtOffset},s=e.nodeOffset,i=t,a=new _e;for(;;){let f=A(o.node),c=ge(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,Ge(c));break}a.push(0,f,Ge(c));let d=l.gbwt().lf(o.offset);if(!d)throw new Error(`No successor for GBWT position (${o.node}, ${o.offset})`);o=d,s=0,i-=p}return this.walkedBp=t,this.insertContext(a,n)}async aroundNodes(e,t){let n=new _e;for(let o of e)await this.ensureNode(o),n.push(0,o,"left"),n.push(0,o,"right");return this.insertContext(n,t)}async insertContext(e,t){this.clearPaths();let n=new Set,o=new Set;for(let i of this.records.keys())o.add(A(i));let s=0;for(;e.size>0;){let[i,a,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=Fn(f);if(!n.has(`${a}:${l}`)){let h=this.record(V(a,qn(f))),u=i+h.sequenceLen-1;u<=t&&e.push(u,a,l)}let p=this.record(V(a,$n(f))),d=i+1;if(d<=t)for(let h of p.successors()){let u=A(h),m=He(ge(h));n.has(`${u}:${m}`)||e.push(d,u,m)}}for(let i of o)this.records.delete(V(i,"forward")),this.records.delete(V(i,"reverse"));return{inserted:s,removed:o.size}}async betweenNodes(e,t){this.clearPaths();let n=[e,B(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,B(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)?we(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(B(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(B(l))).successors().length>1},n=async f=>{let c=await e(B(f));return c.next!==void 0?await t(c)?{kind:"snarl-exit",snarl:[B(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((y,v)=>i.set(y,v));let a=new Int32Array(s+1),f=new Int32Array(s),c=[];for(let y=0;y<s;y++){let v=this.record(o[y]),I=v.gbwt().decompressArrays();f[y]=v.sequenceLen,c.push(I),a[y+1]=a[y]+I.nodes.length}let l=a[s],p=new Int32Array(l),d=new Int32Array(l),h=new Uint8Array(l);for(let y=0;y<s;y++){let v=c[y];p.set(v.nodes,a[y]),d.set(v.offsets,a[y])}c.length=0;for(let y=0;y<l;y++){let v=i.get(p[y]);v===void 0?p[y]=-1:(p[y]=v,h[a[v]+d[y]]=1)}let u=n===void 0?void 0:i.get(n.handle),m=n?.gbwtOffset,w,x=(y,v,I)=>{let R=[],C=0,P=0,E=-1,M=y,L=v;for(;;){M===u&&L===m&&(E=C),I&&(I.push(o[M]),R.push(L)),C+=1,P+=f[M];let N=a[M]+L,F=p[N];if(F<0)break;L=d[N],M=F}return{offsets:R,len:P,refAt:E,last:M}},S=(y,v,I,R)=>{R>=0&&(this.refId=this.paths.length,w=R),this.paths.push({path:y,offsets:v,len:I,weight:void 0,identity:void 0})},g=new Int32Array(s),b=u!==void 0&&O(o[u]);for(let y=0;y<s;y++){let v=o[y];if(!O(v)){let I=a[y],R=a[y+1]-I;for(let C=0;C<R;C++)if(h[I+C]===0){let P=[],{offsets:E,len:M,refAt:L,last:N}=x(y,C,P),F=o[N];if(L>=0||Be(v,F)){if(S(P,E,M,L),!O(F)){let q=i.get(B(F));g[q]=g[q]+1}}else this.twinStarts.add(fe({node:v,offset:C}))}}}for(let y=0;y<s;y++){let v=o[y];if(O(v)){let I=a[y],R=a[y+1]-I,C=0;for(let E=0;E<R;E++)h[I+E]===0&&(C+=1);let P=!b&&C===g[y];for(let E=0;E<R;E++)if(h[I+E]===0){let M=P?void 0:x(y,E,void 0);if(M&&(M.refAt>=0||Be(v,o[M.last]))){let L=[],{offsets:N,len:F,refAt:q}=x(y,E,L);S(L,N,F,q)}else this.twinStarts.add(fe({node:v,offset:E}))}}}if(n){if(w===void 0||this.refId===void 0)throw this.clearPaths(),new Error("Could not find the reference path");let y=this.paths[this.refId],v=n.nodeOffset;for(let R of y.path.slice(0,w))v+=this.record(R).sequenceLen;let I=n.seqOffset-v;this.refInterval=[I,I+y.len],y.identity={pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:I,hapEnd:I+y.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)=>Vt(o.path,s.path)||o.len-s.len);let t=[],n;for(let o of this.paths){let s=t[t.length-1];s&&Vt(s.path,o.path)===0?s.weight=(s.weight??0)+1:(e&&Vt(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,ts),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 d=performance.now(),h=()=>{let k=performance.now(),U=k-d;return d=k,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 ${$(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 w=await this.prefetchReferenceRange(e.handle,m.pathOffset,a+c);if(!w)throw new Error(`Path ${$(e.name,e.name.fragment)} has not been indexed for random access`);let x=await this.walkReference(u,w,m,i,a,a+c),{anchor:S,refOffsetOf:g,refHandles:b,windowSteps:y}=x;p.anchorHandle=S.pos.node,p.referenceSteps=x.steps,this.walkedBp=t;let v=[],I=[],R=0;for(let k of y)await this.ensureNode(A(k.pos.node)),v.push(k.pos.node),I.push(k.pos.offset),R+=this.record(k.pos.node).sequenceLen;let C=y[0];if(C===void 0)throw new Error("The reference walk has no node in the window");this.refPath=e.name,this.refHandle=e.handle,this.refInterval=[C.refOffset,C.refOffset+R],this.refId=0,this.paths.push({path:v,offsets:I,len:R,weight:void 0,identity:{pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:C.refOffset,hapEnd:C.refOffset+R}}),p.ms.reference=h();let P=await this.db.haplotypeSamplesAtNode(S.pos.node);p.rows=P.length,p.ms.rows=h();let E=P.find(k=>k.offset===S.pos.offset&&k.pathHandle===e.handle&&k.pathOffset===S.offset);if(E===void 0)throw new Error(`The haplotype index has no anchor row for ${$(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 M=await this.db.pathsByHandle(),L=k=>{let U=M.get(k);if(!U)throw new Error(`Path ${k} is missing from the database`);return U.name},N=new Set([e.handle]),F=new Map;for(let k of P)if(k!==E&&o(L(k.pathHandle))){let U=F.get(k.pathHandle);U?U.push(k):F.set(k.pathHandle,[k])}let q;for(let[k,U]of F)if(q===void 0){let de=ie=>Math.abs(ie.offset-E.offset);U.sort((ie,Io)=>de(ie)-de(Io));let he;for(let ie of U)N.has(k)||(he=await this.walkAndKeep(u,ie,"anchor",L(k),g,a,l,s,N,p));N.has(k)||(q=he)}p.ms.walks=h();let Ee=q===void 0?await this.samplesOfUnwalkedContigs(v,g,b,o,N,L,p):new Map;if(p.ms.scan=h(),Ee.size>0){await this.mapReferenceBefore(u,e.handle,Math.max(0,m.pathOffset-2*n),m.pathOffset,g,b);for(let[k,U]of Ee)if(q===void 0){let de=L(k),he;for(let ie of U)he??=await this.entryBefore(u,ie,g,b,this.refInterval[0],l);q=he===void 0?`no sample of ${$(de,de.fragment)} on the window's nodes runs with the reference`:await this.walkAndKeep(u,he,"sample",de,g,a,l,s,N,p)}p.ms.sampled=h()}return p.fallback=q,q}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 d;return p.end==="bound"||p.infos.length===0?d=`${$(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)),d}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(h,u)=>{let m=(await e(h.node)).sequenceLen;return{node:h.node,offset:h.offset,pathHandle:t.pathHandle,orientation:t.orientation,pathOffset:t.orientation==="forward"?t.pathOffset-u:t.pathOffset+a+u-m}},c={node:t.node,offset:t.offset},l=0,p,d=!await this.runsWithReference(e,t,n,o,i);for(;!d;){this.signal?.throwIfAborted();let h=n.get(A(c.node));if(h!==void 0&&h<s)p=await f(c,l),d=!0;else if(l>i)p={...t},d=!0;else{let m=(await e(B(c.node))).gbwt().predecessorAt(c.offset);if(m===void 0)p=await f(c,l),d=!0;else{let w=await e(m),x=w.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+=w.sequenceLen}}}return p}async walkReference(e,t,n,o,s,i){let a=new Map,f=new Set,c=[],l,p=t.pos,d=t.pathOffset,h=0;for(;p!==void 0&&p.node!==0&&d<i;){this.signal?.throwIfAborted();let u=await e(p.node),m=d+u.sequenceLen;if(l===void 0&&d===n.pathOffset){if(p.node!==n.node)throw new Error(`The reference walk reaches node ${A(p.node)} at offset ${d} where the haplotype index names node ${A(n.node)} as the anchor`);l={pos:p,offset:d}}if(l!==void 0){h+=1;let w=A(p.node);a.has(w)||(a.set(w,d),f.add(p.node)),d<s&&m>o&&c.push({pos:p,refOffset:d})}d=m,p=u.gbwt().lf(p.offset)}if(l===void 0)throw new Error(`The reference walk from offset ${t.pathOffset} never starts a node at the anchor offset ${n.pathOffset}`);return{anchor:l,refOffsetOf:a,refHandles:f,windowSteps:c,steps:h}}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=[],d=[],h=[],u=0,m=0,w=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 y=o.get(A(g.node)),v=x!==void 0;if(y!==void 0&&y>=i)S=v?"through the window":"past the window";else{!v&&y!==void 0&&y>=s&&(x=m);let I=await e(g.node);if(x!==void 0){let R={pos:g,at:m,len:I.sequenceLen};y===void 0?(h.push(R),u+=R.len):(u>f&&y<s?(p.push(d),d=[]):d.push(...h),h=[],u=0,d.push(R))}w+=1,m+=I.sequenceLen,g=I.gbwt().lf(g.offset)}}p.push(d);let b=[];for(let y of p){let v=y[0],I=y[y.length-1];if(v!==void 0&&I!==void 0){let R=[],C=[],P=0;for(let L of y)await this.ensureNode(A(L.pos.node)),R.push(L.pos.node),C.push(L.pos.offset),P+=L.len;let E=v.at,M=I.at+I.len;b.push({path:R,offsets:C,len:P,weight:void 0,identity:t.orientation==="forward"?{pathHandle:t.pathHandle,name:n,orientation:"forward",hapStart:l+E,hapEnd:l+M}:{pathHandle:t.pathHandle,name:n,orientation:"reverse",hapStart:l-M,hapEnd:l-E}})}}return{steps:w,end:S,infos:b}}async samplesOfUnwalkedContigs(e,t,n,o,s,i,a){let f=dr([...e].sort((l,p)=>l-p));a.scans=f;let c=new Map;for(let[l,p]of f){let d=await this.db.haplotypeSamplesInRange(l,p);a.scanRows+=d.length;for(let h of d){let u=t.has(A(h.node));if(!s.has(h.pathHandle)&&(!u||n.has(h.node))&&o(i(h.pathHandle))){let m=c.get(h.pathHandle)??[];u?m.unshift(h):m.push(h),c.set(h.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=dr(this.sortedHandles());if(t.length===0)return;let n=new Map;for(let[u,m]of t)for(let w of await this.db.haplotypeSamplesInRange(u,m))n.set(fe(w),w);let o=u=>{let m=0,w=t.length-1;for(;m<w;){let S=m+w+1>>1;t[S][0]<=u?m=S:w=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(Ke(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 w=await this.db.haplotypeSampleAt(u.node,u.offset);return w||(i.companionMisses+=1),w},l=new Map,p=async u=>{let m=l.get(u);if(!m){let w=await this.db.getPath(u);if(!w)throw new Error(`Path ${u} is missing from the database`);m=w.name,l.set(u,m)}return m},d=(u,m,w)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.pathOffset-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.pathOffset+m+w},h=(u,m)=>u.orientation==="forward"?{pathHandle:u.pathHandle,orientation:"forward",base:u.hapStart-m}:{pathHandle:u.pathHandle,orientation:"reverse",base:u.hapEnd+m};for(let u=0;u<this.paths.length;u++){let m=this.paths[u];if(u===this.refId||m.identity)continue;let w=[],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,y=u,v;for(;g===void 0;){if(this.signal?.throwIfAborted(),y!==void 0){if(x.has(y)){S.end="cycle";break}x.add(y);let E=this.paths[y];w.push({index:y,startBp:b}),S.fragments+=1;let M=b;for(let N=0;N<E.path.length;N++){let F=Ke(E,N),q=n.get(fe(F)),Ee=this.record(F.node).sequenceLen;if(q){g=d(q,M,Ee);break}M+=Ee}if(b+=E.len,g){S.end="in-fragment sample";break}let L=Ke(E,E.path.length-1);v=this.record(L.node).gbwt().lf(L.offset),y=void 0}if(v===void 0||v.node===0){S.end="endmarker";break}let I=fe(v),R=s.get(I);if(R!==void 0){let E=this.paths[R].identity;if(E){g=h(E,b),S.end="identified sibling";break}y=R;continue}this.records.has(v.node)&&(S.reentries+=1),this.twinStarts.has(I)&&(S.twinLandings+=1);let C=await c(v,S),P=await f(v.node);if(C){g=d(C,b,P.sequenceLen),S.end="out-of-window sample";break}if(this.stats.identificationSteps+=1,S.steps+=1,b-w[w.length-1].startBp>4*e+4*P.sequenceLen){S.end="bound";break}b+=P.sequenceLen,v=P.gbwt().lf(v.offset)}if(g){S.pathHandle=g.pathHandle;let I=await p(g.pathHandle);for(let{index:R,startBp:C}of w){let P=this.paths[R];P.identity=g.orientation==="forward"?{pathHandle:g.pathHandle,name:I,orientation:"forward",hapStart:g.base+C,hapEnd:g.base+C+P.len}:{pathHandle:g.pathHandle,name:I,orientation:"reverse",hapStart:g.base-C-P.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=Vo(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),hr(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??Yo(Zn(e,t,p=>this.record(p).sequenceLen)[0]),s=[],i=this.refPrefix(t),a=(p,d,h,u)=>{p===d?z(s,"D",i[u]-i[h]):h===u?z(s,"I",this.pathLen(e.slice(p,d))):this.align(e.slice(p,d),t.slice(h,u),s)},f=0,c=0,l=0;for(let p=0;p<o.count;p++){let d=o.pathAt[p],h=o.refAt[p];(c!==d||l!==h)&&a(c,d,l,h);let u=this.record(e[d]).sequenceLen;z(s,"M",u),f+=u,c=d+1,l=h+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(Hn(n))o={edits:this.editsAgainst(t.path,n).edits,flipped:!1};else{let s=t.path.map(f=>B(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,d=0;for(;p>c&&a[p-1][0]==="D";)d+=a[p-1][1],p-=1;let h=s.identity,u=h?h.orientation==="forward"!==f:!f;o.push({strand:u?"+":"-",refStart:e.start+l,refEnd:e.start+n-d,edits:a.slice(c,p),weight:s.weight,path:s.path,start:Ke(s,0),identity:h===void 0?void 0:{pathHandle:h.pathHandle,name:h.name,hapStart:h.name.fragment+h.hapStart,hapEnd:h.name.fragment+h.hapEnd,walkForward:h.orientation==="forward"}})}),Zo(o).map(s=>{let{edits:i,identity:a,...f}=s,c={...f,cigar:os(i)};return a?{...c,resolved:!0,name:a.name,label:$({...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:Ze(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=>lr(p.steps,l.steps,c,o).map(d=>({query:p.name,queryStart:p.start+d.queryStart,queryEnd:p.start+d.queryEnd,strand:d.strand,target:l.name,targetStart:l.start+d.targetStart,targetEnd:l.start+d.targetEnd,cigar:pr(d.edits),matches:d.edits.reduce((h,[u,m])=>h+(u==="="?m:0),0),columns:d.edits.reduce((h,[,u])=>h+u,0),sharedBases:d.sharedBases}))))}canonicalEdges(e){let t=[];for(let n of["forward","reverse"]){let o=V(e,n);for(let s of this.record(o).successors())this.hasHandle(s)&&we(o,s)&&t.push([n==="reverse"?1:0,A(s),O(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(!O(n)){let o=A(n),s=`S ${o} ${this.record(n).sequence}
|
|
2
2
|
`;for(let[i,a,f]of this.canonicalEdges(o))s+=`L ${o} ${i?"-":"+"} ${a} ${f?"-":"+"}
|
|
3
3
|
`;t.push(e.encode(s))}return Kn(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",...Vn(Yn(await this.stableName(),await this.db.graphName()))],o=this.sortedHandles();for(let c of o)O(c)||n.push(`S ${A(c)} ${this.record(c).sequence}`);let s=c=>O(c)?"-":"+";for(let c of o)for(let l of this.record(c).successors())this.hasHandle(l)&&we(c,l)&&n.push(`L ${A(c)} ${s(c)} ${A(l)} ${s(l)} 0M`);let i=(c,l,p,d,h)=>{let u=Ze(c,l).map(x=>`${O(x)?"<":">"}${A(x)}`).join(""),m=c.weight===void 0?"":` WT:i:${c.weight}`,w=h===void 0?"":` CG:Z:${h}`;return`W ${p.sample} ${p.haplotype} ${p.contig} ${p.fragment} ${d} ${u}${m}${w}`},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,d=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,d):i(c,void 0,{sample:"unknown",contig:a,haplotype:f,fragment:0},c.len,d)),f+=1}}),`${n.join(`
|
|
4
4
|
`)}
|
|
5
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:$(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?$({...f.name,fragment:f.name.fragment+f.hapStart},f.name.fragment+f.hapEnd):$({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)&&we(e,t)&&(yield[e,t])}toSubgraphJson(e={}){let t=this.sortedHandles().filter(s=>!O(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:O(s),to:String(A(i)),to_is_reverse:O(i)});let o=this.outputPaths(e).map(s=>rs(s.info,s.identity,s.name,s.cigar));return{nodes:t,edges:n,paths:o}}toCompactSubgraph(e={}){let t=this.sortedHandles().filter(i=>!O(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(Ze(i.info,i.identity))}))}}};function Ze(r,e){return e?.orientation==="reverse"?r.path.map(t=>B(t)).reverse():r.path}function rs(r,e,t,n){return{name:t,...r.weight===void 0?{}:{weight:r.weight},...n===void 0?{}:{cigar:n},path:Ze(r,e).map(o=>({id:String(A(o)),is_reverse:O(o)}))}}function Vt(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 Xe(r){return r===0?0:6+(r-1)}function hr(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+Xe(e-n)+Xe(t-n),s=Xe(e)+Xe(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 os(r){return r.map(([e,t])=>`${t}${e}`).join("")}async function Je(r,e,t,n,o={}){let s=new Me(r,o);try{let i=await s.pathPosition(Pe(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 ur(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 Me(r,o);try{let c=await f.pathPosition(Pe(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 Je(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 Je(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 ss(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 is=new TextDecoder;function et(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=ss(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:is.decode(c)}throw new Error(`SQLite serial type ${a} is reserved`)})}var ke=2,nt=5,gr=10,tt=13;function wr(r,e){return r[e]*256+r[e+1]}function oe(r,e){return r[e]*16777216+r[e+1]*65536+r[e+2]*256+r[e+3]}function as(r,e){let t=r[e];if(t!==ke&&t!==nt&&t!==gr&&t!==tt)throw new Error(`SQLite page has unknown b-tree type ${t}`);let n=t===ke||t===nt;return{type:t,cellCount:wr(r,e+3),rightChild:n?oe(r,e+8):0,cellPointers:e+(n?12:8)}}function ne(r,e,t){return wr(r,e.cellPointers+2*t)}var fs=4096,cs=4096,rt=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=oe(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=oe(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:as(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===tt)return s;if(a.type!==nt)throw new Error("SQLite table b-tree contains an index page");let f=this.childIndexFor(i,a,t);o=f===a.cellCount?a.rightChild:oe(i,ne(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,ne(e,t,i)+4);a<n?o=i+1:s=i}return o}async prefetchRowidRange(e,t,n){let o=await this.tableDepth(e,t),s=[e];for(let i=0;i<o;i++){let a=await Promise.all(s.map(c=>this.pageAt(c))),f=[];if(a.forEach(({page:c,header:l},p)=>{let d=p===0?this.childIndexFor(c,l,t):0,h=p===a.length-1?this.childIndexFor(c,l,n):l.cellCount;for(let u=d;u<=h;u++)f.push(u===l.cellCount?l.rightChild:oe(c,ne(c,l,u)))}),f.length>cs)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===tt){let f=0,c=s.cellCount;for(;f<c;){let l=f+c>>1,p=ne(o,s,l),[d,h]=Z(o,p),[u,m]=Z(o,h);if(u===t)return et(await this.payload(o,m,d,!1));u<t?f=l+1:c=l}return}if(s.type!==nt)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=ne(o,s,f),[l]=Z(o,c+4);l<t?i=f+1:a=f}n=i===s.cellCount?s.rightChild:oe(o,ne(o,s,i))}}async*tableScan(e){let{page:t,header:n}=await this.pageAt(e);if(n.type===tt)for(let o=0;o<n.cellCount;o++){let s=ne(t,n,o),[i,a]=Z(t,s),[f,c]=Z(t,a);yield{rowid:f,values:et(await this.payload(t,c,i,!1))}}else{let o=[];for(let s=0;s<n.cellCount;s++)o.push(oe(t,ne(t,n,s)));o.push(n.rightChild),this.pager.prefetch(o);for(let s of o)yield*this.tableScan(s)}}decodedCells(e,t){let n=this.decodedIndexPages.get(e);if(n)this.decodedIndexPages.delete(e);else if(n=new Array(t.cellCount),this.decodedIndexPages.size>=fs){let o=this.decodedIndexPages.keys().next().value;o!==void 0&&this.decodedIndexPages.delete(o)}return this.decodedIndexPages.set(e,n),n}async indexCell(e,t,n,o){let s=this.decodedCells(e,n),i=s[o];if(!i){let a=ne(t,n,o),f=n.type===ke,[c,l]=Z(t,f?a+4:a);i={values:et(await this.payload(t,l,c,!0)),leftChild:f?oe(t,a):0},s[o]=i}return i}async*indexScanFrom(e,t){let{page:n,header:o}=await this.pageAt(e),s=0,i=o.cellCount;for(;s<i;){let a=s+i>>1,f=await this.indexCell(e,n,o,a);mr(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);mr(p.values,t)<=0?(n=p.values,a=l+1):(c=p.leftChild,f=l)}if(i.type===gr)return n;o=a===i.cellCount?i.rightChild:c}}};function mr(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 ot=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 Le=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 d=new ot(e,c,n,t);d.seed(0,o),d.fetches+=1,d.bytesFetched+=o.length;let h=new rt(d,l),u=new Map;for await(let{values:m}of h.tableScan(1)){let[w,x,S,g,b]=m;typeof w=="string"&&typeof x=="string"&&typeof S=="string"&&typeof g=="number"&&u.set(x,{type:w,name:x,tableName:S,rootPage:g,sql:typeof b=="string"?b:""})}return new r(d,h,u)}rootPage(e){let t=this.objects.get(e);if(!t)throw new Error(`SQLite database has no object named ${e}`);return t.rootPage}indexOn(e){let t=[...this.objects.values()].find(n=>n.type==="index"&&n.tableName===e);if(!t)throw new Error(`SQLite table ${e} has no index`);return t.rootPage}byRowid(e,t){return this.btree.tableRowid(this.rootPage(e),t)}prefetchRows(e,t,n){return this.btree.prefetchRowidRange(this.rootPage(e),t,n)}scan(e){return this.btree.tableScan(this.rootPage(e))}indexSeekLE(e,t){return this.btree.indexSeekLE(this.indexOn(e),t)}indexScanFrom(e,t){return this.btree.indexScanFrom(this.indexOn(e),t)}has(e){return this.objects.has(e)}};var Xt="GBZ-base version 4",st=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")}},it=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 "${Xt}"`),this.found=e}},at=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=Dn(o)}get id(){return A(this.handle)}get orientation(){return ge(this.handle)}get sequence(){return this.decoded??=zn(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 ze(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 ft(r,e){if(typeof r!="string")throw new Error(`${e} is not text in the database`);return r}function Kt(r,e){if(!(r instanceof Uint8Array))throw new Error(`${e} is not a blob in the database`);return r}function yr(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:ft(e[5],"Paths.sample"),contig:ft(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 xr(r){let e=new Map;for await(let{values:t}of r.scan("Tags"))e.set(ft(t[0],"Tags.key"),ft(t[1],"Tags.value"));return e}var Oe=class r{tagCache;pathCache;pathMapCache;indexTags=new Map;sqlite;index;constructor(e,t){this.sqlite=e,this.index=t}static async open(e,t={}){let{haplotypeIndex:n,...o}=t,s=await Le.open(e,o);for(let c of["Tags","Nodes","Paths","ReferenceIndex"])s.rootPage(c);let i=n?await Le.open(n,o):void 0,a=new r(s,i),f=await a.tag("version");if(f!==Xt)throw new it(f);if(i){for(let h of["Tags","HaplotypeSamples","HaplotypeLengths"])i.rootPage(h);a.indexTags=await xr(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"),d=await a.tag("nodes");if(p!==void 0&&p!==d)throw new Error(`haplotype index was built for a graph with ${p} nodes but this one has ${d}`);if(a.indexTags.get("haplotype_index_orientations")==="forward")throw new st}return a}tags(){return this.tagCache??=xr(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 at(e,Bn(Kt(t[1],"Nodes.edges")),Kt(t[2],"Nodes.bwt"),Kt(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(yr(t,n));return e})(),this.pathCache}async getPath(e){let t=await this.sqlite.byRowid("Paths",e);return t?yr(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=Pe(Xn(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?$(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),d=Math.min(n,e.end),h=o.haplotypes??"all",u=h==="all"||h==="distinct",m;return s!==void 0&&h==="all"?m=await ur(this,l,p,d,{...i,keep:s}):(m=await Je(this,l,p,d,i),this.hasHaplotypeIndex&&u&&(await m.identifyPaths(),s!==void 0&&m.keepHaplotypes(s))),m}async getSubgraphForRange(e,t,n,o={}){let[s]=await this.pathFragmentsForRange(e,t,n);return s?this.subgraphForFragment(s,t,n,o):void 0}async getAlignmentsForRange(e,t,n,o={}){let s=[];for(let i of await this.pathFragmentsForRange(e,t,n)){let a=await this.subgraphForFragment(i,t,n,o);s.push(...a.alignments())}return s}async graphName(){let e=new Map;for(let[n,o]of await this.tags())n.startsWith("gbz_")&&e.set(n.slice(4),o);let t={name:void 0,subgraph:new Map,translation:new Map};try{t=Qn(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!==void 0}get companion(){if(!this.index)throw new Error("no haplotype index was opened with this database");return this.index}async haplotypeSampleInterval(){let e=this.indexTags.get("haplotype_index_interval");return e===void 0?void 0:Number(e)}async haplotypeAnchorSpacing(){let e=this.index?.has("HaplotypeAnchors")?this.indexTags.get("haplotype_index_anchor_spacing"):void 0;return e===void 0?void 0:Number(e)}async haplotypeAnchor(e,t){let n=await this.companion.indexSeekLE("HaplotypeAnchors",[e,t]),o=n?.[0]===e&&n[1]===t?await this.companion.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.companion.indexScanFrom("HaplotypeSamples",[e,0])){if(T(o[0],"HaplotypeSamples.node_handle")>t)break;let i=await this.companion.byRowid("HaplotypeSamples",T(o[2],"HaplotypeSamples rowid"));i&&n.push(this.sampleFromRow(i))}return n}async haplotypeSampleAt(e,t){let n=await this.companion.indexSeekLE("HaplotypeSamples",[e,t]);if(n?.[0]!==e||n[1]!==t)return;let o=await this.companion.byRowid("HaplotypeSamples",T(n[2],"HaplotypeSamples rowid"));return o?this.sampleFromRow(o):void 0}async haplotypeLength(e){let t=await this.companion.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 ct=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"}},lt=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 J(r){return`${r.sample}#${r.haplotype}`}function br(r,e){let t=J(r);return e===void 0||e.some(n=>ue(t,n))}async function Sr(r){return(await r.tag("gbwt_reference_samples")??"").split(/\s+/).filter(e=>e!=="")}function ls(r,e){let t=r.toLowerCase(),n=_n(r)?.toLowerCase();return e.find(o=>o===r)??e.find(o=>o.toLowerCase()===t)??e.find(o=>o.toLowerCase()===n)}function Zt({configured:r,anchorPrefix:e,referenceSamples:t}){if(r!=="")return r;let n=ls(Pn(e),t)??(t.length===1?t[0]:void 0);if(n===void 0)throw new ct(e,t);return n}async function vr(r,e,t){let n=(await r.paths()).find(o=>o.isIndexed&&o.name.sample===e&&o.name.contig===t);return n?{sample:n.name.sample,contig:t,haplotype:n.name.haplotype}:void 0}function Te(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 lt(e,t,Math.max(s,1))}else return}async function Ir(r,e,t,n,{keep:o,...s}){let i=e?await r.getSubgraphForRange(e,t,n,{...s,haplotypes:"all",...o===void 0?{}:{keep:o}}).catch(a=>{throw Te(a,s.limit,n-t)??a}):void 0;return i?i.toGFA({names:"resolved"}):""}var bn=W(Mn(),1),Sn=W(Ce(),1),Ae=W(kn(),1),vo=W(Eo(),1);var Er=W(kn(),1);var Ar=/\.gbz\.db$/i;function ps(r){return Ar.test(Ln(r))?On(r,e=>e.replace(Ar,".haplotype-index.db")):void 0}async function Cr(r,e){let t=ps(r);if(t)try{return await(0,Er.openLocation)(t,e).stat(),t}catch{return}}var ds=5e3,hs=50*2**20,Jt=class extends Error{constructor(t){super(`this GAF is ${(t/2**20).toFixed(0)} MB without an index; bgzip it and index it with tabix -p gaf`);this.name="UnindexedGafTooLargeError"}};function us(r,e){if(r.length<=e)return r;let t=r.length/e;return Array.from({length:e},(n,o)=>r[Math.floor(o*t)])}var Rr=(r,e)=>r.path.some(t=>e.has(t.name)),pt=class{constructor(e,t){this.file=e;this.tabix=t}readWhole(e){return this.whole??=(async()=>{let{size:t}=await this.file.stat();if(t>hs)throw new Jt(t);let n=await this.file.readFile({signal:e}),o=new TextDecoder().decode(n[0]===31&&n[1]===139?await Cn(n):n);return Nn(o)})().catch(t=>{throw this.whole=void 0,t}),this.whole}async readIndexed(e,t,n){let o=1/0,s=-1/0;for(let a of t){let f=Number(a);Number.isInteger(f)&&(o=Math.min(o,f),s=Math.max(s,f))}let i=[];return o<=s&&await e.getLines("{node}",o,s+1,{signal:n,lineCallback:a=>{let f=Tn(a);f&&Rr(f,t)&&i.push(f)}}),i}async readsOver(e,{signal:t}={}){let n=this.tabix?await this.readIndexed(this.tabix,e,t):(await this.readWhole(t)).filter(o=>Rr(o,e));return{records:us(n,ds),total:n.length}}};var xo=W(Mn(),1),bo=W(Ce(),1);var en=function(r,e){return en=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])},en(r,e)};function Ne(r,e){if(typeof e!="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");en(r,e);function t(){this.constructor=r}r.prototype=e===null?Object.create(e):(t.prototype=e.prototype,new t)}function Pr(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 dt(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 xe(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 be(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 _r(r,e,t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=t.apply(r,e||[]),o,s=[];return o=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),a("next"),a("throw"),a("return",i),o[Symbol.asyncIterator]=function(){return this},o;function i(h){return function(u){return Promise.resolve(u).then(h,p)}}function a(h,u){n[h]&&(o[h]=function(m){return new Promise(function(w,x){s.push([h,m,w,x])>1||f(h,m)})},u&&(o[h]=u(o[h])))}function f(h,u){try{c(n[h](u))}catch(m){d(s[0][3],m)}}function c(h){h.value instanceof le?Promise.resolve(h.value.v).then(l,p):d(s[0][2],h)}function l(h){f("next",h)}function p(h){f("throw",h)}function d(h,u){h(u),s.shift(),s.length&&f(s[0][0],s[0][1])}}function Mr(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 _(r){return typeof r=="function"}function kr(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 ht=kr(function(r){return function(t){r(this),this.message=t?t.length+` errors occurred during unsubscription:
|
|
6
6
|
`+t.map(function(n,o){return o+1+") "+n.toString()}).join(`
|
|
7
7
|
`):"",this.name="UnsubscriptionError",this.errors=t}});function tn(r,e){if(r){var t=r.indexOf(e);0<=t&&r.splice(t,1)}}var ut=(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(_(l))try{l()}catch(m){s=m instanceof ht?m.errors:[m]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var d=ce(p),h=d.next();!h.done;h=d.next()){var u=h.value;try{Lr(u)}catch(m){s=s??[],m instanceof ht?s=be(be([],xe(s)),xe(m.errors)):s.push(m)}}}catch(m){n={error:m}}finally{try{h&&!h.done&&(o=d.return)&&o.call(d)}finally{if(n)throw n.error}}}if(s)throw new ht(s)}},r.prototype.add=function(e){var t;if(e&&e!==this)if(this.closed)Lr(e);else{if(e instanceof r){if(e.closed||e._hasParent(this))return;e._addParent(this)}(this._finalizers=(t=this._finalizers)!==null&&t!==void 0?t:[]).push(e)}},r.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},r.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},r.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&tn(t,e)},r.prototype.remove=function(e){var t=this._finalizers;t&&tn(t,e),e instanceof r&&e._removeParent(this)},r.EMPTY=(function(){var e=new r;return e.closed=!0,e})(),r})();var ea=ut.EMPTY;function mt(r){return r instanceof ut||r&&"closed"in r&&_(r.remove)&&_(r.add)&&_(r.unsubscribe)}function Lr(r){_(r)?r():r.unsubscribe()}var K={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Se={setTimeout:function(r,e){for(var t=[],n=2;n<arguments.length;n++)t[n-2]=arguments[n];var o=Se.delegate;return o?.setTimeout?o.setTimeout.apply(o,be([r,e],xe(t))):setTimeout.apply(void 0,be([r,e],xe(t)))},clearTimeout:function(r){var e=Se.delegate;return(e?.clearTimeout||clearTimeout)(r)},delegate:void 0};function gt(r){Se.setTimeout(function(){var e=K.onUnhandledError;if(e)e(r);else throw r})}function nn(){}var Or=(function(){return rn("C",void 0,void 0)})();function Tr(r){return rn("E",void 0,r)}function Nr(r){return rn("N",r,void 0)}function rn(r,e,t){return{kind:r,value:e,error:t}}var pe=null;function Fr(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 qr(r){K.useDeprecatedSynchronousErrorHandling&&pe&&(pe.errorThrown=!0,pe.error=r)}var Fe=(function(r){Ne(e,r);function e(t){var n=r.call(this)||this;return n.isStopped=!1,t?(n.destination=t,mt(t)&&t.add(n)):n.destination=ys,n}return e.create=function(t,n,o){return new yt(t,n,o)},e.prototype.next=function(t){this.isStopped?sn(Nr(t),this):this._next(t)},e.prototype.error=function(t){this.isStopped?sn(Tr(t),this):(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped?sn(Or,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})(ut);var ms=Function.prototype.bind;function on(r,e){return ms.call(r,e)}var gs=(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){wt(n)}},r.prototype.error=function(e){var t=this.partialObserver;if(t.error)try{t.error(e)}catch(n){wt(n)}else wt(e)},r.prototype.complete=function(){var e=this.partialObserver;if(e.complete)try{e.complete()}catch(t){wt(t)}},r})(),yt=(function(r){Ne(e,r);function e(t,n,o){var s=r.call(this)||this,i;if(_(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&&on(t.next,a),error:t.error&&on(t.error,a),complete:t.complete&&on(t.complete,a)}):i=t}return s.destination=new gs(i),s}return e})(Fe);function wt(r){K.useDeprecatedSynchronousErrorHandling?qr(r):gt(r)}function ws(r){throw r}function sn(r,e){var t=K.onStoppedNotification;t&&Se.setTimeout(function(){return t(r,e)})}var ys={closed:!0,next:nn,error:ws,complete:nn};var ve=(function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"})();function $r(r){return r}function Hr(r){return r.length===0?$r: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=bs(e)?e:new yt(e,t,n);return Fr(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=Gr(t),new t(function(o,s){var i=new yt({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[ve]=function(){return this},r.prototype.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Hr(e)(this)},r.prototype.toPromise=function(e){var t=this;return e=Gr(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 Gr(r){var e;return(e=r??K.Promise)!==null&&e!==void 0?e:Promise}function xs(r){return r&&_(r.next)&&_(r.error)&&_(r.complete)}function bs(r){return r&&r instanceof Fe||xs(r)&&mt(r)}function Ss(r){return _(r?.lift)}function Q(r){return function(e){if(Ss(e))return e.lift(function(t){try{return r(t,this)}catch(n){this.error(n)}});throw new TypeError("Unable to lift unknown Observable type")}}function re(r,e,t,n,o){return new vs(r,e,t,n,o)}var vs=(function(r){Ne(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})(Fe);var xt=(function(r){return r&&typeof r.length=="number"&&typeof r!="function"});function bt(r){return _(r?.then)}function St(r){return _(r[ve])}function vt(r){return Symbol.asyncIterator&&_(r?.[Symbol.asyncIterator])}function It(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 Is(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var At=Is();function Et(r){return _(r?.[At])}function Ct(r){return _r(this,arguments,function(){var t,n,o,s;return dt(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 Rt(r){return _(r?.getReader)}function ee(r){if(r instanceof j)return r;if(r!=null){if(St(r))return As(r);if(xt(r))return Es(r);if(bt(r))return Cs(r);if(vt(r))return Br(r);if(Et(r))return Rs(r);if(Rt(r))return Ps(r)}throw It(r)}function As(r){return new j(function(e){var t=r[ve]();if(_(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Es(r){return new j(function(e){for(var t=0;t<r.length&&!e.closed;t++)e.next(r[t]);e.complete()})}function Cs(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,gt)})}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){_s(r,e).catch(function(t){return e.error(t)})})}function Ps(r){return Br(Ct(r))}function _s(r,e){var t,n,o,s;return Pr(this,void 0,void 0,function(){var i,a;return dt(this,function(f){switch(f.label){case 0:f.trys.push([0,5,6,11]),t=Mr(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 Y(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 Pt(r,e){return e===void 0&&(e=0),Q(function(t,n){t.subscribe(re(n,function(o){return Y(n,r,function(){return n.next(o)},e)},function(){return Y(n,r,function(){return n.complete()},e)},function(o){return Y(n,r,function(){return n.error(o)},e)}))})}function _t(r,e){return e===void 0&&(e=0),Q(function(t,n){n.add(r.schedule(function(){return t.subscribe(n)},e))})}function Dr(r,e){return ee(r).pipe(_t(e),Pt(e))}function zr(r,e){return ee(r).pipe(_t(e),Pt(e))}function jr(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 Ur(r,e){return new j(function(t){var n;return Y(t,e,function(){n=r[At](),Y(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 _(n?.return)&&n.return()}})}function Mt(r,e){if(!r)throw new Error("Iterable cannot be null");return new j(function(t){Y(t,e,function(){var n=r[Symbol.asyncIterator]();Y(t,e,function(){n.next().then(function(o){o.done?t.complete():t.next(o.value)})},0,!0)})})}function Wr(r,e){return Mt(Ct(r),e)}function Qr(r,e){if(r!=null){if(St(r))return Dr(r,e);if(xt(r))return jr(r,e);if(bt(r))return zr(r,e);if(vt(r))return Mt(r,e);if(Et(r))return Ur(r,e);if(Rt(r))return Wr(r,e)}throw It(r)}function an(r,e){return e?Qr(r,e):ee(r)}function qe(r,e){return Q(function(t,n){var o=0;t.subscribe(re(n,function(s){n.next(r.call(e,s,o++))}))})}function Yr(r,e,t,n,o,s,i,a){var f=[],c=0,l=0,p=!1,d=function(){p&&!f.length&&!c&&e.complete()},h=function(m){return c<n?u(m):f.push(m)},u=function(m){s&&e.next(m),c++;var w=!1;ee(t(m,l++)).subscribe(re(e,function(x){o?.(x),s?h(x):e.next(x)},function(){w=!0},void 0,function(){if(w)try{c--;for(var x=function(){var S=f.shift();i?Y(e,i,function(){return u(S)}):u(S)};f.length&&c<n;)x();d()}catch(S){e.error(S)}}))};return r.subscribe(re(e,h,function(){p=!0,d()})),function(){a?.()}}function Ie(r,e,t){return t===void 0&&(t=1/0),_(e)?Ie(function(n,o){return qe(function(s,i){return e(n,s,o,i)})(ee(r(n,o)))},t):(typeof e=="number"&&(t=e),Q(function(n,o){return Yr(n,o,r,t)}))}function Vr(r,e,t,n,o){return function(s,i){var a=t,f=e,c=0;s.subscribe(re(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 Kr(r,e){return Q(Vr(r,e,arguments.length>=2,!1,!0))}var Ms=function(r,e){return r.push(e),r};function kt(){return Q(function(r,e){Kr(Ms,[])(r).subscribe(e)})}function Xr(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 ln(r){let e="";for(let{own:t,mate:n,op:o}of Xr(r))e+=o==="M"?t===0?`${n}I`:n===0?`${t}D`:`${t}M`:`${o==="I"?n:t}${o}`;return e}var fn=2**28-1;function cn(r,e,t){for(let n=e;n>0;n-=fn)r.push((Math.min(n,fn)<<4|t)>>>0)}function ks(r,e,t){if(e===t)cn(r,e,0);else{let n=Math.ceil(Math.max(e,t)/fn);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 pn(r){let e=[];for(let{own:t,mate:n,op:o}of Xr(r))o==="M"?ks(e,t,n):o==="I"?cn(e,n,1):cn(e,t,o==="N"?3:2);return Uint32Array.from(e)}function Ls(r){return r>=48&&r<=57}function Os(r){return r!==void 0&&/[A-Za-z]/.test(r)}function Zr(r,e){let t=e;for(;t<r.length&&Os(r[t]);)t++;return t}function Jr(r,e){let t=e,n=0;for(;t<r.length&&Ls(r.charCodeAt(t));)n=n*10+(r.charCodeAt(t)-48),t++;return{value:n,next:t}}function oo(r,e){let t=0;for(;t<r.length;){let n=r[t];if(n===":"){let{value:o,next:s}=Jr(r,t+1);e(":",o,o,t+1,s),t=s}else if(n==="="){let o=Zr(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=Zr(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}=Jr(r,t+3),i=Math.min(s+2,r.length);e("~",o,0,t+1,i),t=i}else t++}}function dn(r,e,t,n){let o=t??Number.NEGATIVE_INFINITY,s=n??Number.POSITIVE_INFINITY,i=0;oo(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 d=r.slice(l,p);e(73,i,c,d,-1,0,c)}}else(a==="-"||a==="~")&&i<s&&i+f>o&&e(a==="-"?68:78,i,f,"",-1,0,0);i+=f})}function so(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,d=l&15;if(d===0||d===7){if(a)for(let h=0;h<p;h++)(e.charCodeAt(s+h)|32)!==(t.charCodeAt(o+h)|32)&&i.push({start:o+h,type:"mismatch",base:e[s+h],altbase:t[o+h],length:1});s+=p,o+=p}else if(d===1)i.push({start:o,type:"insertion",insertlen:p,insertedBases:e?.slice(s,s+p),length:0}),s+=p;else if(d===2)i.push({start:o,type:"deletion",length:p}),o+=p;else if(d===3)i.push({start:o,type:"skip",length:p}),o+=p;else if(d===8){for(let h=0;h<p;h++)i.push({start:o+h,type:"mismatch",base:e?.[s+h]||"X",qual:n?.[s+h],length:1});s+=p,o+=p}else d===5?i.push({start:o,type:"hardclip",cliplen:p,length:1}):d===4&&(i.push({start:o,type:"softclip",cliplen:p,length:1}),s+=p)}return i}function io(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,d=0,h=0,u=0,m=0,w=0,x=r.length;for(;w<x;){let S=r.charCodeAt(w);if(S>=48&&S<=57){let g=0;for(;w<x;){let b=r.charCodeAt(w);if(b>=48&&b<=57)g=g*10+(b-48),w++;else break}p+=g}else if(S===94)for(w++;w<x&&r.charCodeAt(w)>=65;)w++,p++;else if(S>=65){let g=r[w];if(w++,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=h,y=u;for(let R=d;R<i&&y<=p;R++,d=R){let C=e[R],P=C>>>4,E=C&15;E===4||E===1?b+=P:E===2||E===6||E===3?y+=P:E!==5&&(b+=P,y+=P)}h=b,u=y;let v=b-(y-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 w++}return s}var ao={77:0,73:1,68:2,78:3,83:4,72:5,80:6,61:7,88:8};function fo(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=ao[s];t.push(e<<4|i),e=0}}return t}function mn(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|ao[a],n=0)}return t}function Ft(r,e,t,n,o){let s=fo(r),i=r?so(s,t,n,o):[];return e&&t?i.concat(io(e,s,i,t,o)):i}var Fs=397,qs=387,$s=385;function co(r){return(1<<r&Fs)!==0}function lo(r){return(1<<r&qs)!==0}function po(r){return(1<<r&$s)!==0}function gn(r,e,t,n,o,s,i){let a=o===-1?-1:1,f=e,c=o===-1?n:t,l=[],p=1/0,d=-1/0,h=1/0,u=-1/0,m=(w,x)=>{h=Math.min(h,w,x),u=Math.max(u,w,x)};for(let w=0;w<r.length;w++){let x=r[w],S=x>>>4,g=x&15,b=g===9,y=b||co(g)?S:0,v=b?r[++w]>>>4:lo(g)?S:0,I=f+y,R=c+v*a,C=f,P=I;if(P>=s&&C<=i)if(y>0){let E=Math.max(C,s),M=Math.min(P,i);if(M>E)if(p=Math.min(p,E),d=Math.max(d,M),b){let L=v/S,N=M-E,F=Math.round(N*L),q=Math.round(c+(E-f)*L*a);l.push(N<<4|9,F<<4|9),m(q,q+F*a)}else l.push(M-E<<4|g),po(g)?m(c+(E-f)*a,c+(M-f)*a):m(c,c)}else v>0&&(b?l.push(x,r[w]):l.push(x),p=Math.min(p,f),d=Math.max(d,f),m(c,R));if(f=I,c=R,f>i)break}if(l.length!==0)return{start:p,end:d,mateStart:h,mateEnd:u,cigar:Uint32Array.from(l)}}function Hs(r){return r===1||r===2||r===3}function wn(r,e,t,n,o,s){let i=o===-1?-1:1,a=[],f=e,c=o===-1?n:t,l,p=!1,d=()=>{l!==void 0&&p&&l.qHi>l.qLo&&a.push({start:l.qLo,end:l.qHi,mateStart:l.tLo,mateEnd:l.tHi,cigar:Uint32Array.from(l.ops)}),l=void 0,p=!1};for(let h=0;h<r.length;h++){let u=r[h],m=u>>>4,w=u&15,x=w===9,S=x?r[++h]:void 0,g=x||co(w)?m:0,b=S!==void 0?S>>>4:lo(w)?m:0,y=c+b*i;Hs(w)&&m>=s?d():(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,y),l.tHi=Math.max(l.tHi,c,y),l.ops.push(u),S!==void 0&&l.ops.push(S),p=p||x||po(w)),f+=g,c=y}return d(),a}function ho(r){let e=r.get("CIGAR");return typeof e=="string"?e:void 0}function uo(r){let e=r.get("coarseCigar");return typeof e=="string"?e:void 0}function yn(r){let e=ho(r),t=e===void 0?uo(r):void 0;return e!==void 0?mn(e):t!==void 0?pn(t):void 0}var Gs=W(Ce(),1),Bs=W(go(),1);var Ds=W(Ce(),1);var zs=W(Co(),1);var wo=W(Ce(),1),se=class extends wo.SimpleFeature{get(e){return e==="mismatches"?Ft(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"?ln(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)dn(i,e,o,s);else{let a=o??Number.NEGATIVE_INFINITY,f=s??Number.POSITIVE_INFINITY;for(let c of Ft(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 js=["CIGAR","cs","coarseCigar","cg","cr"];function Us(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 Ws(r){let e=r.get("mate");return Us(e)?e:void 0}function Qs(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 Ys(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:yn(r);if(f===void 0){let c=a?{...s,mateStart:e.start,mateEnd:e.end}:Qs(s,e,i,t);return c===void 0?[]:[c]}else return(n===void 0?[{...s,mateStart:e.start,mateEnd:e.end,cigar:f}]:wn(f,s.start,e.start,e.end,i,n)).flatMap(l=>{let p=gn(l.cigar,l.start,l.mateStart,l.mateEnd,i,t.start,t.end);return p===void 0?[]:[p]})}function Vs(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 js)delete f[c];return s&&t.cigar&&(f.alignmentOps=t.cigar),new se(f)}function yo(r,e,t,n=!1){let o=Ws(r);if(o===void 0)return[r];{let s=Ys(r,o,e,t,n);return s.map((i,a)=>Vs(r,o,i,e,s.length>1?`/${a}`:"",n))}}var qt=class extends xo.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,bo.createStatusFanOut)(a.statusCallback);return an(t).pipe(Ie((l,p)=>this.getFeatures(l,{...a,statusCallback:c()}).pipe(Ie(d=>f?yo(d,d.get("assemblyName")===l.assemblyName?l:{start:d.get("start"),end:d.get("end")},s,i):[d]),kt(),qe(d=>({index:p,features:d})))),kt(),Ie(l=>l.sort((p,d)=>p.index-d.index).flatMap(p=>p.features)))}};var vn=class extends Error{constructor(){super("no haplotype index is set, so the walks cannot be named; build one with gbz-haplotype-index (cargo install gbz-haplotype-index) and set it as haplotypeIndexLocation");this.name="NoHaplotypeIndexError"}},In=class extends Error{constructor(t){super(`a pair query names both lanes: queryAssemblyName ${t} came without a targetAssemblyName`);this.name="PairTargetError"}},An=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"}};function So(r,e){let t=J(e);return r[t]??r[e.sample]??t}function Ks(r,e){return`${J(r)}#${r.contig}@${e.start.node}.${e.start.offset}`}function Xs({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=Ks(f,r),d={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 se(d)}}function Zs({pair:r,lane:e,mateLane:t}){let n=`${J(r.target)}#${r.target.contig}:${r.targetStart}-${r.targetEnd}|${J(r.query)}#${r.query.contig}:${r.queryStart}-${r.queryEnd}`;return new se({uniqueId:n,assemblyName:e,refName:r.target.contig,start:r.targetStart,end:r.targetEnd,type:"match",strand:r.strand==="-"?-1:1,CIGAR:r.cigar,syntenyId:n,identity:r.matches/Math.max(r.columns,1),numMatches:r.matches,blockLen:r.columns,mate:{refName:r.query.contig,start:r.queryStart,end:r.queryEnd,assemblyName:t}})}var xn=r=>!("uri"in r)||r.uri!=="",En=class extends qt{constructor(){super(...arguments);this.graph=(0,bn.cachedSetup)({label:"Opening pangenome database",setup:async()=>{let t=this.getConf("gbzDbLocation"),n=this.getConf("haplotypeIndexLocation"),o=xn(n)?n:await Cr(t,this.pluginManager),s=await Oe.open((0,Ae.openLocation)(t,this.pluginManager),o?{haplotypeIndex:(0,Ae.openLocation)(o,this.pluginManager)}:{}),i=this.getConf("assemblyNames")[0];if(i===void 0)throw new Error("GbzBaseSyntenyAdapter needs assemblyNames: its first entry is the assembly the reference sample is loaded as");let a=await Sr(s),f=Zt({configured:this.getConf("referenceSample"),anchorPrefix:me(this,i),referenceSamples:a});return{db:s,anchor:i,referenceSample:f,referenceSamples:a}}});this.gaf=(0,bn.cachedSetup)({label:"Opening reads",setup:async()=>{let t=this.getConf("readsLocation"),n=this.getConf(["readsIndex","location"]),o=this.pluginManager;if(!xn(t))return;let s=(0,Ae.openLocation)(t,o);return new pt(s,xn(n)?new Rn({filehandle:s,...(0,Ae.openTabixIndexFilehandle)(n,this.getConf(["readsIndex","indexType"]),o)}):void 0)}})}async referenceQuery(t,n){let{db:o,referenceSample:s}=await this.graph(n);return vr(o,s,t)}async getHaplotypes(t={}){let{db:n,referenceSamples:o}=await this.graph(t),s=new Map;for(let i of await n.paths()){let a=J(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=$t(this),a=[];for(let f of await this.getHaplotypes(t))f.sample!==o&&a.push({name:So(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:me(this,i),f=(await n.paths()).filter(c=>i===o?c.isIndexed&&c.name.sample===s:ue(J(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=>me(this,s));return o===void 0&&n===void 0?void 0:s=>br(s,o)&&(n===void 0||ue(J(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 An(i,s);let l=await this.referenceQuery(a,{}),p=this.keepPredicate(n.haplotypes);return Ir(o,l,f,c,{context:this.getConf("context"),snarls:this.getConf("subgraphSnarls"),limit:this.getConf("nodeLimit"),signal:n.signal,...p===void 0?{}:{keep:p}})}async getReads(t,n={}){let o=await this.gaf(n);return o?o.readsOver(new Set(t),n):{records:[],total:0}}async laneHaplotypes(t,n){let o=me(this,t);return(await this.getHaplotypes(n)).filter(s=>ue(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=me(this,n.targetAssemblyName),l=$t(this),p=this.keepPredicate(n.haplotypes,c),d=await this.referenceQuery(i,n),h=this.getConf("nodeLimit");return(d?await(0,Sn.updateStatus)(`Reading graph ${i}:${a.toLocaleString()}-${f.toLocaleString()}`,n.statusCallback,()=>o.getAlignmentsForRange(d,a,f,{context:this.getConf("context"),haplotypes:"all",limit:h,signal:n.signal,...p===void 0?{}:{keep:p}}).catch(m=>{throw Te(m,h,f-a)??m})):[]).flatMap(m=>{let w=m.resolved?Xs({alignment:m,assemblyName:s,refName:i,lane:So(l,m.name)}):void 0;return w===void 0?[]:[w]})}async pairFeatures(t,n,o){let{targetAssemblyName:s}=o;if(s===void 0)throw new In(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),d=[...l,...p],h=await this.referenceQuery(a,o),u=this.getConf("nodeLimit"),m=await i.haplotypeAnchorSpacing()!==void 0,w=(g,b)=>i.getSubgraphForRange(g,b.start,b.end,{context:this.getConf("context"),haplotypes:"all",limit:u,signal:o.signal,keep:y=>d.some(v=>v.sample===y.sample&&v.haplotype===y.haplotype)}).catch(y=>{throw Te(y,u,c-f)??y}),x=h&&m&&l.length>0&&p.length>0?(await(0,Sn.updateStatus)(`Reading ${n} against ${s}`,o.statusCallback,async()=>Promise.all((await this.referencePieces(a,f,c,o)).map(g=>w(h,g))))).filter(g=>g!==void 0):[];return x.every(g=>{let b=g.stats.anchorWalk;return b!==void 0&&b.fallback===void 0})?x.flatMap(g=>l.flatMap(b=>p.flatMap(y=>g.pairAlignments({target:b,query:y,bases:!1}).map(v=>Zs({pair:v,lane:n,mateLane:s}))))):[]}getFeatures(t,n={}){return(0,vo.ObservableCreate)(async o=>{let{db:s,anchor:i}=await this.graph(n);if(!s.hasHaplotypeIndex)throw new vn;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{An as HaplotypeWindowError,vn as NoHaplotypeIndexError,ct as NoReferenceSampleError,lt as NodeLimitError,In as PairTargetError,En as default,Xs as fragmentFeature,J as haplotypePrefix,So as laneAssemblyName,Te as nodeLimitError,Zs as pairFeature,Zt as resolveReferenceSample};
|
|
8
|
-
//# sourceMappingURL=GbzBaseSyntenyAdapter-
|
|
8
|
+
//# sourceMappingURL=GbzBaseSyntenyAdapter-3ZTHTTHA.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as x}from"./chunk-
|
|
1
|
+
import{a as x}from"./chunk-YWJ3RWYB.js";import"./chunk-JXAJ7YLT.js";import"./chunk-UQEPPJEO.js";import"./chunk-SCMIJAAX.js";import"./chunk-FCWXYIFC.js";import"./chunk-5E7TVPCI.js";import{B as L}from"./chunk-IUIIYSGF.js";import"./chunk-EFVAQ2KM.js";import"./chunk-KULNKXPT.js";import{a as s,b as g,c as v,d as G,e as B}from"./chunk-XEJ47DLD.js";import{b as a}from"./chunk-FY3BTKY4.js";var S=a(g(),1);var m=a(G(),1),n=a(v(),1),C=a(g(),1),P=a(L(),1),o=a(s(),1),I=(0,P.makeStyles)()({paper:{padding:16,margin:8,maxWidth:560,marginInline:"auto",display:"flex",flexDirection:"column",gap:12},row:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:8}}),b=(0,C.observer)(function({model:e}){let{classes:r}=I();return e.isLoading?(0,o.jsxs)(n.Paper,{className:r.paper,"data-testid":"graph-genome-loading",children:[(0,o.jsxs)("div",{className:r.row,children:[(0,o.jsx)(m.LoadingEllipses,{variant:"h6",message:e.statusMessage}),(0,o.jsx)(n.Button,{size:"small","data-testid":"graph-genome-cancel",onClick:()=>{e.cancelLoad()},children:"Cancel"})]}),(0,o.jsx)(n.LinearProgress,{variant:"indeterminate"})]}):e.error?(0,o.jsx)(n.Paper,{className:r.paper,children:(0,o.jsx)(m.ErrorBanner,{error:e.error,onReset:()=>{e.retryLoad()}})}):(0,o.jsx)(n.Paper,{className:r.paper,"data-testid":"graph-genome-load-canceled",children:(0,o.jsxs)("div",{className:r.row,children:[(0,o.jsx)(n.Typography,{variant:"h6",children:"Loading canceled"}),(0,o.jsx)(n.Button,{variant:"contained",size:"small","data-testid":"graph-genome-retry",onClick:()=>{e.retryLoad()},children:"Retry"})]})})}),h=b;var M=a(B(),1),N=a(G(),1),i=a(v(),1),w=a(g(),1),E=a(L(),1),t=a(s(),1),k=`H VN:Z:1.0
|
|
2
2
|
S 1 ACGT
|
|
3
3
|
S 2 GGCC
|
|
4
4
|
S 3 TTAA
|
|
@@ -7,4 +7,4 @@ L 1 + 2 + 0M
|
|
|
7
7
|
L 1 + 3 + 0M
|
|
8
8
|
L 2 + 4 + 0M
|
|
9
9
|
L 3 + 4 + 0M`,z=(0,E.makeStyles)()({column:{display:"flex",flexDirection:"column",gap:8},rowEnd:{display:"flex",gap:8,alignItems:"flex-end"},rowCenter:{display:"flex",gap:8,alignItems:"center"},flex1:{flex:1},paper:{padding:16,margin:8,maxWidth:560,marginInline:"auto"},header:{marginBottom:12},footer:{marginTop:12,display:"flex",justifyContent:"flex-end"}}),R=(0,w.observer)(function({model:e}){let{classes:r}=z(),[d,T]=(0,M.useState)("");function y(){d.trim()&&e.loadGFAFromLocation({uri:d,locationType:"UriLocation"})}function A(p){let c=p.target.files?.[0];c&&c.text().then(f=>e.loadGFA(f,c.name)).catch(f=>{e.setError(f)})}return(0,t.jsxs)(i.Paper,{className:r.paper,children:[(0,t.jsx)("div",{className:r.header,children:(0,t.jsx)(i.Typography,{variant:"h6",children:"Load a GFA graph"})}),(0,t.jsxs)("div",{className:r.column,children:[(0,t.jsxs)("div",{className:r.rowCenter,children:[(0,t.jsxs)(i.Button,{variant:"outlined",component:"label",size:"small",children:["Choose file",(0,t.jsx)("input",{type:"file",accept:".gfa,.gfa1,.gfa2",hidden:!0,onChange:p=>{A(p)}})]}),(0,t.jsx)(i.Typography,{variant:"caption",color:"text.secondary",children:"Whole-file GFA; best for small/medium graphs."})]}),(0,t.jsxs)("div",{className:r.rowEnd,children:[(0,t.jsx)(i.TextField,{size:"small",label:"URL",placeholder:"https://example.com/graph.gfa",value:d,onChange:p=>{T(p.target.value)},onKeyDown:p=>{p.key==="Enter"&&y()},className:r.flex1}),(0,t.jsx)(i.Button,{variant:"contained",onClick:()=>{y()},disabled:!d.trim(),children:"Open"})]})]}),(0,t.jsx)("div",{className:r.footer,children:(0,t.jsx)(i.Button,{size:"small",onClick:()=>{e.loadGFA(k,"Example graph")},children:"Load 4-node example"})}),e.error?(0,t.jsx)(N.ErrorBanner,{error:e.error}):null]})}),F=R;var l=a(s(),1),U=(0,S.observer)(function({model:e}){return e.hasGraph?(0,l.jsx)(x,{model:e}):e.canRetryLoad&&(e.error||e.loadCanceled)?(0,l.jsx)(h,{model:e}):(0,l.jsxs)(l.Fragment,{children:[e.isLoading?(0,l.jsx)(h,{model:e}):null,(0,l.jsx)("div",{hidden:e.isLoading,children:(0,l.jsx)(F,{model:e})})]})}),O=U;export{O as default};
|
|
10
|
-
//# sourceMappingURL=GraphGenomeView-
|
|
10
|
+
//# sourceMappingURL=GraphGenomeView-35HMVXRP.js.map
|
package/dist/chunks/{GraphTrackSettingsDialog-3A2PKZRI.js → GraphTrackSettingsDialog-2QV6TPX7.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as g}from"./chunk-
|
|
1
|
+
import{a as g}from"./chunk-5E7TVPCI.js";import{B as f}from"./chunk-IUIIYSGF.js";import"./chunk-EFVAQ2KM.js";import"./chunk-KULNKXPT.js";import{a as l,b as m,c as y,e as x}from"./chunk-XEJ47DLD.js";import{b as o}from"./chunk-FY3BTKY4.js";var a=o(y(),1),b=o(m(),1),S=o(f(),1),n=o(l(),1),L=(0,S.makeStyles)()({section:{marginBottom:24},formControl:{minWidth:200}}),w=[{value:0,label:"None"},{value:1,label:"1 hop"},{value:2,label:"2 hops"}],k=(0,b.observer)(function({model:e}){let{classes:t}=L();return(0,n.jsxs)("div",{className:t.section,children:[(0,n.jsxs)(a.FormControl,{className:t.formControl,children:[(0,n.jsx)(a.InputLabel,{children:"Graph context"}),(0,n.jsx)(a.Select,{value:e.subgraphContext,label:"Graph context","data-testid":"graph-context-select",onChange:p=>{e.setSubgraphContext(p.target.value),e.cut()},children:w.map(({value:p,label:u})=>(0,n.jsx)(a.MenuItem,{value:p,children:u},p))})]}),(0,n.jsx)(a.Typography,{variant:"caption",color:"text.secondary",children:"How far the cut follows links out of the region, one hop by default. A detour that leaves the reference before the window and rejoins after it is indexed under its own sequence, so at none its middle is missing and the one bubble draws as two unrelated stubs. Each hop costs a query per off-reference segment already reached."})]})}),v=k;var C=o(x(),1),d=o(y(),1),c=o(m(),1),G=o(f(),1),i=o(l(),1),T=(0,G.makeStyles)()({section:{marginBottom:24}});function M(r){let e=r.split(/[\s,]+/).map(t=>t.trim()).filter(t=>t!=="");return e.length===0?void 0:e}var F=(0,c.observer)(function({model:e}){let[t,p]=(0,C.useState)(e.chosenHaplotypes?.join(", ")??""),u=()=>{let s=M(t)??[];s.join(`
|
|
2
2
|
`)===(e.chosenHaplotypes??[]).join(`
|
|
3
3
|
`)||(e.setSubgraphHaplotypes(s),e.cut())};return(0,i.jsx)(d.TextField,{fullWidth:!0,label:"Haplotypes",placeholder:"every haplotype",value:t,slotProps:{htmlInput:{"data-testid":"graph-haplotypes-field"}},onChange:s=>{p(s.target.value)},onBlur:()=>{u()},onKeyDown:s=>{s.key==="Enter"&&u()}})}),N=(0,c.observer)(function({model:e}){let{classes:t}=T();return e.adapterConfig.type==="GbzBaseSyntenyAdapter"?(0,i.jsxs)("div",{className:t.section,children:[(0,i.jsx)(F,{model:e},e.chosenHaplotypes?.join(",")??""),(0,i.jsx)(d.Typography,{variant:"caption",color:"text.secondary",children:"The haplotypes the cut is for, as lane assembly names or PanSN prefixes (HG002#1, or HG002 for both), separated by commas. The cut keeps their walks and the nodes those walks visit, with the reference. Empty is every haplotype."})]}):null}),H=N;var h=o(l(),1);function B({model:r,open:e,onClose:t}){return(0,h.jsxs)(g,{model:r,open:e,onClose:t,children:[(0,h.jsx)(v,{model:r}),(0,h.jsx)(H,{model:r})]})}export{B as default};
|
|
4
|
-
//# sourceMappingURL=GraphTrackSettingsDialog-
|
|
4
|
+
//# sourceMappingURL=GraphTrackSettingsDialog-2QV6TPX7.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as i}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=LinearGraphDisplay-
|
|
1
|
+
import{a as i}from"./chunk-YWJ3RWYB.js";import"./chunk-JXAJ7YLT.js";import"./chunk-UQEPPJEO.js";import"./chunk-SCMIJAAX.js";import"./chunk-FCWXYIFC.js";import"./chunk-5E7TVPCI.js";import"./chunk-IUIIYSGF.js";import"./chunk-EFVAQ2KM.js";import"./chunk-KULNKXPT.js";import{a as e,b as d}from"./chunk-XEJ47DLD.js";import{a as h,b as t}from"./chunk-FY3BTKY4.js";var p=h((l,o)=>{o.exports=JBrowseExports["@jbrowse/display-kit/DisplayChrome"]});var s=t(p(),1),n=t(d(),1);var r=t(e(),1),y=(0,n.observer)(function({model:a}){return(0,r.jsx)(s.DisplayStatusChrome,{model:a,phase:a.displayPhase,drawn:a.painted&&a.geometryPainted,testid:"linear-graph-display","data-layout":a.chosenLayoutMode,"data-cut-tier":a.cutTier,"data-recuts":a.recuts,"data-node-count":a.hasGraph?a.nodeCount:void 0,"data-loading":a.isLoading?"":void 0,style:{width:a.paneWidth,height:a.height,overflow:"hidden"},children:(0,r.jsx)(i,{model:a,ownChrome:!1})})}),c=y;export{c as default};
|
|
2
|
+
//# sourceMappingURL=LinearGraphDisplay-3M3LNC5H.js.map
|
package/dist/chunks/{MinigraphBubbleAdapter-APC7JYOM.js → MinigraphBubbleAdapter-NRDD66AK.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m,b as g}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=MinigraphBubbleAdapter-
|
|
1
|
+
import{a as m,b as g}from"./chunk-33VHHB43.js";import{c as N,d as C}from"./chunk-JAQ2RQAE.js";import"./chunk-KWAXLUPQ.js";import{a as y}from"./chunk-J4OLMLS5.js";import{a as b,c as p,e as u}from"./chunk-UQEPPJEO.js";import"./chunk-KULNKXPT.js";import{b as n}from"./chunk-FY3BTKY4.js";var f=n(N(),1),r=n(y(),1),c=n(C(),1);var o=class extends f.BaseFeatureDataAdapter{static{this.capabilities=["getFeatures","getRefNames"]}constructor(t,a,s){super(t,a,s),this.bubbles=m(this,["bubblesLocation"],["index"]),this.refNames=new g(this.bubbles,this)}async getRefNames(t={}){return this.refNames.assemblyRefNames(t)}async hasDataForRefName(){return!0}getFeatures(t,a={}){let{signal:s,statusCallback:d}=a;return(0,c.ObservableCreate)(async i=>{let l=await this.refNames.resolve(t,a);l!==void 0&&await(0,r.updateStatus)("Downloading bubbles",d,()=>this.bubbles.getLines(l,t.start,t.end,{signal:s,lineCallback:(h,A)=>{let e=b(h);i.next(new r.SimpleFeature({uniqueId:`bubble-${A}`,refName:t.refName,start:e.start,end:e.end,name:p(e),description:u(e),type:"bubble",score:e.segmentCount,segmentCount:e.segmentCount,pathCount:e.pathCount,inversion:e.inversion,shortestAlleleLength:e.shortestAlleleLength,longestAlleleLength:e.longestAlleleLength,segments:e.segments,shortestAllele:e.shortestAllele,longestAllele:e.longestAllele}))}})),i.complete()},s)}};export{o as default};
|
|
2
|
+
//# sourceMappingURL=MinigraphBubbleAdapter-NRDD66AK.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as h,b as y}from"./chunk-
|
|
1
|
+
import{a as h,b as y}from"./chunk-33VHHB43.js";import{c as O,d as P}from"./chunk-JAQ2RQAE.js";import"./chunk-KWAXLUPQ.js";import{a as B}from"./chunk-J4OLMLS5.js";import"./chunk-KULNKXPT.js";import{b as S}from"./chunk-FY3BTKY4.js";var C=S(O(),1),l=S(B(),1),M=S(P(),1);function b(t){let e=t.split(" ");return{refName:e[0],start:+e[1],end:+e[2],id:e[3],rank:+e[4],tags:e[5]??""}}function $(t){let e=t.tags.split(" ").find(a=>a.startsWith("SM:Z:"));if(e===void 0)return;let n=e.slice(5).split(",").map(a=>a.trim()).filter(Boolean);return n.length>0?n:void 0}function L(t){return{id:t.slice(0,-1),strand:t.slice(-1)}}function A(t){let e=t.split(" "),n=L(e[3]),a=L(e[4]);return{source:n.id,sourceStrand:n.strand,target:a.id,targetStrand:a.strand,sourceSegment:{id:n.id,refName:e[5],start:+e[6],end:+e[7],rank:+e[8],tags:e[13]??""},targetSegment:{id:a.id,refName:e[9],start:+e[10],end:+e[11],rank:+e[12],tags:e[14]??""}}}function I(t){return`${t.source}${t.sourceStrand}${t.target}${t.targetStrand}`}var j=/^[A-Za-z][A-Za-z0-9]:[AifZJHB]:/;function G(t){let{id:e,refName:n,start:a,end:r,rank:s,tags:m}=t,o=m.split(" ").filter(g=>j.test(g)),i=o.length===0?"":` ${o.join(" ")}`;return`S ${e} * LN:i:${r-a} SN:Z:${n} SO:i:${a} SR:i:${s}${i}`}function Z(t){let{source:e,sourceStrand:n,target:a,targetStrand:r}=t;return`L ${e} ${n} ${a} ${r} 0M`}function w(t,e){return t<e?-1:t>e?1:0}function T(t,e){let n=[...t.values()].sort((r,s)=>r.refName===s.refName?r.start-s.start:w(r.refName,s.refName)),a=[...e.keys()].sort((r,s)=>w(r,s));return["H VN:Z:1.0",...n.map(r=>G(r)),...a.map(r=>Z(e.get(r)))].join(`
|
|
2
2
|
`)}function F(t){return t.filter(e=>e.rank>0)}var N=class extends C.BaseFeatureDataAdapter{static{this.capabilities=["getFeatures","getRefNames"]}constructor(e,n,a){super(e,n,a),this.fine=this.openIndex([])}openIndex(e){let n=h(this,[...e,"segmentsLocation"],[...e,"segmentsIndex"]);return{segments:n,links:h(this,[...e,"linksLocation"],[...e,"linksIndex"]),refNames:new y(n,this)}}index(e="fine"){return e==="fine"?this.fine:(this.coarse??=this.openIndex(["coarse"]),this.coarse)}async getRefNames(e={}){return this.fine.refNames.assemblyRefNames(e)}async hasDataForRefName(){return!0}getFeatures(e,n={}){let{signal:a,statusCallback:r}=n;return(0,M.ObservableCreate)(async s=>{let m=await this.fine.refNames.resolve(e,n);m!==void 0&&await(0,l.updateStatus)("Downloading segments",r,()=>this.fine.segments.getLines(m,e.start,e.end,{signal:a,lineCallback:o=>{let i=b(o),g=$(i);s.next(new l.SimpleFeature({uniqueId:i.id,refName:e.refName,start:i.start,end:i.end,name:i.id,type:"segment",rank:i.rank,stableName:i.refName,...g&&{samples:g,carriers:g.length}}))}})),s.complete()},a)}async getSubgraph(e,n={}){let{hops:a=0,signal:r,tier:s}=n,m=this.index(s),o=new Map,i=new Map,g=await m.refNames.resolve(e,{signal:r}),x=async(f,p,c)=>{let k=[];return await m.links.getLines(f,p,c,{signal:r,lineCallback:v=>{let d=A(v);i.set(I(d),d);for(let u of[d.sourceSegment,d.targetSegment])o.has(u.id)||(o.set(u.id,u),k.push(u))}}),k};if(g===void 0)throw new Error(`${e.assemblyName} ${e.refName} is not in this graph's index; a graph with PanSN names (GRCh38#0#chr1) needs ${e.assemblyName} mapped to its prefix in assemblyNameToPanSN`);await m.segments.getLines(g,e.start,e.end,{signal:r,lineCallback:f=>{let p=b(f);o.set(p.id,p)}});let R=F(await x(g,e.start,e.end));for(let f=0;f<a;f++){let p=await Promise.all(R.map(c=>x(c.refName,c.start,c.end)));R=F(p.flat())}return T(o,i)}};export{N as default};
|
|
3
|
-
//# sourceMappingURL=RgfaTabixAdapter-
|
|
3
|
+
//# sourceMappingURL=RgfaTabixAdapter-NQEERXXI.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as l,c as h}from"./chunk-JAQ2RQAE.js";import{a as y}from"./chunk-KWAXLUPQ.js";import{a as u,
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{b as l,c as h}from"./chunk-JAQ2RQAE.js";import{a as y}from"./chunk-KWAXLUPQ.js";import{a as u,c as m,d as s,e as g,f as p}from"./chunk-KULNKXPT.js";import{b as f}from"./chunk-FY3BTKY4.js";var x=f(h(),1),r=f(y(),1),N=50*2**20;function B(n,t,e){let a=n.pluginManager;return new l({filehandle:(0,r.openLocation)(n.getConf(t),a),...(0,r.openTabixIndexFilehandle)(n.getConf([...e,"location"]),n.getConf([...e,"indexType"]),a),chunkCacheSize:N})}function c(n,t){return`${n} ${t}`}function S(n){let t=new Map;for(let e of n){t.set(e,e);let a=u(e);if(a!==e){let i=s(e);t.set(c(a,i),e);let o=m(e);o!==void 0&&t.set(c(o,i),e)}}return t}function b(n,t,e){let a=n.get(c(t,e));return a===void 0?n.get(e):a}var d=class{constructor(t,e){this.file=t;this.adapter=e;this.lookup=(0,x.cachedSetup)({setup:async t=>S(await this.file.getReferenceSequenceNames(t))})}async assemblyRefNames(t={}){let e=await this.file.getReferenceSequenceNames(t),a=p(this.adapter,t.assemblyName),i=e.filter(o=>g(o,a)).map(o=>s(o));return i.length>0?i:e}async resolve(t,e){let a=await this.lookup(e);return b(a,p(this.adapter,t.assemblyName),t.refName)}};export{B as a,d as b};
|
|
2
|
+
//# sourceMappingURL=chunk-33VHHB43.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{B as M,c as m,f as u,r as c,w as g}from"./chunk-IUIIYSGF.js";import{a as d,b as N,c as I,d as G}from"./chunk-XEJ47DLD.js";import{a as T,b as l}from"./chunk-FY3BTKY4.js";var b=T((D,y)=>{y.exports=JBrowseExports["@mui/material/Button"]});var C=l(G(),1),t=l(I(),1),f=l(b(),1),h=l(N(),1),k=l(M(),1),e=l(d(),1),B=(0,k.makeStyles)()({section:{marginBottom:24},formControl:{minWidth:200}}),R=["Lowest","Low","Medium","High","Highest"],v=(0,h.observer)(function({model:s}){return s.hasGraph&&!s.usesLayoutEngine?(0,e.jsx)(t.Typography,{variant:"caption",color:"warning.main",children:"No effect on this layout: only the force-directed layout is drawn by the engine that reads this."}):null}),x=(0,h.observer)(function(s){let{model:o,open:S,onClose:p,children:L}=s,{classes:n}=B();return(0,e.jsxs)(C.Dialog,{open:S,onClose:p,title:"Graph settings",children:[(0,e.jsxs)(t.DialogContent,{children:[(0,e.jsx)("div",{className:n.section,children:(0,e.jsxs)(t.FormControl,{fullWidth:!0,children:[(0,e.jsx)(t.FormLabel,{component:"legend",children:"Layout quality"}),(0,e.jsx)(t.RadioGroup,{value:o.layoutQuality,onChange:a=>{let r=parseInt(a.target.value);o.setLayoutQuality(r),o.recomputeLayout()},children:R.map((a,r)=>(0,e.jsx)(t.FormControlLabel,{value:r,control:(0,e.jsx)(t.Radio,{}),label:a},a))}),(0,e.jsx)(t.Typography,{variant:"caption",color:"text.secondary",children:"FMMM's iteration budget, the same scale Bandage exposes. Higher is slower: on a thousand-node cut the top setting is seconds rather than tenths."}),(0,e.jsx)(v,{model:o})]})}),(0,e.jsxs)("div",{className:n.section,children:[(0,e.jsx)(t.FormControlLabel,{control:(0,e.jsx)(t.Switch,{checked:o.drawPaths,onChange:a=>{o.setDrawPaths(a.target.checked)}}),label:"Draw paths"}),(0,e.jsx)(t.Typography,{variant:"caption",color:"text.secondary",children:"Color each node and connector by the paths through it, one lane per path in legend order, so a path that skips a node leaves its lane empty"}),o.drawPaths&&!o.effectiveDrawPaths?(0,e.jsx)(t.Typography,{variant:"caption",color:"warning.main",children:o.pathCount>c?`Off: ${o.pathCount.toLocaleString()} paths is past the ${c} this can tell apart`:"Off: this graph states no paths"}):null]}),(0,e.jsxs)("div",{className:n.section,children:[(0,e.jsx)(t.FormControlLabel,{control:(0,e.jsx)(t.Switch,{checked:o.showBubbles,onChange:a=>{o.setShowBubbles(a.target.checked)}}),label:"Mark bubbles"}),(0,e.jsx)(t.Typography,{variant:"caption",color:"text.secondary",children:"A halo along the nodes of each bubble, labelled by what it is, with the label opening the bubble on its own"})]}),(0,e.jsxs)("div",{className:n.section,children:[(0,e.jsx)(t.FormControlLabel,{control:(0,e.jsx)(t.Switch,{checked:o.showGenes,onChange:a=>{o.setShowGenes(a.target.checked)}}),label:"Genes on the backbone"}),(0,e.jsx)(t.Typography,{variant:"caption",color:"text.secondary",children:"Exons along the reference nodes that carry them and each gene's name at its midpoint, from the assembly's annotation track"}),o.geneTrackChoices.length>1?(0,e.jsxs)(t.FormControl,{className:n.formControl,sx:{mt:1},children:[(0,e.jsx)(t.InputLabel,{children:"Gene track"}),(0,e.jsx)(t.Select,{value:o.geneTrack?.trackId??"",label:"Gene track","data-testid":"graph-gene-track-select",onChange:a=>{o.setGeneTrackId(a.target.value),o.reloadGenes()},children:o.geneTrackChoices.map(({trackId:a,name:r})=>(0,e.jsx)(t.MenuItem,{value:a,children:r},a))})]}):null,o.repeatTrackChoices.length>1?(0,e.jsxs)(t.FormControl,{className:n.formControl,sx:{mt:1},children:[(0,e.jsx)(t.InputLabel,{children:"Repeat track"}),(0,e.jsx)(t.Select,{value:o.repeatTrack?.trackId??"",label:"Repeat track","data-testid":"graph-repeat-track-select",onChange:a=>{o.setRepeatTrackId(a.target.value),o.reloadRepeats()},children:o.repeatTrackChoices.map(({trackId:a,name:r})=>(0,e.jsx)(t.MenuItem,{value:a,children:r},a))})]}):null]}),o.anchorPaths.length>1?(0,e.jsxs)("div",{className:n.section,children:[(0,e.jsxs)(t.FormControl,{className:n.formControl,children:[(0,e.jsx)(t.InputLabel,{children:"Reference path"}),(0,e.jsx)(t.Select,{value:o.activeReferencePath??"",label:"Reference path","data-testid":"graph-reference-path-select",onChange:a=>{o.setReferencePath(a.target.value),o.recomputeLayout()},children:o.anchorPaths.map(({name:a})=>(0,e.jsx)(t.MenuItem,{value:a,children:a},a))})]}),(0,e.jsx)(t.Typography,{variant:"caption",color:"text.secondary",children:"Which path the anchored layouts draw x against. A GFA with no rGFA tags states its coordinates only in its paths, and marks none of them as the reference."})]}):null,(0,e.jsxs)("div",{className:n.section,children:[(0,e.jsxs)(t.FormControl,{className:n.formControl,children:[(0,e.jsx)(t.InputLabel,{children:"Bubble spread"}),(0,e.jsx)(t.Select,{value:o.bubbleSpread,label:"Bubble spread","data-testid":"graph-bubble-spread-select",onChange:a=>{o.setBubbleSpread(a.target.value),o.recomputeLayout()},children:m.map(({value:a,label:r,description:i})=>(0,e.jsx)(t.MenuItem,{value:a,children:(0,e.jsx)(t.Tooltip,{title:i,placement:"right",children:(0,e.jsx)("span",{children:r})})},a))})]}),(0,e.jsx)(t.Typography,{variant:"caption",color:"text.secondary",children:"How far the force layout opens a bubble. A pangenome allele is a few bp, so at Bandage's own scale both arms land inside one node thickness and the graph draws as a rope."}),(0,e.jsx)(v,{model:o})]}),(0,e.jsxs)("div",{className:n.section,children:[(0,e.jsxs)(t.FormControl,{className:n.formControl,children:[(0,e.jsx)(t.InputLabel,{children:"Node width"}),(0,e.jsx)(t.Select,{value:o.nodeWidth,label:"Node width","data-testid":"graph-node-width-select",onChange:a=>{o.setNodeWidth(a.target.value)},children:g.map(({value:a,label:r,description:i})=>(0,e.jsx)(t.MenuItem,{value:a,children:(0,e.jsx)(t.Tooltip,{title:i,placement:"right",children:(0,e.jsx)("span",{children:r})})},a))})]}),(0,e.jsx)(t.Typography,{variant:"caption",color:"text.secondary",children:"Bandage's depth as width. In a cut with walks, depth is how many haplotypes carry the node."})]}),L,(0,e.jsx)("div",{className:n.section,children:(0,e.jsxs)(t.FormControl,{className:n.formControl,children:[(0,e.jsx)(t.InputLabel,{children:"Color scheme"}),(0,e.jsx)(t.Select,{value:o.chosenColorScheme,label:"Color scheme",onChange:a=>{o.setColorScheme(a.target.value)},children:u.map(({value:a,label:r})=>(0,e.jsx)(t.MenuItem,{value:a,children:r},a))})]})})]}),(0,e.jsx)(t.DialogActions,{children:(0,e.jsx)(f.default,{variant:"contained",color:"primary",onClick:p,children:"Close"})})]})}),O=x;export{O as a};
|
|
2
|
+
//# sourceMappingURL=chunk-5E7TVPCI.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as c,b as u}from"./chunk-KULNKXPT.js";import{a as L}from"./chunk-FY3BTKY4.js";var j=L((Ne,N)=>{N.exports=JBrowseExports["tss-react/mui"]});function X(e,t){return Math.max(e.nodeLengthPerMegabase*t/1e6,e.minimumNodeLength)}function b(e,t=5){let r=e.nodes.reduce((s,a)=>s+a.length,0)/1e6,o=Math.max(e.nodes.length*40,500);return{nodeLengthPerMegabase:r>0?o/r:1e4,minimumNodeLength:Math.max(5,t),edgeLength:5,nodeSegmentLength:20}}var d={power:1,effect:1};function E(e){return e.power===1&&e.effect===1}function _(e,t){let n=e.nodes.length,r=e.nodes.reduce((a,i)=>a+i.length,0),o=n>0?r/n:0,s=n>0?Math.max(n*40,500)/n:40;return a=>{if(o<=0)return s;let i=(a/o)**t.power;return Math.max(s*((i-1)*t.effect+1),5)}}var m=1e3,x={law:d,minNodeLength:0};function q(e,t=x){let{law:n,minNodeLength:r}=t,o=b(e,r);if(E(n))return{nodes:e.nodes,opts:o};let s=_(e,n);return{nodes:e.nodes.map(a=>({...a,length:Math.round(s(a.length)*m)})),opts:{...o,nodeLengthPerMegabase:1e6/m,minimumNodeLength:5}}}var f=[{value:"auto",label:"Proportional",description:"Bandage's own scale: a node draws proportional to its length, so a 1 bp allele is a speck.",law:d,minNodeFactor:0},{value:"open",label:"Open bubbles",description:"Give every allele a drawn length, so a bubble reads as two arms rather than a knot.",law:d,minNodeFactor:2.5},{value:"wide",label:"Wide bubbles",description:"As open, spread further. Best on a window of a dozen bubbles.",law:d,minNodeFactor:10},{value:"compress",label:"Compress lengths",description:"Pull the longest and shortest nodes towards the graph\u2019s mean, so a cut spanning kb and bp fits one pane.",law:{power:.5,effect:.5},minNodeFactor:0}],J=f.map(e=>e.value);function Y(e){let t=f.find(n=>n.value===e);return{law:t?.law??d,minNodeLength:(t?.minNodeFactor??0)*40}}var S=[{value:"auto",label:"Auto"},{value:"uniform",label:"Uniform"},{value:"random",label:"Random"},{value:"rainbow",label:"Rainbow"},{value:"depth",label:"Depth"},{value:"node-length",label:"Node Length"},{value:"stable-rank",label:"Stable rank"},{value:"reference-position",label:"Reference position"},{value:"grey",label:"Grey"}],Z=S.map(e=>e.value);function ee(e,t){return e!=="auto"?e:t?.anchoredBy?"reference-position":"uniform"}var O=/:(\d+)-\d+$/;function l(e){let t=O.exec(e);return t?{name:e.slice(0,t.index),start:+t[1]}:{name:e,start:0}}function oe(e,t){let n=[],r=new Map;for(let o of e){let s=c(o.name),a=o.start;for(let i of o.steps){let p={path:o.name,sample:s,start:a,strand:i.strand},h=r.get(i.id);h?h.push(p):r.set(i.id,[p]),a+=t(i.id)}n.push({name:o.name,sample:s,start:o.start,length:a-o.start})}return{anchorPaths:n,pathVisits:r}}function M(e,t){return e.find(r=>r.sample===t||r.name===t)??e[0]}var w=1;function P(e,t,n){let r=e;if(t&&t.length>0){let o=t.find(s=>s.path===n)??t[0];r={...e,stable:{refName:o.path,start:o.start,rank:o.path===n?0:w,strand:o.strand},samples:[...new Set(t.map(s=>s.sample))].sort()}}return r}function y(e,t){let{anchorPaths:n,pathVisits:r}=e,o=n&&r?M(n,t):void 0;return o&&r?{...e,nodes:e.nodes.map(s=>P(s,r.get(s.name),o.name)),anchoredBy:"paths",referencePath:o.name}:e}function ae(e,t){return e.anchoredBy==="tags"?e:y(e,t)}function de(e){let t=0;for(let n=0;n<e.length;n++)t=e.charCodeAt(n)+((t<<5)-t);return Math.abs(t%360)}function T(e,t){return e*360/t}var D=.7,R=.5,H=16;function le(e){return e>0&&e<=H}function I(e,t){return`hsl(${T(e,t)}, ${D*100}%, ${R*100}%)`}function he(e,t){return`hsl(0, 0%, ${t>1?25+45*e/(t-1):45}%)`}function v(e){let t=l(e).name.split("#"),n=t.join("#");if(t.length>=3&&u(t[0])){let r=t.slice(2).join("#");return[r,r,n]}return[t[0],t.slice(0,2).join("#"),n]}function B(e){return String(e).replace(/\B(?=(\d{3})+$)/g,",")}function C(e,t){let{start:n}=l(e);return t.map(r=>`${r} @${B(n)}`)}function ce(e,t){let n=e.map(a=>v(a.name)),r=[0,1,2].flatMap(a=>[e.map((i,p)=>n[p][a]),e.map((i,p)=>C(i.name,n[p])[a])]),s=r.find(a=>new Set(a).size===e.length)??r.at(-1);return e.map((a,i)=>({name:a.name,label:s[i],color:t?.[i]??I(i,e.length)}))}var F=[{value:"depth",label:"By depth",description:"Thicker the more paths carry a node, on the square root of its depth against the mean. A graph with one depth everywhere draws uniform."},{value:"uniform",label:"Uniform",description:"Every node the same thickness."}],me=F.map(e=>e.value),U=.3,g=3;function W(e){let t=0,n=0;for(let r of e.nodes)t+=r.depth*r.length,n+=r.length;return n>0?t/n:0}function k(e,t){return!(t>0)||!(e.depth>0)?1:Math.min(g,Math.max(U,Math.sqrt(e.depth/t)))}function V(e,t,n,r){return t*(n==="depth"?k(e,r):1)}function $(e,t){return e*(t==="depth"?g:1)}function fe(e,t,n,r){let o=e?W(e):0;return{maxHalfWidthPx:$(n,r)/2,halfWidthPx:s=>{let a=t?.get(s);return a?V(a,n,r,o)/2:n/2}}}export{X as a,q as b,f as c,J as d,Y as e,S as f,Z as g,ee as h,l as i,oe as j,M as k,y as l,ae as m,de as n,T as o,D as p,R as q,H as r,le as s,I as t,he as u,ce as v,F as w,me as x,W as y,V as z,fe as A,j as B};
|
|
2
|
+
//# sourceMappingURL=chunk-IUIIYSGF.js.map
|