chromosomix 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -11
- package/dist/THIRD-PARTY-NOTICES.txt +2 -2
- package/dist/assets/{ConnectCard-CNwlR_yV.js → ConnectCard-DMVXG5RV.js} +1 -1
- package/dist/assets/{Tour-Dn4L7jES.js → Tour-B2TqlBZJ.js} +1 -1
- package/dist/assets/analysis.worker-CCrEqZ1d.js +8 -0
- package/dist/assets/{annotations.worker-Bd03nKdJ.js → annotations.worker-DPRPwDSy.js} +26 -26
- package/dist/assets/index-Cy5f_JUV.css +1 -0
- package/dist/assets/index-Cys9FWNc.js +579 -0
- package/dist/assets/{reader.worker-DKXrm0nO.js → reader.worker-D44DC4HP.js} +5 -5
- package/dist/assets/{three-BZagS2ne.js → three-8dUtnT3a.js} +1 -1
- package/dist/assets/{tutorial-DOptkiKU.js → tutorial-C8UBY5wh.js} +1 -1
- package/dist/assets/workspace-DtuBV6aE.js +12 -0
- package/dist/index.html +2 -2
- package/dist-cli/THIRD-PARTY-NOTICES.txt +2 -2
- package/dist-cli/chromosomix.mjs +4085 -1096
- package/package.json +12 -2
- package/dist/assets/analysis.worker-2Jx8_NWN.js +0 -8
- package/dist/assets/index-BZqg8J4S.js +0 -106
- package/dist/assets/index-Cxw-esX1.css +0 -1
- package/dist/assets/workspace-ZYKuBclx.js +0 -15
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
async function Je(t){return t.bytes?t.bytes():new Uint8Array(await t.arrayBuffer())}const rc=50;async function Ts(t,e){const n=t.headers.get("content-length"),A=n?parseInt(n,10):void 0,s=t.body;if(!s||A===void 0){const c=await Je(t);return e(c.byteLength,A??c.byteLength),c}const r=s.getReader();let o=new Uint8Array(A),i=0,a=0;e(0,A);for(let c=await r.read();!c.done;c=await r.read()){if(i+c.value.byteLength>o.length){const g=new Uint8Array(Math.max(i+c.value.byteLength,o.length*2));g.set(o.subarray(0,i)),o=g}o.set(c.value,i),i+=c.value.byteLength;const l=Date.now();l-a>=rc&&(a=l,e(i,A))}return e(i,A),i===o.length?o:o.subarray(0,i)}class oc{blob;constructor(e){this.blob=e}async read(e,n=0){return e===0?new Uint8Array(0):Je(this.blob.slice(n,n+e))}async readFile(e){const n=typeof e=="string"?e:e?.encoding;if(n==="utf8")return this.blob.text();if(n)throw new Error(`unsupported encoding: ${n}`);return Je(this.blob)}stat(){return Promise.resolve({size:this.blob.size})}close(){return Promise.resolve()}}function ic(t){return(typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"?t.message:`${t}`).replace(/\.$/,"")}class Do{url;_stat;fetchImplementation;baseHeaders;baseOverrides;constructor(e,n={}){this.url=e,this.baseHeaders=n.headers??{},this.baseOverrides=n.overrides??{},this.fetchImplementation=n.fetch??globalThis.fetch.bind(globalThis)}buildRequest(e,n){return{...this.baseOverrides,...e.overrides,headers:{...this.baseHeaders,...e.headers,...n},method:"GET",redirect:"follow",mode:"cors",signal:e.signal}}async fetch(e,n){const A=r=>new Error(`${ic(r)} fetching ${e}`,{cause:r});let s;try{s=await this.fetchImplementation(e,n)}catch(r){if(`${r}`.includes("Failed to fetch")){console.warn(`generic-filehandle: refetching ${e} to attempt to work around chrome CORS header caching bug`);try{s=await this.fetchImplementation(e,{...n,cache:"reload"})}catch(o){throw A(o)}}else throw A(r)}return s}async read(e,n,A={}){if(e===0)return new Uint8Array(0);if(Number.isNaN(e)||Number.isNaN(n))throw new TypeError(`read() called with NaN length or position (length=${e}, position=${n}). The index file may be corrupt.`);const s=await this.fetch(this.url,this.buildRequest(A,{range:`bytes=${n}-${n+e-1}`}));if(s.status===416)return new Uint8Array(0);if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(s.status===200&&n===0||s.status===206){const r=s.headers.get("content-range"),o=/\/(\d+)$/.exec(r??"");o?.[1]&&(this._stat={size:parseInt(o[1],10)});const i=A.onProgress?await Ts(s,A.onProgress):await Je(s);return!this._stat&&s.status===200&&(this._stat={size:i.byteLength}),i.byteLength<=e?i:i.subarray(0,e)}throw new Error(s.status===200?`${this.url} fetch returned status 200, expected 206`:`HTTP ${s.status} fetching ${this.url}`)}async readFile(e={}){const n=typeof e=="string"?e:e.encoding,A=typeof e=="string"?{}:e,s=await this.fetch(this.url,this.buildRequest(A));if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(n==="utf8")return s.text();if(n)throw new Error(`unsupported encoding: ${n}`);return A.onProgress?Ts(s,A.onProgress):Je(s)}async stat(){return this._stat||await this.read(10,0),this._stat??{size:0}}close(){return Promise.resolve()}}class ac{readFile(){return Promise.reject(new Error("unimplemented"))}read(){return Promise.reject(new Error("unimplemented"))}stat(){return Promise.reject(new Error("unimplemented"))}close(){return Promise.reject(new Error("unimplemented"))}}class cc{}class lc{constructor(){this.signals=new Set,this.abortController=new AbortController}addSignal(e=new cc){if(this.signal.aborted)throw new Error("cannot add a signal, already aborted!");this.signals.add(e),e.aborted?this.handleAborted(e):typeof e.addEventListener=="function"&&e.addEventListener("abort",()=>{this.handleAborted(e)})}handleAborted(e){this.signals.delete(e),this.signals.size===0&&this.abortController.abort()}get signal(){return this.abortController.signal}abort(){this.abortController.abort()}}class gc{constructor(){this.callbacks=new Set}addCallback(e=()=>{}){this.callbacks.add(e),this.currentMessage&&e(this.currentMessage)}callback(e){this.currentMessage=e;for(const n of this.callbacks)n(e)}}class Bn{constructor({fill:e,cache:n}){if(typeof e!="function")throw new TypeError("must pass a fill function");if(typeof n!="object")throw new TypeError("must pass a cache object");if(typeof n.get!="function"||typeof n.set!="function"||typeof n.delete!="function")throw new TypeError("cache must implement get(key), set(key, val), and and delete(key)");this.cache=n,this.fillCallback=e}static isAbortException(e){return e.name==="AbortError"||e.code==="ERR_ABORTED"||e.message==="AbortError: aborted"||e.message==="Error: aborted"}evict(e,n){this.cache.get(e)===n&&this.cache.delete(e)}fill(e,n,A,s){const r=new lc,o=new gc;o.addCallback(s);const i={aborter:r,promise:this.fillCallback(n,r.signal,a=>{o.callback(a)}),settled:!1,statusReporter:o,get aborted(){return this.aborter.signal.aborted}};i.aborter.addSignal(A),i.aborter.signal.addEventListener("abort",()=>{i.settled||this.evict(e,i)}),i.promise.then(()=>{i.settled=!0},()=>{i.settled=!0,this.evict(e,i)}).catch(a=>{throw console.error(a),a}),this.cache.set(e,i)}static checkSinglePromise(e,n){function A(){if(n?.aborted)throw Object.assign(new Error("aborted"),{code:"ERR_ABORTED"})}return e.then(s=>(A(),s),s=>{throw A(),s})}has(e){return this.cache.has(e)}get(e,n,A,s){if(!A&&n instanceof AbortSignal)throw new TypeError("second get argument appears to be an AbortSignal, perhaps you meant to pass `null` for the fill data?");const r=this.cache.get(e);return r?r.aborted&&!r.settled?(this.evict(e,r),this.get(e,n,A,s)):r.settled?r.promise:(r.aborter.addSignal(A),r.statusReporter.addCallback(s),Bn.checkSinglePromise(r.promise,A)):(this.fill(e,n,A,s),Bn.checkSinglePromise(this.cache.get(e).promise,A))}delete(e){const n=this.cache.get(e);n&&(n.settled||n.aborter.abort(),this.cache.delete(e))}clear(){const e=this.cache.keys();let n=0;for(let A=e.next();!A.done;A=e.next())this.delete(A.value),n+=1;return n}}var X=function(t,e,n,A,s){if(A==="m")throw new TypeError("Private method is not writable");if(A==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return A==="a"?s.call(t,n):s?s.value=n:e.set(t,n),n},M=function(t,e,n,A){if(n==="a"&&!A)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!A:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?A:n==="a"?A.call(t):A?A.value:e.get(t)},O,ot,_,W,qt,be,Ht,Xe,ut,Js,zn,Xn,Vn,$s,Ve;class fc extends Map{constructor(e={}){if(super(),O.add(this),ot.set(this,0),_.set(this,new Map),W.set(this,new Map),qt.set(this,void 0),be.set(this,void 0),Ht.set(this,void 0),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof e.maxAge=="number"&&e.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");X(this,qt,e.maxSize,"f"),X(this,be,e.maxAge||Number.POSITIVE_INFINITY,"f"),X(this,Ht,e.onEviction,"f")}get __oldCache(){return M(this,W,"f")}get(e){if(M(this,_,"f").has(e)){const n=M(this,_,"f").get(e);return M(this,O,"m",zn).call(this,e,n)}if(M(this,W,"f").has(e)){const n=M(this,W,"f").get(e);if(!M(this,O,"m",ut).call(this,e,n))return M(this,O,"m",$s).call(this,e,n),n.value}}set(e,n,{maxAge:A=M(this,be,"f")}={}){const s=typeof A=="number"&&A!==Number.POSITIVE_INFINITY?Date.now()+A:void 0;return M(this,_,"f").has(e)?M(this,_,"f").set(e,{value:n,expiry:s}):M(this,O,"m",Vn).call(this,e,{value:n,expiry:s}),this}has(e){return M(this,_,"f").has(e)?!M(this,O,"m",ut).call(this,e,M(this,_,"f").get(e)):M(this,W,"f").has(e)?!M(this,O,"m",ut).call(this,e,M(this,W,"f").get(e)):!1}peek(e){if(M(this,_,"f").has(e))return M(this,O,"m",Xn).call(this,e,M(this,_,"f"));if(M(this,W,"f").has(e))return M(this,O,"m",Xn).call(this,e,M(this,W,"f"))}expiresIn(e){const n=M(this,_,"f").get(e)??M(this,W,"f").get(e);if(n)return n.expiry?n.expiry-Date.now():Number.POSITIVE_INFINITY}delete(e){var n;const A=M(this,_,"f").delete(e);return A&&X(this,ot,(n=M(this,ot,"f"),n--,n),"f"),M(this,W,"f").delete(e)||A}clear(){M(this,_,"f").clear(),M(this,W,"f").clear(),X(this,ot,0,"f")}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");const n=[...M(this,O,"m",Ve).call(this)],A=n.length-e;A<0?(X(this,_,new Map(n),"f"),X(this,W,new Map,"f"),X(this,ot,n.length,"f")):(A>0&&M(this,O,"m",Xe).call(this,n.slice(0,A)),X(this,W,new Map(n.slice(A)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f")),X(this,qt,e,"f")}evict(e=1){const n=e;if(!n||n<=0)return;const A=[...M(this,O,"m",Ve).call(this)],s=Math.trunc(Math.min(n,Math.max(A.length-1,0)));s<=0||(M(this,O,"m",Xe).call(this,A.slice(0,s)),X(this,W,new Map(A.slice(s)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f"))}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[(ot=new WeakMap,_=new WeakMap,W=new WeakMap,qt=new WeakMap,be=new WeakMap,Ht=new WeakMap,O=new WeakSet,Xe=function(n){if(typeof M(this,Ht,"f")=="function")for(const[A,s]of n)M(this,Ht,"f").call(this,A,s.value)},ut=function(n,A){return typeof A.expiry=="number"&&A.expiry<=Date.now()?(typeof M(this,Ht,"f")=="function"&&M(this,Ht,"f").call(this,n,A.value),this.delete(n)):!1},Js=function(n,A){if(!M(this,O,"m",ut).call(this,n,A))return A.value},zn=function(n,A){return A.expiry?M(this,O,"m",Js).call(this,n,A):A.value},Xn=function(n,A){const s=A.get(n);return M(this,O,"m",zn).call(this,n,s)},Vn=function(n,A){var s;M(this,_,"f").set(n,A),X(this,ot,(s=M(this,ot,"f"),s++,s),"f"),M(this,ot,"f")>=M(this,qt,"f")&&(X(this,ot,0,"f"),M(this,O,"m",Xe).call(this,M(this,W,"f")),X(this,W,M(this,_,"f"),"f"),X(this,_,new Map,"f"))},$s=function(n,A){M(this,W,"f").delete(n),M(this,O,"m",Vn).call(this,n,A)},Ve=function*(){for(const n of M(this,W,"f")){const[A,s]=n;M(this,_,"f").has(A)||M(this,O,"m",ut).call(this,A,s)||(yield n)}for(const n of M(this,_,"f")){const[A,s]=n;M(this,O,"m",ut).call(this,A,s)||(yield n)}},Symbol.iterator)](){for(const e of M(this,_,"f")){const[n,A]=e;M(this,O,"m",ut).call(this,n,A)||(yield[n,A.value])}for(const e of M(this,W,"f")){const[n,A]=e;M(this,_,"f").has(n)||M(this,O,"m",ut).call(this,n,A)||(yield[n,A.value])}}*entriesDescending(){let e=[...M(this,_,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;M(this,O,"m",ut).call(this,s,r)||(yield[s,r.value])}e=[...M(this,W,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;M(this,_,"f").has(s)||M(this,O,"m",ut).call(this,s,r)||(yield[s,r.value])}}*entriesAscending(){for(const[e,n]of M(this,O,"m",Ve).call(this))yield[e,n.value]}get size(){if(!M(this,ot,"f"))return M(this,W,"f").size;let e=0;for(const n of M(this,W,"f").keys())M(this,_,"f").has(n)||e++;return Math.min(M(this,ot,"f")+e,M(this,qt,"f"))}get maxSize(){return M(this,qt,"f")}get maxAge(){return M(this,be,"f")}entries(){return this.entriesAscending()}forEach(e,n=this){for(const[A,s]of this.entriesAscending())e.call(n,s,A,this)}get[Symbol.toStringTag](){return"QuickLRU"}toString(){return`QuickLRU(${this.size}/${this.maxSize})`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}}function hc(t){if(t.length===0)return[];const e=t.toSorted((s,r)=>s.min-r.min),n=[];let A=e[0];for(let s=1;s<e.length;s++){const r=e[s];r.min>A.max+1?(n.push(A),A=r):r.max>A.max&&(A={min:A.min,max:r.max})}return n.push(A),n}var uc={},Ys={};function gt(t){var e=Ys[t];if(e!==void 0)return e.exports;var n=Ys[t]={exports:{}};return uc[t](n,n.exports,gt),n.exports}(()=>{var t=Object.getPrototypeOf?n=>Object.getPrototypeOf(n):n=>n.__proto__,e;gt.t=function(n,A){if(A&1&&(n=this(n)),A&8||typeof n=="object"&&n&&(A&4&&n.__esModule||A&16&&typeof n.then=="function"))return n;var s=Object.create(null);gt.r(s);var r={};e=e||[null,t({}),t([]),t(t)];for(var o=A&2&&n;(typeof o=="object"||typeof o=="function")&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach(i=>r[i]=()=>n[i]);return r.default=()=>n,gt.d(s,r),s}})();gt.d=(t,e)=>{for(var n in e)gt.o(e,n)&&!gt.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})};gt.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);gt.r=t=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var VA={};gt.r(VA);gt.d(VA,{__wbg_Error_ef53bc310eb298a0:()=>Qc,__wbg_set_wasm:()=>jA,decompress_and_parse_bigwig:()=>Fo,decompress_and_parse_summary:()=>So,inflate_raw:()=>dc,inflate_raw_batch:()=>Ro,inflate_raw_unknown_size:()=>Cc});const Mo="data:application/wasm;base64,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AkH4AXEiAkGAncAAaiEGIAJBiJ3AAGooAgAhAgsgBiAANgIIIAIgADYCDCAAIAY2AgwgACACNgIIDAELIAggAiADaiIAQQNyNgIEIAggAGoiACAAKAIEQQFyNgIECyAIQQhqIgANAQsCQAJAAkACQAJAAkBBACgCkJ9AIgAgA08NAAJAQQAoApSfQCIAIANLDQAgAUEEakG0n8AAIANBr4AEakGAgHxxECMCQCABKAIEIgYNAEEAIQAMCAsgASgCDCEFQQBBACgCoJ9AIAEoAggiCWoiADYCoJ9AQQAgAEEAKAKkn0AiAiAAIAJLGzYCpJ9AAkACQAJAQQAoApyfQCICRQ0AQfCcwAAhAANAIAYgACgCACIIIAAoAgQiB2pGDQIgACgCCCIADQAMAwsLAkACQEEAKAKsn0AiAEUNACAGIABPDQELQQAgBjYCrJ9AC0EAQf8fNgKwn0BBACAFNgL8nEBBACAJNgL0nEBBACAGNgLwnEBBAEGAncAANgKMnUBBAEGIncAANgKUnUBBAEGAncAANgKInUBBAEGQncAANgKcnUBBAEGIncAANgKQnUBBAEGYncAANgKknUBBAEGQncAANgKYnUBBAEGgncAANgKsnUBBAEGYncAANgKgnUBBAEGoncAANgK0nUBBAEGgncAANgKonUBBAEGwncAANgK8nUBBAEGoncAANgKwnUBBAEG4ncAANgLEnUBBAEGwncAANgK4nUBBAEHAncAANgLMnUBBAEG4ncAANgLAnUBBAEHAncAANgLInUBBAEHIncAANgLUnUBBAEHIncAANgLQnUBBAEHQncAANgLcnUBBAEHQncAANgLYnUBBAEHYncAANgLknUBBAEHYncAANgLgnUBBAEHgncAANgLsnUBBAEHgncAANgLonUBBAEHoncAANgL0nUBBAEHoncAANgLwnUBBAEHwncAANgL8nUBBAEHwncAANgL4nUBBAEH4ncAANgKEnkBBAEH4ncAANgKAnkBBAEGAnsAANgKMnkBBAEGInsAANgKUnkBBAEGAnsAANgKInkBBAEGQnsAANgKcnkBBAEGInsAANgKQnkBBAEGYnsAANgKknkBBAEGQnsAANgKYnkBBAEGgnsAANgKsnkBBAEGYnsAANgKgnkBBAEGonsAANgK0nkBBAEGgnsAANgKonkBBAEGwnsAANgK8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bGVkOiDAAMACOiDAAC9ydXN0Yy84YmFiMjZmNGY2OGUwZTI2ZjBiYjc5NjBiZTMzNGQ1YjUyMGVhNDUyL2xpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvcndsb2NrL25vX3RocmVhZHMucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMjIvc3JjL2V4dGVybnJlZi5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi4xMy9zcmMvZGxtYWxsb2MucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbGliZGVmbGF0ZXItMS4yNS4yL3NyYy9saWIucnMAY29tcHJlc3NlZCBibG9jayBleHRlbmRzIHBhc3QgdGhlIGlucHV0IGJ1ZmZlcmJsb2NrIG9mZnNldCBvdmVyZmxvd3NibG9jayBpcyBzaG9ydGVyIHRoYW4gdGhlIDItYnl0ZSB6bGliIGhlYWRlcgAAAM4CEAAKAAAAUQAAAAsAAADOAhAACgAAAGcAAAALAAAAzgIQAAoAAABZAAAAPQAAAM4CEAAKAAAAYgAAACsAAADOAhAACgAAAFwAAAAPAAAAZGVjb21wcmVzc2lvbiBvdXRwdXQgdG9vIGxhcmdlAADOAhAACgAAAJIAAAA9AAAAzgIQAAoAAACYAAAAHQAAAM4CEAAKAAAAAQEAAD0AAADOAhAACgAAAAcBAAAdAAAAQmFkRGF0YUluc3VmZmljaWVudFNwYWNllQEQAGcAAACEAAAAEQAAAJUBEABnAAAAkgAAABEAAABsaWJkZWZsYXRlX2RlZmxhdGVfZGVjb21wcmVzcyByZXR1cm5lZCBhbiB1bmtub3du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IG1heF9vdmVyaGVhZAAATgIQACoAAAC3BAAADQAAAHJ3bG9jayBvdmVyZmxvd2VkIHJlYWQgbG9ja3M3ARAAXQAAABUAAAAsAAAAAAAAAAgAAAAEAAAAFQAAAAkAAAAMAAAABAAAABYAAAByd2xvY2sgaGFzIG5vdCBiZWVuIGxvY2tlZCBmb3IgcmVhZGluZwAANwEQAF0AAAA+AAAACQAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/QEQAFAAAAAcAAAABQAAABcAAAAMAAAABAAAABgAAAAZAAAAGgAAAAAAAAAAAAAAAQAAABsAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdAAA7gAQAEgAAACPAgAADgAAAEVycm9yMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlSZWZDZWxsIGFscmVhZHkgYm9ycm93ZWQAQaybwAALBAQAAAAAKQRuYW1lASIBXx9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAEgJcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkCBndhbHJ1cwYwLjI2LjIMd2FzbS1iaW5kZ2VuEzAuMi4xMjIgKGRkZDMyMjUxNCk=";var Ic=gt.t(Mo);function Fo(t,e,n,A,s,r){try{const g=U.__wbindgen_add_to_stack_pointer(-16),f=qe(t,U.__wbindgen_export),h=it,u=Be(e,U.__wbindgen_export),I=it,d=Be(n,U.__wbindgen_export),C=it;U.decompress_and_parse_bigwig(g,f,h,u,I,d,C,A,s,r);var o=z().getInt32(g+0,!0),i=z().getInt32(g+4,!0),a=z().getInt32(g+8,!0),c=z().getInt32(g+12,!0);if(c)throw He(a);var l=Ke(o,i).slice();return U.__wbindgen_export2(o,i*1,1),l}finally{U.__wbindgen_add_to_stack_pointer(16)}}function So(t,e,n,A,s,r,o){try{const f=U.__wbindgen_add_to_stack_pointer(-16),h=qe(t,U.__wbindgen_export),u=it,I=Be(e,U.__wbindgen_export),d=it,C=Be(n,U.__wbindgen_export),E=it;U.decompress_and_parse_summary(f,h,u,I,d,C,E,A,s,r,o);var i=z().getInt32(f+0,!0),a=z().getInt32(f+4,!0),c=z().getInt32(f+8,!0),l=z().getInt32(f+12,!0);if(l)throw He(c);var g=Ke(i,a).slice();return U.__wbindgen_export2(i,a*1,1),g}finally{U.__wbindgen_add_to_stack_pointer(16)}}function dc(t,e){try{const i=U.__wbindgen_add_to_stack_pointer(-16),a=qe(t,U.__wbindgen_export),c=it;U.inflate_raw(i,a,c,e);var n=z().getInt32(i+0,!0),A=z().getInt32(i+4,!0),s=z().getInt32(i+8,!0),r=z().getInt32(i+12,!0);if(r)throw He(s);var o=Ke(n,A).slice();return U.__wbindgen_export2(n,A*1,1),o}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Ro(t,e,n,A){try{const c=U.__wbindgen_add_to_stack_pointer(-16),l=qe(t,U.__wbindgen_export),g=it,f=Be(e,U.__wbindgen_export),h=it,u=Be(n,U.__wbindgen_export),I=it;U.inflate_raw_batch(c,l,g,f,h,u,I,A);var s=z().getInt32(c+0,!0),r=z().getInt32(c+4,!0),o=z().getInt32(c+8,!0),i=z().getInt32(c+12,!0);if(i)throw He(o);var a=Ke(s,r).slice();return U.__wbindgen_export2(s,r*1,1),a}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Cc(t){try{const o=U.__wbindgen_add_to_stack_pointer(-16),i=qe(t,U.__wbindgen_export),a=it;U.inflate_raw_unknown_size(o,i,a);var e=z().getInt32(o+0,!0),n=z().getInt32(o+4,!0),A=z().getInt32(o+8,!0),s=z().getInt32(o+12,!0);if(s)throw He(A);var r=Ke(e,n).slice();return U.__wbindgen_export2(e,n*1,1),r}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Qc(t,e){const n=Error(mc(t,e));return Bc(n)}function Bc(t){Ue===Ft.length&&Ft.push(Ft.length+1);const e=Ue;return Ue=Ft[e],Ft[e]=t,e}function Ec(t){t<1028||(Ft[t]=Ue,Ue=t)}function Ke(t,e){return t=t>>>0,ZA().subarray(t/1,t/1+e)}let ae=null;function z(){return(ae===null||ae.buffer.detached===!0||ae.buffer.detached===void 0&&ae.buffer!==U.memory.buffer)&&(ae=new DataView(U.memory.buffer)),ae}function mc(t,e){return Nc(t>>>0,e)}let Ze=null;function wc(){return(Ze===null||Ze.byteLength===0)&&(Ze=new Uint32Array(U.memory.buffer)),Ze}let je=null;function ZA(){return(je===null||je.byteLength===0)&&(je=new Uint8Array(U.memory.buffer)),je}function pc(t){return Ft[t]}let Ft=new Array(1024).fill(void 0);Ft.push(void 0,null,!0,!1);let Ue=Ft.length;function Be(t,e){const n=e(t.length*4,4)>>>0;return wc().set(t,n/4),it=t.length,n}function qe(t,e){const n=e(t.length*1,1)>>>0;return ZA().set(t,n/1),it=t.length,n}function He(t){const e=pc(t);return Ec(t),e}let ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});ln.decode();const yc=2146435072;let Zn=0;function Nc(t,e){return Zn+=e,Zn>=yc&&(ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),ln.decode(),Zn=e),ln.decode(ZA().subarray(t,t+e))}let it=0,U;function jA(t){U=t}jA(Ic);let tn=null,jn=null;async function ts(){return tn||(jn||(jn=(async()=>{const e=await(await fetch(Mo)).arrayBuffer(),{instance:n}=await WebAssembly.instantiate(e,{"./inflate_wasm_bg.js":VA});return jA(n.exports),tn=n.exports,tn})()),jn)}async function kc(t,e,n,A){await ts();const s=Ro(t,e,n,A),r=new DataView(s.buffer,s.byteOffset,s.byteLength),o=r.getUint32(0,!0),i=4,a=i+(o+1)*4,c=new Array(o+1);for(let g=0;g<=o;g++)c[g]=r.getUint32(i+g*4,!0);return{data:s.subarray(a),offsets:c}}function bc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n)}}function Dc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0),minScores:new Float32Array(0),maxScores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4,o=r+n*4,i=o+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n),minScores:new Float32Array(t.buffer,t.byteOffset+o,n),maxScores:new Float32Array(t.buffer,t.byteOffset+i,n)}}async function Mc(t,e,n,A,s,r){await ts();const o=Fo(t,e,n,A,s,r);return bc(o)}async function Fc(t,e,n,A,s,r,o){await ts();const i=So(t,e,n,A,s,r,o);return Dc(i)}function es(t){const e=new Uint32Array(t.length),n=new Uint32Array(t.length);for(let A=0;A<t.length;A++){const s=t[A];e[A]=s.offset,n[A]=s.length}return{inputOffsets:e,inputLengths:n}}async function Sc(t,e,n){const{inputOffsets:A,inputLengths:s}=es(e);return kc(t,A,s,n)}async function Rc(t,e,n,A,s){const{inputOffsets:r,inputLengths:o}=es(e);return Mc(t,r,o,n,A,s)}async function Lc(t,e,n,A,s,r){const{inputOffsets:o,inputLengths:i}=es(e);return Fc(t,o,i,n,A,s,r)}const ns=new TextDecoder("utf8");function rt(t,e=0){return new DataView(t.buffer,t.byteOffset+e,t.length-e)}function j(t,e){return t.getUint32(e,!0)+t.getUint32(e+4,!0)*2**32}function dA(t,e,n){const A=t.indexOf(0,e),s=A!==-1&&A<e+n?A:e+n;return ns.decode(t.subarray(e,s))}function xc(t){const e=t.toSorted((s,r)=>s.offset-r.offset),n=[];let A;for(const s of e)A&&s.offset-(A.offset+A.length)<=2e3?(A.length=Math.max(A.length,s.offset+s.length-A.offset),A.blocks.push(s)):(A={blocks:[s],length:s.length,offset:s.offset},n.push(A));return n}const Os=610839776;function Gc(t,e){let n=0;for(const s of t)n+=s.length;let A=0;return e?.(0,n),s=>{A+=s,e?.(A,n)}}function Ie(t,e,n,A){return t<A&&e>n}function Lo(t,e){return e?t/e:t}function Uc(t,e){const n=[];let A=0;const s=rt(t);for(;A<t.byteLength;){const r=s.getUint32(A,!0);A+=4;const o=s.getUint32(A,!0);A+=4;const i=s.getUint32(A,!0);A+=4;const a=s.getUint32(A,!0);A+=4;const c=s.getFloat32(A,!0);A+=4;const l=s.getFloat32(A,!0);A+=4;const g=s.getFloat32(A,!0);A+=8,(!e||r===e.chrId&&Ie(o,i,e.start,e.end))&&n.push({start:o,end:i,maxScore:l,minScore:c,summary:!0,score:Lo(g,a)})}return n}function vc(t,e,n){const A=[];let s=0;const r=rt(t);for(;s<t.byteLength;){const o=s,i=r.getUint32(s,!0);s+=4;const a=r.getInt32(s,!0);s+=4;const c=r.getInt32(s,!0);s+=4;const l=t.indexOf(0,s),g=l===-1?t.length:l,f=ns.decode(t.subarray(s,g));s=g+1,(!n||i===n.chrId&&Ie(a,c,n.start,n.end))&&A.push({start:a,end:c,rest:f,uniqueId:`bb-${e}-${o}`})}return A}function Tc(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0);let a=24;const c=[];switch(o){case 1:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getInt32(a,!0);a+=4;const h=n.getFloat32(a,!0);a+=4,(!e||Ie(g,f,e.start,e.end))&&c.push({start:g,end:f,score:h})}break}case 2:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getFloat32(a,!0);a+=4;const h=g+r;(!e||Ie(g,h,e.start,e.end))&&c.push({score:f,start:g,end:h})}break}case 3:{for(let l=0;l<i;l++){const g=n.getFloat32(a,!0);a+=4;const f=A+l*s,h=f+r;(!e||Ie(f,h,e.start,e.end))&&c.push({score:g,start:f,end:h})}break}}return c}function _s(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0),a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i),g=e.start,f=e.end;let h=0;switch(o){case 1:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=n.getInt32(u+4,!0);d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+8,!0),h++),u+=12}break}case 2:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+4,!0),h++),u+=8}break}case 3:{let u=24;for(let I=0;I<i;I++){const d=A+I*s,C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u,!0),h++),u+=4}break}}return h<i?{starts:a.subarray(0,h),ends:c.subarray(0,h),scores:l.subarray(0,h)}:{starts:a,ends:c,scores:l}}function Ks(t,e){const n=rt(t),A=Math.floor(t.byteLength/32),s=new Int32Array(A),r=new Int32Array(A),o=new Float32Array(A),i=new Float32Array(A),a=new Float32Array(A);let c=0,l=0;for(;l<t.byteLength;){const g=n.getUint32(l,!0);l+=4;const f=n.getUint32(l,!0);l+=4;const h=n.getUint32(l,!0);l+=4;const u=n.getUint32(l,!0);l+=4;const I=n.getFloat32(l,!0);l+=4;const d=n.getFloat32(l,!0);l+=4;const C=n.getFloat32(l,!0);l+=8,g===e.chrId&&Ie(f,h,e.start,e.end)&&(s[c]=f,r[c]=h,o[c]=Lo(C,u),i[c]=I,a[c]=d,c++)}return c<A?{starts:s.subarray(0,c),ends:r.subarray(0,c),scores:o.subarray(0,c),minScores:i.subarray(0,c),maxScores:a.subarray(0,c)}:{starts:s,ends:r,scores:o,minScores:i,maxScores:a}}function ve(t,e,n,A){if(t.length===1)return e(t[0]);const s=new A(n);let r=0;for(const o of t){const i=e(o);s.set(i,r),r+=i.length}return s}function xo(t){let e=0;for(const n of t)e+=n.starts.length;return e}function Go(t){const e=xo(t);return{starts:ve(t,n=>n.starts,e,Int32Array),ends:ve(t,n=>n.ends,e,Int32Array),scores:ve(t,n=>n.scores,e,Float32Array),isSummary:!1}}function Jc(t){const e=xo(t),{starts:n,ends:A,scores:s}=Go(t);return{starts:n,ends:A,scores:s,minScores:ve(t,r=>r.minScores,e,Float32Array),maxScores:ve(t,r=>r.maxScores,e,Float32Array),isSummary:!0}}function Uo(t){let e=0;for(const i of t)for(const a of i)e+=a.starts.length;const n=new Int32Array(e),A=new Int32Array(e),s=new Float32Array(e),r=[0];let o=0;for(const i of t){for(const a of i)n.set(a.starts,o),A.set(a.ends,o),s.set(a.scores,o),o+=a.starts.length;r.push(o)}return{starts:n,ends:A,scores:s,regionOffsets:r,totalCount:e}}function $c(t){const{starts:e,ends:n,scores:A,regionOffsets:s}=Uo(t);return{starts:e,ends:n,scores:A,regionOffsets:s,isSummary:!1}}function Yc(t){const{starts:e,ends:n,scores:A,regionOffsets:s,totalCount:r}=Uo(t),o=new Float32Array(r),i=new Float32Array(r);let a=0;for(const c of t)for(const l of c)o.set(l.minScores,a),i.set(l.maxScores,a),a+=l.starts.length;return{starts:e,ends:n,scores:A,minScores:o,maxScores:i,regionOffsets:s,isSummary:!0}}function qs(t,e,n,A){switch(t){case"summary":return Uc(e,A);case"bigwig":return Tc(e,A);case"bigbed":return vc(e,n,A)}}class Oc{rTreePromise;rTreeNodeCache=new Bn({cache:new fc({maxSize:1e3}),fill:async({length:e,offset:n},A)=>this.bbi.read(e,n,{signal:A})});bbi;refsByName;rTreeOffset;uncompressBufSize;blockType;constructor(e,n,A,s,r){if(!(A>=0))throw new Error("invalid rTreeOffset!");this.bbi=e,this.refsByName=n,this.rTreeOffset=A,this.uncompressBufSize=s,this.blockType=r}async _collectBlocks(e,n,A,s){const r=this.refsByName[e];if(r===void 0||n>=A)return;this.rTreePromise||(this.rTreePromise=this.bbi.read(48,this.rTreeOffset,{signal:s?.signal}).catch(u=>{throw this.rTreePromise=void 0,u}));const o=await this.rTreePromise,i=rt(o),a=i.getUint32(0,!0);if(a!==Os)throw new Error(`invalid cirTree magic: 0x${a.toString(16)} (expected 0x${Os.toString(16)}) at offset ${this.rTreeOffset}, file may be corrupt or unsupported`);const l=4+i.getUint32(4,!0)*32,g=(u,I,d,C)=>(u<r||u===r&&I<A)&&(d>r||d===r&&C>n),f=[];let h=[this.rTreeOffset+48];for(;h.length>0;){const u=hc(h.map(d=>({min:d,max:d+l}))),I=[];for(const{min:d,max:C}of u){const E=C-d,B=d,Q=await this.rTreeNodeCache.get(`${E}_${B}`,{length:E,offset:B},s?.signal);for(const m of h)if(d<=m&&m<=C){const p=Q.subarray(m-B),w=rt(p),y=w.getUint8(0),N=w.getUint16(2,!0);if(y===1||y===0){const k=y===1?32:24;let b=4;for(let D=0;D<N;D++){const F=w.getUint32(b,!0),R=w.getUint32(b+4,!0),v=w.getUint32(b+8,!0),x=w.getUint32(b+12,!0);if(g(F,R,v,x)){const Y=j(w,b+16);if(y===1){const J=j(w,b+24);f.push({offset:Y,length:J})}else I.push(Y)}b+=k}}}}h=I}return{blocks:f,chrId:r}}async readWigData(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);if(!r)return[];const{blocks:o,chrId:i}=r;return this.readFeatures(o,{...s,request:{chrId:i,start:n,end:A}})}async getBlockSizeForRange(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);let o=0;if(r)for(const i of r.blocks)o+=i.length;return o}async getBlockSizeForRangeMulti(e,n={}){const{blockByOffset:A}=await this._collectBlocksMulti(e,n);let s=0;for(const r of A.values())s+=r.length;return s}async _collectBlocksMulti(e,n){const A=await Promise.all(e.map(({refName:o,start:i,end:a})=>this._collectBlocks(o,i,a,n))),s=new Map,r=new Map;for(let o=0;o<A.length;o++){const i=A[o];if(i){const{start:a,end:c}=e[o],l={chrId:i.chrId,start:a,end:c};for(const g of i.blocks){const f=r.get(g.offset);f?f.push({regionIndex:o,request:l}):(s.set(g.offset,g),r.set(g.offset,[{regionIndex:o,request:l}]))}}}return{blockByOffset:s,tagsByOffset:r}}async readWigDataMulti(e,n={}){const A=e.map(()=>[]),{blockByOffset:s,tagsByOffset:r}=await this._collectBlocksMulti(e,n),{blockType:o}=this;return await this._forEachDecodedBlock([...s.values()],n.signal,n.onProgress,(i,a)=>{const c=r.get(a);if(c)for(const{regionIndex:l,request:g}of c){const f=qs(o,i,a,g);for(const h of f)A[l].push(h)}}),A}assertNotBigBed(e){if(this.blockType==="bigbed")throw new Error(`${e} is not supported for BigBed data; use getFeatures/getFeaturesMulti instead`)}async readWigDataAsArrays(e,n,A,s){this.assertNotBigBed("getFeaturesAsArrays");const r=await this._collectBlocks(e,n,A,s),o=r?r.blocks:[],i={chrId:r?r.chrId:0,start:n,end:A};return this.blockType==="summary"?this._readSummaryFeaturesAsArrays(o,i,s):this._readBigWigFeaturesAsArrays(o,i,s)}async readWigDataAsArraysMulti(e,n={}){this.assertNotBigBed("getFeaturesAsArraysMulti");const A=await this._collectBlocksMulti(e,n);return this.blockType==="summary"?Yc(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>Ks(s,r),n)):$c(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>_s(s,r),n))}async _readBlocksAsArraysMulti(e,n,A,s){const{blockByOffset:r,tagsByOffset:o}=e,i=Array.from({length:n},()=>[]);return await this._forEachDecodedBlock([...r.values()],s.signal,s.onProgress,(a,c)=>{const l=o.get(c);if(l)for(const{regionIndex:g,request:f}of l){const h=A(a,f);h.starts.length>0&&i[g].push(h)}}),i}async _forEachBlockGroup(e,n,A,s){const r=xc(e),o=Gc(r,A);for(const i of r){const a=await this.bbi.read(i.length,i.offset,{signal:n});o(i.length),await s(a,i.blocks.map(c=>({offset:c.offset-i.offset,length:c.length})),i.offset)}}async _forEachDecodedBlock(e,n,A,s){const{uncompressBufSize:r}=this;await this._forEachBlockGroup(e,n,A,async(o,i,a)=>{if(r>0){const{data:c,offsets:l}=await Sc(o,i,r);for(let g=0;g<i.length;g++)s(c.subarray(l[g],l[g+1]),a+i[g].offset)}else for(const c of i)s(o.subarray(c.offset,c.offset+c.length),a+c.offset)})}async readFeatures(e,n={}){const{blockType:A}=this,{signal:s,request:r,onProgress:o}=n,i=[];return await this._forEachDecodedBlock(e,s,o,(a,c)=>{const l=qs(A,a,c,r);for(const g of l)i.push(g)}),i}async _readBlocksAsArrays(e,n,A,s,r){const{uncompressBufSize:o}=this,i=[],a=c=>{c.starts.length>0&&i.push(c)};return await this._forEachBlockGroup(e,n,r,async(c,l)=>{if(o>0)a(await A(c,l));else for(const g of l)a(s(c.subarray(g.offset,g.offset+g.length)))}),i}async _readBigWigFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Rc(r,o,this.uncompressBufSize,n.start,n.end),r=>_s(r,n),A.onProgress);return Go(s)}async _readSummaryFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Lc(r,o,this.uncompressBufSize,n.chrId,n.start,n.end),r=>Ks(r,n),A.onProgress);return Jc(s)}}const _c=-2003829722,Hs=-2021002517;class vo{bbi;headerP;getHeader(e){return this.headerP||(this.headerP=this._getHeader(e).catch(n=>{throw this.headerP=void 0,n})),this.headerP}constructor(e){const{filehandle:n,path:A,url:s}=e;if(n)this.bbi=n;else if(s)this.bbi=new Do(s);else if(A)this.bbi=new ac(A);else throw new Error("no file given")}async _getHeader(e){const n=await this._getMainHeader(e),A=await this._readChromosomeTree(n,e);return{...n,...A}}async _getMainHeader(e,n=2e3){const A=await this.bbi.read(n,0,e),s=rt(A);let r=0;const o=s.getInt32(r,!0);if(r+=4,o!==_c&&o!==Hs)throw new Error("not a BigWig/BigBed file");const i=s.getUint16(r,!0);r+=2;const a=s.getUint16(r,!0);r+=2;const c=j(s,r);r+=8;const l=j(s,r);r+=8;const g=j(s,r);r+=8;const f=s.getUint16(r,!0);r+=2;const h=s.getUint16(r,!0);r+=2;const u=j(s,r);r+=8;const I=j(s,r);r+=8;const d=s.getUint32(r,!0);r+=4;const C=j(s,r);r+=8;const E=[];for(let y=0;y<a;y++){const N=s.getUint32(r,!0);r+=4,r+=4;const k=j(s,r);r+=8;const b=j(s,r);r+=8,E.push({reductionLevel:N,dataOffset:k,indexOffset:b})}const B=o===Hs?"bigbed":"bigwig",Q=A.length<n,m=u!==0&&!A.includes(0,u);if(!Q&&(u>n||I>n-40||m))return this._getMainHeader(e,n*2);let p;if(I){const y=rt(A,I);p={basesCovered:j(y,0),scoreMin:y.getFloat64(8,!0),scoreMax:y.getFloat64(16,!0),scoreSum:y.getFloat64(24,!0),scoreSumSquares:y.getFloat64(32,!0)}}else throw new Error("no stats");let w="";if(u){const y=A.indexOf(0,u),N=y===-1?A.length:y;w=ns.decode(A.subarray(u,N))}return{zoomLevels:E,magic:o,extHeaderOffset:C,numZoomLevels:a,fieldCount:f,totalSummary:p,definedFieldCount:h,uncompressBufSize:d,asOffset:u,chromosomeTreeOffset:c,totalSummaryOffset:I,unzoomedDataOffset:l,unzoomedIndexOffset:g,fileType:B,version:i,autoSql:w}}async _readChromosomeTree(e,n){const A=[],s={},r=e.chromosomeTreeOffset,o=rt(await this.bbi.read(32,r,n)),i=o.getUint32(4,!0),a=o.getUint32(8,!0),c=o.getUint32(12,!0),l=4+i*(a+Math.max(c,8)),g=async f=>{const h=await this.bbi.read(l,f,n),u=rt(h),I=u.getUint8(0),d=u.getUint16(2,!0);let C=4;if(I)for(let E=0;E<d;E++){const B=dA(h,C,a);C+=a;const Q=u.getUint32(C,!0);C+=4;const m=u.getUint32(C,!0);C+=4,s[B]=Q,A[Q]={name:B,id:Q,length:m}}else{const E=[];for(let B=0;B<d;B++){C+=a;const Q=j(u,C);C+=8,E.push(g(Q))}await Promise.all(E)}};return await g(r+32),{refsByName:s,refsByNumber:A}}viewCache=new Map;getOrCreateBlockView(e,n,A,s){const r=`${n}_${s}`;let o=this.viewCache.get(r);return o||(o=new Oc(this.bbi,e,n,A,s),this.viewCache.set(r,o)),o}async getUnzoomedView(e){const{unzoomedIndexOffset:n,refsByName:A,uncompressBufSize:s,fileType:r}=await this.getHeader(e);return this.getOrCreateBlockView(A,n,s,r)}async _getView(e){const{basesPerSpan:n,scale:A}=e??{},s=n?1/n:A??1;return this.getView(s,e)}async getFeatures(e,n,A,s){return(await this._getView(s)).readWigData(e,n,A,s)}async getRegionByteSize(e,n,A,s){return(await this._getView(s)).getBlockSizeForRange(e,n,A,s)}async getRegionByteSizeMulti(e,n){return(await this._getView(n)).getBlockSizeForRangeMulti(e,n)}async getFeaturesMulti(e,n){return(await this._getView(n)).readWigDataMulti(e,n)}async getFeaturesAsArrays(e,n,A,s){return(await this._getView(s)).readWigDataAsArrays(e,n,A,s)}async getFeaturesAsArraysMulti(e,n){return(await this._getView(n)).readWigDataAsArraysMulti(e,n)}}class To extends vo{async getView(e,n){const{zoomLevels:A,refsByName:s,uncompressBufSize:r}=await this.getHeader(n),o=1/e,i=A.length-1;for(let a=i;a>=0;a-=1){const c=A[a];if(c.reductionLevel<=2*o)return this.getOrCreateBlockView(s,c.indexOffset,r,"summary")}return this.getUnzoomedView(n)}}function Kc(t,e){if(e<0)return;let n=0;for(let s=0;s<e;s++){if(n=t.indexOf(" ",n),n===-1)return;n++}const A=t.indexOf(" ",n);return A===-1?t.slice(n):t.slice(n,A)}function Ws(t,e){return t<e?-1:t>e?1:0}async function Jo(t,e,n,A,s,r,o,i){const a=4+n*(A+s),c=await t.read(a,e,i),l=rt(c),g=l.getInt8(0),f=l.getInt16(2,!0);let h=4;if(g===0){const u=[];for(let B=0;B<f;B++){const Q=dA(c,h,A);h+=A;const m=j(l,h);h+=8,u.push({key:Q,offset:m})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const B=Math.floor((I+d)/2);Ws(r,u[B].key)>=0?(C=B,I=B+1):d=B-1}const E=u[Math.max(C,0)].offset;return Jo(t,E,n,A,s,r,o,i)}else if(g===1){const u=[];for(let Q=0;Q<f;Q++){const m=dA(c,h,A);h+=A;const p=j(l,h);h+=8;const w=l.getUint32(h,!0);h+=4,h+=4,u.push({key:m,offset:p,length:w})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const Q=Math.floor((I+d)/2),m=Ws(r,u[Q].key);if(m===0){C=Q;break}else m<0?d=Q-1:I=Q+1}if(C===-1)return[];let E=C;for(;E>0&&u[E-1].key===r;)E--;let B=C;for(;B<u.length-1&&u[B+1].key===r;)B++;return u.slice(E,B+1).map(Q=>({...Q,field:o}))}return[]}class $o extends vo{indicesP;readIndices(e={}){return this.indicesP||(this.indicesP=this._readIndices(e).catch(n=>{throw this.indicesP=void 0,n})),this.indicesP}async getView(e,n){return this.getUnzoomedView(n)}async _readIndices(e){const{extHeaderOffset:n}=await this.getHeader(e);if(n===0)return[];const A=await this.bbi.read(64,n,e),s=rt(A),r=s.getUint16(2,!0),o=j(s,4);if(r===0)return[];const i=20,a=i*r,c=await this.bbi.read(a,o,e),l=[];for(let g=0;g<r;g+=1){const f=rt(c,g*i),h=f.getInt16(0,!0),u=f.getInt16(2,!0),I=j(f,4),d=f.getInt16(16,!0);l.push({type:h,fieldcount:u,offset:I,field:d})}return l}async searchExtraIndexBlocks(e,n={}){const A=await this.readIndices(n);if(A.length===0)return[];const s=A.map(async o=>{const{offset:i,field:a}=o,c=await this.bbi.read(32,i,n),l=rt(c),g=l.getInt32(4,!0),f=l.getInt32(8,!0),h=l.getInt32(12,!0);return Jo(this.bbi,i+32,g,f,h,e,a,n)});return(await Promise.all(s)).flat()}async searchExtraIndex(e,n={}){const A=await this.searchExtraIndexBlocks(e,n);if(A.length===0)return[];const s=await this.getUnzoomedView(n),r=new Map;for(const i of A){const a=i.field??0,c=r.get(a);c?c.set(i.offset,i):r.set(a,new Map([[i.offset,i]]))}return(await Promise.all([...r].map(async([i,a])=>(await s.readFeatures([...a.values()],n)).map(l=>({...l,field:i}))))).flat().filter(i=>i.rest?Kc(i.rest,i.field-3)===e:!1)}}const qc=["exact","case","decorated","prefix","padded","roman","organelle","accession","version"],Ps=new Set(["gi","gb","ref","emb","dbj","tpg","tpe","tpd","lcl","pir","prf","sp","tr","pdb","ena","bbs"]);function As(t){let e=t.trim().split(/\s+/)[0]??"";if(e=e.replace(/[,;]+$/,""),e.includes("|")){const n=e.split("|").filter(A=>A!=="");if(n.some(A=>Ps.has(A.toLowerCase()))){const A=n.filter((s,r)=>Ps.has(s.toLowerCase())?!1:!(/^[0-9]+$/.test(s)&&r>0&&n[r-1].toLowerCase()==="gi"));A.length>0&&(e=A[A.length-1])}}return e}const Yo=/^(?:chromosome|chrom|chr)[ _.-]?/i;function Oo(t){const e=t.replace(Yo,"");if(e===""||e===t)return null;const n=e.toLowerCase();return/^[0-9]/.test(e)||mn.has(n)||En.has(n)||Tn(e)>0||/^un[_.-]/i.test(e)||/^[A-Za-z]{1,2}[0-9]/.test(e)||Ko.test(e)||qo.test(e.replace(/\.[0-9]+$/,""))?e:null}const Hc=/^(?:lg|linkage_?group|group)[ _.-]?(?=[0-9])/i,_o=/_(random|alt|fix|hap\d+|maternal|paternal)$/i,Wc=/(?:^|[_.-])([A-Z]{2}[0-9]{5,6})v([0-9]+)(?:$|[_.-])/,Ko=/^(N[CGTWZ]|AC)_([0-9]{5,})$/i,qo=/^[A-Z]{1,6}[0-9]{5,8}$/,Pc=[["mito",["m","mt","mtdna","mito","mitochondrion","mitochondria","mitochondrial","mitochondrion_genome","dmel_mitochondrion_genome","mitochondrial_genome","mitochondrion_dna","chrmt","nc_012920","j01415","nc_001224","nc_005089"]],["plastid",["c","pt","cp","chloroplast","plastid","chloroplast_genome","chrc","nc_000932"]],["2micron",["2-micron","2micron","2u","2-micron_plasmid","nc_001398"]]],En=new Map;for(const[t,e]of Pc)for(const n of e)En.set(n,t);const mn=new Set(["x","y","z","w"]),zc=/^(XL|L|X{0,3})(IX|IV|V?I{0,3})$/i,Xc={"":0,x:10,xx:20,xxx:30,xl:40,l:50},Vc={"":0,i:1,ii:2,iii:3,iv:4,v:5,vi:6,vii:7,viii:8,ix:9};function Tn(t){const e=zc.exec(t);if(e===null)return 0;const n=Xc[e[1].toLowerCase()],A=Vc[e[2].toLowerCase()];return n===void 0||A===void 0?0:n+A}const Zc=[{from:1,to:22,first:1,tail:["x","y"]},{from:67,to:85,first:1,tail:["x","y"]}];function jc(t){for(const e of Zc){if(t>=e.from&&t<=e.to)return String(e.first+(t-e.from));const n=t-e.to-1;if(n>=0&&n<e.tail.length)return e.tail[n]}return null}const CA=200;function tl(t){return t.length<2||mn.has(t.toLowerCase())?!1:Tn(t)>0}function Ho(t){const e=t.map(a=>Wo(a)),A=e.filter(a=>tl(a)).length>=2,s=e.filter(a=>/^[0-9]+$/.test(a)&&Number(a)>=1&&Number(a)<=CA),r=s.length<CA,o=a=>e.some(c=>c.toLowerCase()===a),i=r&&s.length>=2;return{roman:A,ordinals:r,xIsTen:A&&!i&&(o("ix")||o("xi"))}}function Wo(t){const e=As(t);return(Oo(e)??e).replace(_o,"")}function gn(t,e){const n=[],A=As(t);A!==t.trim()&&n.push("decorated");const s=Oo(A),r=s??A;s!==null&&n.push("prefix");const o=_o.exec(r),i=o===null?r:r.slice(0,o.index),a=o===null?"":`+${o[1].toLowerCase()}`,c=i.toLowerCase(),l=Wc.exec(r);if(l!==null)return n.push("accession"),{key:`acc:${l[1].toLowerCase()}`,via:n,version:l[2],opaque:!1};const g=/^(.*?)\.([0-9]+)$/.exec(i),f=g===null?i:g[1],h=g===null?null:g[2],u=En.get(c)??En.get(f.toLowerCase());if(u!==void 0)return u!==c&&n.push("organelle"),{key:`org:${u}`,via:n,version:h,opaque:!1};const I=Ko.exec(f);if(I!==null){n.push("accession");const E=I[1].toLowerCase()==="nc"?jc(Number(I[2])):null;return E!==null?{key:mn.has(E)?`sex:${E}${a}`:`num:${E}${a}`,via:n,version:h,opaque:!1}:{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1}}if(qo.test(f))return n.push("accession"),{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1};if(/^[0-9]+$/.test(i)&&e.ordinals&&Number(i)<=CA)return/^0[0-9]/.test(i)&&n.push("padded"),{key:`num:${Number(i)}${a}`,via:n,version:null,opaque:!1};const d=/^([0-9]{1,2})([a-z]{1,2})$/i.exec(i);if(d!==null&&e.ordinals)return d[1].startsWith("0")&&n.push("padded"),{key:`num:${Number(d[1])}${d[2].toLowerCase()}${a}`,via:n,version:null,opaque:!1};const C=Hc.exec(i);if(C!==null){const E=i.slice(C[0].length);if(/^[0-9]+$/.test(E))return/^0[0-9]/.test(E)&&n.push("padded"),{key:`lg:${Number(E)}${a}`,via:n,version:null,opaque:!1}}if(mn.has(c)&&!(c==="x"&&e.xIsTen))return{key:`sex:${c}${a}`,via:n,version:null,opaque:!1};if(e.roman){const E=Tn(i);if(E>0)return n.push("roman"),{key:`num:${E}${a}`,via:n,version:null,opaque:!1}}return{key:`raw:${c}${a}`,via:n,version:null,opaque:!0}}function Ee(t){return qc.indexOf(t)}function el(t,e){let n="case";for(const A of[...t.via,...e.via])Ee(A)>Ee(n)&&(n=A);return n}function tA(t,e){return t===void 0||e===void 0||t<=0||e<=0?"unknown":t===e?"agree":"differ"}const zs=new WeakMap;class St{names;context;styleCache=null;get style(){return this.styleCache??=Al(this.names,this.context),this.styleCache}exact=new Map;folded=new Map;keyed=new Map;constructor(e){this.names=e.map(n=>n.name),this.context=Ho(this.names);for(const n of e){this.exact.has(n.name)||this.exact.set(n.name,n),Xs(this.folded,n.name.toLowerCase(),n);const A=gn(n.name,this.context);Xs(this.keyed,A.key,{sequence:n,canon:A})}}static of(e){return new St(e)}static ofNames(e){return new St(e.map(n=>({name:n})))}static for(e){const n=zs.get(e);if(n!==void 0)return n;const A=typeof e[0]=="string"?St.ofNames(e):St.of(e);return zs.set(e,A),A}has(e){return this.exact.has(e)}find(e,n={}){const{length:A}=n,s=this.exact.get(e);if(s!==void 0)return{name:s.name,asked:e,tier:"exact",lengths:tA(A,s.length)};const r=this.folded.get(e.toLowerCase());if(r!==void 0&&r.length===1)return{name:r[0].name,asked:e,tier:"case",lengths:tA(A,r[0].length)};const o=n.from??this.context,i=this.byKey(e,gn(e,o),A);if(i!==null)return i;if(!o.roman){const a=Wo(e).toLowerCase();if(a!=="x"&&a!=="l"&&Tn(a)>0)return this.byKey(e,gn(e,{...o,roman:!0,xIsTen:!1}),A)}return null}byKey(e,n,A){const s=this.keyed.get(n.key);if(s===void 0||s.length===0)return null;const r=nl(s,A);if(r===null)return null;const o=el(n,r.canon),i=n.version!==null&&r.canon.version!==null&&n.version!==r.canon.version;return{name:r.sequence.name,asked:e,tier:i&&Ee(o)<Ee("version")?"version":o,lengths:tA(A,r.sequence.length)}}}function nl(t,e){if(t.length===1)return t[0];if(e===void 0||e<=0)return null;const n=t.filter(A=>A.sequence.length===e);return n.length===1?n[0]:null}function Xs(t,e,n){const A=t.get(e);A===void 0?t.set(e,[n]):A.push(n)}function Al(t,e=Ho(t)){if(t.length===0)return"empty";let n=0,A=0,s=0,r=0;for(const i of t){const a=gn(i,e);if(a.opaque){r++;continue}a.via.includes("accession")?s++:Yo.test(As(i))?n++:A++}const o=n+A+s;return o===0||r>o*4?"assembly":e.roman&&n<=A?"roman":s>n&&s>A?"accession":n>0&&A>0?"mixed":n>0?e.roman?"roman":"ucsc":e.roman?"roman":"ensembl"}function sl(t,e){const n=St.of(e),A=St.of(t).context,s=[];for(const g of t){const f=n.find(g.name,{length:g.length,from:A});f!==null&&s.push({source:g,match:f})}s.sort((g,f)=>Ee(g.match.tier)-Ee(f.match.tier));const r=new Map,o=new Set;for(const g of s){const f=r.get(g.match.name);f===void 0?r.set(g.match.name,{source:g.source.name,tier:g.match.tier}):f.tier===g.match.tier&&o.add(g.match.name)}const i=new Map,a=[];let c=0;for(const g of s){const f=r.get(g.match.name);f===void 0||f.source!==g.source.name||o.has(g.match.name)||(i.set(g.source.name,g.match),g.match.tier!=="exact"&&c++,g.match.lengths==="differ"&&a.push(g.match))}const l=t.map(g=>g.name).filter(g=>!i.has(g));return{pairs:i,unmatched:l,contested:a,renamed:c}}function pe(t,e){const n=sl(t,e),A=new Map,s=t.map(r=>{const o=n.pairs.get(r.name);return o===void 0?r.name:(A.set(o.name,r.name),o.name)});for(const r of t)A.has(r.name)||A.set(r.name,r.name);return{names:s,sourceOf:A,renamed:n.renamed,contested:n.contested}}function rl(t){return t.map(e=>({name:e}))}function Kt(t,e){const n=ol(t),A=n.get(e);if(A!==void 0)return A;const s=St.for(t).find(e);return s===null?-1:n.get(s.name)??-1}const Vs=new WeakMap;function ol(t){const e=Vs.get(t);if(e!==void 0)return e;const n=new Map;return t.forEach((A,s)=>{const r=typeof A=="string"?A:A.name;n.has(r)||n.set(r,s)}),Vs.set(t,n),n}class Rt extends Error{code;detail;constructor(e,n,A={}){super(n),this.name="ViewerError",this.code=e,this.detail=A}}const eA=new Intl.NumberFormat(void 0,{maximumFractionDigits:0}),il=new Intl.NumberFormat(void 0,{maximumFractionDigits:3}),al=new Intl.NumberFormat(void 0,{maximumSignificantDigits:3}),Zs=new Map,cl=new Intl.NumberFormat("en-US",{maximumFractionDigits:0}),G={int(t){return Number.isFinite(t)?eA.format(t):"—"},num(t){if(!Number.isFinite(t))return"—";if(Number.isInteger(t))return eA.format(t);const e=Math.abs(t);return e>=.001?il.format(t):e>=1e-7?al.format(t):t.toExponential(2)},fixed(t,e){if(!Number.isFinite(t))return"—";let n=Zs.get(e);return n===void 0&&(n=new Intl.NumberFormat(void 0,{minimumFractionDigits:e,maximumFractionDigits:e}),Zs.set(e,n)),n.format(t)},pct(t,e=1){return Number.isFinite(t)?`${(t*100).toFixed(e)}%`:"—"},pos(t){return Number.isFinite(t)?cl.format(Math.round(t)):"—"},bp(t){return Number.isFinite(t)?Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)} Mb`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(1)} kb`:`${eA.format(t)} bp`:"—"},bytes(t){if(!Number.isFinite(t))return"—";const e=["B","kB","MB","GB","TB"];let n=t,A=0;for(;n>=1e3&&A<e.length-1;)n/=1e3,A++;return`${A===0?n:n.toFixed(1)} ${e[A]}`}};function ll(t){return!Number.isFinite(t)||t<=0?"—":t>=1e6?`${nA(t/1e6)} Mb`:t>=1e3?`${nA(t/1e3)} kb`:`${nA(t)} bp`}function nA(t){return String(Number(t.toFixed(2)))}function nt(t,e){const n=fl(t),A=hl(n,e);if(A===null)return n;throw new Rt("format",`The ${e.field} of this ${e.format} reads ${BA(t)}, ${A.reason}. `+de,{format:e.format,field:e.field,value:typeof t=="bigint"?t.toString():t,ceiling:e.ceiling,...e.available===void 0?{}:{available:e.available},...A.most===void 0?{}:{most:A.most}})}function ss(t,e,n){const A={format:n.format,field:n.field,offset:t,length:e,size:n.size};if(!QA(t)||!QA(e))throw new Rt("format",`The ${n.field} of this ${n.format} points at ${BA(e)} bytes from byte ${BA(t)}, which is not a place in a file. ${de}`,A);if(n.ceiling!==void 0&&e>n.ceiling)throw new Rt("format",`The ${n.field} of this ${n.format} is ${G.int(e)} bytes long, more than the ${G.int(n.ceiling)} any real one holds. ${de}`,{...A,ceiling:n.ceiling});if(t+e>n.size)throw new Rt("format",`The ${n.field} of this ${n.format} points at bytes ${G.int(t)} to ${G.int(t+e)}, past the end of a file of ${G.int(n.size)}. ${de}`,A)}const js=65536,Po=2**29;async function rs(t,e){if(typeof DecompressionStream>"u")throw new Rt("unsupported",`Reading a ${e.format} needs DecompressionStream, which this runtime does not have. Every browser since 2023 has it; a very old one does not.`,{format:e.format});const n=new DecompressionStream(e.encoding),A=n.writable.getWriter(),s=n.readable.getReader(),r=[];let o=0,i=!1;const a=(async()=>{for(;;){const{done:I,value:d}=await s.read();if(I)return;if(o+=d.byteLength,o>e.maxBytes){i=!0,await s.cancel();return}r.push(d)}})(),c=(async()=>{for(let I=0;I<t.byteLength;I+=js){if(i)return;const d=t.subarray(I,Math.min(I+js,t.byteLength));await A.write(d)}i||await A.close()})(),[l,g]=await Promise.allSettled([a,c]);if(i)throw zo(e,e.maxBytes,t.byteLength);const f=l.status==="rejected"?l.reason:g.status==="rejected"?g.reason:null;if(f!==null){const I=f instanceof Error?f.message:String(f);throw new Rt("format",`The ${e.field} of this ${e.format} does not inflate (${I.replace(/\.$/,"")}). ${de}`,{format:e.format,field:e.field})}if(r.length===1)return r[0];const h=new Uint8Array(o);let u=0;for(const I of r)h.set(I,u),u+=I.length;return h}function gl(t,e){return Math.min(e.ceiling,Math.max(e.floor,Math.ceil(t*e.ratio)))}function zo(t,e,n){return new Rt("format",`The ${t.field} of this ${t.format} inflates to more than ${G.bytes(e)}, past what any real one holds. ${de}`,{format:t.format,field:t.field,maxBytes:e,compressed:n})}const de="The file is truncated, corrupt, or not the format its first bytes claim.";function fl(t){return typeof t=="number"?t:t>=BigInt(Number.MIN_SAFE_INTEGER)&&t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):Number.NaN}function QA(t){return Number.isSafeInteger(t)&&t>=0}function hl(t,e){if(!QA(t))return{reason:"which is not a count"};if(t>e.ceiling)return{reason:`more than the ${G.int(e.ceiling)} any real one declares`};if(e.available!==void 0){const n=Math.floor(Math.max(0,e.available)/Math.max(1,e.bytesPerItem??1));if(t>n){const A=Math.max(0,e.available);return{reason:`and the ${G.int(A)} byte${A===1?"":"s"} after it could hold at most ${G.int(n)}`,most:n}}}return null}function BA(t){return typeof t=="bigint"?t.toString():Number.isSafeInteger(t)?G.int(t):String(t)}const ul=65536;async function Il(t){return t.length===0?t:rs(t,{format:"BGZF file",field:"member",encoding:"deflate-raw",maxBytes:ul})}const os=12,Et=65536;function We(t){return t.length<os||t[0]!==31||t[1]!==139||t[2]!==8||(t[3]&4)===0?!1:ye(t)!==null}function ye(t){if(t.length<os)return null;const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint16(10,!0);let A=12;const s=Math.min(12+n,t.length);for(;A+4<=s;){const r=t[A],o=t[A+1],i=e.getUint16(A+2,!0);if(r===66&&o===67&&i===2)return e.getUint16(A+4,!0)+1;A+=4+i}return null}const dl=Il;async function Ot(t,e=Number.POSITIVE_INFINITY,n=Po){const A=[];let s=0,r=0;for(;r+os<=t.length;){const a=r,c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const g=new DataView(t.buffer,t.byteOffset+r,c).getUint16(10,!0),f=r+12+g,h=r+c-8;if(h>f){const u=await dl(t.subarray(f,h));if(u.length>0){if(s+u.length>n)throw zo({format:"BGZF file",field:"span read"},n,t.length);A.push(u),s+=u.length}}if(r+=c,a>=e)break}const o=new Uint8Array(s);let i=0;for(const a of A)o.set(a,i),i+=a.length;return o}function Cl(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<36||t[0]!==84||t[1]!==66||t[2]!==73||t[3]!==1)throw new Error("This is not a tabix index: the magic bytes are not TBI\\1.");const n=e.getInt32(4,!0),A=e.getInt32(8,!0),s=String.fromCharCode(e.getInt32(24,!0)),r=e.getInt32(28,!0),o=e.getInt32(32,!0),i=[],a=new TextDecoder().decode(t.subarray(36,36+o));for(const g of a.split("\0"))g!==""&&i.push(g);let c=36+o;const l=new Map;for(let g=0;g<n;g++){const f=e.getInt32(c,!0);c+=4;let h=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY;for(let d=0;d<f;d++){c+=4;const C=e.getInt32(c,!0);c+=4;for(let E=0;E<C;E++){const B=Number(e.getBigUint64(c,!0)>>16n),Q=Number(e.getBigUint64(c+8,!0)>>16n);c+=16,B<h&&(h=B),Q>u&&(u=Q)}}const I=e.getInt32(c,!0);c+=4;for(let d=0;d<I;d++){const C=Number(e.getBigUint64(c,!0)>>16n);c+=8,C>0&&C<h&&(h=C)}Number.isFinite(h)&&Number.isFinite(u)&&g<i.length&&l.set(i[g],{from:h,to:u})}return{names:i,spans:l,format:A,meta:s,skip:r}}function Ql(t,e,n){const A=[];for(const r of e){const o=t.spans.get(r);o!==void 0&&A.push({from:o.from,to:Math.min(n,o.to+Et),lastBlock:o.to})}A.sort((r,o)=>r.from-o.from);const s=[];for(const r of A){const o=s[s.length-1];o!==void 0&&r.from<=o.to+(1<<20)?(o.to=Math.max(o.to,r.to),o.lastBlock=Math.max(o.lastBlock,r.lastBlock)):s.push({...r})}return s}function Bl(t,e){if(e.length===0)return t.names;const n=St.ofNames(t.names),A=new Set;for(const s of e){const r=n.find(s);r!==null&&A.add(r.name)}return A.size===0?t.names:[...A]}class et{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s={}){const r=Math.min(n,A),o=Math.max(r+1,Math.max(n,A));this.rows.push({contig:this.contigId(e),start:r,end:o,strand:s.strand??0,score:s.score??Number.NaN,name:s.name??"",id:s.id??"",detail:s.detail??"",exons:s.exons??null,cds:s.cds??null,bars:s.bars??null,xyz:s.xyz??null,hap:s.hap??0})}get length(){return this.rows.length}finish(e=null,n=null){const A=this.rows;A.sort((h,u)=>h.contig-u.contig||h.start-u.start||h.end-u.end||h.hap-u.hap);const s=A.length,r={contigs:this.contigs,length:s,contig:new Int32Array(s),start:new Int32Array(s),end:new Int32Array(s),strand:new Int8Array(s),score:new Float32Array(s),name:new Array(s),id:new Array(s),detail:new Array(s),exonAt:new Int32Array(s+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(s),cdsEnd:new Int32Array(s),contigAt:new Int32Array(this.contigs.length+1),maxSpan:new Int32Array(this.contigs.length)};let o=0;for(const h of A)o+=h.exons===null?0:h.exons.length>>1;r.exonStart=new Int32Array(o),r.exonEnd=new Int32Array(o);const i=e===null?0:e.labels.length,a=new Float32Array(i*s).fill(Number.NaN);let c=0;const l=n===null?null:{x:new Float32Array(s),y:new Float32Array(s),z:new Float32Array(s),hap:new Int8Array(s)};let g=0;for(let h=0;h<s;h++){const u=A[h];if(r.contig[h]=u.contig,r.start[h]=u.start,r.end[h]=u.end,r.strand[h]=u.strand,r.score[h]=u.score,r.name[h]=u.name,r.id[h]=u.id,r.detail[h]=u.detail,r.cdsStart[h]=u.cds===null?-1:u.cds[0],r.cdsEnd[h]=u.cds===null?-1:u.cds[1],r.exonAt[h]=g,u.exons!==null){const d=[];for(let C=0;C+1<u.exons.length;C+=2)d.push([u.exons[C],u.exons[C+1]]);d.sort((C,E)=>C[0]-E[0]);for(const[C,E]of d)r.exonStart[g]=C,r.exonEnd[g]=E,g++}if(i>0&&u.bars!==null&&u.bars.length===i)for(let d=0;d<i;d++){const C=u.bars[d];a[h*i+d]=C,C>c&&(c=C)}l!==null&&(l.x[h]=u.xyz===null?Number.NaN:u.xyz[0],l.y[h]=u.xyz===null?Number.NaN:u.xyz[1],l.z[h]=u.xyz===null?Number.NaN:u.xyz[2],l.hap[h]=u.hap);const I=u.end-u.start;I>r.maxSpan[u.contig]&&(r.maxSpan[u.contig]=I)}r.exonAt[s]=g;let f=0;for(let h=0;h<this.contigs.length;h++)for(r.contigAt[h]=f;f<s&&r.contig[f]===h;)f++;if(r.contigAt[this.contigs.length]=f,e!==null){const{limit:h,...u}=e;r.bars={...u,values:a,max:Number.isFinite(h)&&h>0?h:c}}return l!==null&&n!==null&&(r.model={...l,haplotypes:[...n.haplotypes],width:n.width}),r}}function El(t,e,n=4){const A=new Set(t),s=new Set(e),r=e.filter(i=>!A.has(i)),o=t.filter(i=>!s.has(i));return{matched:e.length-r.length,total:e.length,missing:r.slice(0,n),extra:o.slice(0,n)}}class Jn{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s,r,o,i={}){this.rows.push({c1:this.contigId(e),s1:n,e1:Math.max(n+1,A),c2:this.contigId(s),s2:r,e2:Math.max(r+1,o),score:i.score??Number.NaN,name:i.name??"",detail:i.detail??""})}get length(){return this.rows.length}finish(){const e=this.rows.length,n={contigs:this.contigs,length:e,contig1:new Int32Array(e),start1:new Int32Array(e),end1:new Int32Array(e),contig2:new Int32Array(e),start2:new Int32Array(e),end2:new Int32Array(e),score:new Float32Array(e),name:new Array(e),detail:new Array(e)};for(let A=0;A<e;A++){const s=this.rows[A];n.contig1[A]=s.c1,n.start1[A]=s.s1,n.end1[A]=s.e1,n.contig2[A]=s.c2,n.start2[A]=s.s2,n.end2[A]=s.e2,n.score[A]=s.score,n.name[A]=s.name,n.detail[A]=s.detail}return n}}const De=256,ml=["#FFFEF9","#FCF9CE","#FFF2A9","#FDE188","#FFCA67","#FAAA4B","#F78E40","#F15C34","#ED3024","#D42027","#B01F29","#7A1128","#1A0A10"],wl=["#FFFFFF","#FFF5F0","#FEE0D2","#FCBBA1","#FC9272","#FB6A4A","#EF3B2C","#CB181D","#A50F15","#67000D"],pl=["#053061","#2166AC","#4393C3","#92C5DE","#D1E5F0","#F7F7F7","#FDDBC7","#F4A582","#D6604D","#B2182B","#67001F"],yl=["#1659b1","#487BA8","#819EC8","#D1E6F1","#FFFFFF","#FAC1C1","#F1606C","#EE222A"],Nl=[0,.125,.25,.375,.5,2/3,5/6,1],kl=["#00004D","#0000FF","#FFFFFF","#FF0000","#800000"];function Me(t,e,n){const A=t.map(i=>[Number.parseInt(i.slice(1,3),16),Number.parseInt(i.slice(3,5),16),Number.parseInt(i.slice(5,7),16)]),s=A.length-1,r=n??A.map((i,a)=>a/s),o=new Array(e*3);for(let i=0;i<e;i++){const a=i/(e-1);let c=0;for(;c<s-1&&a>=r[c+1];)c++;const l=r[c+1]-r[c],g=l>0?(a-r[c])/l:0;for(let f=0;f<3;f++)o[i*3+f]=Math.round(A[c][f]+(A[c+1][f]-A[c][f])*g)}return o}Me(ml,De),Me(wl,De),Me(pl,De),Me(yl,De,Nl),Me(kl,De);const bl="RdBu_r";(()=>{const t=new Int8Array(256).fill(-1),e=(n,A)=>{for(const s of n)t[s.charCodeAt(0)]=A,t[s.toLowerCase().charCodeAt(0)]=A};return e("TU",0),e("C",1),e("A",2),e("G",3),t})();const tr=[66,65,77,1],fn=32,At={PAIRED:1,PROPER_PAIR:2,UNMAPPED:4,MATE_UNMAPPED:8,REVERSE:16,FIRST_IN_PAIR:64,SECOND_IN_PAIR:128,SECONDARY:256,QC_FAIL:512,DUPLICATE:1024,SUPPLEMENTARY:2048};function is(t,e,n,A){const s={c:1,C:1,s:2,S:2,i:4,I:4,f:4,A:1};if(n==="Z"||n==="H"){let o=e;for(;o<A&&t[o]!==0;)o++;return o+1}if(n==="B"){const o=String.fromCharCode(t[e]),i=new DataView(t.buffer,t.byteOffset,t.byteLength).getInt32(e+1,!0),a=s[o];return a===void 0||i<0?-1:e+5+i*a}const r=s[n];return r===void 0?-1:e+r}const Xo=At.UNMAPPED|At.SECONDARY|At.SUPPLEMENTARY|At.QC_FAIL;function Vo(t){return t.length<tr.length?!1:tr.every((e,n)=>t[n]===e)}function Dl(t){if(!Vo(t))throw new Error("This is not a BAM: the first four bytes are not BAM\\1.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<8)return null;const n=e.getInt32(4,!0);if(n<0)throw new Error("This BAM header declares a negative length.");let A=8+n;if(t.length<A+4)return null;const s=new TextDecoder().decode(t.subarray(8,A)),r=e.getInt32(A,!0);if(A+=4,r<0)throw new Error("This BAM header declares a negative reference count.");const o=[];for(let i=0;i<r;i++){if(t.length<A+4)return null;const a=e.getInt32(A,!0);if(A+=4,a<0)throw new Error("This BAM header declares a negative name length.");if(t.length<A+a+4)return null;const c=new TextDecoder().decode(t.subarray(A,A+a-1));A+=a;const l=e.getInt32(A,!0);A+=4,o.push({name:c,length:l})}return{text:s,refs:o,sortOrder:Ml(s),recordsFrom:A}}function Ml(t){for(const e of t.split(`
|
|
2
|
-
`))if(e.startsWith("@HD"))for(const n of e.split(" ")){if(!n.startsWith("SO:"))continue;const A=n.slice(3).trim();return A==="coordinate"||A==="queryname"||A==="unsorted"?A:"unknown"}return"unknown"}const
|
|
3
|
-
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o==="")continue;if(o.startsWith("##")){if(/^##fileformat=VCF/i.test(o))return!0;continue}if(o.startsWith("#")){if(/^#CHROM\s+POS\s+ID\s+REF\s+ALT/i.test(o))return!0;continue}const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(!
|
|
4
|
-
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o!==""&&e(o)===!1)return}}function
|
|
5
|
-
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);n=r+1,A++,!(i===""||i.charCodeAt(0)===35)&&(i.startsWith("track ")||i.startsWith("browser ")||e(i.includes(" ")?i.split(" "):i.trim().split(/\s+/),A))}}function
|
|
6
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!
|
|
7
|
-
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);if(n=r+1,A++,!(i===""||i.charCodeAt(0)===35)){if(!i.startsWith("track ")){if(!i.startsWith("browser "))break;continue}for(const[,a,c,l]of i.matchAll(/(\w+)=(?:"([^"]*)"|(\S+))/g))e[a.toLowerCase()]=c??l??"";break}}return e}function
|
|
8
|
-
`,r);i<0&&(i=o);let a=i;a>r&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(r,a);if(r=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=
|
|
9
|
-
`,g);N<0&&(N=f);let k=N;k>g&&t.charCodeAt(k-1)===13&&k--;const b=t.slice(g,k);if(g=N+1,b.startsWith(`${cr} `)){const x=b.slice(cr.length+1).trim().split(/\s+/),[Y,...J]=x;if(Y==="PLACEMENT")s=Number(J[0]);else if(Y==="FRAME"&&J.length===4){const[K,V,H,ht]=J.map(Number);[K,V,H].every(Number.isFinite)&&ht>0&&(r={cx:K,cy:V,cz:H,factor:ht})}else if(Y==="WIDTH"){const K=Number(J[0]);Number.isInteger(K)&&K>0&&(o=K)}else if(Y==="HAPLOTYPES")i=J.map(sA);else if(Y==="CHAIN"&&J.length>=6){const K=Number(J[2]),V=Number(J[3]);en(K)&&en(V)&&K<=V&&n.push({first:K,last:V,hap:sA(J[4]),sequence:sA(J.slice(5).join(" "))})}else if(Y==="RUN"&&J.length===4){const[K,V,H,ht]=J.map(Number);en(K)&&Number.isInteger(V)&&V>0&&K+V-1<=fe&&Number.isInteger(H)&&H>=0&&Number.isInteger(ht)&&ht>0&&A.push({first:K,count:V,start:H,width:ht})}continue}if(l)continue;if(b.startsWith("ENDMDL")){l=!0;continue}if(!b.startsWith("HETATM")&&!b.startsWith("ATOM "))continue;const D=Number(b.slice(6,11)),F=Number(b.slice(30,38)),R=Number(b.slice(38,46)),v=Number(b.slice(46,54));!en(D)||!Pg(F,R,v)||(b.slice(17,20)===Wg&&c++,a.push({serial:D,x:F,y:R,z:v}))}const h=e===""?"This file":e;if(a.length===0)throw new Error(`${h} has no ATOM or HETATM record with a place, so there is no bead to read.`);if(s===null||n.length===0||A.length===0)throw new Error(c===a.length?"These beads are named the way this app writes a PDB, but the lines that said where each one is on the genome are gone: PyMOL drops REMARK records when it saves. Open the PDB as this app wrote it, or its bed3d.":"A PDB says where each bead is in space and not where it is on the genome, and this one does not say: pastis and the other solvers write their beads in bin order and nothing else. Write the coordinates beside the bins they were modelled at, as a bed3d (chrom, start, end, x, y, z), and open that.");if(s!==lr)throw new Error(`This PDB's placement table is version ${String(s)}, and this reader understands version ${lr}.`);const u=new Int32Array(fe+1).fill(-1);n.forEach((N,k)=>{for(let b=N.first;b<=N.last;b++)u[b]=k});const I=new Float64Array(fe+1).fill(-1),d=new Float64Array(fe+1);for(const N of A)for(let k=0;k<N.count;k++)I[N.first+k]=N.start+k*N.width,d[N.first+k]=N.width;const C=i??[],E=new Map;C.forEach((N,k)=>E.set(N,k));const B=r??{cx:0,cy:0,cz:0,factor:1},Q=new Uint8Array(fe+1),m=[];for(const N of a){const k=u[N.serial],b=I[N.serial];if(k<0||b<0||Q[N.serial]===1)continue;Q[N.serial]=1;const D=n[k];E.has(D.hap)||(E.set(D.hap,C.length),C.push(D.hap)),m.push({contig:D.sequence,start:b,end:b+d[N.serial],xyz:[N.x/B.factor+B.cx,N.y/B.factor+B.cy,N.z/B.factor+B.cz],hap:D.hap})}if(m.length===0)throw new Error(`${h} has a placement table, and it places none of the file's ${G.int(a.length)} atoms.`);const p=C.length>1,w=new et;for(const N of m)w.add(N.contig,N.start,N.end,{xyz:N.xyz,hap:E.get(N.hap)??0,detail:p?`${hs} ${N.hap}`:""});const y={width:o??zg(m.map(N=>N.end-N.start)),haplotypes:C};return w.finish(null,y)}function en(t){return Number.isInteger(t)&&t>=1&&t<=fe}function sA(t){try{return decodeURIComponent(t)}catch{return t}}function zg(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}const rA="MessagePack value",gr=64,Xg=BigInt(Number.MAX_SAFE_INTEGER),Vg=BigInt(Number.MIN_SAFE_INTEGER);function yi(t,e=0){const n=new Zg(t,e);return{value:n.next(),end:n.at}}class Zg{constructor(e,n){this.bytes=e,this.at=n,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength)}at;view;decoder=new TextDecoder;depth=0;next(){const e=this.u8();if(e<=127)return e;if(e>=224)return e-256;if(e>=128&&e<=143)return this.map(e&15);if(e>=144&&e<=159)return this.array(e&15);if(e>=160&&e<=191)return this.str(e&31);switch(e){case 192:return null;case 194:return!1;case 195:return!0;case 196:return this.bin(this.u8());case 197:return this.bin(this.u16());case 198:return this.bin(this.u32());case 202:return this.f32();case 203:return this.f64();case 204:return this.u8();case 205:return this.u16();case 206:return this.u32();case 207:return this.big(this.view.getBigUint64(this.take(8)));case 208:return this.i8();case 209:return this.i16();case 210:return this.i32();case 211:return this.big(this.view.getBigInt64(this.take(8)));case 217:return this.str(this.u8());case 218:return this.str(this.u16());case 219:return this.str(this.u32());case 220:return this.array(this.u16());case 221:return this.array(this.u32());case 222:return this.map(this.u16());case 223:return this.map(this.u32());default:throw new Error(`msgpack: unsupported type byte 0x${e.toString(16).padStart(2,"0")} at offset ${this.at-1}.`)}}take(e){const n=this.at;if(n+e>this.bytes.length)throw new Error(`msgpack: truncated: needed ${e} byte${e===1?"":"s"} at offset ${n} of ${this.bytes.length}.`);return this.at=n+e,n}u8(){return this.view.getUint8(this.take(1))}u16(){return this.view.getUint16(this.take(2))}u32(){return this.view.getUint32(this.take(4))}i8(){return this.view.getInt8(this.take(1))}i16(){return this.view.getInt16(this.take(2))}i32(){return this.view.getInt32(this.take(4))}f32(){return this.view.getFloat32(this.take(4))}f64(){return this.view.getFloat64(this.take(8))}big(e){if(e>Xg||e<Vg)throw new Error(`msgpack: the 64-bit integer ${e} at offset ${this.at-9} does not fit a JavaScript number.`);return Number(e)}str(e){const n=this.take(e);return this.decoder.decode(this.bytes.subarray(n,n+e))}bin(e){const n=this.take(e);return this.bytes.subarray(n,n+e)}open(e,n,A){if(this.depth>=gr)throw new Rt("format",`This ${rA} nests deeper than ${gr} levels at offset ${this.at}, which no document this reader opens does. The file is corrupt, or not the format its first bytes claim.`,{format:rA,offset:this.at,depth:this.depth});return this.depth++,nt(e,{format:rA,field:`${n} length at offset ${this.at}`,ceiling:2**32-1,available:this.bytes.length-this.at,bytesPerItem:A})}array(e){const n=this.open(e,"array",1),A=new Array(n);for(let s=0;s<n;s++)A[s]=this.next();return this.depth--,A}map(e){const n=this.open(e,"map",2),A=new Map;for(let s=0;s<n;s++){const r=this.at,o=this.next();if(typeof o!="string"&&typeof o!="number")throw new Error(`msgpack: a map key at offset ${r} is neither a string nor an integer.`);A.set(o,this.next())}return this.depth--,A}}const fr=64e3,yn="binary g3d",Ni={ratio:64,floor:64<<20,ceiling:1<<30},jg=[165,109,97,103,105,99],tf=[163,71,51,68];function Is(t){if(t.length===0)return!1;const e=t[0];let n;if(e>=128&&e<=143)n=1;else if(e===222)n=3;else return!1;const A=[...jg,...tf];if(t.length<n+A.length)return!1;for(let s=0;s<A.length;s++)if(t[n+s]!==A[s])return!1;return!0}async function ef(t,e){const n=e===void 0?fr:Math.min(fr,e),A=await t(n,0);if(!Is(A))throw new Error("Not a binary g3d: the file does not begin with the G3D magic.");const{value:s}=yi(A);if(!(s instanceof Map))throw new Error("Not a binary g3d: the header is not a map.");if(s.get("magic")!=="G3D")throw new Error('Not a binary g3d: the magic is not "G3D".');const r=s.get("version");if(r!==2)throw r===1?new Error("This is a version-1 g3d, written by a g3dtools older than 0.2. Run `g3dtools load` over the original text to rewrite it as a version-2 file, which is the layout this reader and the WashU browser both understand."):new Error(`Unsupported g3d version ${String(r)}: this reader understands version 2.`);const o=xe(s.get("resolutions"),"resolutions"),i=rf(s.get("categories"),"categories"),a=s.get("offsets");if(!(a instanceof Map))throw new Error("This g3d has no offsets map in its header.");const c=new Map;for(const[l,g]of a){const f=typeof l=="number"?l:Number(l);if(!Number.isInteger(f)||!(g instanceof Map))continue;const h=g.get("offset"),u=g.get("size");if(typeof h!="number"||typeof u!="number")continue;const I=`${f} bp block`;nt(h,{format:yn,field:`offset of the ${I}`,ceiling:Number.MAX_SAFE_INTEGER}),nt(u,{format:yn,field:`size of the ${I}`,ceiling:Ni.ceiling}),c.set(f,{offset:h,size:u})}for(const l of o)if(!c.has(l))throw new Error(`This g3d lists a resolution of ${l} bp but has no block for it.`);return{version:r,genome:typeof s.get("genome")=="string"?s.get("genome"):"",name:typeof s.get("name")=="string"?s.get("name"):"",resolutions:o,categories:i,offsets:c,...e===void 0?{}:{fileSize:e}}}async function nf(t,e,n){const A=e.offsets.get(n);if(A===void 0)throw new Error(`This g3d has no model at ${n} bp; it has ${e.resolutions.join(", ")}.`);e.fileSize!==void 0&&ss(A.offset,A.size,{format:yn,field:`${n} bp block`,size:e.fileSize});const s=await t(A.size,A.offset);if(s.length!==A.size)throw new Error(`The ${n} bp block of this g3d is ${s.length} bytes where the header promised ${A.size}.`);const{value:r}=yi(await sf(s,n));if(!(r instanceof Map))throw new Error(`The ${n} bp block of this g3d is not a map.`);const o=[...e.categories],i=o.length>1,a=new et;for(const[l,g]of r){const f=String(l);let h=o.indexOf(f);h<0&&(h=o.length,o.push(f));const u=i?`${hs} ${f}`:"";if(g instanceof Map)for(const[I,d]of g){if(!(d instanceof Map))continue;const C=`${f}/${String(I)} at ${n} bp`,E=xe(d.get("start"),`start of ${C}`),B=xe(d.get("x"),`x of ${C}`),Q=xe(d.get("y"),`y of ${C}`),m=xe(d.get("z"),`z of ${C}`);if(B.length!==E.length||Q.length!==E.length||m.length!==E.length)throw new Error(`The columns of ${C} in this g3d are not the same length.`);const p=String(I);for(let w=0;w<E.length;w++)a.add(p,E[w],E[w]+n,{xyz:[B[w],Q[w],m[w]],hap:h,detail:u})}}const c={width:n,haplotypes:o};return a.finish(null,c)}function Af(t){const e=t.resolutions.length,n=t.categories.length;return["binary g3d",`${e} resolution${e===1?"":"s"}`,`${n} categor${n===1?"y":"ies"}`].join(ct)}async function sf(t,e){return rs(t,{format:yn,field:`${e} bp block`,encoding:"deflate",maxBytes:gl(t.byteLength,Ni)})}function xe(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="number")throw new Error(`This g3d's ${e} holds a value that is not a number.`);return t}function rf(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="string")throw new Error(`This g3d's ${e} holds a value that is not a string.`);return t}const of=[66,65,73,1],af=[67,83,73,1],cf=14,lf=5,gf=37450,Qt="BAM index",ff=65536,hf=65536,uf=10,If=63,he=2**31-1;function hr(t,e){return t.length<e.length?!1:e.every((n,A)=>t[A]===n)}async function df(t){const e=We(t)?await Ot(t):t,n=hr(e,af)?Qf:hr(e,of)?Cf:null;if(n===null)throw new Error("This is not a BAM index: the magic bytes are neither BAI\\1 nor CSI\\1.");try{return n(e)}catch(A){throw A instanceof RangeError?new Rt("format",`This ${Qt} ends part-way through its own tables, ${e.byteLength.toLocaleString("en-US")} bytes in. It is truncated; rebuild it with \`samtools index\`.`,{bytes:e.byteLength}):A}}function Cf(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=o=>t.byteLength-o,A=nt(e.getInt32(4,!0),{format:Qt,field:"reference count",ceiling:he,available:n(8),bytesPerItem:8});let s=8;const r=[];for(let o=0;o<A;o++){const i=new Map,a=nt(e.getInt32(s,!0),{format:Qt,field:`bin count of reference ${o}`,ceiling:ff,available:n(s+4)-4,bytesPerItem:8});s+=4;for(let g=0;g<a;g++){const f=e.getUint32(s,!0);s+=4;const h=nt(e.getInt32(s,!0),{format:Qt,field:`chunk count of bin ${f}`,ceiling:he,available:n(s+4),bytesPerItem:16});s+=4;const u=[];for(let I=0;I<h;I++)u.push({begin:e.getBigUint64(s,!0),end:e.getBigUint64(s+8,!0)}),s+=16;f!==gf&&i.set(f,u)}const c=nt(e.getInt32(s,!0),{format:Qt,field:`linear index size of reference ${o}`,ceiling:hf,available:n(s+4),bytesPerItem:8});s+=4;const l=new BigUint64Array(c);for(let g=0;g<c;g++)l[g]=e.getBigUint64(s,!0),s+=8;r.push({bins:i,linear:l,loffset:null})}return{format:"bai",minShift:cf,depth:lf,refs:r}}function Qf(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=c=>t.byteLength-c,A=nt(e.getInt32(8,!0),{format:Qt,field:"CSI depth",ceiling:uf}),s=nt(e.getInt32(4,!0),{format:Qt,field:"CSI min_shift",ceiling:If-3*A});let o=16+nt(e.getInt32(12,!0),{format:Qt,field:"auxiliary data length",ceiling:he,available:n(16)-4});const i=nt(e.getInt32(o,!0),{format:Qt,field:"reference count",ceiling:he,available:n(o+4),bytesPerItem:4});o+=4;const a=[];for(let c=0;c<i;c++){const l=new Map,g=new Map,f=nt(e.getInt32(o,!0),{format:Qt,field:`bin count of reference ${c}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;for(let h=0;h<f;h++){const u=e.getUint32(o,!0);o+=4,g.set(u,e.getBigUint64(o,!0)),o+=8;const I=nt(e.getInt32(o,!0),{format:Qt,field:`chunk count of bin ${u}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;const d=[];for(let C=0;C<I;C++)d.push({begin:e.getBigUint64(o,!0),end:e.getBigUint64(o+8,!0)}),o+=16;l.set(u,d)}a.push({bins:l,linear:null,loffset:g})}return{format:"csi",minShift:s,depth:A,refs:a}}function $e(t,e){return Math.floor(t/2**e)}function Bf(t,e,n,A){const s=[],r=Math.max(e,n-1);let o=A.minShift+A.depth*3,i=0;for(let a=0;a<=A.depth;a++){const c=i+$e(e,o),l=i+$e(r,o);if(l-c+1>t.bins.size)for(const[g,f]of t.bins)g>=c&&g<=l&&s.push(f);else for(let g=c;g<=l;g++){const f=t.bins.get(g);f!==void 0&&s.push(f)}i+=1<<a*3,o-=3}return s}function Ef(t,e,n){if(t.linear!==null){const r=$e(e,n.minShift);return t.linear.length===0?0n:t.linear[Math.min(r,t.linear.length-1)]}if(t.loffset===null)return 0n;let A=n.minShift,s=0;for(let r=n.depth;r>=0;r--){s=ki(r);const o=t.loffset.get(s+$e(e,A));if(o!==void 0)return o;A+=3}return 0n}function ki(t){let e=0;for(let n=0;n<t;n++)e+=1<<n*3;return e}function mf(t,e,n){let A=null,s=n.minShift;for(let r=n.depth;r>=0;r--){const o=ki(r),i=1<<r*3,a=$e(Math.max(0,e-1),s)+1;for(let c=0;c<8&&a+c<i;c++){const l=t.bins.get(o+a+c);if(l!==void 0)for(const g of l)(A===null||g.begin<A)&&(A=g.begin)}s+=3}return A??BigInt(Number.MAX_SAFE_INTEGER)<<16n}const wf=1<<20;function pf(t,e,n,A,s){const r=t.refs[e];if(r===void 0)return[];const o=Ef(r,Math.max(0,n),t),i=mf(r,Math.max(1,A),t),a=[];for(const l of Bf(r,Math.max(0,n),Math.max(1,A),t))for(const g of l)g.end>o&&g.begin<i&&a.push(g);if(a.length===0)return[];a.sort((l,g)=>l.begin<g.begin?-1:l.begin>g.begin?1:0);const c=[];for(const l of a){const g=Number(l.begin>>16n),f=Number(l.begin&0xffffn),h=Number(l.end>>16n),u=Math.min(s,h+Et),I=c[c.length-1];I!==void 0&&g<=I.to+wf?(I.to=Math.max(I.to,u),I.lastBlock=Math.max(I.lastBlock,h)):c.push({from:g,to:u,lastBlock:h,dataFrom:f})}return c}function bi(t){let e=0;for(const n of t)e+=n.to-n.from;return e}const yf=2*Et,Nf=Et,ur=1<<20,kf=4*Et,bf=16384,Df=1<<24,Mf=1<<18,Ff=1<<24,Nn=18,Pt=[31,139,8,4],me=36;function jt(t,e){return t<0?Number.POSITIVE_INFINITY:t*2**32+e+1}class yA extends Error{constructor(e,n){super("The reads are not in coordinate order."),this.before=e,this.after=n,this.name="UnsortedError"}}function Ir(t,e){return t.refId<0?"unplaced":`${e[t.refId]?.name??`reference ${t.refId}`}:${(t.pos+1).toLocaleString("en-US")}`}function Sf(t,e){const n=e-1;return t>>14===n>>14?32767/7+(t>>14):t>>17===n>>17?4095/7+(t>>17):t>>20===n>>20?511/7+(t>>20):t>>23===n>>23?63/7+(t>>23):t>>26===n>>26?7/7+(t>>26):0}class ds{constructor(e,n,A,s){this.handle=e,this.size=n,this.refs=A,this.progress=s,this.lineStart=[];let r=0;for(const o of A)this.lineStart.push(r),r+=Math.max(0,o.length);this.lineLength=r}probes=[];answers=new Map;probing=new Map;lastWalk=null;walking=new Map;bytesRead=0;first=null;lineStart;lineLength;static async open(e,n,A,s,r){const o=new ds(e,n,A.refs,s);if(o.first=await o.firstRecord(A.recordsFrom),o.first!==null&&A.sortOrder!=="coordinate")for(const i of[.125,.375,.625,.875])r!==void 0&&await r(),await o.probeAt(Math.floor(n*i));return o}get bytes(){return this.bytesRead}get probeCount(){return this.probes.length}async spansFor(e,n,A,s,r){if(this.first===null||A<=n)return[];const o=await this.locate(e,Math.max(0,n-bf),s);if(o===null||o.key>=jt(e,A))return[];if(r!==void 0&&o.block+r<this.size){s!==void 0&&await s();const c=await this.probeAt(dr(o.block+r,o.block));if(c.key<jt(e,A)){const l=c.block;return[{from:o.block,to:Math.min(this.size,l+Et),lastBlock:l,dataFrom:o.within}]}}const i=await this.locate(e,A,s),a=i===null||i.tail===!0?this.size:i.block;return[{from:o.block,to:Math.min(this.size,a+Et),lastBlock:a,dataFrom:o.within}]}locate(e,n,A){if(this.first===null)return Promise.resolve(null);const s=jt(e,n);if(this.first.key>=s)return Promise.resolve(this.first);const r=this.answers.get(s);if(r!==void 0)return r;const o=this.search(e,n,A).then(i=>(i!==null&&i.tail!==!0&&this.remember(i,!0),i));return this.answers.set(s,o),o.catch(()=>this.answers.delete(s)),o}async search(e,n,A){if(this.first===null)return null;const s=jt(e,n);let r=this.first,o=null;for(const c of this.probes)if(c.key<s)r=c;else{o=c;break}let i=!0;for(;;){const c=o===null?this.size:o.block,l=c-r.block;if(l<=kf)break;A!==void 0&&await A();const g=i?this.guess(r,o,e,n):null,f=await this.probeAt(dr(g??Math.floor((r.block+c)/2),r.block));if(f.block>=c)break;f.key>=s?o=f:r=f,i=(o===null?this.size:o.block)-r.block<=l/2}const a=o===null||o.tail===!0?this.size:Math.min(this.size,o.block+Et);return this.walk(r,a,s)}lineOf(e,n){return(this.lineStart[e]??this.lineLength)+Math.max(0,n)}guess(e,n,A,s){const r=this.lineOf(A,s),o=this.lineOf(e.refId,e.pos),i=n===null||n.tail===!0||n.refId<0?this.lineLength:this.lineOf(n.refId,n.pos);if(i<=o)return null;const a=(r-o)/(i-o);if(!(a>0&&a<1))return null;const c=n===null?this.size:n.block,l=e.block+Math.floor(a*(c-e.block));return Math.min(Math.max(l,e.block+1),c-2*Et)}async walk(e,n,A){if(n<=e.block)return null;let s=this.lastWalk;if(s===null||e.block<s.from||n>s.to){const c=`${e.block}-${n}`;let l=this.walking.get(c);if(l===void 0){l=this.read(n-e.block,e.block).then(async f=>{const{bytes:h,blocks:u}=await NA(f,e.block);return{from:e.block,to:n,bytes:h,blocks:u}}),this.walking.set(c,l);const g=()=>{this.walking.delete(c)};l.then(g,g)}s=await l,this.lastWalk=s}const{bytes:r,blocks:o}=s,i=o.find(c=>c.fileAt===e.block);if(i===void 0)return this.lastWalk=null,this.walk(e,n,A);let a=null;return wn(r,i.from+e.within,c=>jt(c.refId,c.pos)<A?!0:(a=kA(o,c.at-4,c.refId,c.pos),!1)),a}probeAt(e){const n=this.probing.get(e);if(n!==void 0)return n;const A=this.probe(e);this.probing.set(e,A);const s=()=>{this.probing.delete(e)};return A.then(s,s),A}async probe(e){let n=yf;for(;;){const A=Math.min(this.size,e+n);if(A<=e)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});const s=await this.read(A-e,e),r=await Lf(s,e,this.refs,this.size);if(r.kind==="record")return this.remember(r.placed);if(r.kind==="end"||A>=this.size)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});if(n>=ur)throw new Error(`no alignment record could be made out within ${ur>>20} MB of byte ${e.toLocaleString("en-US")}`);n*=4}}remember(e,n=!1){let A=this.probes.length;for(;A>0&&this.probes[A-1].block>e.block;)A--;const s=this.probes[A-1];if(s!==void 0&&s.block===e.block&&s.within===e.within)return s;if(n)return this.probes.splice(A,0,e),e;const r=A===0?this.first:this.probes[A-1],o=A<this.probes.length?this.probes[A]:null;if(r!==null&&r.key>e.key)throw new yA(r,e);if(o!==null&&e.key>o.key)throw new yA(e,o);return this.probes.splice(A,0,e),e}async firstRecord(e){let n=Mf;for(;;){const A=await this.read(Math.min(n,this.size),0);let s=0,r=0;for(;s+Nn<=A.length;){const o=ye(A.subarray(s,Math.min(s+64,A.length)));if(o===null||s+o>A.length)break;const i=Di(A,s+o-4);if(e<r+i){const{bytes:a,blocks:c}=await NA(A.subarray(s),s),l=e-r;if(l+me>a.length){if(A.length>=this.size)return null;break}if(!bA(a,l,this.refs))throw new Error("the first alignment record is not where the header says it begins");const g=new DataView(a.buffer,a.byteOffset,a.byteLength);return kA(c,l,g.getInt32(l+4,!0),g.getInt32(l+8,!0))}r+=i,s+=o}if(A.length>=this.size)return null;if(n>=Ff)throw new Error("the header does not end within the first 16 MB");n*=4}}async read(e,n){const A=await this.handle.read(e,n);return this.bytesRead+=A.length,this.progress!==void 0&&this.progress(this.bytesRead),A}}async function NA(t,e){const n=[],A=[];let s=0,r=0,o=!1;for(;r+Nn<=t.length;){const c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const l=await Ot(t.subarray(r,r+c),0);l.length===0&&(o=!0),A.push({fileAt:e+r,from:s,to:s+l.length}),n.push(l),s+=l.length,r+=c}const i=new Uint8Array(s);let a=0;for(const c of n)i.set(c,a),a+=c.length;return{bytes:i,blocks:A,sawEnd:o}}function kA(t,e,n,A){for(const r of t)if(e>=r.from&&e<r.to)return{block:r.fileAt,within:e-r.from,refId:n,pos:A,key:jt(n,A)};const s=t[t.length-1];return{block:s.fileAt,within:e-s.from,refId:n,pos:A,key:jt(n,A)}}function Rf(t,e,n){for(let A=0;A+Nn<=t.length;A++){if(t[A]!==Pt[0]||t[A+1]!==Pt[1]||t[A+2]!==Pt[2]||t[A+3]!==Pt[3])continue;const s=ye(t.subarray(A,Math.min(A+64,t.length)));if(s===null||s>Et||s<Nn+8)continue;const r=A+s;if(r>t.length)return e+r===n?A:"more";if(!(Di(t,r-4)>Et)){if(e+r===n)return A;if(r+3<=t.length){if(t[r]===Pt[0]&&t[r+1]===Pt[1]&&t[r+2]===Pt[2])return A;continue}return"more"}}return"more"}async function Lf(t,e,n,A){const s=Rf(t,e,A);if(s==="more")return e+t.length>=A?{kind:"end"}:{kind:"more"};const{bytes:r,blocks:o,sawEnd:i}=await NA(t.subarray(s),e+s);if(r.length===0)return i||e+t.length>=A?{kind:"end"}:{kind:"more"};const a=xf(r,n);if(a>=0){const c=new DataView(r.buffer,r.byteOffset,r.byteLength);return{kind:"record",placed:kA(o,a,c.getInt32(a+4,!0),c.getInt32(a+8,!0))}}return i||e+t.length>=A?{kind:"end"}:{kind:"more"}}function xf(t,e){const n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let A=0;A+me<=t.length;A++){if(!bA(t,A,e,n))continue;const s=A+4+n.getInt32(A,!0);if(s+me<=t.length){if(bA(t,s,e,n))return A;continue}if(Gf(t,A,n))return A}return-1}function bA(t,e,n,A=new DataView(t.buffer,t.byteOffset,t.byteLength)){if(e+me>t.length)return!1;const s=A.getInt32(e,!0);if(s<32||s>Df)return!1;const r=A.getInt32(e+4,!0);if(r<-1||r>=n.length)return!1;const o=A.getInt32(e+8,!0);if(o<-1||r>=0&&o>n[r].length)return!1;const i=t[e+12];if(i<1)return!1;const a=A.getUint16(e+16,!0),c=A.getInt32(e+20,!0);if(c<0)return!1;const l=A.getInt32(e+24,!0);if(l<-1||l>=n.length||A.getInt32(e+28,!0)<-1||32+i+a*4+(c+1>>1)+c>s)return!1;const g=e+me,f=g+i;if(f>t.length||t[f-1]!==0)return!1;for(let h=g;h<f-1;h++){const u=t[h];if(u<33||u>126)return!1}return!0}function Gf(t,e,n){const A=n.getInt32(e+8,!0);if(A<0||A>=1<<29)return!1;const s=e+me+t[e+12],r=n.getUint16(e+16,!0);if(s+r*4>t.length)return!1;const o=A+Zo(n,s,r);return n.getUint16(e+14,!0)===Sf(A,Math.max(o,A+1))}function dr(t,e){const n=t-t%Nf;return n>e?n:t}function Di(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0}const DA=62,Cr=10;function kn(t){return t.length>0&&t[0]===DA}function Uf(t){const e=new TextDecoder,n=[];t.length>0&&t[0]===DA&&n.push(0);for(let o=1;o<t.length;o++)t[o]===DA&&t[o-1]===Cr&&n.push(o);const A=[],s=new Map;let r=0;for(let o=0;o<n.length;o++){const i=n[o];let a=t.indexOf(Cr,i);a<0&&(a=t.length);const c=vf(e,t,i+1,a),l=Math.min(a+1,t.length),g=o+1<n.length?n[o+1]:t.length;if(c===""||s.has(c))continue;let f=0;for(let I=l;I<g;I++)t[I]>32&&f++;if(f===0)continue;const h=new Uint8Array(f);let u=0;for(let I=l;I<g;I++){const d=t[I];d>32&&(h[u++]=d)}s.set(c,h),A.push({name:c,length:f}),r+=f}return{contigs:A,bases:s,total:r}}function vf(t,e,n,A){let s=n;for(;s<A&&e[s]>32;)s++;return t.decode(e.subarray(n,s)).trim()}const Ne=(()=>{const t=new Uint8Array(256).fill(4),e=(n,A)=>{t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A};return e("A",0),e("C",1),e("G",2),e("T",3),e("U",3),t})(),Tf=25;function Qr(t,e,n,A){const s=Math.max(0,Math.floor(e)),r=Math.min(t.length,Math.ceil(n)),o=Math.max(Tf,Math.round(A)),i=r>s?Math.ceil((r-s)/o):0,a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i);for(let g=0;g<i;g++){const f=s+g*o,h=Math.min(r,f+o);let u=0,I=0;for(let d=f;d<h;d++){const C=Ne[t[d]];C===1||C===2?u++:(C===0||C===3)&&I++}a[g]=f,c[g]=h,l[g]=u+I>0?u/(u+I):Number.NaN}return{starts:a,ends:c,values:l}}const Mi={exclude:Xo,minMapq:0};function Jf(t,e,n,A,s,r,o=Mi,i,a,c){const l=s-A;if(r<=0||l<=0)return{depth:new Float32Array(0),variant:null,total:0,kept:0,max:0};const g=l/r,f=new Float64Array(r),h=new Float64Array(r+1),u=i===void 0?null:new Float64Array(r),I=i===void 0?null:new Float64Array(r+1);let d=0,C=0;wn(t,e,p=>{if(d++,p.refId===n&&(p.flag&o.exclude)===0&&!(p.mapq<o.minMapq)&&!(p.pos<0||p.end<=A||p.pos>=s)){if(C++,Kf(t,p,(w,y)=>{const N=Math.max(w,A),k=Math.min(y,s);k<=N||Br(f,h,(N-A)/g,(k-A)/g,r)}),a!==void 0){let w=null;Of(t,p,(y,N)=>{if(N<=A||y>=s)return;w??=_f(t,p);const k=`${y}:${N}:${w}`;a.set(k,(a.get(k)??0)+1)})}if(c!==void 0)for(const w of jo(t,p)){if(w.pos<A||w.pos>=s)continue;const y=Hl(w.prob,c.threshold);if(y<0)continue;let N=c.tally.get(w.code);N===void 0&&(N={calls:new Float64Array(r),modified:new Float64Array(r)},c.tally.set(w.code,N));const k=Math.min(r-1,Math.floor((w.pos-A)/g));N.calls[k]++,y===1&&N.modified[k]++}i===void 0||u===null||I===null||$f(t,p,i,w=>{w<A||w>=s||Br(u,I,(w-A)/g,(w+1-A)/g,r)},[A,s])}});let E=0,B=0;const Q=new Float32Array(r);for(let p=0;p<r;p++){E+=h[p];const w=E+f[p];Q[p]=w,w>B&&(B=w)}let m=null;if(u!==null&&I!==null){m=new Float32Array(r);let p=0;for(let w=0;w<r;w++)p+=I[w],m[w]=p+u[w]}return{depth:Q,variant:m,total:d,kept:C,max:B}}function $f(t,e,n,A,s=[Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY]){const r=new DataView(t.buffer,t.byteOffset,t.byteLength),o=Pe(t,e),i=o===null?e.cigarOps:o.length,a=f=>o===null?r.getUint32(e.cigarAt+f*4,!0):o[f],c=n.start+n.bases.length;let l=e.pos,g=0;for(let f=0;f<i;f++){const h=a(f),u=h&15,I=h>>>4;if(u===2){const d=Math.max(0,s[0]-l),C=Math.min(I,s[1]-l);for(let E=d;E<C;E++)A(l+E);l+=I;continue}if(mt(u)&&Yt(u)){const d=Math.max(0,n.start-l,s[0]-l),C=Math.min(I,c-l,s[1]-l,e.seqLength-g);for(let E=d;E<C;E++){const B=l+E-n.start,Q=Ne[n.bases[B]];if(Q===4)continue;const m=Yf(t,e.seqAt,g+E);m!==4&&m!==Q&&A(l+E)}l+=I,g+=I;continue}mt(u)&&(l+=I),Yt(u)&&(g+=I)}}function Yf(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[as.charCodeAt(s)]}function Br(t,e,n,A,s){const r=Math.min(s-1,Math.max(0,Math.floor(n))),o=Math.min(s-1,Math.max(0,Math.ceil(A)-1));if(!(o<r)){if(r===o){t[r]+=Math.min(A,r+1)-Math.max(n,r);return}t[r]+=r+1-Math.max(n,r),t[o]+=Math.min(A,o+1)-o,o>r+1&&(e[r+1]+=1,e[o]-=1)}}function Of(t,e,n){const A=Pe(t,e),s=A===null?e.cigarOps:A.length,r=A===null?new DataView(t.buffer,t.byteOffset,t.byteLength):null;let o=e.pos;for(let i=0;i<s;i++){const a=r===null?A[i]:r.getUint32(e.cigarAt+i*4,!0),c=a&15,l=a>>>4;if(c===3){l>0&&n(o,o+l),o+=l;continue}mt(c)&&(o+=l)}}function _f(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=t[A],o=t[A+1],i=String.fromCharCode(t[A+2]);if(A+=3,i==="A"&&(r===88&&o===83||r===116&&o===115)){const a=t[A]===43?1:t[A]===45?-1:0;return r===88?a:(e.flag&At.REVERSE)!==0?-a:a}if(A=is(t,A,i,s),A<0)return 0}return 0}function Kf(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=Pe(t,e),r=s===null?e.cigarOps:s.length,o=l=>s===null?A.getUint32(e.cigarAt+l*4,!0):s[l];let i=e.pos,a=e.pos,c=!1;for(let l=0;l<r;l++){const g=o(l),f=g&15,h=g>>>4;if(f===3){c&&i>a&&n(a,i),c=!1,i+=h,a=i;continue}mt(f)&&(c||(a=i,c=!0),i+=h)}c&&i>a&&n(a,i)}function qf(t,e,n){let A=2166136261;for(let s=e;s<n;s++)A^=t[s],A=Math.imul(A,16777619)>>>0;return A/4294967296}function Hf(t,e,n,A,s,r,o){const i=new DataView(t.buffer,t.byteOffset,t.byteLength),a=o.filter;let c=0;const l=[];wn(t,e,C=>{Er(C,A,s,r,a)&&(c++,l.push(qf(t,C.at+32,C.at+32+C.nameBytes-1)))});const g=Math.max(1,Math.min(o.maxReads,o.maxRows*Wf)),f=c<=g?1:g/c,h=f<1,u=[],I=[];let d=0;return wn(t,e,C=>{!Er(C,A,s,r,a)||l[d++]>=f||I.push(Pf(t,i,C,o,u))}),{pile:nh(I,n,A,s,r,o),total:c,kept:I.length,capped:h,rows:u.length,usedMd:I.some(C=>C.fromMd),usedCigar:I.some(C=>C.fromCigar)}}const Wf=8;function Er(t,e,n,A,s){return t.refId!==e||(t.flag&s.exclude)!==0||t.mapq<s.minMapq?!1:t.pos>=0&&t.end>n&&t.pos<A}function Pf(t,e,n,A,s){const r=Pe(t,n),o=r===null?n.cigarOps:r.length,i=h=>r===null?e.getUint32(n.cigarAt+h*4,!0):r[h],a=[];let c=0,l=0;for(let h=0;h<o;h++){const u=i(h);a.push(u);const I=u&15,d=u>>>4;I===4&&(h===0||h===1&&(i(0)&15)===5?c=d:(h===o-1||h===o-2&&(i(o-1)&15)===5)&&(l=d))}const g=Vf(t,n,a,A.reference),f=Xf(s,n.pos-c,n.end+l);return{refStart:n.pos,refEnd:n.end,clipStart:c,clipEnd:l,row:f,flag:n.flag,mapq:n.mapq,mateContig:n.nextRefId,matePos:n.nextPos,tlen:n.tlen,name:Rl(t,n),ops:a,diffPos:g.pos,diffBase:g.base,fromMd:g.fromMd,fromCigar:g.fromCigar,mods:A.colourBy==="basemod"?jo(t,n,a):null}}const zf=3;function Xf(t,e,n){for(let A=0;A<t.length;A++)if(t[A]+zf<=e)return t[A]=n,A;return t.push(n),t.length-1}function MA(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[as.charCodeAt(s)]}function Vf(t,e,n,A){const s={pos:[],base:[],fromMd:!1,fromCigar:!1};if(n.some(o=>(o&15)===8)){let o=e.pos,i=0;for(const a of n){const c=a&15,l=a>>>4;if(c===8){const g=Math.min(l,e.seqLength-i);for(let f=0;f<g;f++)s.pos.push(o+f),s.base.push(MA(t,e.seqAt,i+f))}mt(c)&&(o+=l),Yt(c)&&(i+=l)}return s.fromCigar=!0,s}const r=Zf(t,e);if(r!==null)return jf(t,e,n,r,s),s.fromMd=!0,s;if(A!==void 0){let o=e.pos,i=0;const a=A.start+A.bases.length;for(const c of n){const l=c&15,g=c>>>4;if(mt(l)&&Yt(l)){const f=Math.max(0,A.start-o),h=Math.min(g,a-o,e.seqLength-i);for(let u=f;u<h;u++){const I=o+u-A.start,d=Ne[A.bases[I]],C=MA(t,e.seqAt,i+u);d!==C&&d<4&&C<4&&(s.pos.push(o+u),s.base.push(C))}}mt(l)&&(o+=g),Yt(l)&&(i+=g)}}return s}function Zf(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=String.fromCharCode(t[A],t[A+1]),o=String.fromCharCode(t[A+2]);if(A+=3,r==="MD"&&o==="Z"){let i=A;for(;i<s&&t[i]!==0;)i++;return new TextDecoder().decode(t.subarray(A,i))}if(A=is(t,A,o,s),A<0)return null}return null}function jf(t,e,n,A,s){const r=[],o=[];let i=e.pos,a=0;for(const l of n){const g=l&15,f=l>>>4;if(mt(g)&&Yt(g)){const h=Math.min(f,e.seqLength-a);for(let u=0;u<h;u++)r.push(i+u),o.push(a+u)}mt(g)&&(i+=f),Yt(g)&&(a+=f)}let c=0;for(const l of A.match(/(\d+|\^[A-Za-z]+|[A-Za-z])/g)??[]){if(l.charCodeAt(0)===94)continue;const g=Number(l);if(Number.isFinite(g)&&l!==""){c+=g;continue}c<r.length&&(s.pos.push(r[c]),s.base.push(MA(t,e.seqAt,o[c]))),c+=1}}const Fi=1e3;function th(t,e,n){switch(e){case"strand":return(t.flag&At.REVERSE)!==0?1:0;case"mapq":return t.mapq===0?0:t.mapq<30?1:2;case"pair":return(t.flag&At.PAIRED)===0?0:(t.flag&At.PROPER_PAIR)!==0?1:2;case"mate":return(t.flag&At.PAIRED)===0?0:(t.flag&At.MATE_UNMAPPED)!==0||t.mateContig<0?1:t.mateContig===n?2:3;case"insert":{const A=Math.abs(t.tlen);return(t.flag&At.PAIRED)===0||A===0?0:A>Fi?2:1}default:return 0}}function eh(t){switch(t){case"strand":return["forward","reverse"];case"mapq":return["MAPQ 0","MAPQ < 30","MAPQ ≥ 30"];case"pair":return["unpaired","proper pair","not a proper pair"];case"mate":return["unpaired","mate unmapped","same sequence","another sequence"];case"insert":return["unpaired","ordinary insert",`insert > ${Fi}`];case"basemod":return["reads"];default:return["reads"]}}function nh(t,e,n,A,s,r){const o=t.length,i={contig:e,start:A,end:s,length:o,refStart:new Int32Array(o),refEnd:new Int32Array(o),clipStart:new Int32Array(o),clipEnd:new Int32Array(o),row:new Int16Array(o),flags:new Uint16Array(o),mapq:new Uint8Array(o),mateContig:new Int32Array(o),matePos:new Int32Array(o),tlen:new Int32Array(o),group:new Uint8Array(o),mate:new Int32Array(o).fill(-1),opAt:new Int32Array(o+1),opCode:new Uint8Array(t.reduce((l,g)=>l+g.ops.length,0)),opLen:new Int32Array(t.reduce((l,g)=>l+g.ops.length,0)),diffAt:new Int32Array(o+1),diffPos:new Int32Array(t.reduce((l,g)=>l+g.diffPos.length,0)),diffBase:new Uint8Array(t.reduce((l,g)=>l+g.diffPos.length,0)),contigs:[],groups:eh(r.colourBy),names:[]};let a=0,c=0;for(let l=0;l<o;l++){const g=t[l];i.refStart[l]=g.refStart,i.refEnd[l]=g.refEnd,i.clipStart[l]=g.clipStart,i.clipEnd[l]=g.clipEnd,i.row[l]=g.row,i.flags[l]=g.flag,i.mapq[l]=g.mapq,i.mateContig[l]=g.mateContig,i.matePos[l]=g.matePos,i.tlen[l]=g.tlen,i.opAt[l]=a;for(const f of g.ops)i.opCode[a]=f&15,i.opLen[a]=f>>>4,a++;i.diffAt[l]=c;for(let f=0;f<g.diffPos.length;f++)i.diffPos[c]=g.diffPos[f],i.diffBase[c]=g.diffBase[f],c++;r.withNames&&i.names.push(g.name)}i.opAt[o]=a,i.diffAt[o]=c,r.colourBy==="basemod"&&(i.mods=Ah(t));for(let l=0;l<o;l++)i.group[l]=th(t[l],r.colourBy,n);return sh(i,n,e,r),rh(i,t),i}function Ah(t){const e=new Map;let n=0;for(const i of t)for(const a of i.mods??[]){const c=e.get(a.code)??[0,0];a.prob>=128&&c[0]++,c[1]++,e.set(a.code,c),n++}const A=[...e.entries()].sort((i,a)=>a[1][0]-i[1][0]||a[1][1]-i[1][1]||(i[0]<a[0]?-1:1)),s=new Map(A.map(([i],a)=>[i,a])),r={at:new Int32Array(t.length+1),pos:new Int32Array(n),code:new Uint8Array(n),prob:new Uint8Array(n),codes:A.map(([i])=>i),counts:A.map(([,[i]])=>i)};let o=0;for(let i=0;i<t.length;i++){r.at[i]=o;for(const a of t[i].mods??[])r.pos[o]=a.pos,r.code[o]=s.get(a.code)??0,r.prob[o]=a.prob,o++}return r.at[t.length]=o,r}function sh(t,e,n,A){const s=new Map;for(let r=0;r<t.length;r++){const o=t.mateContig[r];if(o<0){t.mateContig[r]=-1;continue}let i=s.get(o);i===void 0&&(i=t.contigs.length,t.contigs.push(o===e?n:A.refNameOf?.(o)??""),s.set(o,i)),t.mateContig[r]=i}}function rh(t,e){const n=new Map;for(let A=0;A<e.length;A++){const s=e[A].name;if(s===""||(t.flags[A]&At.SUPPLEMENTARY)!==0)continue;const r=n.get(s);if(r===void 0){n.set(s,A);continue}t.mate[r]===-1&&t.mate[A]===-1&&((t.flags[r]^t.flags[A])&(At.FIRST_IN_PAIR|At.SECOND_IN_PAIR))!==0&&(t.mate[r]=A,t.mate[A]=r)}}function Si(t){const e=t.split(`
|
|
10
|
-
`,200);let n=0;for(const A of e){const s=A.trim();if(s==="")continue;if(/^(fixedStep|variableStep)\b/i.test(s))return"wig";if(/^track\b/i.test(s)){if(/type\s*=\s*"?bedGraph/i.test(s))return"bedgraph";if(/type\s*=\s*"?wiggle_0/i.test(s))return"wig";continue}if(s.startsWith("#")||/^browser\b/i.test(s))continue;const r=s.split(/\t| +/);if(r.length!==4||!
|
|
11
|
-
`)){const o=r.trim();if(o===""||o.startsWith("#")||/^(track|browser)\b/i.test(o))continue;const i=o.split(/\t| +/);if(i.length<4)continue;const a=Number(i[1]),c=Number(i[2]),l=Number(i[3]);if(!Number.isInteger(a)||!Number.isInteger(c)||!Number.isFinite(l)||c<=a)continue;let g=e.get(i[0]);g===void 0&&(g=new
|
|
12
|
-
`)){const h=f.trim();if(h===""||h.startsWith("#")||/^(track|browser)\b/i.test(h))continue;const u=/^(fixedStep|variableStep)\s+(.*)$/i.exec(h);if(u!==null){r=u[1].toLowerCase()==="fixedstep"?"fixed":"variable";const I=new Map;for(const d of u[2].split(/\s+/)){const C=d.indexOf("=");C>0&&I.set(d.slice(0,C).toLowerCase(),d.slice(C+1))}if(o=I.get("chrom")??"",i=Number(I.get("span")??1)||1,a=Number(I.get("step")??1)||1,c=(Number(I.get("start")??1)||1)-1,o===""){l=null;continue}l=e.get(o)??new
|
|
13
|
-
`).join(""),c=i.map(([I])=>I).join(";"),l=[t.method.toUpperCase(),
|
|
14
|
-
`),g=`${s}/${o.region}/${
|
|
15
|
-
`),h=wr(Ge(Ih(o.secretAccessKey,s,o.region),te(f))),u={Authorization:`${pr} Credential=${o.accessKeyId}/${g}, SignedHeaders=${c}, Signature=${h}`,"x-amz-content-sha256":r,"x-amz-date":A};return o.sessionToken!==void 0&&o.sessionToken!==""&&(u["x-amz-security-token"]=o.sessionToken),u}function Ch(t){const e={...t.headers};return t.credential===void 0?e:{...e,...dh({method:(t.method??"GET").toUpperCase(),url:t.url,credential:t.credential})}}function Ti(t,e){const n=e.method??Qh(t);return{...t,headers:{...Bh(t?.headers),...Ch({...e,method:n})}}}function Qh(t){const e=t?.method;return typeof e=="string"&&e!==""?e:"GET"}function Bh(t){if(t===void 0)return{};if(typeof Headers<"u"&&t instanceof Headers){const e={};return t.forEach((n,A)=>{e[A]=n}),e}return Array.isArray(t)?Object.fromEntries(t):{...t}}function Eh(t){const e=[],n=new Set,A=s=>{if(!(s===null||typeof s!="object")){if(ArrayBuffer.isView(s)){const r=s.buffer;r instanceof ArrayBuffer&&!n.has(r)&&(n.add(r),e.push(r));return}if(Array.isArray(s)){if(s.length===0||typeof s[0]!="object")return;for(const r of s)A(r);return}for(const r of Object.values(s))A(r)}};return A(t),e}function Bs(){return typeof MessageChannel>"u"?new Promise(t=>{setTimeout(t,0)}):new Promise(t=>{const e=new MessageChannel;e.port1.onmessage=()=>{e.port1.close(),e.port2.close(),t()},e.port2.postMessage(void 0)})}const mh=200,wh=3e3,ph=3e4,yh=1e3;function Nh(t=mh,e=wh){const n=[];let A=performance.now();const s=setInterval(()=>{const r=performance.now(),o=r-A;for(A=r,o<ph?n.push({at:r,span:o,late:Math.max(0,o-t)}):n.length=0;n.length>0&&r-n[0].at>e;)n.shift()},t);return{busy(){if(n.length<3)return 0;let r=0,o=0;for(const i of n)r+=i.span,o+=i.late;return r<=0?0:Math.min(1,o/r)},reset(){n.length=0,A=performance.now()},stop(){clearInterval(s)}}}function kh(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#")||/^(track|browser)\b/.test(s))continue;const r=s.split(/\s+/);if(r.length<2)return[];const o=Number(r[1]);if(!Number.isInteger(o)||o<=0)return[];n.has(r[0])||(n.add(r[0]),e.push({name:r[0],length:o}))}return e}function bh(t,e=""){const n=/\.fai$/i.test(e);let A=0;for(const s of t.split(/\r?\n/,200)){const r=s.trim();if(r===""||r.startsWith("#")||/^(track|browser)\b/.test(r))continue;const o=r.split(/\s+/);if((n?o.length<2:o.length!==2)||!/^\d+$/.test(o[1])||Number(o[1])<=0)return!1;A++}return A>0}const Dh=4096;function Mh(t,e){const n=Kt(t.contigs,e);return n<0?void 0:t.contigs[n]}function Fh(t,e,n){const A=Mh(t,e.contig);if(A===void 0||A.bins===0)return null;const s=Math.max(0,Math.floor(e.start)),r=Math.min(A.length,Math.ceil(e.end));if(!(r>s))return null;const o=Math.floor(s/t.binsize),i=Math.min(A.bins-1,Math.floor((r-1)/t.binsize));if(i<o)return null;const a=i-o+1,c=n?1:Math.max(1,Math.ceil(a/Dh)),l=Math.ceil(a/c),g=new Int32Array(l),f=new Int32Array(l),h=new Float32Array(l),u=c>1?new Float32Array(l):null,I=c>1?new Float32Array(l):null;let d=0;for(let C=0;C<l;C++){const E=o+C*c,B=Math.min(i+1,E+c);let Q=0,m=0,p=Number.POSITIVE_INFINITY,w=Number.NEGATIVE_INFINITY;for(let y=E;y<B;y++){const N=A.startBin+y-t.firstBin;if(N<0||N>=t.values.length)continue;const k=t.values[N];Number.isNaN(k)||(Q+=k,m++,k<p&&(p=k),k>w&&(w=k))}m!==0&&(g[d]=E*t.binsize,f[d]=Math.min(A.length,B*t.binsize),h[d]=Q/m,u!==null&&I!==null&&(u[d]=p,I[d]=w),d++)}return d===0?null:{contig:e.contig,start:s,end:r,starts:g.slice(0,d),ends:f.slice(0,d),values:h.slice(0,d),min:u===null?null:u.slice(0,d),max:I===null?null:I.slice(0,d),variant:null,summary:c>1}}function Sh(t,e,n,A=!1){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const i of e){const a=Fh(t,i,A);if(a!==null){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push(a)}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}function T(t,e,n){const A=t[e];return typeof A=="number"&&Number.isFinite(A)?A:n}function st(t,e,n){const A=t[e];return typeof A=="string"?A:n}function Lt(t,e,n){const A=t[e];return typeof A=="boolean"?A:n}function Yn(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n!==""?[n]:[]}function On(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n.trim()!==""?[n.trim()]:null}function at(t,e){const n=t[e];return typeof n=="string"&&n!==""?n:null}function ne(t,e,n){return{value:t?.[n],chosen:at(e,n)!==null}}function _n(t,e){return t.value!==void 0?null:t.chosen?e.gone:e.unchosen}function Rh(t){let e=0,n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isNaN(s)||(e+=s,n++)}return n===0?Number.NaN:e/n}function Ji(t){const e=Es(t);return ms(e,.5)}function Lh(t,e){const n=Es(t),A=n.length;if(A===0)return Number.NaN;const s=Number.isFinite(e)?Math.min(.5,Math.max(0,e)):0,r=Math.floor(A*s);if(A-2*r<=0)return ms(n,.5);let o=0;for(let i=r;i<A-r;i++)o+=n[i];return o/(A-2*r)}function Bt(t,e=0,n=t.length-e){if(n<8){let s=0;for(let r=0;r<n;r++)s+=t[e+r];return s}if(n<=128){let s=t[e],r=t[e+1],o=t[e+2],i=t[e+3],a=t[e+4],c=t[e+5],l=t[e+6],g=t[e+7],f=8;for(;f<n-n%8;f+=8){const u=e+f;s+=t[u],r+=t[u+1],o+=t[u+2],i+=t[u+3],a+=t[u+4],c+=t[u+5],l+=t[u+6],g+=t[u+7]}let h=s+r+(o+i)+(a+c+(l+g));for(;f<n;f++)h+=t[e+f];return h}let A=Math.floor(n/2);return A-=A%8,Bt(t,e,A)+Bt(t,e+A,n-A)}function SA(t,e=0,n=t.length-e){return Bt(t,e,n)/n}const bn=3;function $i(t,e){const n=Math.min(t.length,e.length);let A=0,s=0,r=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];Number.isNaN(f)||Number.isNaN(h)||(s+=f,r+=h,A++)}if(A<bn)return Number.NaN;const o=s/A,i=r/A;let a=0,c=0,l=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];if(Number.isNaN(f)||Number.isNaN(h))continue;const u=f-o,I=h-i;a+=u*I,c+=u*u,l+=I*I}return c<=0||l<=0?Number.NaN:a/Math.sqrt(c*l)}function xh(t,e){const n=Math.min(t.length,e.length);let A=0;for(let i=0;i<n;i++)!Number.isNaN(t[i])&&!Number.isNaN(e[i])&&A++;if(A<bn)return Number.NaN;const s=new Float64Array(A),r=new Float64Array(A);let o=0;for(let i=0;i<n;i++){const a=t[i],c=e[i];Number.isNaN(a)||Number.isNaN(c)||(s[o]=a,r[o]=c,o++)}return $i(yr(s),yr(r))}function yr(t){const e=t.length,n=new Float64Array(e),A=[];for(let r=0;r<e;r++)Number.isNaN(t[r])?n[r]=Number.NaN:A.push(r);A.sort((r,o)=>t[r]-t[o]);let s=0;for(;s<A.length;){let r=s+1;for(;r<A.length&&t[A[r]]===t[A[s]];)r++;const o=(s+r+1)/2;for(let i=s;i<r;i++)n[A[i]]=o;s=r}return n}function Yi(t,e){const n=Math.max(1,Math.trunc(e)),A=Es(t);if(A.length===0)return new Float64Array(0);const s=new Float64Array(n+1);for(let r=0;r<=n;r++)s[r]=ms(A,r/n);return s}function Es(t){let e=0;for(let s=0;s<t.length;s++)Number.isNaN(t[s])||e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++){const r=t[s];Number.isNaN(r)||(n[A]=r,A++)}return n.sort(),n}function ms(t,e){const n=t.length;if(n===0)return Number.NaN;if(n===1)return t[0];const A=Math.min(1,Math.max(0,e))*(n-1),s=Math.floor(A),r=Math.min(n-1,s+1),o=A-s;return t[s]+o*(t[r]-t[s])}const Gh=2e5,Uh=50,vh=async t=>{const e=Yn(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig and tick it under Tracks."),[];const n=ne(t.inputs.features,t.params,"features"),A=n.value;if(A===void 0)return t.note(_n(n,{unchosen:"A FRiP needs the features to measure inside, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),[];const s=[];let r=0;for(let B=0;B<A.contigs.length;B++){const Q=A.contigs[B];let m=Number.NaN,p=Number.NaN;const w=()=>{Number.isNaN(m)||(s.push({contig:Q,start:m,end:p}),r+=p-m)};for(let y=A.contigAt[B];y<A.contigAt[B+1];y++){const N=A.start[y],k=A.end[y];k<=N||(Number.isNaN(m)?(m=N,p=k):N<=p?p=Math.max(p,k):(w(),m=N,p=k))}w()}if(s.length===0)return t.note("The feature set covers no bases, so there is nothing to measure inside."),[];const o=t.inputs.contigLengths??{};let i=0;for(const B of Object.values(o))i+=B;i<=0&&t.note("This session knows no sequence lengths, so the fraction of the assembly the set covers cannot be worked out and the enrichment column is left empty. Load a chrom.sizes, or the map itself.");const a=new Float64Array(s.length);for(let B=0;B<s.length;B++)a[B]=s[B].end-s[B].start;const c=Ji(a),l=Math.max(0,Math.round(T(t.params,"resolution",0))),g=l>0?l:Math.max(1,Math.round(c/Uh)),f=i>0?Math.max(1,Math.round(i/Gh)):g,h=[];for(const[B,Q]of Object.entries(o))Q>0&&h.push({contig:B,start:0,end:Q});const u=B=>t.inputs.labels?.[B]??B,I=[],d=[],C=Lt(t.params,"perFeature",!1);for(let B=0;B<e.length;B++){t.throwIfCancelled();const Q=e[B],m=u(Q);t.progress(B,e.length,`${m} · features`);const p=await Nr(t,Q,s,g);t.throwIfCancelled(),t.progress(B+.5,e.length,`${m} · assembly`);const w=h.length>0?await Nr(t,Q,h,f):{signal:Number.NaN},y=w.signal>0?p.signal/w.signal:Number.NaN,N=i>0?r/i:Number.NaN;if(I.push({track:m,frip:y,covered:N,enrichment:N>0?y/N:Number.NaN,signal:p.signal,totalSignal:w.signal,inFeature:p.span>0?p.covered/p.span:Number.NaN}),C){const k=await Th(t,Q,A,g);t.throwIfCancelled();for(const b of k)d.push({track:m,...b,share:w.signal>0?Number(b.signal)/w.signal:Number.NaN})}}t.progress(e.length,e.length,"done"),t.note(`Features read at ${g.toLocaleString()} bp and the assembly at ${f.toLocaleString()} bp — a span-weighted sum estimates the same area at either, and the finer one is spent where the boundaries are.`);const E=[{kind:"table",id:"frip",label:`In ${s.length.toLocaleString()} merged feature${s.length===1?"":"s"}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"frip",label:"FRiP",kind:"number",digits:4,hint:"Signal inside over signal everywhere."},{key:"covered",label:"Genome covered",kind:"number",digits:4,hint:"Merged bases of the set over the assembly."},{key:"enrichment",label:"Enrichment",kind:"number",digits:2,hint:"FRiP over the covered fraction. 1 is a track with no preference."},{key:"signal",label:"Signal inside",kind:"number",digits:0},{key:"totalSignal",label:"Signal total",kind:"number",digits:0},{key:"inFeature",label:"Set with data",kind:"number",digits:3,hint:"Of the set’s bases, how many the track has a value for."}],rows:I.sort((B,Q)=>Number(Q.enrichment)-Number(B.enrichment))}];return C&&d.length>0&&E.push({kind:"table",id:"frip-features",label:"Per feature",columns:[{key:"track",label:"Track",kind:"text"},{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},{key:"signal",label:"Signal",kind:"number",digits:2},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"share",label:"Share of total",kind:"number",digits:6,hint:"This feature’s signal over the track’s whole signal."}],rows:d.sort((B,Q)=>Number(Q.signal)-Number(B.signal))}),E};async function Nr(t,e,n,A){const s=new Map;for(const a of n){const c=s.get(a.contig);c===void 0?s.set(a.contig,[a]):c.push(a)}let r=0,o=0,i=0;for(const[,a]of s){t.throwIfCancelled();for(const g of a)o+=g.end-g.start;const c=await t.sample(e,a,A),l=new Map;for(const g of a)l.set(Dn(g),g);for(const g of c.regions){const f=l.get(Dn(g));if(f!==void 0)for(let h=0;h<g.values.length;h++){const u=g.values[h];if(!Number.isFinite(u))continue;const I=Math.max(f.start,g.starts[h]),d=Math.min(f.end,g.ends[h]);d<=I||(r+=u*(d-I),i+=d-I)}}}return{signal:r,span:o,covered:i}}async function Th(t,e,n,A){const s=[],r=new Map;for(let o=0;o<n.length;o++){const i=n.contigs[n.contig[o]],a=r.get(i);a===void 0?r.set(i,[o]):a.push(o)}for(const[,o]of r){t.throwIfCancelled();const i=o.map(l=>Jh(n,l)),a=await t.sample(e,i,A),c=new Map;for(const l of a.regions)c.set(Dn(l),l);for(let l=0;l<o.length;l++){const g=i[l],f=c.get(Dn(g));if(f===void 0)continue;let h=0,u=0;for(let I=0;I<f.values.length;I++){const d=f.values[I];if(!Number.isFinite(d))continue;const C=Math.max(g.start,f.starts[I]),E=Math.min(g.end,f.ends[I]);E<=C||(h+=d*(E-C),u+=E-C)}s.push({contig:g.contig,start:g.start,end:g.end,name:n.name[o[l]]??"",signal:h,mean:u>0?h/u:Number.NaN})}}return s}function Jh(t,e){return{contig:t.contigs[t.contig[e]],start:t.start[e],end:t.end[e]}}function Dn(t){return`${t.contig}:${t.start}-${t.end}`}function $h(t){return .5*Yh(-t/Math.SQRT2)}function Yh(t){const e=Math.abs(t),n=e<2?1-Oh(e):_h(e);return t>=0?n:2-n}function Oh(t){let e=t,n=t;for(let A=1;A<200&&(e*=2*t*t/(2*A+1),n+=e,!(e<Math.abs(n)*1e-17));A++);return 2/Math.sqrt(Math.PI)*Math.exp(-t*t)*n}function _h(t){let n=1/t,A=1e300,s=n;for(let r=1;r<300;r++){const o=r/2;n=t+o*n,n===0&&(n=1e-300),A=t+o/A,A===0&&(A=1e-300),n=1/n;const i=A*n;if(s*=i,Math.abs(i-1)<1e-16)break}return Math.exp(-t*t)/Math.sqrt(Math.PI)*s}function Kh(t){const e=t.length,n=new Float64Array(e).fill(Number.NaN),A=[];for(let o=0;o<e;o++)Number.isFinite(t[o])&&A.push(o);A.sort((o,i)=>t[i]-t[o]);const s=A.length;let r=Number.POSITIVE_INFINITY;for(let o=0;o<s;o++){const i=s/(s-o);r=Math.min(r,i*t[A[o]]),n[A[o]]=Math.min(1,r)}return n}function Oi(t){return t.rows[1]<=t.rows[0]&&t.cols[1]<=t.cols[0]}function Ae(t){let e=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&(n[A++]=t[s]);return n.sort()}function Te(t,e){const n=t.length;if(n===0)return Number.NaN;const A=Math.min(n-1,Math.max(0,e*(n-1))),s=Math.floor(A),r=Math.min(n-1,s+1);return t[s]+(t[r]-t[s])*(A-s)}function qh(t){const e=Ae(t),n=e.length;if(n===0)return{n:0,mean:Number.NaN,sd:Number.NaN,median:Number.NaN,q1:Number.NaN,q3:Number.NaN};let A=0;for(let o=0;o<n;o++)A+=e[o];const s=A/n;let r=0;for(let o=0;o<n;o++)r+=(e[o]-s)**2;return{n,mean:s,sd:n>1?Math.sqrt(r/(n-1)):Number.NaN,median:Te(e,.5),q1:Te(e,.25),q3:Te(e,.75)}}function _i(t){const e=t.length,n=Array.from({length:e},(o,i)=>i).sort((o,i)=>t[o]-t[i]),A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o+1<e&&t[n[o+1]]===t[n[r]];)o++;const i=(r+o)/2+1;for(let c=r;c<=o;c++)A[n[c]]=i;const a=o-r+1;a>1&&(s+=a*a*a-a),r=o+1}return{ranks:A,ties:s}}function Hh(t,e){const n=Ae(t),A=Ae(e),s=n.length,r=A.length;if(s===0||r===0)return{u:Number.NaN,z:Number.NaN,p:Number.NaN,effect:Number.NaN};const o=new Float64Array(s+r);o.set(n,0),o.set(A,s);const{ranks:i,ties:a}=_i(o);let c=0;for(let C=0;C<s;C++)c+=i[C];const l=c-s*(s+1)/2,g=s+r,f=s*r/2,h=s*r/12*(g+1-a/(g*(g-1))),u=2*l/(s*r)-1;if(!(h>0))return{u:l,z:0,p:1,effect:u};const I=l-f,d=(I-.5*Math.sign(I))/Math.sqrt(h);return{u:l,z:d,p:Math.min(1,2*$h(-Math.abs(d))),effect:u}}function Wh(t){const e=t.map(Ae).filter(g=>g.length>0),n=e.length,A=e.reduce((g,f)=>g+f.length,0);if(n<2||A<2)return{h:Number.NaN,df:Math.max(0,n-1),p:Number.NaN};const s=new Float64Array(A);let r=0;for(const g of e)s.set(g,r),r+=g.length;const{ranks:o,ties:i}=_i(s);let a=0;r=0;for(const g of e){let f=0;for(let h=0;h<g.length;h++)f+=o[r+h];a+=f*f/g.length,r+=g.length}a=12/(A*(A+1))*a-3*(A+1);const c=1-i/(A*A*A-A);if(!(c>0))return{h:Number.NaN,df:n-1,p:Number.NaN};const l=a/c;return{h:l,df:n-1,p:Ph(l,n-1)}}function Ph(t,e){return!(e>0)||Number.isNaN(t)?Number.NaN:t<=0?1:zh(e/2,t/2)}function zh(t,e){const n=Math.exp(-e+t*Math.log(e)-Ki(t));if(e<t+1){let a=1/t,c=a;for(let l=1;l<1e3&&(a*=e/(t+l),c+=a,!(Math.abs(a)<Math.abs(c)*1e-16));l++);return Math.max(0,1-c*n)}const A=1e-300;let s=e+1-t,r=1/A,o=1/s,i=o;for(let a=1;a<1e3;a++){const c=-a*(a-t);s+=2,o=c*o+s,Math.abs(o)<A&&(o=A),r=s+c/r,Math.abs(r)<A&&(r=A),o=1/o;const l=o*r;if(i*=l,Math.abs(l-1)<1e-16)break}return Math.min(1,n*i)}function Ki(t){if(t<.5)return Math.log(Math.PI/Math.sin(Math.PI*t))-Ki(1-t);const e=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,15056327351493116e-23],n=t-1;let A=e[0];const s=n+7.5;for(let r=1;r<9;r++)A+=e[r]/(n+r);return .5*Math.log(2*Math.PI)+(n+.5)*Math.log(s)-s+Math.log(A)}const Xh=1e4,Mn=["#0072b2","#d55e00","#009e73","#cc79a7","#e69f00","#56b4e9","#f0e442","#000000"],Vh="#999999",kr="rest of the genome",ue=2e4,Zh=async t=>{const e=Yn(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig, or run a task that makes one, and tick it under Tracks."),[];const n=[];for(const[u,I]of Object.entries(t.inputs.contigLengths??{}))I>0&&n.push({name:u,length:I});if(n.length===0)return t.note("This session knows no sequence lengths, so there is no genome to cut into stretches. Load a chrom.sizes, or the map itself."),[];const A=T(t.params,"resolution",0),s=A>0?Math.round(A):t.framing.binsize>0&&!Oi(t.framing)?t.framing.binsize:Xh;let r=st(t.params,"groupBy","features")==="track"?await tu(t,n,s):jh(t,n,s);if(r===null)return[];if(r=eu(r,t),r.stretches.length===0)return t.note("No stretch of the genome fell in any group, so there is nothing to compare."),[];const o=u=>t.inputs.labels?.[u]??u,i=r.names.length,a=[],c=[],l=[];for(let u=0;u<e.length;u++){t.throwIfCancelled();const I=o(e[u]);t.progress(u,e.length,I);const d=await ws(t,e[u],r.stretches),C=r.names.map(()=>[]);for(let m=0;m<r.stretches.length;m++)Number.isFinite(d[m])&&C[r.stretches[m].group].push(d[m]);if(C.every(m=>m.length===0)){t.note(`${I} has no value over any stretch — its sequence names may not be the assembly's.`);continue}let E=0,B=0;for(const m of C){for(const p of m)B+=p;E+=m.length}for(let m=0;m<i;m++){const p=qh(C[m]),w=E-p.n,y=w>0?(B-p.mean*p.n)/w:Number.NaN;let N=0;for(const k of r.stretches)k.group===m&&(N+=k.end-k.start);a.push({track:I,group:r.names[m],n:p.n,bases:N,mean:p.mean,sd:p.sd,median:p.median,q1:p.q1,q3:p.q3,vsRest:p.n>0?p.mean-y:Number.NaN})}const Q=C.map((m,p)=>({group:m,g:p})).filter(m=>m.group.length>0);if(Q.length>2){const m=Wh(Q.map(p=>p.group));c.push({track:I,test:"Kruskal–Wallis H",a:`all ${Q.length} groups`,b:"",statistic:m.h,effect:Number.NaN,difference:Number.NaN,p:m.p})}for(let m=0;m<Q.length;m++)for(let p=m+1;p<Q.length;p++){const w=Q[m],y=Q[p],N=Hh(w.group,y.group);c.push({track:I,test:"Mann–Whitney U",a:r.names[w.g],b:r.names[y.g],statistic:N.u,effect:N.effect,difference:Te(Ae(w.group),.5)-Te(Ae(y.group),.5),p:N.p})}l.push({kind:"curve",id:`groupsignal-${u+1}`,label:`${I} by ${r.of}`,series:C.map((m,p)=>{const w=ou(m);return{name:r.names[p],x:Float64Array.from(w,(y,N)=>N),y:w,colour:r.colours[p],n:m.length,mark:"violin"}}),xLabel:r.of,yLabel:I,xScale:"linear",yScale:"linear"})}if(t.progress(e.length,e.length,"done"),l.length===0)return[];const g=Kh(c.map(u=>Number(u.p)));c.forEach((u,I)=>{u.q=g[I]});const f=l.some(u=>u.series.some(I=>(I.n??0)>ue));t.note(`Compared over ${r.stretches.length.toLocaleString()} stretches of at most ${s.toLocaleString()} bp in ${i} groups, each the track's mean over the bases it has a value for.${f?` A violin of more than ${ue.toLocaleString()} is drawn from that many, evenly by rank; the tests use every one.`:""}`);const h=[...l];if(h.push({kind:"table",id:"groupsignal-groups",label:`Groups · ${r.of}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"group",label:"Group",kind:"text"},{key:"n",label:"Stretches",kind:"number"},{key:"bases",label:"Bases",kind:"number"},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"sd",label:"SD",kind:"number",digits:4},{key:"median",label:"Median",kind:"number",digits:4},{key:"q1",label:"Q1",kind:"number",digits:4},{key:"q3",label:"Q3",kind:"number",digits:4},{key:"vsRest",label:"Mean − rest",kind:"number",digits:4,hint:"This group’s mean less that of every other stretch."}],rows:a}),h.push({kind:"table",id:"groupsignal-tests",label:"Between groups",columns:[{key:"track",label:"Track",kind:"text"},{key:"test",label:"Test",kind:"text"},{key:"a",label:"Group",kind:"text"},{key:"b",label:"Against",kind:"text"},{key:"difference",label:"Median difference",kind:"number",digits:4},{key:"effect",label:"Effect",kind:"number",digits:3,hint:"Rank-biserial r: +1 where every value of the group is above every value against it."},{key:"statistic",label:"U or H",kind:"number",digits:2},{key:"p",label:"P",kind:"number",digits:4,scientific:!0},{key:"q",label:"q",kind:"number",digits:4,scientific:!0,hint:"Benjamini–Hochberg, over every test of the run."}],rows:c}),r.segments!==void 0&&h.push({kind:"intervals",id:"groupsignal-segments",label:`Groups · ${r.of}`,payload:{kind:"features",data:r.segments},noun:{one:"segment",many:"segments"},display:"lane",look:"corner"}),st(t.params,"groupBy","features")!=="track"&&Lt(t.params,"perFeature",!1)){const u=await ru(t,e,o);u!==null&&h.push(u)}return h};function jh(t,e,n){const A=ne(t.inputs.features,t.params,"features"),s={chosen:A.chosen,value:A.chosen?A.value:void 0},r=s.value;if(r===void 0)return t.note(_n(s,{unchosen:"No feature set was chosen to make the groups from.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),null;const o=st(t.params,"split","name"),i=t.inputs.labels?.[at(t.params,"features")??""]??"the set",a=new Array(r.length).fill(null);let c;if(o==="score"){const Q=qi(t),m=Yi(r.score,Q);if(m.length===0)return t.note(`${i} carries no scores, so it cannot be cut into quantiles of them.`),null;c=Array.from({length:Q},(p,w)=>Hi(w,m));for(let p=0;p<r.length;p++){const w=Wi(r.score[p],m);w>=0&&(a[p]=c[w])}}else if(o==="strand"){c=["+ strand","− strand","no strand"];for(let Q=0;Q<r.length;Q++)a[Q]=r.strand[Q]>0?c[0]:r.strand[Q]<0?c[1]:c[2]}else if(o==="none")c=[i],a.fill(i);else{for(let Q=0;Q<r.length;Q++)a[Q]=r.name[Q]===""?"(no name)":r.name[Q];c=[...new Set(a.filter(Q=>Q!==null))].sort((Q,m)=>Q.localeCompare(m,void 0,{numeric:!0}))}const l=c.filter(Q=>a.includes(Q)),g=Lt(t.params,"outside",!0),f=g?[...l,kr]:l,h=new Map(f.map((Q,m)=>[Q,m])),u=Q=>e.find(m=>m.name===Q)?.length??t.lengthOf(Q),I=new Map,d=new Set;for(let Q=0;Q<r.contigs.length;Q++){const m=r.contigs[Q],p=u(m);if(p===void 0){r.contigAt[Q+1]>r.contigAt[Q]&&d.add(m);continue}const w=f.map(()=>[]);for(let y=r.contigAt[Q];y<r.contigAt[Q+1];y++){const N=a[y];if(N===null)continue;const k=Math.max(0,r.start[y]),b=Math.min(p,r.end[y]);b>k&&w[h.get(N)??0].push([k,b])}I.set(m,w.map(br))}d.size>0&&t.note(`${[...d].slice(0,6).join(", ")}${d.size>6?", …":""} ${d.size===1?"is":"are"} not a sequence of this assembly, so ${d.size===1?"its":"their"} features were left out.`);const C=[],E=new Map;for(const[Q,m]of I)m.forEach((p,w)=>{for(const[y,N]of p)for(const[k,b]of oA(y,N,n))C.push({contig:Q,start:k,end:b,group:w})}),E.set(Q,br(m.flat()));if(g){const Q=f.length-1;for(const{name:m,length:p}of e){let w=0;for(const[y,N]of E.get(m)??[]){for(const[k,b]of oA(w,y,n))C.push({contig:m,start:k,end:b,group:Q});w=Math.max(w,N)}for(const[y,N]of oA(w,p,n))C.push({contig:m,start:y,end:N,group:Q})}}const B=o==="score"?"score":o==="strand"?"strand":o==="none"?"":"name";return{names:f,colours:f.map((Q,m)=>Q===kr?Vh:Mn[m%Mn.length]),stretches:C,of:B===""?i:`${i}, by ${B}`}}async function tu(t,e,n){const A=at(t.params,"groupTrack");if(A===null)return t.note("No track was chosen to group the bins by."),null;const s=t.inputs.labels?.[A]??A,r=[];for(const h of e)for(let u=0;u<h.length;u+=n)r.push({contig:h.name,start:u,end:Math.min(h.length,u+n),group:-1});const o=await ws(t,A,r),i=st(t.params,"cut","sign")==="quantiles"?"quantiles":"sign";let a;if(i==="sign"){a=["above 0","below 0"];for(let h=0;h<r.length;h++)r[h].group=o[h]>0?0:o[h]<0?1:-1}else{const h=qi(t),u=Yi(o,h);if(u.length===0)return t.note(`${s} has no value over any bin, so there is nothing to cut into quantiles.`),null;a=Array.from({length:h},(I,d)=>Hi(d,u));for(let I=0;I<r.length;I++)r[I].group=Wi(o[I],u)}const c=r.filter(h=>h.group>=0);c.length<r.length&&t.note(`${(r.length-c.length).toLocaleString()} of ${r.length.toLocaleString()} bins had no reading of ${s}${i==="sign"?", or read exactly 0,":""} and are in no group.`);const l=new et;let g=null;const f=()=>{g!==null&&l.add(g.contig,g.start,g.end,{name:a[g.group]}),g=null};for(const h of c){if(g!==null&&g.contig===h.contig&&g.group===h.group&&g.end===h.start){g.end=h.end;continue}f(),g={...h}}return f(),{names:a,colours:a.map((h,u)=>Mn[u%Mn.length]),stretches:c,of:`${s}, ${i==="sign"?"by sign":"in quantiles"}`,segments:l.finish()}}function eu(t,e){const n=new Array(t.names.length).fill(0);for(const o of t.stretches)n[o.group]++;if(n.every(o=>o>0))return t;const A=t.names.filter((o,i)=>n[i]===0);e.note(`${A.join(", ")} had no stretch in ${A.length===1?"it":"them"}, and ${A.length===1?"is":"are"} left out.`);const s=t.names.map((o,i)=>i).filter(o=>n[o]>0),r=new Map(s.map((o,i)=>[o,i]));return{...t,names:s.map(o=>t.names[o]),colours:s.map(o=>t.colours[o]),stretches:t.stretches.map(o=>({...o,group:r.get(o.group)??0}))}}function qi(t){return Math.max(2,Math.min(10,Math.round(T(t.params,"quantiles",4))))}function Hi(t,e){const n=A=>Math.abs(A)>=100?A.toFixed(0):A.toPrecision(3);return`Q${t+1} (${n(e[t])} to ${n(e[t+1])})`}function Wi(t,e){if(!Number.isFinite(t)||e.length<2)return-1;const n=e.length-1;if(t<e[0]||t>e[n])return-1;for(let A=0;A<n;A++)if(t<e[A+1])return A;return n-1}function br(t){const e=[...t].sort((A,s)=>A[0]-s[0]),n=[];for(const[A,s]of e){const r=n[n.length-1];r!==void 0&&A<=r[1]?r[1]=Math.max(r[1],s):n.push([A,s])}return n}function oA(t,e,n){if(!(e>t))return[];if(e-t<=n)return[[t,e]];const A=[];let s=t;for(;s<e;){const o=Math.min(e,(Math.floor(s/n)+1)*n);A.push([s,o]),s=o}A.length>1&&A[0][1]-A[0][0]<n/2&&(A[1][0]=A[0][0],A.shift());const r=A.length-1;return r>0&&A[r][1]-A[r][0]<n/2&&(A[r-1][1]=A[r][1],A.pop()),A}const nu=1<<20,Au=4096;async function ws(t,e,n){const A=new Float64Array(n.length).fill(Number.NaN),s=new Map;n.forEach((r,o)=>{const i=s.get(r.contig);i===void 0?s.set(r.contig,[o]):i.push(o)});for(const[r,o]of s){const i=new Map;for(const l of o){const{start:g,end:f}=n[l];i.set(`${g}-${f}`,{contig:r,start:g,end:f})}const a=[...i.values()].sort((l,g)=>l.start-g.start||l.end-g.end),c=new Map;for(let l=0;l<a.length;){t.throwIfCancelled();let g=l+1,f=a[l].end-a[l].start;for(;g<a.length&&g-l<Au&&(f+=a[g].end-a[g].start,!(f>nu));)g++;const h=await t.sample(e,a.slice(l,g),1);for(const u of h.regions)c.set(`${u.start}-${u.end}`,su(u,u.start,u.end));l=g}for(const l of o){const g=c.get(`${n[l].start}-${n[l].end}`);g!==void 0&&(A[l]=g)}}return A}function su(t,e,n){let A=0,s=0;for(let r=0;r<t.values.length;r++){const o=t.values[r];if(!Number.isFinite(o))continue;const i=Math.max(e,t.starts[r]),a=Math.min(n,t.ends[r]);a<=i||(A+=o*(a-i),s+=a-i)}return s>0?A/s:Number.NaN}async function ru(t,e,n){const A=ne(t.inputs.features,t.params,"features").value;if(A===void 0)return null;const s=[];for(let i=0;i<A.length;i++)s.push({contig:A.contigs[A.contig[i]],start:A.start[i],end:A.end[i],group:i});const r=e.map((i,a)=>`track${a+1}`),o=s.map(i=>({contig:i.contig,start:i.start,end:i.end,name:A.name[i.group]??""}));for(let i=0;i<e.length;i++)(await ws(t,e[i],s)).forEach((c,l)=>{o[l][r[i]]=c});return{kind:"table",id:"groupsignal-features",label:"Per feature",columns:[{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},...e.map((i,a)=>({key:r[a],label:n(i),kind:"number",digits:4}))],rows:o}}function ou(t){const e=Ae(t);if(e.length<=ue)return e;const n=new Float64Array(ue);for(let A=0;A<ue;A++)n[A]=e[Math.round(A*(e.length-1)/(ue-1))];return n}function iu(t,e){const n=Math.max(1,Math.round(e.flank/e.step)),A=n*2,s={slots:A,bodyFrom:n,bodyTo:n,flankStep:e.step},r=[];for(const o of t){const i=e.at==="start"?o.strand<0?o.end:o.start:e.at==="end"?o.strand<0?o.start:o.end:o.start+Math.floor((o.end-o.start)/2),a=e.lengthOf(o.contig),c={from:i-n*e.step,to:i+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l))continue;const f=Math.floor((l-c.from)/e.step),h=Math.floor((c.to-g)/e.step),u=o.strand<0?h:f,I=A-(o.strand<0?f:h);if(!(I>u))continue;const d={start:c.from+f*e.step,end:c.to-h*e.step};r.push({contig:o.contig,start:l,end:g,strand:o.strand,slotFrom:u,slotTo:I,...d.start===l&&d.end===g?{}:{span:d}})}return{windows:r,layout:s}}function au(t,e){const n=Math.max(0,Math.round(e.flank/e.step)),A=e.body+n*2,s={slots:A,bodyFrom:n,bodyTo:n+e.body,flankStep:e.step},r=[];let o=0;for(const i of t){if(i.end-i.start<e.body){o++;continue}const a=e.lengthOf(i.contig),c={from:i.start-n*e.step,to:i.end+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l)){o++;continue}const f=Math.round((l-c.from)/e.step),h=Math.round((c.to-g)/e.step),u=i.strand<0?h:f,I=A-(i.strand<0?f:h);if(!(I>u)){o++;continue}const d=Math.min(Math.max(i.start,l),g),C=Math.min(Math.max(i.end,d),g),E=Math.min(Math.max(s.bodyFrom,u),I),B=Math.min(Math.max(s.bodyTo,E),I);r.push({contig:i.contig,start:l,end:g,strand:i.strand,slotFrom:u,slotTo:I,body:{start:d,end:C,slotFrom:E,slotTo:B}})}return{windows:r,layout:s,dropped:o}}function cu(t,e,n){const A=new Float64Array(n).fill(Number.NaN),s=e.slotTo-e.slotFrom;if(s<=0||e.end-e.start<=0)return A;const o=new Float64Array(s),i=new Float64Array(s),a=lu(s),{values:c,starts:l,ends:g}=t,f=e.span?.start??e.start,h=e.span?.end??e.end,u=e.strand<0,I=e.body===void 0;for(let d=0;d<c.length;d++){const C=c[d];if(!Number.isFinite(C))continue;const E=Math.max(f,l[d]),B=Math.min(h,g[d]);if(!(B>E))continue;let Q,m;if(I){const y=(E-f)/(h-f),N=(B-f)/(h-f);Q=u?1-N:y,m=u?1-y:N}else{const y=Mr(e,E),N=Mr(e,B);Q=u?N:y,m=u?y:N}const p=Math.max(0,Math.floor(Q*s)),w=Math.min(s-1,Math.ceil(m*s)-1);for(let y=p;y<=w;y++){const N=Math.min(m,a[y+1])-Math.max(Q,a[y]);N>0&&(o[y]+=C*N,i[y]+=N)}}for(let d=0;d<s;d++)i[d]>0&&(A[e.slotFrom+d]=o[d]/i[d]);return A}const Dr=new Map;function lu(t){let e=Dr.get(t);if(e===void 0){e=new Float64Array(t+1);for(let n=0;n<=t;n++)e[n]=n/t;Dr.set(t,e)}return e}function Mr(t,e){const n=t.body;if(n===void 0){const c=t.span?.start??t.start,l=t.span?.end??t.end,g=(e-c)/(l-c);return t.strand<0?1-g:g}const A=t.strand<0,s=A?t.end:t.start,r=A?n.end:n.start,o=A?n.start:n.end,i=A?t.start:t.end;return(t.slotFrom+iA(e,s,r)*(n.slotFrom-t.slotFrom)+iA(e,r,o)*(n.slotTo-n.slotFrom)+iA(e,o,i)*(t.slotTo-n.slotTo)-t.slotFrom)/(t.slotTo-t.slotFrom)}function iA(t,e,n){if(e===n)return 1;const A=(t-e)/(n-e);return A<0?0:A>1?1:A}function gu(t,e,n,A){const s=new Float64Array(n).fill(Number.NaN),r=new Float64Array(n).fill(Number.NaN),o=new Float64Array(n).fill(Number.NaN);if(e===0)return{mean:s,low:r,high:o,n:0};const i=new Float64Array(e),a=[i],c=g=>A.average==="median"?Ji(g):A.average==="trimmed"?Lh(g,A.trim):Rh(g);for(let g=0;g<n;g++){for(let f=0;f<e;f++)i[f]=t[f*n+g];if(s[g]=c(i),A.band==="sd"){const f=Pi(a,s[g]);Number.isFinite(f)&&(r[g]=s[g]-f,o[g]=s[g]+f)}}if(A.band==="bootstrap"&&e>1){const g=new Float64Array(A.iterations*n),f=new Int32Array(e),h=new Float64Array(e);for(let d=0;d<A.iterations;d++){for(let C=0;C<e;C++)f[C]=Math.floor(A.rng()*e)%e;for(let C=0;C<n;C++){for(let E=0;E<e;E++)h[E]=t[f[E]*n+C];g[d*n+C]=c(h)}}const u=(1-A.level)/2,I=new Float64Array(A.iterations);for(let d=0;d<n;d++){for(let E=0;E<A.iterations;E++)I[E]=g[E*n+d];const C=Array.from(I).filter(Number.isFinite).sort((E,B)=>E-B);C.length!==0&&(r[d]=C[Math.floor(u*(C.length-1))],o[d]=C[Math.ceil((1-u)*(C.length-1))])}}let l=0;for(let g=0;g<e;g++)for(let f=0;f<n;f++)if(Number.isFinite(t[g*n+f])){l++;break}return{mean:s,low:r,high:o,n:l}}function fu(t){const e=hu(t),n=Pi(t,e);if(!Number.isFinite(e))return{mean:e,sd:n,scaled:!1};const A=Number.isFinite(n)&&n>0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(s[r]=A?(o-e)/n:o-e)}return{mean:e,sd:n,scaled:A}}function hu(t){let e=0,n=0;for(const A of t)for(let s=0;s<A.length;s++){const r=A[s];Number.isFinite(r)&&(e+=r,n++)}return n===0?Number.NaN:e/n}function Pi(t,e){if(!Number.isFinite(e))return Number.NaN;let n=0,A=0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(n+=(o-e)**2,A++)}return A>1?Math.sqrt(n/(A-1)):Number.NaN}function RA(t){const e=new Float64Array(t.slots),n=t.bodyTo>t.bodyFrom;for(let A=0;A<t.slots;A++)e[A]=n?A:(A-t.bodyFrom+.5)*t.flankStep;return{x:e,label:n?"Position (upstream · body · downstream)":"Distance from the anchor (bp)"}}function zi(t){let e=(Number.isFinite(t)?Math.trunc(t):0)>>>0;return function(){e=e+1831565813>>>0;let A=e;return A=Math.imul(A^A>>>15,A|1),A^=A+Math.imul(A^A>>>7,A|61),((A^A>>>14)>>>0)/4294967296}}function uu(t,e,n){const A=[];for(let s=0;s<t.length;s++)A.push({contig:t.contigs[t.contig[s]],start:t.start[s],end:t.end[s],strand:n?t.strand[s]:1,rank:e===null?0:Iu(t,s,e)});return A}function Iu(t,e,n){if(n==="score")return t.score[e];for(const A of t.detail[e].split(ct)){const s=A.search(/[=:]/);if(s<0||A.slice(0,s).trim()!==n)continue;const r=Number.parseFloat(A.slice(s+1).trim());return Number.isFinite(r)?r:Number.NaN}return Number.NaN}function du(t,e){if(e.rankBy===null||e.subset==="all")return[{name:"all",features:t}];const n=[...t].sort((r,o)=>Number.isNaN(r.rank)?Number.isNaN(o.rank)?0:1:Number.isNaN(o.rank)?-1:o.rank-r.rank);if(e.subset==="top")return[{name:`top ${e.count}`,features:n.slice(0,e.count)}];if(e.subset==="bottom")return[{name:`bottom ${e.count}`,features:n.slice(-e.count)}];const A=[],s=Math.ceil(n.length/e.groups);for(let r=0;r<e.groups;r++){const o=n.slice(r*s,(r+1)*s);o.length!==0&&A.push({name:`group ${r+1}`,features:o})}return A}const Cu=async t=>{const e=Yn(t.params,"tracks"),n=ne(t.inputs.features,t.params,"features"),A=n.value;if(e.length===0||A===void 0){const b=_n(n,{unchosen:"No feature set was chosen. Load a BED or a GTF and pick it under Features.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."});return t.note(e.length===0&&b!==null?"A metaplot needs a track to read and a set of positions to read it at, and neither is in hand.":e.length===0?"No track was chosen. Load a bigWig and tick it under Tracks.":b??""),[]}const s=Lt(t.params,"stranded",!0),r=at(t.params,"rankBy"),o=uu(A,r,s),i=du(o,{rankBy:r,subset:st(t.params,"subset","all"),count:Math.max(1,Math.round(T(t.params,"count",500))),groups:Math.max(2,Math.round(T(t.params,"groups",4)))}),a=Lt(t.params,"zscore",!1),c=Math.max(1,Math.round(T(t.params,"step",50))),l=Math.max(0,Math.round(T(t.params,"flank",2e3))),g=st(t.params,"mode","reference")==="scaled",f=Math.max(10,Math.round(T(t.params,"body",100))),h=b=>t.lengthOf(b)??Number.MAX_SAFE_INTEGER,u=i.map(b=>g?au(b.features,{body:f,flank:l,step:c,lengthOf:h}):{...iu(b.features,{at:st(t.params,"at","start"),flank:l,step:c,lengthOf:h}),dropped:0}),I=u.reduce((b,D)=>b+D.dropped,0),d=[],C=[],E=u.length===0?null:u[0].layout,B=Lt(t.params,"heatmap",!0),Q=[],m=u.map(b=>({total:new Float64Array(b.windows.length),seen:new Float64Array(b.windows.length)})),p=e.length*i.length;let w=0;for(const b of e){const D=[];for(const[F,R]of i.entries()){t.throwIfCancelled(),t.progress(w,p,`${t.inputs.labels?.[b]??b} · ${R.name}`),w++;const v=u[F];v.windows.length!==0&&D.push({group:F,rows:await Eu(t,b,v.windows,v.layout),count:v.windows.length,layout:v.layout})}a&&fu(D.map(F=>F.rows));for(const F of D){const R=gu(F.rows,F.count,F.layout.slots,{average:st(t.params,"average","mean"),trim:.1,band:st(t.params,"band","bootstrap"),iterations:Math.max(20,Math.round(T(t.params,"iterations",200))),level:.95,rng:zi(Math.round(T(t.params,"seed",1)))}),v=t.inputs.labels?.[b]??b,x=i.length===1?v:`${v} · ${i[F.group].name}`;d.push({name:x,x:RA(F.layout).x,y:R.mean,low:R.low,high:R.high,n:R.n}),B&&(pu(m[F.group],F.rows,F.count,F.layout.slots),Q.push({group:F.group,rows:Float32Array.from(F.rows),count:F.count,name:x}))}}if(t.progress(p,p,"done"),E===null||d.length===0)return t.note("No feature produced a usable window. Check that the track and the set share an assembly."),[];I>0&&t.note(`${I.toLocaleString()} features were dropped: shorter than the body width, or with no window left after clipping to the sequence.`);const y=RA(E);C.push({kind:"curve",id:"metaplot",label:"Metaplot",series:d,xLabel:y.label,yLabel:a?"Signal (z-score, per track)":"Mean signal",xScale:"linear",yScale:"linear"});const N=Q.length===0?[]:m.map(yu),k={zscore:a,tracks:e.length};return Q.forEach((b,D)=>{C.push(Nu(b,N[b.group],D,E,y.label,k))}),C},Qu=1<<20,Bu=4096;async function Eu(t,e,n,A){const s=new Float64Array(n.length*A.slots).fill(Number.NaN),r=new Map;for(let o=0;o<n.length;o++){const i=r.get(n[o].contig);i===void 0?r.set(n[o].contig,[o]):i.push(o)}for(const[o,i]of r){const a=new Map;for(const g of i){const f=`${n[g].start}-${n[g].end}`,h=a.get(f);h===void 0?a.set(f,[g]):h.push(g)}const c=[...a.keys()].map(g=>{const[f,h]=g.split("-").map(Number);return{contig:o,start:f,end:h}}).sort((g,f)=>g.start-f.start||g.end-f.end),l=new Map;for(let g=0;g<c.length;){t.throwIfCancelled();let f=g+1,h=c[g].end-c[g].start;for(;f<c.length&&f-g<Bu&&(h+=c[f].end-c[f].start,!(h>Qu));)f++;const u=await t.sample(e,c.slice(g,f),1);g=f;for(const I of u.regions)for(const d of a.get(`${I.start}-${I.end}`)??[]){const C=n[d],{body:E,span:B}=C,Q=`${C.start}-${C.end}:${C.strand}:${C.slotFrom}-${C.slotTo}`+(B===void 0?"":`:${B.start}-${B.end}`)+(E===void 0?"":`:${E.start}-${E.end}:${E.slotFrom}-${E.slotTo}`),m=l.get(Q);if(m!==void 0){s.copyWithin(d*A.slots,m*A.slots,(m+1)*A.slots);continue}l.set(Q,d),s.set(cu(I,C,A.slots),d*A.slots)}}}return s}function mu(t){const e=Math.max(1,Math.floor(t.length/1e5)),n=[];for(let i=0;i<t.length;i+=e){const a=t[i];Number.isFinite(a)&&n.push(a)}if(n.length===0)return null;n.sort((i,a)=>i-a);const A=i=>n[Math.min(n.length-1,Math.floor(i*(n.length-1)))],s=A(.99),r=n[0]>=0?0:-Math.max(Math.abs(A(.01)),Math.abs(s)),o=n[0]>=0?s:Math.max(Math.abs(A(.01)),Math.abs(s));return o>r?[r,o]:null}function wu(t){const{x:e}=RA(t);if(e.length===0)return[];if(t.bodyTo>t.bodyFrom)return["","","","",""];const A=t.flankStep>0?t.flankStep:1,s=e[0]-A/2,r=e[e.length-1]+A/2;return[0,.25,.5,.75,1].map(o=>{const i=s+o*(r-s);return Math.abs(i)>=1e4?`${Number((i/1e3).toFixed(1))} kb`:String(Math.round(i))})}function pu(t,e,n,A){for(let s=0;s<n;s++){let r=0,o=0;for(let i=0;i<A;i++){const a=e[s*A+i];Number.isFinite(a)&&(r+=a,o++)}t.total[s]+=r,t.seen[s]+=o}}function yu(t){const e=t.total.length,n=new Float64Array(e);for(let A=0;A<e;A++)n[A]=t.seen[A]===0?Number.NaN:t.total[A]/t.seen[A];return Array.from({length:e},(A,s)=>s).sort((A,s)=>Number.isNaN(n[A])?Number.isNaN(n[s])?0:1:Number.isNaN(n[s])?-1:n[s]-n[A])}function Nu(t,e,n,A,s,r){const{rows:o,count:i}=t,a=new Float32Array(i*A.slots);for(let l=0;l<i;l++)a.set(o.subarray(e[l]*A.slots,(e[l]+1)*A.slots),l*A.slots);const c=mu(a);return{kind:"matrix",id:n===0?"metaplot-heatmap":`metaplot-heatmap-${n+1}`,label:`${t.name} · per feature${r.zscore?", z-scored":""}`,nrows:i,ncols:A.slots,values:a,xLabel:s,yLabel:r.tracks===1?`Features, strongest first (${i.toLocaleString()})`:`Features, strongest first across ${r.tracks} tracks (${i.toLocaleString()})`,xTicks:wu(A),yTicks:[],colormap:"viridis",...c===null?{}:{range:c},aspect:"fill"}}const Nt=1,kt=2,bt=4,dt=8,ku=Nt|kt|bt|dt,Xi=(()=>{const t=new Uint8Array(256),e={A:Nt,C:kt,G:bt,T:dt,U:dt,R:Nt|bt,Y:kt|dt,S:bt|kt,W:Nt|dt,K:bt|dt,M:Nt|kt,B:kt|bt|dt,D:Nt|bt|dt,H:Nt|kt|dt,V:Nt|kt|bt,N:ku};for(const[n,A]of Object.entries(e))t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A;return t})(),bu=(()=>{const t=new Uint8Array(16);for(let e=0;e<16;e++){let n=0;(e&Nt)!==0&&(n|=dt),(e&kt)!==0&&(n|=bt),(e&bt)!==0&&(n|=kt),(e&dt)!==0&&(n|=Nt),t[e]=n}return t})();function Ye(t){return!(t instanceof Uint8Array)}const Fr=200;function Oe(t){const e=t.replace(/\s+/g,"");if(e==="")return{reason:"Type a sequence to search for."};if(e.length>Fr)return{reason:`${e.length} bases is longer than this searches for (${Fr}). It looks for short motifs, so a query that long is a job for an aligner.`};const n=new Uint8Array(e.length);for(let A=0;A<e.length;A++){const s=Xi[e.charCodeAt(A)]??0;if(s===0)return{reason:`“${e[A]}” is not a IUPAC base. Use A C G T U and the ambiguity codes R Y S W K M B D H V N.`};n[A]=s}return n}function Vi(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=bu[t[t.length-1-n]??0]??0;return e}function Du(t){const e=Vi(t);for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function Sr(t,e,n,A){let s=0;for(let r=0;r<e.length;r++){const o=Xi[t[n+r]??0]??0,i=e[r]??0;if((o===0||(o&~i)!==0)&&(s++,s>A))return s}return s}function ps(t,e,n={}){const A=[];if(e.length===0||t.length<e.length)return{hits:A,truncated:!1};const s=n.offset??0,r=n.limit??Number.POSITIVE_INFINITY,o=Math.max(0,Math.min(e.length-1,Math.floor(n.mismatches??0))),i=n.bothStrands===!0,a=i&&Du(e),c=i&&!a?Vi(e):null,l=a?0:1,g=t.length-e.length;for(let f=0;f<=g;f++){const h=Sr(t,e,f,o);if(h<=o&&(A.push({start:f+s,end:f+e.length+s,strand:l,mismatches:h}),A.length>=r))return{hits:A,truncated:f<g};if(c!==null){const u=Sr(t,c,f,o);if(u<=o&&(A.push({start:f+s,end:f+e.length+s,strand:-1,mismatches:u}),A.length>=r))return{hits:A,truncated:f<g}}}return{hits:A,truncated:!1}}function Mu(t){return Math.max(0,t.length-1)}function Fu(t){return t>0?"+":t<0?"−":"±"}function Su(t,e){const n=new et,A=e.replace(/\s+/g,"").toUpperCase();for(const s of t.hits)for(let r=0;r<s.starts.length;r++){const o=s.strands[r],i=s.mismatches?.[r];n.add(s.contig,s.starts[r],s.ends[r],{strand:o,name:`${A} ${Fu(o)}`,...i===void 0?{}:{score:i,detail:`${i} ${i===1?"mismatch":"mismatches"}`}})}return n.finish()}function Zi(t,e,n){const A=[];let s=0;for(const i of e){const a=Math.max(1,Math.ceil(i.length/n));A.push({name:i.name,startBin:s,bins:a,length:i.length}),s+=a}const r=new Float32Array(s),o=new Map(A.map(i=>[i.name,i]));for(const i of t.hits){const a=o.get(i.contig);if(a!==void 0)for(let c=0;c<i.starts.length;c++){const l=Math.min(a.bins-1,Math.floor(i.starts[c]/n));r[a.startBin+l]+=1}}return{binsize:n,firstBin:0,values:r,contigs:A}}function Ru(t,e,n=0){const A=t.replace(/\s+/g,"").toUpperCase(),s=[...e?["both strands"]:[],...n>0?[`≤ ${n} ${n===1?"mismatch":"mismatches"}`]:[]];return s.length===0?A:`${A} (${s.join(", ")})`}const un=5e5,Lu=16e6;function xu(t){const e=t.pattern;return typeof e=="string"?e.replace(/\s+/g,"").toUpperCase():""}async function Gu(t,e,n){const A=Math.max(1,Math.min(n.limit,un)),s=n.mismatches??0,r=n.contigs??t.contigs,o=Mu(e),i=t.read?.bind(t),a=Math.max(1,Math.floor(n.piece??Lu)),c=[];let l=0,g=!1;const f=r.reduce((u,I)=>u+I.length,0);let h=0;for(const u of r){if(l>=A){g=!0;break}const I=[];let d=!1;const C=(w,y)=>{const N=A-l-I.length,k=ps(w,e,{bothStrands:n.bothStrands,limit:N+1,mismatches:s,offset:y});for(let b=0;b<Math.min(k.hits.length,N);b++)I.push(k.hits[b]);(k.truncated||k.hits.length>N)&&(d=!0)};if(i===void 0){const w=t.bases(u.name);if(w===void 0)continue;C(w,0),h+=u.length,n.progress?.(h,f,u.name)}else for(let w=0;w<u.length&&!d;w+=a){n.throwIfCancelled?.();const y=Math.min(u.length,w+a),N=await i(u.name,w,Math.min(u.length,y+o));if(N===void 0)break;C(N,w),h+=y-w,n.progress?.(h,f,u.name)}d&&(g=!0);const E=I.length;if(E===0){if(d)break;continue}const B=new Int32Array(E),Q=new Int32Array(E),m=new Int8Array(E),p=s>0?new Uint8Array(E):void 0;for(let w=0;w<E;w++){const y=I[w];B[w]=y.start,Q[w]=y.end,m[w]=y.strand,p!==void 0&&(p[w]=y.mismatches)}if(c.push({contig:u.name,starts:B,ends:Q,strands:m,...p===void 0?{}:{mismatches:p}}),l+=E,d)break}return{hits:c,total:l,truncated:g}}function ji(t,e,n){if(e===null)return[...t.contigs];const A=new Set(e);if(n.length>0&&n.every(r=>A.has(r)))return[...t.contigs];const s=new Set;for(const r of e){const o=Kt(t.contigs,r);o>=0&&s.add(o)}return t.contigs.filter((r,o)=>s.has(o))}const Uu=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to search."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=On(t.params,"sequences");if(A!==null&&A.length===0)return t.note("No sequence is ticked, so there is nothing to search."),[];const s=Object.entries(t.inputs.contigLengths??{}).filter(([,E])=>E>0).map(([E])=>E),r=ji(n,A,s);if(r.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to search."),[];const o=r.length===n.contigs.length,i=xu(t.params),a=Oe(i);if(Ye(a))return t.note(a.reason),[];const c=Lt(t.params,"bothStrands",!0),l=Math.min(un,Math.max(1,Math.round(T(t.params,"limit",un)))),g=Math.max(0,Math.min(a.length-1,Math.round(T(t.params,"mismatches",0))));t.progress(0,1,r.length===1?`searching ${r[0].name}`:`searching ${r.length.toLocaleString()} sequences`);const f=await Gu(n,a,{bothStrands:c,limit:l,mismatches:g,contigs:r,...n.read===void 0?{}:{progress:(E,B,Q)=>t.progress(E,B,`searching ${Q}`),throwIfCancelled:()=>t.throwIfCancelled()}});t.progress(1,1,"done");const h=vu(Ru(i,c,g),r,o);if(f.total===0)return t.note(o?`No match for ${h} anywhere in this reference.`:`No match for ${h}.`),[];const u=`${f.total.toLocaleString()} site${f.total===1?"":"s"}`;t.note(f.truncated?`${u} — the search stopped at the limit of ${l.toLocaleString()} and there are more. `+(l<un?"Raise “Most sites”, or narrow the pattern.":r.length>1?"That is the most one run reports, so narrow the pattern or tick fewer sequences.":"That is the most one run reports, so narrow the pattern."):`${u}, on ${f.hits.length.toLocaleString()} ${f.hits.length===1?"sequence":"sequences"}.`);const I=`motif-${i}${c?"-both":""}${g>0?`-mm${g}`:""}`+(o?"":Tu(r)),d=[Ju(f,i,h,I)],C=$u(t,f,h,I);return C!==null&&d.push(C),d};function vu(t,e,n){return n?t:e.length<=3?`${t} on ${e.map(A=>A.name).join(", ")}`:`${t} on ${e.length.toLocaleString()} sequences`}function Tu(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
16
|
-
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Ju(t,e,n,A){return{kind:"intervals",id:A,label:n,payload:{kind:"features",data:Su(t,e)},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function $u(t,e,n,A){const s=t.framing.binsize,r=Kn(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none — so there is nothing for a density to be per. Open the map and run it again for that half."),null;const o=Zi(e,r,s);return{kind:"profile",id:`${A}-density`,label:`${n} density`,values:o.values,extent:[0,o.values.length],binsize:s,unit:"sites"}}function Kn(t){const e=t.inputs.contigLengths;if(e===void 0)return[];const n=[];for(const[A,s]of Object.entries(e))s>0&&n.push({name:A,length:s});return n}let ce=null,An=null;function Yu(){if(ce===null||An===null){ce=new Uint32Array(256);for(let t=0;t<256;t++){const e=Ne[t];ce[t]=e<4?1<<8*e:0}An=new Uint32Array(65536);for(let t=0;t<65536;t++)An[t]=ce[t&255]+ce[t>>>8]}return[ce,An]}const Ou=63;function ys(t,e){const n=Math.max(1,Math.round(e)),A=t.length===0?0:Math.ceil(t.length/n),s=new Int32Array(A),r=new Int32Array(A),o=new Int32Array(A),i=new Int32Array(A),[a,c]=Yu(),l=4-(t.byteOffset&3)&3,g=new Uint32Array(t.buffer,t.byteOffset+l,Math.max(0,t.length-l>>2));for(let f=0;f<A;f++){const h=f*n,u=Math.min(t.length,h+n),I=Math.min(u,h<=l?l:l+(h-l+3>>2<<2)),d=u-I>>2;let C=0;for(let y=h;y<I;y++)C+=a[t[y]];for(let y=I+4*d;y<u;y++)C+=a[t[y]];let E=C&255,B=C>>>8&255,Q=C>>>16&255,m=C>>>24,p=I-l>>2;const w=p+d;for(;p<w;){const y=Math.min(w,p+Ou);let N=0;for(;p<y;p++){const k=g[p];N+=c[k&65535]+c[k>>>16]}E+=N&255,B+=N>>>8&255,Q+=N>>>16&255,m+=N>>>24}s[f]=E,r[f]=B,o[f]=Q,i[f]=m}return{step:n,steps:A,a:s,c:r,g:o,t:i}}const ta=1<<22;function _u(t,e=ta){const n=Math.max(1,Math.round(t));return n*Math.max(1,Math.floor(e/n))}async function Ku(t,e,n=ta){const A=Math.max(1,Math.round(e)),s=_u(A,n),r=[];let o=0;for(let l=0;;l+=s){const g=await t(l,l+s);if(g===void 0)return;if(r.push(ys(g,A)),o+=g.length,g.length<s)break}const i=r.reduce((l,g)=>l+g.steps,0),a={step:A,steps:i,a:new Int32Array(i),c:new Int32Array(i),g:new Int32Array(i),t:new Int32Array(i)};let c=0;for(const l of r)a.a.set(l.a,c),a.c.set(l.c,c),a.g.set(l.g,c),a.t.set(l.t,c),c+=l.steps;return{counts:a,length:o}}function ea(t,e,n){const A=Math.max(0,Math.floor(Math.max(1,Math.round(e))/2)),s=t.steps;if(A===0||s===0)return t;const r=o=>{const i=new Int32Array(s),a=new Float64Array(s+1);for(let g=0;g<s;g++)a[g+1]=a[g]+o[g];const c=a[s],l=g=>{if(!n)return a[Math.max(0,Math.min(s,g))];const f=Math.floor(g/s);return f*c+a[g-f*s]};for(let g=0;g<s;g++){const f=n?g-Math.min(A,Math.floor((s-1)/2)):g-A,h=n?g+Math.min(A,Math.floor((s-1)/2))+1:g+A+1;i[g]=l(h)-l(f)}return i};return{...t,a:r(t.a),c:r(t.c),g:r(t.g),t:r(t.t)}}function qu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n],s=A+t.a[n]+t.t[n];e[n]=s>0?A/s:Number.NaN}return e}function LA(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n];e[n]=A>0?(t.g[n]-t.c[n])/A:Number.NaN}return e}function Hu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.a[n]+t.t[n];e[n]=A>0?(t.a[n]-t.t[n])/A:Number.NaN}return e}function na(t){const e=new Float32Array(t.length);let n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isFinite(s)&&(n+=s),e[A]=n}return e}const Wu=1e4;function Pu(t){return["gc","gcSkew","atSkew","cumulative"].filter(e=>t[e]!==!1)}function zu(t){return Oi(t.framing)}const Rr={gc:{name:"GC content",unit:""},gcSkew:{name:"GC skew",unit:""},atSkew:{name:"AT skew",unit:""},cumulative:{name:"Cumulative GC skew",unit:""}},Xu=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=Pu(t.params);if(A.length===0)return t.note("No track was ticked, so there is nothing to make."),[];const s=T(t.params,"resolution",0),r=s>0?Math.round(s):t.framing.binsize>0&&!zu(t)?t.framing.binsize:Wu,o=Kn(t);if(o.length===0)return t.note("There are no sequences to lay the bins out on. Open a map, or load the FASTA itself."),[];const i=Math.max(0,Math.round(T(t.params,"window",0))),a=Math.max(1,Math.round(i/r)),c=a%2===1?a:a+1,l=new Set(t.framing.circular??[]),g=o.reduce((Q,m)=>Q+Math.max(1,Math.ceil(m.length/r)),0),f={gc:new Float32Array(g).fill(Number.NaN),gcSkew:new Float32Array(g).fill(Number.NaN),atSkew:new Float32Array(g).fill(Number.NaN),cumulative:new Float32Array(g).fill(Number.NaN)},{read:h}=n,u=[],I=[];let d=0;for(let Q=0;Q<o.length;Q++){const m=o[Q],p=Math.max(1,Math.ceil(m.length/r));t.progress(Q,o.length,m.name);let w;if(h!==void 0)w=await Ku((D,F)=>(t.throwIfCancelled(),h(m.name,D,F)),r);else{const D=n.bases(m.name);w=D===void 0?void 0:{counts:ys(D,r),length:D.length}}if(w===void 0){u.push(m.name),d+=p;continue}w.length!==m.length&&I.push(m.name);const{counts:y}=w,N=c>1?ea(y,c,l.has(m.name)):y,k={gc:qu(N),gcSkew:LA(N),atSkew:Hu(N),cumulative:na(LA(y))},b=Math.min(p,y.steps);for(const D of A)f[D].set(k[D].subarray(0,b),d);d+=p}if(t.progress(o.length,o.length,"done"),u.length===o.length)return t.note("The reference has none of the map’s sequences under any name this viewer knows, so nothing could be measured."),[];u.length>0&&t.note(`${u.length.toLocaleString()} of the map’s sequences are not in this reference and are gaps on every track: ${u.slice(0,6).join(", ")}${u.length>6?", …":""}.`),I.length>0&&t.note(`${I.slice(0,6).join(", ")}${I.length>6?", …":""} ${I.length===1?"is":"are"} not the length the map says — the reference may be another assembly version. Bins were read from its start.`),c>1&&t.note(`Each bin was read over ${c} bins (${(c*r).toLocaleString()} bp) centred on it; the cumulative skew sums each bin’s own.`);const C=t.inputs.labels?.[e]??"reference",E=c>1?` · ${(c*r).toLocaleString()} bp window`:"";return A.map(Q=>({kind:"profile",id:`composition-${Q.toLowerCase()}`,label:`${Rr[Q].name} · ${C}${Q==="cumulative"?"":E}`,values:f[Q],extent:[0,g],binsize:r,unit:Rr[Q].unit}))},_e=19,Aa=50,Vu=2e6,Zu=5e3,ju=500,tI=10;function Lr(t){const e=[0];for(const n of t)e.push(e[e.length-1]+n.length);return{names:t.map(n=>n.name),lengths:t.map(n=>n.length),offsets:e}}function eI(t,e=Vu){return Math.max(1,Math.ceil(2*t/e-1))}const nI=(()=>{const t=new Int8Array(256).fill(-1);for(const[e,n]of[["A",0],["C",1],["G",2],["T",3]])t[e.charCodeAt(0)]=n,t[e.toLowerCase().charCodeAt(0)]=n;return t})();function AI(t){const e=t>>>0,n=Math.floor(t/4294967296)>>>0;let A=Math.imul(e^Math.imul(n,2654435761),2246822507);return A^=A>>>13,A=Math.imul(A,3266489909),A^=A>>>16,A>>>0}class sI{hash=new Uint32Array(1024);position=new Uint32Array(1024);strand=new Int8Array(1024);count=0;push(e,n,A){if(this.count===this.hash.length){const s=this.hash.length*2,r=new Uint32Array(s);r.set(this.hash),this.hash=r;const o=new Uint32Array(s);o.set(this.position),this.position=o;const i=new Int8Array(s);i.set(this.strand),this.strand=i}this.hash[this.count]=e,this.position[this.count]=n,this.strand[this.count]=A,this.count++}finish(){return{hash:this.hash.slice(0,this.count),position:this.position.slice(0,this.count),strand:this.strand.slice(0,this.count),count:this.count}}}function xr(t,e,n,A=_e){const s=new sI,r=4**(A-1),o=new Float64Array(n+1),i=new Float64Array(n+1),a=new Int8Array(n+1);for(let c=0;c<t.names.length;c++){const l=e(t.names[c]);if(l===void 0)continue;const g=t.offsets[c];let f=0,h=0,u=0,I=0,d=0,C=-1,E=0;const B=o.length;for(let Q=0;Q<l.length;Q++){const m=nI[l[Q]];if(m<0){u=0,d=0,E=0;continue}if(f=f%r*4+m,h=Math.floor(h/4)+(3-m)*r,u++,u<A)continue;const p=Q-A+1;if(E++,f===h)continue;const w=f<h?1:-1,y=AI(f<h?f:h);for(;d>0&&o[(I+d-1)%B]>=y;)d--;for(o[(I+d)%B]=y,i[(I+d)%B]=p,a[(I+d)%B]=w,d++;d>0&&i[I]<=p-n;)I=(I+1)%B,d--;if(E<n)continue;const N=i[I];N!==C&&(s.push(o[I],g+N,a[I]),C=N)}}return s.finish()}function Fn(t,e=t.length,n){let A=new Uint32Array(e);if(n===void 0)for(let o=0;o<e;o++)A[o]=o;else A.set(n.subarray(0,e));let s=new Uint32Array(e);const r=new Uint32Array(65537);for(const o of[0,16]){r.fill(0);for(let i=0;i<e;i++)r[(t[A[i]]>>>o&65535)+1]++;for(let i=0;i<65536;i++)r[i+1]+=r[i];for(let i=0;i<e;i++)s[r[t[A[i]]>>>o&65535]++]=A[i];[A,s]=[s,A]}return A}function rI(t,e,n=Aa){const A=Fn(t.hash,t.count),s=Fn(e.hash,e.count);let r=new Uint32Array(1024),o=new Uint32Array(1024),i=new Int8Array(1024),a=0,c=0,l=0,g=0;for(;l<t.count&&g<e.count;){const f=t.hash[A[l]],h=e.hash[s[g]];if(f<h){l++;continue}if(h<f){g++;continue}let u=l;for(;u<t.count&&t.hash[A[u]]===f;)u++;let I=g;for(;I<e.count&&e.hash[s[I]]===h;)I++;if(u-l>n||I-g>n)c++;else for(let d=l;d<u;d++)for(let C=g;C<I;C++){if(a===r.length){const E=r.length*2,B=new Uint32Array(E);B.set(r),r=B;const Q=new Uint32Array(E);Q.set(o),o=Q;const m=new Int8Array(E);m.set(i),i=m}r[a]=t.position[A[d]],o[a]=e.position[s[C]],i[a]=t.strand[A[d]]===e.strand[s[C]]?1:-1,a++}l=u,g=I}return{x:r.slice(0,a),y:o.slice(0,a),strand:i.slice(0,a),count:a,dropped:c}}function oI(t,e=Zu,n=ju,A=tI,s){const r=[];s?.fill(-1);let o=0;for(let a=0;a<t.count;a++)t.y[a]>o&&(o=t.y[a]);for(const a of[1,-1]){let c=0;for(let B=0;B<t.count;B++)t.strand[B]===a&&c++;const l=new Uint32Array(c),g=new Uint32Array(c),f=new Uint32Array(c),h=Math.ceil(o/n)+1;for(let B=0,Q=0;B<t.count;B++)t.strand[B]===a&&(l[Q]=B,g[Q]=t.x[B],f[Q]=a===1?Math.round((t.x[B]-t.y[B])/n)+h:Math.round((t.x[B]+t.y[B])/n),Q++);const u=Fn(f,c,Fn(g,c)),I=new Uint32Array(c),d=new Uint32Array(c);for(let B=0;B<c;B++)I[B]=l[u[B]],d[B]=f[u[B]];let C=0;const E=B=>{const Q=B-C;if(Q>=A){let m=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY,w=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;for(let N=C;N<B;N++){const k=I[N];m=Math.min(m,t.x[k]),p=Math.max(p,t.x[k]+_e),w=Math.min(w,t.y[k]),y=Math.max(y,t.y[k]+_e)}if(s!==void 0)for(let N=C;N<B;N++)s[I[N]]=r.length;r.push({x0:m,x1:p,y0:w,y1:y,strand:a,anchors:Q})}C=B};for(let B=1;B<=I.length;B++){if(B===I.length){E(B);break}const Q=I[B-1],m=I[B];(d[B-1]!==d[B]||t.x[m]-t.x[Q]>e)&&E(B)}}const i=r.map((a,c)=>c).sort((a,c)=>r[a].x0-r[c].x0||r[a].y0-r[c].y0);if(s!==void 0){const a=new Int32Array(r.length);i.forEach((c,l)=>a[c]=l);for(let c=0;c<t.count;c++)s[c]>=0&&(s[c]=a[s[c]])}return i.map(a=>r[a])}const iI=100,aI=4e5;function cI(t,e,n){const A=e.offsets[e.offsets.length-1],s=n.offsets[n.offsets.length-1],r=Math.max(iI,Math.ceil(Math.max(A,s)/aI)),o=new Uint8Array(Math.ceil(A/r)+1),i=new Uint8Array(Math.ceil(s/r)+1),a=(h,u)=>{const I=Math.floor(h/r);return[I,Math.max(I+1,Math.ceil(u/r))]},c=(h,u,I)=>{const[d,C]=a(u,I);let E=0;for(let B=d;B<C;B++)E+=h[B];return E/(C-d)},l=(h,u,I)=>{const[d,C]=a(u,I);h.fill(1,d,C)},g=new Uint8Array(t.length),f=t.map((h,u)=>u).sort((h,u)=>t[u].anchors-t[h].anchors||h-u);for(const h of f){const u=t[h];c(o,u.x0,u.x1)>.5||c(i,u.y0,u.y1)>.5||(g[h]=1,l(o,u.x0,u.x1),l(i,u.y0,u.y1))}return g}function lI(t,e,n,A,s){const r=e.offsets[e.offsets.length-1],o=n.offsets[n.offsets.length-1],i=Math.max(1,Math.ceil(Math.max(r,o)/Math.max(1,A))),a=Math.max(1,Math.ceil(r/i)),c=Math.max(1,Math.ceil(o/i)),l=new Float32Array(a*c);for(let g=0;g<t.count;g++){if(s!==void 0&&s[g]!==1)continue;const f=Math.min(a-1,Math.floor(t.x[g]/i)),h=Math.min(c-1,Math.floor(t.y[g]/i));l[h*a+f]+=t.strand[g]}return{values:l,ncols:a,nrows:c,cellSize:i}}function Gr(t,e){let n=0,A=t.names.length-1;for(;n<A;){const s=n+A+1>>1;t.offsets[s]<=e?n=s:A=s-1}return{sequence:n,at:e-t.offsets[n]}}const Ur=400;function gI(t,e,n,A,s){const r=t.length,o={x:{label:A,names:[...e.names],lengths:[...e.lengths]},y:{label:s,names:[...n.names],lengths:[...n.lengths]},x0:new Float64Array(r),x1:new Float64Array(r),y0:new Float64Array(r),y1:new Float64Array(r),strand:new Int8Array(r),anchors:new Int32Array(r)};return t.forEach((i,a)=>{o.x0[a]=i.x0,o.x1[a]=i.x1,o.y0[a]=i.y0,o.y1[a]=i.y1,o.strand[a]=i.strand,o.anchors[a]=i.anchors}),o}function vr(t,e){return t.names.map((n,A)=>({label:n,from:t.offsets[A]/e,to:t.offsets[A+1]/e}))}const fI=async t=>{const e=at(t.params,"x"),n=at(t.params,"y");if(t.residues===void 0)return t.note("This session cannot read residues, so there is nothing to set against anything."),[];if(e===null||n===null)return t.note("Choose the two sequence sets: one along x, one along y."),[];const A=t.residues(e),s=t.residues(n);if(A===void 0||s===void 0)return t.note("A sequence set chosen is no longer loaded. Drop the FASTA again, or pick another."),[];for(const R of[A,s])if(R.refusal!==void 0)return t.note(R.refusal),[];const r=Lr(A.contigs),o=Lr(s.contigs),i=r.offsets[r.offsets.length-1],a=eI(i);t.progress(0,4,"minimizers along x");const c=xr(r,R=>A.bases(R),a);t.throwIfCancelled(),t.progress(1,4,"minimizers along y");const l=xr(o,R=>s.bases(R),a);t.throwIfCancelled(),t.progress(2,4,"anchors");const g=rI(c,l);t.throwIfCancelled(),t.progress(3,4,"streaks");const f=new Int32Array(g.count),h=oI(g,void 0,void 0,void 0,f),u=e===n,I=!u&&st(t.params,"streaks","one to one")==="one to one",d=I?cI(h,r,o):new Uint8Array(h.length).fill(1),C=h.filter((R,v)=>d[v]===1),E=new Uint8Array(g.count);for(let R=0;R<g.count;R++)f[R]>=0&&d[f[R]]===1&&(E[R]=1);const B=Math.round(T(t.params,"cells",Ur)),Q=lI(g,r,o,B>0?B:Ur,E);t.progress(4,4);const m=c.count>0?Math.round(i/c.count):0,p=h.length-C.length;t.note(`Exact ${_e}-mers, one in about ${m.toLocaleString("en-US")} bases; hashes above ${Aa} copies on either side dropped (${g.dropped.toLocaleString("en-US")} of them). ${g.count.toLocaleString("en-US")} anchors, ${h.length.toLocaleString("en-US")} streaks`+(I?`, ${C.length.toLocaleString("en-US")} of them one to one — ${p.toLocaleString("en-US")} a stronger streak had taken the stretch of`:"")+(u?", every one drawn, the set against itself":"")+`. Not an alignment, and it writes none: a streak is ten or more shared ${_e}-mers along one diagonal.`);const w=[];for(const R of Q.values)Math.abs(R)>=3&&w.push(Math.abs(R));w.sort((R,v)=>R-v);const y=w.length===0?3:Math.max(3,w[Math.floor(.5*(w.length-1))]),N={kind:"matrix",id:"dotplot-density",label:I?"Streaks one to one, the same way round (red) and the other (blue)":"Streaks, the same way round (red) and the other (blue)",nrows:Q.nrows,ncols:Q.ncols,values:Q.values,xLabel:"along x",yLabel:"along y",xTicks:[],yTicks:[],colormap:"RdBu_r",centre:0,range:[-y,y],xSegments:vr(r,Q.cellSize),ySegments:vr(o,Q.cellSize),stats:[{label:"anchors",value:g.count},{label:I?"streaks one to one":"streaks",value:C.length},{label:"bases a cell",value:Q.cellSize}],large:!0,streaks:gI(C,r,o,t.inputs.labels?.[e]??"along x",t.inputs.labels?.[n]??"along y")},k=C.map(R=>{const v=Gr(r,R.x0),x=Gr(o,R.y0);return{xSequence:r.names[v.sequence],xStart:v.at,xEnd:v.at+(R.x1-R.x0),ySequence:o.names[x.sequence],yStart:x.at,yEnd:x.at+(R.y1-R.y0),strand:R.strand===1?"+":"-",anchors:R.anchors}}),b={kind:"table",id:"dotplot-streaks",label:"Streaks",columns:[{key:"xSequence",label:"x sequence",kind:"text"},{key:"xStart",label:"x start",kind:"number",coordinate:"start"},{key:"xEnd",label:"x end",kind:"number",coordinate:"end"},{key:"ySequence",label:"y sequence",kind:"text"},{key:"yStart",label:"y start",kind:"number",coordinate:"start"},{key:"yEnd",label:"y end",kind:"number",coordinate:"end"},{key:"strand",label:"strand",kind:"text",hint:"+ the same way round, − the other"},{key:"anchors",label:"anchors",kind:"number"}],rows:k},D=new Jn;for(const R of k)D.add(R.xSequence,R.xStart,R.xEnd,R.ySequence,R.yStart,R.yEnd,{score:R.anchors,name:R.strand==="+"?"same way round":"the other way round",detail:`${R.anchors} anchors`});const F={kind:"intervals",id:"dotplot-pairs",label:"Streaks, as pairs",payload:{kind:"pairs",data:D.finish()},noun:{one:"streak",many:"streaks"},display:"overlay"};return[N,b,F]};function xA(t,e,n,A){const s=Math.abs(t-e);return A&&n>0?Math.min(s,n-s%n):s}function hI(t,e,n){if(t.length===0)return Number.NaN;if(!n||!(e>0)){let i=0;for(const a of t)i+=a;return i/t.length}let A=0,s=0;for(const i of t){const a=2*Math.PI*i/e;A+=Math.sin(a),s+=Math.cos(a)}const o=(Math.atan2(A,s)/(2*Math.PI)*e%e+e)%e;return o>=e?0:o}function Tr(t,e,n,A){if(t.length===0)return null;let s=-1,r=0;for(let i=0;i<t.length;i++){let a=0;for(const c of t)xA(t[i],c,e,n)<=A&&a++;a>r&&(r=a,s=i)}const o=t.filter(i=>xA(t[s],i,e,n)<=A);return{centre:hI(o,e,n),count:o.length}}function uI(t,e,n){let A=-1,s=-1;for(let o=0;o<t.length;o++){const i=t[o];Number.isFinite(i)&&((A<0||i<t[A])&&(A=o),(s<0||i>t[s])&&(s=o))}const r=o=>o<0?Number.NaN:Math.min(n-1,Math.floor(o*e+e/2));return{low:r(A),high:r(s)}}const II=10;function dI(t){const{length:e,circular:n,low:A,high:s}=t,r=e/8,o=Tr(t.matS,e,n,r),i=Tr(t.parS,e,n,r),a=t.minMatS??II,c=(h,u)=>xA(h,u,e,n);let l=s,g="skew";if(o!==null&&t.matS.length>=a)l=c(A,o.centre)<c(s,o.centre)?A:s,g="matS";else if(i!==null)l=c(A,i.centre)>c(s,i.centre)?A:s,g="parS";else if(t.coverageAt!==void 0){const h=t.coverageAt(A),u=t.coverageAt(s);Number.isFinite(h)&&Number.isFinite(u)&&h!==u&&(l=h<u?A:s,g="coverage")}return{ori:l===s?A:s,ter:l,rule:g,agreesWithSkew:l===s,matS:o,parS:i}}function CI(t,e,n,A,s){const r=Math.max(s?3:1,Math.round(A)),o=s?r:r+3,i=n>0?r/n:0,a=B=>{let Q=B*i;s||(Q=Math.max(0,Math.min(r-1e-9,Q)));const m=Math.floor(Q),p=Q-m,w=[(1-p)**3/6,(3*p**3-6*p**2+4)/6,(-3*p**3+3*p**2+3*p+1)/6,p**3/6];return{first:s?m-1:m,w}},c=B=>s?(B%o+o)%o:B,l=new Float64Array(o*o),g=new Float64Array(o);let f=0;for(let B=0;B<t.length;B++){const Q=e[B];if(!Number.isFinite(Q))continue;f++;const{first:m,w:p}=a(t[B]);for(let w=0;w<4;w++){const y=c(m+w);g[y]+=p[w]*Q;for(let N=0;N<4;N++)l[y*o+c(m+N)]+=p[w]*p[N]}}let h=0,u=0;for(let B=0;B<e.length;B++)Number.isFinite(e[B])&&(h+=e[B],u++);h=u>0?h/u:0;const I=1e-6*Math.max(1,f/o);for(let B=0;B<o;B++)l[B*o+B]+=I,g[B]+=I*h;const d=QI(l,g,o),C=B=>{if(d===null)return Number.NaN;const{first:Q,w:m}=a(B);let p=0;for(let w=0;w<4;w++)p+=m[w]*d[c(Q+w)];return p},E=new Float64Array(t.length);for(let B=0;B<t.length;B++)E[B]=C(t[B]);return{fitted:E,at:C}}function QI(t,e,n){const A=Float64Array.from(t),s=Float64Array.from(e);for(let o=0;o<n;o++){let i=o;for(let a=o+1;a<n;a++)Math.abs(A[a*n+o])>Math.abs(A[i*n+o])&&(i=a);if(Math.abs(A[i*n+o])<1e-300)return null;if(i!==o){for(let c=0;c<n;c++){const l=A[o*n+c];A[o*n+c]=A[i*n+c],A[i*n+c]=l}const a=s[o];s[o]=s[i],s[i]=a}for(let a=o+1;a<n;a++){const c=A[a*n+o]/A[o*n+o];if(c!==0){for(let l=o;l<n;l++)A[a*n+l]-=c*A[o*n+l];s[a]-=c*s[o]}}}const r=new Float64Array(n);for(let o=n-1;o>=0;o--){let i=s[o];for(let a=o+1;a<n;a++)i-=A[o*n+a]*r[a];r[o]=i/A[o*n+o]}return r}function BI(t){let e=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY;for(const s of t)Number.isFinite(s)&&(s>e&&(e=s),s<n&&(n=s));return{ratio:n>0&&Number.isFinite(e)?e/n:Number.NaN,highest:e,lowest:n}}const EI="TGTTNCACGTGNAACA",mI="GTGACRNYGTCAC";function wI(t,e){const n=t[e];return n==null?e==="parS"?EI:mI:typeof n=="string"?n.replace(/\s+/g,"").toUpperCase():""}const pI=5e3,aA={matS:"nearest the matS cluster",parS:"farthest from the parS cluster",coverage:"lower coverage",skew:"skew maximum"};function Jr(t,e,n){const A={mids:[],starts:[],ends:[],strands:[],mismatches:[]};if(e===null)return A;for(const s of ps(t,e,{bothStrands:!0,mismatches:n}).hits)A.mids.push((s.start+s.end)/2),A.starts.push(s.start),A.ends.push(s.end),A.strands.push(s.strand),A.mismatches.push(s.mismatches);return A}const yI=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load the genome’s FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.refusal!==void 0)return t.note(n.refusal),[];const A={parS:{motif:null,pattern:"",mismatches:0},matS:{motif:null,pattern:"",mismatches:0}};for(const N of["parS","matS"]){const k=wI(t.params,N);if(k==="")continue;const b=Oe(k);if(Ye(b)){t.note(`${N}: ${b.reason} Its step was skipped.`);continue}const D=Math.round(T(t.params,`${N}Mismatches`,N==="parS"?1:0));A[N]={motif:b,pattern:k,mismatches:Math.max(0,Math.min(b.length-1,D))}}const s=Math.max(100,Math.round(T(t.params,"window",5e3))),r=Math.max(10,Math.min(s,Math.round(T(t.params,"step",1e3)))),o=Math.max(4,Math.min(40,Math.round(T(t.params,"knots",10)))),i=at(t.params,"coverage"),a=new Set(t.framing.circular??[]),c=Kn(t),l=c.length>0?c.map(N=>N.name):n.contigs.map(N=>N.name),g=On(t.params,"sequences"),f=g===null?l:l.filter(N=>g.includes(N));if(f.length===0)return t.note("No sequence is ticked, so there is nothing to read."),[];const h=new et,u=new et,I=new et;let d=0,C=0;const E=[],B=new Map,Q=[];for(let N=0;N<f.length;N++){const k=f[N];t.progress(N,f.length,k);const b=n.bases(k);if(b===void 0){Q.push(k);continue}const D=b.length;if(D<4*s){Q.push(k);continue}const F=a.has(k),R=ys(b,r),v=LA(ea(R,Math.max(1,Math.round(s/r)),F)),x=uI(na(v),r,D);if(!Number.isFinite(x.low)||!Number.isFinite(x.high)){Q.push(k);continue}const Y=Jr(b,A.parS.motif,A.parS.mismatches),J=Jr(b,A.matS.motif,A.matS.mismatches);let K,V=Number.NaN;if(i!==null){const L=(await t.sample(i,[{contig:k,start:0,end:D}],pI)).regions[0];if(L!==void 0&&L.values.length>3){const $=new Float64Array(L.values.length),Dt=new Float64Array(L.values.length);for(let P=0;P<L.values.length;P++)$[P]=(L.starts[P]+L.ends[P])/2,Dt[P]=L.values[P];const Ut=CI($,Dt,D,o,F);K=Ut.at,B.set(k,Ut.at),V=BI(Ut.fitted).ratio}}const H=dI({length:D,circular:F,low:x.low,high:x.high,parS:Y.mids,matS:J.mids,...K===void 0?{}:{coverageAt:K}}),ht=Math.floor(s/2),Gt=`${aA[H.rule]}${H.agreesWithSkew?"":" · disagrees with the skew"}`;for(const[q,L]of[["ori",H.ori],["ter",H.ter]])h.add(k,Math.max(0,L-ht),Math.min(D,L+ht),{name:q,detail:q==="ter"?`terminus · ${Gt}`:"origin"});for(let q=0;q<Y.starts.length;q++)u.add(k,Y.starts[q],Y.ends[q],{strand:Y.strands[q],name:"parS",score:Y.mismatches[q],detail:`${Y.mismatches[q]} ${Y.mismatches[q]===1?"mismatch":"mismatches"}`});for(let q=0;q<J.starts.length;q++)I.add(k,J.starts[q],J.ends[q],{strand:J.strands[q],name:"matS",score:J.mismatches[q],detail:`${J.mismatches[q]} ${J.mismatches[q]===1?"mismatch":"mismatches"}`});d+=Y.starts.length,C+=J.starts.length,H.agreesWithSkew||t.note(`${k}: the terminus was placed ${aA[H.rule]}, at the cumulative skew’s minimum — which is where the skew alone would put the origin. Check the assembly, or the motifs.`),E.push({sequence:k,length:D,topology:F?"circular":"linear",ori:H.ori+1,ter:H.ter+1,rule:aA[H.rule],parS:Y.starts.length,parSCluster:H.parS?.count??0,matS:J.starts.length,ratio:V})}if(t.progress(f.length,f.length,"done"),Q.length>0&&t.note(`${Q.length.toLocaleString()} ${Q.length===1?"sequence was":"sequences were"} not placed — not in the reference, or shorter than four skew windows: ${Q.slice(0,6).join(", ")}${Q.length>6?", …":""}.`),E.length===0)return[];i===null&&t.note("No coverage track was chosen, so there is no ori/ter ratio and no coverage step.");const m=E.filter(N=>N.topology==="linear").length;m>0&&t.note(`${m.toLocaleString()} ${m===1?"sequence was":"sequences were"} read as linear. A bacterial chromosome is usually circular — tick it in the Chromosomes table and run this again, or the origin at its first base is split between its two ends.`);const w=[{kind:"intervals",id:"oriter-loci",label:`Origin and terminus · ${t.inputs.labels?.[e]??"reference"}`,payload:{kind:"features",data:h.finish()},noun:{one:"locus",many:"loci"},display:"lane",look:"point"}];d>0&&w.push({kind:"intervals",id:"oriter-pars",label:`parS sites · ${A.parS.pattern}`,payload:{kind:"features",data:u.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"}),C>0&&w.push({kind:"intervals",id:"oriter-mats",label:`matS sites · ${A.matS.pattern}`,payload:{kind:"features",data:I.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"});const y=t.framing.binsize;if(B.size>0&&y>0&&c.length>0){const N=c.reduce((F,R)=>F+Math.max(1,Math.ceil(R.length/y)),0),k=new Float32Array(N).fill(Number.NaN);let b=0;for(const F of c){const R=Math.max(1,Math.ceil(F.length/y)),v=B.get(F.name);if(v!==void 0)for(let x=0;x<R;x++)k[b+x]=v(Math.min(F.length-1,(x+.5)*y));b+=R}const D=t.inputs.labels?.[i??""]??"coverage";w.push({kind:"profile",id:"oriter-coverage-fit",label:`${D} · spline fit`,values:k,extent:[0,N],binsize:y,unit:""})}return w.push({kind:"table",id:"oriter-table",label:"Origin and terminus per sequence",columns:[{key:"sequence",label:"sequence",kind:"text"},{key:"length",label:"length",kind:"number"},{key:"topology",label:"read as",kind:"text"},{key:"ori",label:"ori",kind:"number",hint:"Centre of the origin locus, 1-based."},{key:"ter",label:"ter",kind:"number",hint:"Centre of the terminus locus, 1-based."},{key:"rule",label:"terminus placed by",kind:"text"},{key:"parS",label:"parS",kind:"number",hint:"Sites found on this sequence."},{key:"parSCluster",label:"in cluster",kind:"number",hint:"parS sites within an eighth of the sequence of the densest one."},{key:"matS",label:"matS",kind:"number",hint:"Sites found on this sequence."},{key:"ratio",label:"ori/ter",kind:"number",digits:2,hint:"Highest over lowest smoothed coverage: copies of the origin per copy of the terminus."}],rows:E}),w};function GA(t,e,n){const A=t.contigs.indexOf(e);if(A<0)return[];const s=[];for(let r=t.contigAt[A];r<t.contigAt[A+1];r++){const o=t.start[r],i=t.end[r];if(i<=o)continue;const a=s[s.length-1];a!==void 0&&o<=a[1]?a[1]=Math.max(a[1],i):s.push([o,i])}return s}function $r(t){let e=0;for(const[n,A]of t)e+=A-n;return e}function NI(t,e){let n=0,A=0,s=0;for(;A<t.length&&s<e.length;){const r=Math.max(t[A][0],e[s][0]),o=Math.min(t[A][1],e[s][1]);o>r&&(n+=o-r),t[A][1]<e[s][1]?A++:s++}return n}function Yr(t,e,n,A){const s=t.contigs.indexOf(e);if(s<0||n.length===0)return 0;let r=0,o=0;for(let i=t.contigAt[s];i<t.contigAt[s+1];i++){const a=t.start[i],c=t.end[i],l=c-a;if(l<=0)continue;for(;o<n.length&&n[o][1]<=a;)o++;let g=0;for(let f=o;f<n.length&&n[f][0]<c;f++)g+=Math.max(0,Math.min(c,n[f][1])-Math.max(a,n[f][0]));g/l>=A&&g>0&&r++}return r}function sa(t,e,n){const A=new Set([...t.contigs,...e.contigs]);let s=0,r=0,o=0,i=0,a=0;for(const l of A){const g=GA(t,l,n.minFraction),f=GA(e,l,n.minFraction);s+=$r(g),r+=$r(f),o+=NI(g,f),i+=Yr(t,l,f,n.minFraction),a+=Yr(e,l,g,n.minFraction)}const c=s+r-o;return{basesA:s,basesB:r,intersection:o,union:c,jaccard:c>0?o/c:Number.NaN,featuresAHit:i,featuresBHit:a,featuresA:t.length,featuresB:e.length}}function kI(t,e,n,A,s){let r=0,o=0,i=0,a=0,c=0,l=Number.NaN,g=Number.NaN;const f=()=>{if(!Number.isNaN(l)){for(o+=g-l;c<A.length&&A[c][1]<=l;)c++;for(let h=c;h<A.length&&A[h][0]<g;h++)r+=Math.min(g,A[h][1])-Math.max(l,A[h][0])}};for(let h=0;h<n.length;h++){const u=n[h],I=t[u],d=I+e[u];for(;a<A.length&&A[a][1]<=I;)a++;let C=0;for(let B=a;B<A.length&&A[B][0]<d;B++)C+=Math.max(0,Math.min(d,A[B][1])-Math.max(I,A[B][0]));const E=d-I;E>0&&C>0&&C/E>=s&&i++,Number.isNaN(l)?(l=I,g=d):I<=g?g=Math.max(g,d):(f(),l=I,g=d)}return f(),{intersection:r,covered:o,hits:i}}function cA(t,e){const n=e.length;let A=0;for(let c=0;c<n;c++)A+=e[c];const s=n>0?A/n:Number.NaN;let r=0;for(let c=0;c<n;c++)r+=(e[c]-s)**2;const o=n>1?Math.sqrt(r/(n-1)):Number.NaN;let i=0,a=0;for(let c=0;c<n;c++)e[c]>=t&&i++,e[c]<=t&&a++;return{observed:t,mean:s,sd:o,z:o>0?(t-s)/o:Number.NaN,fold:s>0?t/s:Number.NaN,pEnriched:(i+1)/(n+1),pDepleted:(a+1)/(n+1)}}function bI(t,e,n){const A=sa(t,e,{minFraction:n.minFraction}),s=[],r=[],o=[];for(const I of t.contigs){const d=t.contigs.indexOf(I),C=[];let E=0;for(let m=t.contigAt[d];m<t.contigAt[d+1];m++){const p=t.end[m]-t.start[m];p<=0||(C.push(p),E=Math.max(E,t.end[m]))}if(C.length===0)continue;let Q=n.lengthOf(I);if(Q===void 0||Q<=0){const m=e.contigs.indexOf(I);let p=E;if(m>=0)for(let w=e.contigAt[m];w<e.contigAt[m+1];w++)p=Math.max(p,e.end[w]);Q=p,r.push(I)}if(!Number.isFinite(Q)||Q<=0){o.push(I);continue}s.push({contig:I,length:Q,lengths:C,runs:GA(e,I)})}if(s.length===0)return null;const i=Math.max(1,Math.trunc(n.iterations)),a=zi(n.seed),c=new Float64Array(i),l=new Float64Array(i),g=new Float64Array(i);let f=0;for(const I of s)f=Math.max(f,I.lengths.length);const h=new Float64Array(f),u=new Int32Array(f);for(let I=0;I<i;I++){if(n.cancelled?.()===!0)return null;let d=0,C=0,E=0;for(const Q of s){const m=Q.lengths.length;for(let y=0;y<m;y++){const N=Math.max(0,Q.length-Q.lengths[y]);h[y]=Math.floor(a()*(N+1)),u[y]=y}const p=u.subarray(0,m);p.sort((y,N)=>h[y]-h[N]);const w=kI(h,Q.lengths,p,Q.runs,n.minFraction);d+=w.intersection,C+=w.covered,E+=w.hits}l[I]=d,g[I]=E;const B=C+A.basesB-d;c[I]=B>0?d/B:Number.NaN,n.onProgress?.(I+1,i)}return{iterations:i,jaccard:cA(A.jaccard,c),intersection:cA(A.intersection,l),featuresHit:cA(A.featuresAHit,g),assumedLengths:r,droppedContigs:o}}const DI=async t=>{const e=ne(t.inputs.features,t.params,"a"),n=ne(t.inputs.features,t.params,"b"),A=e.value,s=n.value;if(A===void 0||s===void 0){const u=[e,n].filter(d=>d.value===void 0),I=u.filter(d=>d.chosen).length;return t.note(I===u.length?`The interval ${u.length===2?"sets":"set"} chosen ${u.length===2?"are":"is"} no longer loaded. Re-open the file, or pick another.`:`Two interval sets are needed and ${u.length===2&&I===0?"neither has":"one has not"} been chosen. Load two BED files, or a BED and a GTF, and pick one in each box.`),[]}t.progress(0,1,"comparing");const r=sa(A,s,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6)))});t.progress(1,1,"done"),Number.isFinite(r.jaccard)||t.note("Neither set covers any bases, so there is nothing to compare.");const i=[{kind:"table",id:"overlap",label:"Overlap",columns:[{key:"measure",label:"Measure",kind:"text"},{key:"value",label:"Value",kind:"number",digits:4},{key:"note",label:"Note",kind:"text"}],rows:[{measure:"Jaccard (bases)",value:r.jaccard,note:"Symmetric; 1 is identical."},{measure:"Shared bases",value:r.intersection,note:""},{measure:"Bases in either",value:r.union,note:""},{measure:"Bases in the first",value:r.basesA,note:"After merging its own overlaps."},{measure:"Bases in the second",value:r.basesB,note:"After merging its own overlaps."},{measure:"First set hit",value:r.featuresA===0?Number.NaN:r.featuresAHit/r.featuresA,note:`${r.featuresAHit.toLocaleString()} of ${r.featuresA.toLocaleString()} features.`},{measure:"Second set hit",value:r.featuresB===0?Number.NaN:r.featuresBHit/r.featuresB,note:`${r.featuresBHit.toLocaleString()} of ${r.featuresB.toLocaleString()} features.`}]}];if(!Lt(t.params,"shuffle",!1))return i;const a=st(t.params,"shuffleWhich","a")!=="b",c=Math.max(20,Math.trunc(T(t.params,"iterations",1e3)));t.progress(0,c,"shuffling");const l=bI(a?A:s,a?s:A,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6))),iterations:c,seed:T(t.params,"seed",1),lengthOf:u=>t.lengthOf(u),cancelled:()=>t.cancelled(),onProgress:(u,I)=>t.progress(u,I,"shuffling")});if(t.throwIfCancelled(),l===null)return t.note("The set chosen to move occupies no sequence this session knows a length for, so there was nothing to shuffle it within. Load the assembly — a chrom.sizes, or the map itself."),i;l.assumedLengths.length>0&&t.note(`${l.assumedLengths.length.toLocaleString()} sequence${l.assumedLengths.length===1?" has":"s have"} no known length, so the null was drawn over the furthest position either set reaches there — which is shorter than the sequence and overstates the enrichment. ${l.assumedLengths.slice(0,6).join(", ")}${l.assumedLengths.length>6?", …":""}.`),l.droppedContigs.length>0&&t.note(`${l.droppedContigs.length.toLocaleString()} sequence${l.droppedContigs.length===1?"":"s"} could not be shuffled at all and ${l.droppedContigs.length===1?"is":"are"} left out of the null: ${l.droppedContigs.slice(0,6).join(", ")}${l.droppedContigs.length>6?", …":""}.`);const g=a?"first":"second",f=(u,I,d)=>({measure:u,observed:I.observed,expected:I.mean,fold:I.fold,z:I.z,p:I.observed>=I.mean?I.pEnriched:I.pDepleted,tail:I.observed>=I.mean?"enriched":"depleted",digits:d}),h=[f("Jaccard (bases)",l.jaccard,4),f("Shared bases",l.intersection,0),f(`Features of the ${g} set hit`,l.featuresHit,0)].map(({digits:u,...I})=>I);return i.push({kind:"table",id:"overlap-null",label:`Against ${l.iterations.toLocaleString()} shuffles of the ${g} set`,columns:[{key:"measure",label:"Measure",kind:"text"},{key:"observed",label:"Observed",kind:"number",digits:4},{key:"expected",label:"Expected",kind:"number",digits:4,hint:"Mean of the null."},{key:"fold",label:"Fold",kind:"number",digits:2,hint:"Observed over expected."},{key:"z",label:"z",kind:"number",digits:2},{key:"p",label:"p",kind:"number",digits:5,hint:`Permutation p on the tail the observation fell on, with Phipson and Smyth’s +1: the smallest this run can report is ${(1/(l.iterations+1)).toPrecision(2)}.`},{key:"tail",label:"Tail",kind:"text"}],rows:h}),i},$t={maxIter:3e3,convergenceEps:1e-6,start:[.1,1,.2,.5],pseudoValueEps:1e-8,finalPseudoValueEps:1e-12,emStepsPerRound:30},Ct=[0,.2,.1,.01],ee=[20,20,.99,.99],Or={min:Ct,max:ee};class se extends Error{constructor(e){super(e),this.name="IdrError"}}const In=new Float64Array(1),_r=new Int32Array(In.buffer),ra=new Uint8Array(Float64Array.of(1).buffer)[7]===63?1:0,MI=1-ra,Kr=.8450629115104675,FI=.1283791670955126,SI=1.0270333367641007,Fe=[.12837916709551256,-.3250421072470015,-.02848174957559851,-.005770270296489442,-23763016656650163e-21],Se=[.39791722395915535,.0650222499887673,.005081306281875766,.00013249473800432164,-3960228278775368e-21],zt=[-.0023621185607526594,.41485611868374833,-.3722078760357013,.31834661990116175,-.11089469428239668,.035478304325618236,-.002166375594868791],le=[.10642088040084423,.540397917702171,.07182865441419627,.12617121980876164,.01363708391202905,.011984499846799107],Tt=[-.009864944034847148,-.6938585727071818,-10.558626225323291,-62.375332450326006,-162.39666946257347,-184.60509290671104,-81.2874355063066,-9.814329344169145],Jt=[19.651271667439257,137.65775414351904,434.56587747522923,645.3872717332679,429.00814002756783,108.63500554177944,6.570249770319282,-.0604244152148581],Xt=[-.0098649429247001,-.799283237680523,-17.757954917754752,-160.63638485582192,-637.5664433683896,-1025.0951316110772,-483.5191916086514],Vt=[30.33806074348246,325.7925129965739,1536.729586084437,3199.8582195085955,2553.0504064331644,474.52854120695537,-22.44095244658582];function qr(t){In[0]=t;const e=_r[ra],n=e&2147483647;if(n>=2146435072)return 1-(e>>>31<<1)+1/t;if(n<1072365568){if(n<1043333120)return n<8388608?.125*(8*t+SI*t):t+FI*t;const c=t*t,l=Fe[0]+c*(Fe[1]+c*(Fe[2]+c*(Fe[3]+c*Fe[4]))),g=1+c*(Se[0]+c*(Se[1]+c*(Se[2]+c*(Se[3]+c*Se[4])))),f=l/g;return t+t*f}if(n<1072955392){const c=Math.abs(t)-1,l=zt[0]+c*(zt[1]+c*(zt[2]+c*(zt[3]+c*(zt[4]+c*(zt[5]+c*zt[6]))))),g=1+c*(le[0]+c*(le[1]+c*(le[2]+c*(le[3]+c*(le[4]+c*le[5])))));return e>=0?Kr+l/g:-Kr-l/g}if(n>=1075314688)return e>=0?1-1e-300:1e-300-1;const A=Math.abs(t),s=1/(A*A);let r,o;n<1074191214?(r=Tt[0]+s*(Tt[1]+s*(Tt[2]+s*(Tt[3]+s*(Tt[4]+s*(Tt[5]+s*(Tt[6]+s*Tt[7])))))),o=1+s*(Jt[0]+s*(Jt[1]+s*(Jt[2]+s*(Jt[3]+s*(Jt[4]+s*(Jt[5]+s*(Jt[6]+s*Jt[7])))))))):(r=Xt[0]+s*(Xt[1]+s*(Xt[2]+s*(Xt[3]+s*(Xt[4]+s*(Xt[5]+s*Xt[6]))))),o=1+s*(Vt[0]+s*(Vt[1]+s*(Vt[2]+s*(Vt[3]+s*(Vt[4]+s*(Vt[5]+s*Vt[6]))))))),In[0]=A,_r[MI]=0;const i=In[0],a=Math.exp(-i*i-.5625)*Math.exp((i-A)*(i+A)+r/o);return e>=0?1-a/A:a/A-1}function dn(t,e,n,A){const s=(t-e)/n;return .5*A*qr(s/Math.SQRT2)+.5*(1-A)*qr(t/Math.SQRT2)+.5}function Hr(t,e,n,A,s,r,o){let i=0;for(let a=0;a<1e3;a++){i=s+(r-s)/2;const c=dn(i,e,n,A);if(Math.abs(c-t)<o)return i;c<t?s=i:r=i}return i}function UA(t,e,n,A,s,r){const o=Pr(t.length,n,A,s,r),i=e.length===t.length?o:Pr(e.length,n,A,s,r);return[Wr(t,o),Wr(e,i)]}function Wr(t,e){const n=new Float64Array(t.length);for(let A=0;A<t.length;A++)n[A]=e[t[A]];return n}function Pr(t,e,n,A,s){const r=new Float64Array(t);if(t===0)return r;const o=t+1,i=1/o;let a=0<=e?0:e;for(;dn(a,e,n,A)>i;)a-=1;let c=0>=e?0:e;for(;dn(c,e,n,A)<1-i;)c+=1;a=Hr(i,e,n,A,a,c,s),r[0]=a;for(let l=1;l<t;l++){const g=(l+1)/o;dn(c,e,n,A)<g&&(c+=10);const f=Hr(g,e,n,A,a,c,s);r[l]=f,a=f,c=a+2*(f-r[l-1])}return r}class oa{constructor(e,n){this.z1=e,this.z2=n,this.n=e.length,this.noise=new Float64Array(this.n),this.signal=new Float64Array(this.n),this.terms=new Float64Array(this.n),zr(0,1,0,e,n,this.noise)}n;noise;signal;terms;at=[Number.NaN,Number.NaN,Number.NaN];logLik(e){this.signalAt(e);const n=e[3];for(let A=0;A<this.n;A++)this.terms[A]=Math.log(n*this.signal[A]+(1-n)*this.noise[A]);return Bt(this.terms)}membership(e){this.signalAt(e);const n=e[3],A=new Float64Array(this.n);for(let s=0;s<this.n;s++){const r=n*this.signal[s];A[s]=r/(r+(1-n)*this.noise[s])}return A}signalAt(e){const n=this.at;e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2]||(zr(e[0],e[1],e[2],this.z1,this.z2,this.signal),this.at=[e[0],e[1],e[2]])}}function zr(t,e,n,A,s,r){const o=-1.837877-Math.log(e)-Math.log(e)-.5*Math.log(1-n*n),i=2*n,a=2*(1-n*n);for(let c=0;c<A.length;c++){const l=(A[c]-t)/e,g=(s[c]-t)/e;r[c]=Math.exp(o-(l*l-i*l*g+g*g)/a)}}function RI(t,e){const{n,z1:A,z2:s}=t,r=t.membership(e),o=Bt(r),i=new Float64Array(n);for(let I=0;I<n;I++)i[I]=r[I]*A[I];const a=Bt(i)/o;for(let I=0;I<n;I++)i[I]=r[I]*s[I];const c=Bt(i)/o,l=(a+c)/2;for(let I=0;I<n;I++){const d=A[I]-l;i[I]=r[I]*(d*d)}const g=Bt(i);for(let I=0;I<n;I++){const d=s[I]-l;i[I]=r[I]*(d*d)}const f=Bt(i),h=Math.sqrt((g+f)/(2*o));for(let I=0;I<n;I++)i[I]=r[I]*(A[I]-l)*(s[I]-l);const u=2*Bt(i)/(g+f);return[l,h,u,o/n]}function ia(t){const e=[t[0],t[1],t[2],t[3]];let n=!1;return e[0]<Ct[0]&&(e[0]=Ct[0],n=!0),e[1]<Ct[1]&&(e[1]=Ct[1],n=!0),e[2]<Ct[2]?(e[2]=Ct[2],n=!0):e[2]>ee[2]&&(e[2]=ee[2],n=!0),e[3]<Ct[3]?(e[3]=Ct[3],n=!0):e[3]>ee[3]&&(e[3]=ee[3],n=!0),{theta:e,changed:n}}function LI(t,e,n,A){let s=e,r=t.logLik(s),o=[e[0],e[1],e[2],e[3]];for(let i=0;i<n;i++){const a=ia(RI(t,s));o=a.theta;const c=t.logLik(o);if(a.changed)return{theta:o,changed:!0};if(!(c+1e-6>=r))throw new se("An EM step lowered the likelihood, which stops idr’s own fit.");if(c-r<A)return{theta:o,changed:!1};s=o,r=c}return{theta:o,changed:!1}}function xI(t,e,n,A=1e-5,s=500){if(!Number.isFinite(e)||!Number.isFinite(n))throw new se("Optimization bounds must be finite scalars.");if(e>n)throw new se("The lower bound exceeds the upper bound.");const r=Math.sqrt(22e-17),o=.5*(3-Math.sqrt(5));let i=e,a=n,c=i+o*(a-i),l=c,g=c,f=0,h=0,u=g,I=t(u),d=1,C=I,E=I,B=.5*(i+a),Q=r*Math.abs(g)+A/3,m=2*Q;for(;Math.abs(g-B)>m-.5*(a-i);){let p=!0;if(Math.abs(h)>Q){p=!1;let N=(g-l)*(I-C),k=(g-c)*(I-E),b=(g-c)*k-(g-l)*N;if(k=2*(k-N),k>0&&(b=-b),k=Math.abs(k),N=h,h=f,Math.abs(b)<Math.abs(.5*k*N)&&b>k*(i-g)&&b<k*(a-g)){if(f=(b+0)/k,u=g+f,u-i<m||a-u<m){const D=Math.sign(B-g)+(B-g===0?1:0);f=Q*D}}else p=!0}p&&(h=g>=B?i-g:a-g,f=o*h);const w=Math.sign(f)+(f===0?1:0);u=g+w*Math.max(Math.abs(f),Q);const y=t(u);if(d+=1,y<=I?(u>=g?i=g:a=g,c=l,C=E,l=g,E=I,g=u,I=y):(u<g?i=u:a=u,y<=E||l===g?(c=l,C=E,l=u,E=y):(y<=C||c===g||c===l)&&(c=u,C=y)),B=.5*(i+a),Q=r*Math.abs(g)+A/3,m=2*Q,d>=s)break}return g}function GI(t,e,n){const A=[e[0],e[1],e[2],e[3]],s=e[n],r=c=>(A[n]=s+c,-t.logLik(A));if(!(s>=Ct[n])||!(s<=ee[n]))throw new se("A coordinate-ascent step started outside idr’s parameter box.");const o=xI(r,Ct[n]-s,ee[n]-s),i=-r(0),a=-r(o);return a>i?(e[n]+=o,a):i}function UI(t,e,n,A){let s=t.logLik(e),r=[e[0],e[1],e[2],e[3]],o=s;for(let i=0;i<n;i++){for(let c=0;c<4;c++)o=GI(t,r,c);const a=ia(r);if(a.changed)throw new se("Coordinate ascent left idr’s parameter box, which stops idr’s own fit.");if(r=a.theta,!(o+1e-6>=s))throw new se("A coordinate-ascent round lowered the likelihood, which stops idr’s own fit.");if(o-s<A)return r;s=o}return r}async function vI(t,e,n={}){const A=n.eps??$t.convergenceEps,s=n.maxIter??$t.maxIter,r=$t.pseudoValueEps,o=n.start??$t.start;let i=[o[0],o[1],o[2],o[3]],[a,c]=UA(t,e,i[0],i[1],i[3],r),l=!1,g=0;const f=new Float64Array(t.length);for(let h=0;h<s;h++){g=h+1;const u=i,I=new oa(a,c),d=LI(I,u,$t.emStepsPerRound,A/10);i=d.theta,d.changed&&(l=!0,i=UI(I,u,$t.emStepsPerRound,A/10));const C=Bt([Math.abs(i[0]-u[0]),Math.abs(i[1]-u[1]),Math.abs(i[2]-u[2]),Math.abs(i[3]-u[3])]),E=a,B=c;[a,c]=UA(t,e,i[0],i[1],i[3],r);for(let p=0;p<f.length;p++)f[p]=Math.abs(E[p]-a[p]);const Q=SA(f);for(let p=0;p<f.length;p++)f[p]=Math.abs(B[p]-c[p]);const m=Q+SA(f);if(n.between!==void 0&&await n.between(g),h>3&&C<A&&m<A)break}return{theta:i,rounds:g,coordinateAscent:l}}function TI(t,e,n){const A=$t.finalPseudoValueEps,[s,r]=UA(e,n,t[0],t[1],t[3],A),o=new oa(s,r).membership(t),i=$t.convergenceEps,a=new Float64Array(o.length);for(let c=0;c<a.length;c++){let l=1-o[c];s[c]+r[c]<0&&(l=1),a[c]=l<i?i:l>1?1:l}return a}function JI(t){const e=t.length,n=Array.from({length:e},(o,i)=>i);n.sort((o,i)=>t[o]-t[i]||o-i);const A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o<e&&t[n[o]]===t[n[r]];)s+=t[n[o]],o++;const i=s/o;for(let a=r;a<o;a++)A[n[a]]=i;r=o}return A}function vA(t){return-Math.log10(Math.max(1e-5,t))}function Xr(t){const e=t.length,n=Array.from({length:e},(s,r)=>r);n.sort((s,r)=>t[s]-t[r]||s-r);const A=new Int32Array(e);for(let s=0;s<e;s++)A[n[s]]=s;return A}const sn={width:150,times:3,minWidth:75,truncate:1e5},$I=[-1/560,8/315,-1/5,8/5,-205/72,8/5,-1/5,8/315,-1/560],YI=1e6,OI=1e-10;function _I(t,e){let n=Float64Array.from($I);const A=new Float64Array(t).fill(1/t);for(let o=0;o<e;o++)n=KI(n,A);const s=new Float64Array(n.length);for(let o=0;o<n.length;o++)s[o]=YI*n[n.length-1-o];const r=new Float64Array(s.length+1);for(let o=0;o<s.length;o++)r[o+1]=r[o]+s[o];return{width:t,times:e,values:s,cumulative:r}}function KI(t,e){const n=new Float64Array(t.length+e.length-1);for(let A=0;A<n.length;A++){let s=0;const r=Math.max(0,A-(e.length-1)),o=Math.min(A,t.length-1);for(let i=r;i<=o;i++)s+=t[i]*e[A-i];n[A]=s}return n}function Ns(t,e){return Math.min(e,t.values.length)-1>>1}function qI(t,e){const n=Ns(t,e);return{left:t.values.length-1-n,right:n}}function HI(t,e,n,A,s){const r=[],o=[],i=[],a=(l,g,f)=>{const h=i.length-1;if(h>=0&&o[h]===l&&aa(i[h],f)){o[h]=g;return}r.push(l),o.push(g),i.push(f)};let c=A;for(let l=0;l<t.length&&c<s;l++){const g=Math.max(t[l],c),f=Math.min(e[l],s);f<=g||(g>c&&a(c,g,Number.NaN),a(g,f,n[l]),c=f)}return c<s&&a(c,s,Number.NaN),{starts:Int32Array.from(r),ends:Int32Array.from(o),values:Float64Array.from(i),length:r.length}}function WI(t,e){return{starts:Int32Array.of(t),ends:Int32Array.of(e),values:Float64Array.of(0),length:1}}function PI(t,e,n){if(t.length===1)return t[0];const A=[],s=[],r=[],o=new Int32Array(t.length);let i=e;for(;i<n;){let a=n,c=0;for(let f=0;f<t.length;f++){const h=t[f];for(;o[f]<h.length&&h.ends[o[f]]<=i;)o[f]++;const u=o[f];if(u>=h.length||h.starts[u]>i)throw new Error(`pooledRuns: a track does not cover ${i}`);c+=h.values[u],h.ends[u]<a&&(a=h.ends[u])}const l=Math.fround(c/t.length),g=r.length-1;g>=0&&aa(r[g],l)?s[g]=a:(A.push(i),s.push(a),r.push(l)),i=a}return{starts:Int32Array.from(A),ends:Int32Array.from(s),values:Float64Array.from(r),length:A.length}}function aa(t,e){return t===e||t!==t&&e!==e}function Vr(t,e,n,A,s,r,o){const i=e.values.length,a=Ns(e,n),c=new Float64Array(Math.max(0,s-A));if(o===void 0)Zr(t,e,a,A,s,c,A);else{let l=0;for(;l<c.length;){const g=o.indexOf(1,l),f=g<0||g>c.length?c.length:g;if(c.fill(Number.NaN,l,f),f===c.length)break;const h=o.indexOf(0,f),u=h<0||h>c.length?c.length:h;Zr(t,e,a,A+f,A+u,c,A),l=u}}if(r!==void 0)for(let l=0;l<t.length;l++){const g=Math.max(A,t.starts[l]-a+i-1),f=Math.min(s-1,t.ends[l]-a-1);g<=f&&r.fill(1,g-A,f-A+1)}return c}function Zr(t,e,n,A,s,r,o){const i=e.values.length,a=e.values,c=e.cumulative,l=t.starts,g=t.ends,f=t.values,h=A+n+1,u=s+n,I=-(n+1)-o;let d=0,C=t.length;for(;d<C;){const Q=d+C>>>1;g[Q]>h-i?C=Q:d=Q+1}const E=c[0],B=c[i];for(;d<t.length;d++){const Q=l[d];if(Q+1>u)break;const m=g[d],p=f[d];let w=Q+1>h?Q+1:h,y=m-1<Q+i?m-1:Q+i;if(y>u&&(y=u),w<=y){let k=w;k===Q+1&&(r[I+k]+=p*a[0],k++);for(let b=I+k,D=k-Q,F=I+y;b<=F;b++,D++)r[b]+=p*(c[D]-E)}if(w=m>h?m:h,y=Q+i<u?Q+i:u,w<=y)if(m-Q===1)for(let k=I+w,b=w-1-Q,D=I+y;k<=D;k++,b++)r[k]+=p*a[b];else for(let k=I+w,b=w-Q,D=w-m,F=I+y;k<=F;k++,b++,D++)r[k]+=p*(c[b]-c[D]);if(w=Q+i+1>h?Q+i+1:h,y=m-1<u?m-1:u,w<=y){const k=p*(B-E);for(let b=I+w,D=I+y;b<=D;b++)r[b]+=k}w=m>Q+i+1?m:Q+i+1,w<h&&(w=h);const N=m+i-1;if(y=N<u?N:u,w<=y){const k=I+(y===N?y-1:y);for(let b=I+w,D=w-m;b<=k;b++,D++)r[b]+=p*(B-c[D]);y===N&&(r[I+N]+=p*a[i-1])}}}const zI=65536;function ca(t){return Math.fround(t)<OI}function XI(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)ca(t[n])&&(e[n]=1);return e}class jr{constructor(e,n,A){this.contig=e,this.length=n,this.tracks=A.length,this.absent=A,this.scores=A.map(()=>[]),this.held=A.map(()=>new Float64Array(1024))}tracks;absent;starts=[];ends=[];modes=[];flats=[];scores;previous=!1;rose=!1;open=-1;best=Number.NEGATIVE_INFINITY;ties=[];held;heldLength=0;openFlat=0;position=0;feed(e,n,A,s){if(e!==this.position)throw new Error(`ConcaveScan: fed ${e} after ${this.position}`);for(let r=0;r<n.length;r++){const o=e+r,i=Math.fround(n[r]),a=ca(i);if(o===0?a&&this.begin(0):a&&!this.previous?(this.rose=!0,this.begin(o)):!a&&this.previous&&this.close(o),a){const c=-i;c>this.best?(this.best=c,this.ties=[o]):c===this.best&&this.ties.push(o),this.hold(A,r),s!==void 0&&s[r]===1&&(this.openFlat=1)}this.previous=a}this.position=e+n.length}finish(){if(this.open>=0&&this.close(this.length),!this.rose){this.starts=[],this.ends=[],this.modes=[],this.flats=[];for(const e of this.scores)e.length=0}return{contig:this.contig,starts:Int32Array.from(this.starts),ends:Int32Array.from(this.ends),modes:Int32Array.from(this.modes),scores:this.scores.map(e=>Float64Array.from(e)),flat:Uint8Array.from(this.flats)}}begin(e){this.open=e,this.best=Number.NEGATIVE_INFINITY,this.ties=[],this.heldLength=0,this.openFlat=0,this.held[0].length>zI&&(this.held=this.held.map(()=>new Float64Array(1024)))}hold(e,n){this.heldLength===this.held[0].length&&(this.held=this.held.map(A=>{const s=new Float64Array(A.length*2);return s.set(A),s}));for(let A=0;A<this.tracks;A++)this.held[A][this.heldLength]=e[A][n];this.heldLength++}close(e){this.starts.push(this.open),this.ends.push(e),this.flats.push(this.openFlat),this.modes.push(this.ties.length===0?this.open:this.ties[this.ties.length>>1]);for(let n=0;n<this.tracks;n++)this.scores[n].push(this.absent[n]?Number.NEGATIVE_INFINITY:-SA(this.held[n],0,this.heldLength));this.open=-1}}function VI(t){const e=t.length,n=Array.from({length:e},(r,o)=>o);n.sort((r,o)=>t[o]-t[r]||r-o);const A=new Float64Array(e);let s=0;for(;s<e;){let r=s+1;for(;r<e&&t[n[r]]===t[n[s]];)r++;const o=(s+1+r)/2;for(let i=s;i<r;i++)A[n[i]]=o;s=r}return A}function ZI(t,e,n,A,s){const r=e.length,o=new Float64Array(r).fill(Number.POSITIVE_INFINITY);for(const l of A){const g=VI(l);for(let f=0;f<r;f++)g[f]<o[f]&&(o[f]=g[f])}const i=(l,g)=>t[l]<t[g]?-1:t[l]>t[g]?1:e[l]-e[g]||n[l]-n[g],a=Array.from({length:r},(l,g)=>g);a.sort((l,g)=>o[l]-o[g]||i(l,g));const c=a.slice(0,Math.max(0,Math.min(r,s)));return c.sort(i),Int32Array.from(c)}class jI{constructor(e,n,A={}){this.tracks=e,this.limit=n,this.scores=Array.from({length:e},()=>new Float64Array(1024)),this.floor=new Float64Array(e).fill(Number.NEGATIVE_INFINITY),A.prune===!1&&(this.holdAll=!0),this.below=A.below===!0?new Float64Array(1024):null}size=0;contigs=[];starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;floor;seen=0;dropped=0;holdAll=!1;below;belowSize=0;add(e,n){this.seen++;let A=this.holdAll;for(let r=0;r<this.tracks;r++){const o=e.scores[r][n];o!==o&&!this.holdAll&&(this.holdAll=!0,A=!0),o>=this.floor[r]&&(A=!0)}if(!A){this.drop(e.scores[0][n],e.flat[n]);return}this.size===this.starts.length&&this.grow();const s=this.size++;this.contigs[s]=e.contig,this.starts[s]=e.starts[n],this.ends[s]=e.ends[n],this.modes[s]=e.modes[n],this.flats[s]=e.flat[n];for(let r=0;r<this.tracks;r++)this.scores[r][s]=e.scores[r][n];!this.holdAll&&this.size>=2*this.tracks*this.limit+1024&&this.prune()}finish(){this.holdAll||this.prune();const e=this.size,n={contig:this.contigs.slice(0,e),starts:this.starts.slice(0,e),ends:this.ends.slice(0,e),modes:this.modes.slice(0,e),flat:this.flats.slice(0,e),scores:this.scores.map(A=>A.slice(0,e))};return{...n,tested:ZI(n.contig,n.starts,n.ends,n.scores,this.limit),below:this.below===null?new Float64Array(0):this.below.slice(0,this.belowSize),exact:!(this.holdAll&&this.dropped>0)}}prune(){if(this.seen<this.limit)return;const e=this.size;for(let A=0;A<this.tracks;A++){const s=this.scores[A].slice(0,e).sort();this.floor[A]=s[e-this.limit]}let n=0;for(let A=0;A<e;A++){let s=!1;for(let r=0;r<this.tracks;r++)this.scores[r][A]>=this.floor[r]&&(s=!0);if(!s){this.drop(this.scores[0][A],this.flats[A]);continue}if(n!==A){this.contigs[n]=this.contigs[A],this.starts[n]=this.starts[A],this.ends[n]=this.ends[A],this.modes[n]=this.modes[A],this.flats[n]=this.flats[A];for(let r=0;r<this.tracks;r++)this.scores[r][n]=this.scores[r][A]}n++}this.size=n,this.contigs.length=n}drop(e,n){if(this.dropped++,!(this.below===null||!(e>0)||n===1)){if(this.belowSize===this.below.length){const A=new Float64Array(this.below.length*2);A.set(this.below),this.below=A}this.below[this.belowSize++]=e}}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}function td(t,e,n,A,s){return A>0?[Math.max(0,n-A),Math.min(s,n+A+1)]:[t,e]}function la(t){return-(Math.log(t)/Math.log(10))}const ga=[.001,.005,.01,.05,.1,.2],lA="0.05";function fa(t){return typeof t.replicate=="string"&&t.replicate!==""}const ed="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",nd=8,Ad=-1,sd=-2;let ge;function rd(){if(ge!==void 0)return ge;ge=null;try{if(typeof WebAssembly>"u")return null;const t=atob(ed),e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=t.charCodeAt(n);WebAssembly.validate(e)&&(ge=new WebAssembly.Module(e))}catch{ge=null}return ge}class TA extends Error{constructor(){super("The peak-calling kernel ran out of memory."),this.name="KernelMemoryError"}}class od{size=0;starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;constructor(e){this.scores=Array.from({length:e},()=>new Float64Array(1024))}take(e,n,A){if(A===0)return;for(;this.size+A>this.starts.length;)this.grow();const s=e.buffer,r=n.scan_region_capacity();this.starts.set(new Int32Array(s,n.scan_region_starts()>>>0,A),this.size),this.ends.set(new Int32Array(s,n.scan_region_ends()>>>0,A),this.size),this.modes.set(new Int32Array(s,n.scan_region_modes()>>>0,A),this.size),this.flats.set(new Uint8Array(s,n.scan_region_flats()>>>0,A),this.size);const o=n.scan_regions()>>>0;this.scores.forEach((i,a)=>i.set(new Float64Array(s,o+a*r*8,A),this.size)),this.size+=A}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}class ks{constructor(e,n,A,s){this.memory=e,this.exports=n,this.contig=A,this.tracks=s,this.collected=new od(s)}collected;static open(e,n,A,s,r){const o=rd();if(o===null||s<1||s>nd)return null;try{const i=new WebAssembly.Memory({initial:2}),c=new WebAssembly.Instance(o,{env:{memory:i}}).exports,l=e.values.length;if(c.scan_open(s,l,Ns(e,A),A,r)!==0)return null;const g=c.scan_kernel()>>>0;return new Float64Array(i.buffer,g,l).set(e.values),new Float64Array(i.buffer,g+l*8,l+1).set(e.cumulative),new ks(i,c,n,s)}catch{return null}}window(e,n,A,s,r){let o=0;for(let i=0;i<this.tracks;i++){const a=r[i];if(a===null){o|=1<<i;continue}const c=a.starts.length,l=this.exports.scan_input(i,c)>>>0;if(l===0)throw new TA;const g=this.memory.buffer;new Float64Array(g,l,c).set(a.values),new Int32Array(g,l+c*8,c).set(a.starts),new Int32Array(g,l+c*12,c).set(a.ends)}this.closed(this.exports.scan_window(e,n,A,s,o),e)}lastWindow(e){const n=this.memory.buffer;return{pooled:new Float64Array(n,this.exports.scan_pooled()>>>0,e).slice(),flat:new Uint8Array(n,this.exports.scan_flat()>>>0,e).slice(),own:Array.from({length:this.tracks},(A,s)=>new Float64Array(n,this.exports.scan_own(s)>>>0,e).slice())}}finish(){this.closed(this.exports.scan_finish(),-1);const{collected:e}=this,n=this.exports.scan_rose()===1?e.size:0;return{contig:this.contig,starts:e.starts.slice(0,n),ends:e.ends.slice(0,n),modes:e.modes.slice(0,n),scores:e.scores.map(A=>A.slice(0,n)),flat:e.flats.slice(0,n)}}closed(e,n){if(e===Ad)throw new TA;if(e===sd)throw new Error(`ConcaveScan: fed ${n} out of order`);if(e<0)throw new Error(`pooledRuns: a track does not cover a window at ${n}`);this.collected.take(this.memory,this.exports,e)}}const gA=1<<18,to=20,rn=2e4,eo=["#0072b2","#009e73"],id="#999999",ad=async t=>{const e=at(t.params,"signal");if(e===null)return t.note("No track was chosen. Load a bigWig and pick it under Track."),[];const n=fa(t.params)?at(t.params,"replicate"):null;if(n===e)return t.note("The replicate chosen is the track being called, and a track cannot test itself. Choose a second track, or none."),[];const A=n===null?[e]:[e,n],s=L=>t.inputs.labels?.[L]??L,r=Re(T(t.params,"width",sn.width),1,2e3),o=Re(T(t.params,"times",sn.times),0,10),i=Re(T(t.params,"minWidth",sn.minWidth),1,1e9),a=Re(T(t.params,"halfWidth",0),0,1e9),c=Re(T(t.params,"truncate",sn.truncate),1,1e9),l=ld(t),g=t.inputs.contigLengths??{},f=On(t.params,"sequences"),h=Object.keys(g).filter(L=>g[L]>0&&(f===null||f.includes(L)));if(h.length===0)return t.note(f!==null&&f.length===0?"No sequence is ticked, so there is nothing to call peaks on.":"This session knows no sequence lengths, so there is nothing to scan. Load a chrom.sizes, or the map itself."),[];const u=_I(r,o),I=L=>cd(t,A,h,g,u,{minWidth:i,truncate:c,below:n===null,prune:L});let d=await I(!0);if(typeof d!="string"&&!d.held.exact&&(d=await I(!1)),typeof d=="string")return t.note(d),[];const{held:C,found:E,n:B,perSequence:Q,absentOn:m}=d;for(let L=0;L<A.length;L++){if(m[L].length===h.length)return t.note(`${s(A[L])} has none of the ${h.length===1?"sequence":"sequences"} ticked. Check that it and the assembly name their sequences the same way.`),[];m[L].length>0&&t.note(`${s(A[L])} has no ${Qd(m[L])}. yapc reads a track that lacks a sequence as zeros there, so it lowers the mean the regions are called on, and ranks every region there last by it.`)}const p=`${u.values.length}-tap kernel: a ${r.toLocaleString()} bp window, ${o} ${o===1?"pass":"passes"}`;if(B===0)return t.note(`No concave region at least ${i.toLocaleString()} bp wide on ${h.length===1?h[0]:`${h.length} sequences`} (${p}). A wider smoothing window finds broader shapes; a narrower minimum keeps smaller ones.`),[];const{contig:w,starts:y,ends:N,modes:k,flat:b,scores:D,tested:F}=C;t.note(`${E.toLocaleString()} concave ${E===1?"region":"regions"} on ${h.length.toLocaleString()} ${h.length===1?"sequence":"sequences"} (${p}), ${B.toLocaleString()} at least ${i.toLocaleString()} bp wide`+(F.length<B?`, of which the ${F.length.toLocaleString()} strongest by each track’s curvature rank were kept.`:"."));let R=null,v=null,x=null;const Y=new Uint8Array(F.length).fill(1);if(n!==null)if(F.length<to)t.note(`IDR needs at least ${to} peaks to fit — its own command refuses fewer — and there ${F.length===1?"is 1":`are ${F.length}`}. They are reported untested, ranked by curvature.`);else{const L=Xr(on(D[0],F)),$=Xr(on(D[1],F)),Dt=so(on(D[0],F))+so(on(D[1],F));Dt>0&&t.note(`${Dt.toLocaleString()} ${Dt===1?"score ties":"scores tie"} with another: ranked by position, where yapc breaks a tie at random.`);try{R=await vI(L,$,{between:async P=>{t.progress(0,0,`IDR, round ${P}`),await Bs(),t.throwIfCancelled()}})}catch(P){throw P instanceof se?new Error(`IDR could not fit these two tracks, as idr itself could not: ${P.message}`):P}v=TI(R.theta,L,$),x=JI(v);const Ut=la(l);for(let P=0;P<F.length;P++)Y[P]=vA(x[P])>=Ut?1:0;t.note(gd(R,F.length,dd(Y),l))}else{let L=0;for(let $=0;$<F.length;$++)b[F[$]]!==0&&(Y[$]=0,L++);L>0&&t.note(`${L.toLocaleString()} of the candidates ${L===1?"is":"are"} flat — the signal constant across a whole kernel’s width inside, which yapc’s test counts as concave — and ${L===1?"is":"are"} left out, as IDR would leave ${L===1?"it":"them"} out of two replicates.`),t.note("One track, so no test of significance: yapc’s cut is IDR between two replicates. These are the strongest concave regions by curvature — choose a replicate to test them, or lower “keep the strongest” to the upper of the two populations in the figure.")}const J=new Map(h.map((L,$)=>[L,$])),K=[];for(let L=0;L<F.length;L++)Y[L]===1&&K.push(L);K.sort((L,$)=>(J.get(w[F[L]])??0)-(J.get(w[F[$]])??0)||y[F[L]]-y[F[$]]);const V=new et;let H=0,ht=0;for(const L of K){const $=F[L],[Dt,Ut]=td(y[$],N[$],k[$],a,g[w[$]]);a>0&&(Dt!==k[$]-a||Ut!==k[$]+a+1)&&H++;const P=[`summit ${(k[$]+1).toLocaleString("en-US")}`];P.push(`curvature ${A.map(($Q,sc)=>ro(D[sc][$])).join(" / ")}`),x!==null&&P.push(`IDR ${ro(x[L])}`),V.add(w[$],Dt,Ut,{name:`peak_${++ht}`,score:x!==null?vA(x[L]):D[0][$],cds:[k[$],k[$]+1],detail:P.join(ct)})}H>0&&t.note(`${H.toLocaleString()} ${H===1?"peak reaches":"peaks reach"} past a sequence end at this half-width and ${H===1?"is":"are"} cut at it; yapc writes the coordinate past the end.`),K.length===0&&t.note(`No peak passes IDR ≤ ${l}. A looser threshold keeps more; two tracks that are not replicates of one experiment will pass few at any.`);const Gt=[];K.length>0&&Gt.push({kind:"intervals",id:`peaks-${A.map(L=>L.replace(/[^A-Za-z0-9_]+/g,"_")).join("-")}`,label:n===null?`Peaks · ${s(e)} · no IDR`:`Peaks · ${s(e)} + ${s(n)} · IDR ≤ ${l}`,payload:{kind:"features",data:V.finish()},noun:{one:"peak",many:"peaks"},lane:{under:{entry:e}},display:"lane",look:"point"});const q=fd(A.map(s),D,F,Y,n!==null,b,C.below);return q!==null&&Gt.push(q),Gt.push(hd(h,g,Q,K.map(L=>w[F[L]]))),R!==null&&x!==null&&Gt.push(ud(x,l)),Lt(t.params,"perPeak",!1)&&Gt.push(Id({names:A.map(s),contig:w,starts:y,ends:N,modes:k,scores:D,tested:F,passes:Y,local:v,global:x,replicate:n!==null})),t.progress(1,1,"done"),Gt};async function cd(t,e,n,A,s,r){const o=n.reduce((h,u)=>h+A[u],0);let i=0;const a=new jI(e.length,r.truncate,{prune:r.prune,below:r.below}),c=e.map(()=>[]),l=new Map;let g=0,f=0;for(const h of n){const u=await ha(t,e,h,A[h],s,C=>{i+=C,t.progress(i,o,h)});if(typeof u=="string")return u;const{regions:I}=u;let d=0;for(let C=0;C<I.starts.length;C++)I.ends[C]-I.starts[C]<r.minWidth||(d++,a.add(I,C));g+=I.starts.length,f+=d,l.set(h,{regions:I.starts.length,wide:d}),u.absent.forEach((C,E)=>{C&&c[E].push(h)})}return{held:a.finish(),found:g,n:f,perSequence:l,absentOn:c}}async function ha(t,e,n,A,s,r,o="auto"){const{left:i,right:a}=qI(s,A),c=e.map(()=>!1),l=o==="js"?null:ks.open(s,n,A,e.length,gA);let g=null,f=0;try{for(let h=0;h<A;h+=gA){const u=Math.min(A,h+gA),I=Math.max(0,h-i),d=Math.min(A,u+a),C=[];for(let E=0;E<e.length;E++){if(c[E]){C.push(null);continue}const B=await t.sample(e[E],[{contig:n,start:I,end:d}],1);if(B.note!==void 0)return B.note;const Q=B.regions[0];Q===void 0&&(c[E]=!0),C.push(Q??null)}if(l!==null)l.window(h,u,I,d,C);else{const E=C.map(w=>w===null?WI(I,d):HI(w.starts,w.ends,w.values,I,d));g??=new jr(n,A,c);const B=new Uint8Array(u-h),Q=Vr(PI(E,I,d),s,A,h,u,B),m=e.length===1?null:XI(Q),p=m===null?[Q]:E.map(w=>Vr(w,s,A,h,u,void 0,m));g.feed(h,Q,p,B)}r(u-h),f+=u-h,await Bs(),t.throwIfCancelled()}}catch(h){if(!(h instanceof TA))throw h;return r(-f),ha(t,e,n,A,s,r,"js")}return l!==null?{regions:l.finish(),absent:c}:{regions:(g??new jr(n,A,c)).finish(),absent:c}}function ld(t){const e=Number(st(t.params,"idr",lA));return ga.includes(e)?e:(fa(t.params)&&t.note(`An IDR threshold of ${st(t.params,"idr","")} is not one yapc writes; ${lA} was used.`),Number(lA))}const no=["mean","spread","correlation","reproducible share"];function gd(t,e,n,A){const[s,r,o,i]=t.theta,a=`IDR fitted over ${e.toLocaleString()} peaks in ${t.rounds.toLocaleString()} rounds: μ ${s.toFixed(2)}, σ ${r.toFixed(2)}, ρ ${o.toFixed(2)}, reproducible share ${i.toFixed(2)}; ${n.toLocaleString()} pass IDR ≤ ${A}.`,c=[],l=g=>Number.isInteger(g)?String(g):g.toFixed(2);return t.theta.forEach((g,f)=>{const[h,u]=[Or.min[f],Or.max[f]];g<=h+1e-4*Math.max(1,h)?c.push(`the ${no[f]} at its floor of ${l(h)}`):g>=u-1e-4*Math.max(1,u)&&c.push(`the ${no[f]} at its ceiling of ${l(u)}`)}),c.length===0?a:`${a} The fit ended at the edge of IDR’s parameter box — ${c.join(", ")} — which is where two tracks that do not rank their peaks like replicates of one experiment put it. Read these IDRs as that, not as reproducibility.`}function fd(t,e,n,A,s,r,o){const i=[],a=new Uint8Array(r.length);for(const f of n)a[f]=1;for(let f=0;f<e.length;f++){const h=[],u=[];if(n.forEach((E,B)=>{const Q=e[f][E];!(Q>0)||!s&&r[E]===1||(A[B]===1?h.push(Q):u.push(Q))}),!s){for(let E=0;E<r.length;E++)a[E]===0&&e[f][E]>0&&r[E]===0&&u.push(e[f][E]);for(const E of o)u.push(E)}const I=e.length===1?"":`${t[f]} · `,d=s?`${I}passes IDR`:`${I}peaks`,C=s?`${I}fails IDR`:`${I}below the cut`;h.length>0&&i.push(Ao(d,h,eo[f]??eo[0])),u.length>0&&i.push(Ao(C,u,id))}if(i.length===0)return null;const c=i.flatMap(f=>Array.from(f.y)),l=Cd(c,.01);let g=Number.NEGATIVE_INFINITY;for(const f of c)f>g&&(g=f);return{kind:"curve",id:"peaks-curvature",label:"Curvature of every candidate",series:i,xLabel:"",yLabel:"Curvature (yapc score)",xScale:"linear",yScale:"log",...Number.isFinite(l)&&l>0&&g>l?{yDomain:[10**Math.floor(Math.log10(l)),10**Math.ceil(Math.log10(g))]}:{}}}function Ao(t,e,n){const A=Float64Array.from(e).sort();let s=A;if(A.length>rn){s=new Float64Array(rn);for(let r=0;r<rn;r++)s[r]=A[Math.round(r*(A.length-1)/(rn-1))]}return{name:t,x:Float64Array.from(s,(r,o)=>o),y:s,colour:n,n:e.length,mark:"violin"}}function hd(t,e,n,A){const s=new Map;for(const r of A)s.set(r,(s.get(r)??0)+1);return{kind:"table",id:"peaks-sequences",label:"Per sequence",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"length",label:"Length",kind:"number"},{key:"regions",label:"Concave regions",kind:"number"},{key:"wide",label:"Wide enough",kind:"number"},{key:"peaks",label:"Peaks",kind:"number"},{key:"density",label:"Peaks per Mb",kind:"number",digits:1}],rows:t.map(r=>{const o=n.get(r)??{regions:0,wide:0},i=s.get(r)??0;return{sequence:r,length:e[r],regions:o.regions,wide:o.wide,peaks:i,density:i/e[r]*1e6}})}}function ud(t,e){const n=t.length;return{kind:"table",id:"peaks-idr",label:"IDR thresholds",columns:[{key:"threshold",label:"IDR ≤",kind:"text"},{key:"peaks",label:"Peaks",kind:"number"},{key:"share",label:"Share of tested",kind:"number",digits:3},{key:"drawn",label:"Drawn",kind:"text"}],rows:ga.map(A=>{const s=la(A);let r=0;for(let o=0;o<n;o++)vA(t[o])>=s&&r++;return{threshold:String(A),peaks:r,share:r/n,drawn:A===e?"yes":""}})}}function Id(t){const{names:e,contig:n,starts:A,ends:s,modes:r,scores:o,tested:i,passes:a,local:c,global:l}=t,g=[];return i.forEach((f,h)=>{const u={sequence:n[f],start:A[f],end:s[f],summit:r[f],width:s[f]-A[f]};o.forEach((I,d)=>{u[`curvature${d}`]=I[f]}),c!==null&&l!==null&&(u.local=c[h],u.idr=l[h],u.passes=a[h]===1?"yes":"no"),g.push(u)}),l!==null?g.sort((f,h)=>Number(f.idr)-Number(h.idr)):g.sort((f,h)=>Number(h.curvature0)-Number(f.curvature0)),{kind:"table",id:"peaks-list",label:t.replicate?"Every peak tested":"Every peak",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"summit",label:"Summit",kind:"number",coordinate:"start",hint:"The most concave base."},{key:"width",label:"Width",kind:"number"},...e.map((f,h)=>({key:`curvature${h}`,label:e.length===1?"Curvature":`Curvature · ${f}`,kind:"number",digits:2})),...c!==null?[{key:"local",label:"Local IDR",kind:"number",digits:4,scientific:!0},{key:"idr",label:"IDR",kind:"number",digits:4,scientific:!0},{key:"passes",label:"Passes",kind:"text"}]:[]],rows:g}}function Re(t,e,n){return Math.min(n,Math.max(e,Math.round(t)))}function on(t,e){const n=new Float64Array(e.length);for(let A=0;A<e.length;A++)n[A]=t[e[A]];return n}function dd(t){let e=0;for(const n of t)e+=n;return e}function so(t){const e=Float64Array.from(t).sort();let n=0;for(let A=1;A<e.length;A++)e[A]===e[A-1]&&n++;return n}function Cd(t,e){if(t.length===0)return Number.NaN;const n=Float64Array.from(t).sort(),A=e*(n.length-1),s=Math.floor(A),r=Math.min(n.length-1,s+1);return n[s]+(A-s)*(n[r]-n[s])}function ro(t){return Number.isFinite(t)?Number(t.toPrecision(4)).toLocaleString("en-US",{maximumSignificantDigits:4}):t>0?"∞":t<0?"−∞":"—"}function Qd(t){return t.length===1?t[0]:t.length<=3?`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`:`${t.slice(0,3).join(", ")} and ${(t.length-3).toLocaleString()} more`}const ua=[{name:"DpnII",site:"GATC",cut:0},{name:"HindIII",site:"AAGCTT",cut:1},{name:"NcoI",site:"CCATGG",cut:1},{name:"EcoRI",site:"GAATTC",cut:1},{name:"BglII",site:"AGATCT",cut:1},{name:"HinfI",site:"GANTC",cut:1},{name:"DdeI",site:"CTNAG",cut:1},{name:"MseI",site:"TTAA",cut:1},{name:"NlaIII",site:"CATG",cut:4},{name:"CviQI",site:"GTAC",cut:1},{name:"AluI",site:"AGCT",cut:2}],Bd={MboI:"DpnII",Sau3AI:"DpnII",Csp6I:"CviQI"},Sn={Arima:["DpnII","HinfI"]},Ed=(()=>{const t=new Map;for(const e of ua)t.set(e.name.toLowerCase(),e);for(const[e,n]of Object.entries(Bd)){const A=t.get(n.toLowerCase());A!==void 0&&t.set(e.toLowerCase(),A)}return t})();function an(t){return Ed.get(t.trim().toLowerCase())}function Rn(t){const e=t.trim().toLowerCase();return Object.keys(Sn).find(n=>n.toLowerCase()===e)}function Ia(t){return`${t.site.slice(0,t.cut)}^${t.site.slice(t.cut)}`}function md(t){return t.site.length-2*t.cut}const wd=1/256,oo=255;function io(t){let e=1;for(const n of t){let A=0;for(let s=n;s!==0;s&=s-1)A++;e*=A/4}return e}function pd(t){const e=t.toUpperCase().replace(/U/g,"T"),n=e.indexOf("^"),A=e.replace("^","");if(n<0){const r=Oe(A);return{refusal:Ye(r)?`“${t}” is neither an enzyme this knows nor a site in IUPAC letters with a ^ where it cuts.`:`“${t}” needs a ^ where the enzyme cuts the top strand, as in ^GATC or G^ANTC.`}}if(A.includes("^"))return{refusal:`“${t}” has more than one ^, and a site is cut in one place.`};const s=Oe(A);return Ye(s)?{refusal:s.reason}:io(s)>wd?{refusal:`“${t}” would cut every ${Math.round(1/io(s))} bases or so; a site needs at least the specificity of a four-base cutter.`}:{name:`${e.slice(0,n)}^${e.slice(n+1)}`,site:A,cut:n}}function yd(t,e){const n=t.trim();if(n===""||n==="none")return[];if(n!=="custom"){const i=Rn(n);if(i!==void 0)return Sn[i].map(c=>an(c));const a=an(n);return a===void 0?{refusal:`“${n}” is not an enzyme or a kit this knows. Pick one, or type its site under custom.`}:[a]}const A=e.split(/[\s,;]+/).filter(i=>i!=="");if(A.length===0)return{refusal:"Type an enzyme or a site, such as DpnII or G^ANTC."};const s=[],r=new Set,o=i=>{const a=`${i.site}^${i.cut}`;r.has(a)||(r.add(a),s.push(i))};for(const i of A){const a=Rn(i);if(a!==void 0){for(const g of Sn[a])o(an(g));continue}const c=an(i);if(c!==void 0){o(c);continue}const l=pd(i);if("refusal"in l)return l;o(l)}return s.length>oo?{refusal:`That is ${s.length} enzymes, and one digest takes ${oo} at most.`}:s}function Nd(t){return t.map(e=>e.name).join("+")}function kd(t){let e=0;for(const n of t)e=Math.max(e,n.site.length);return Math.max(0,e-1)}const ao=new Map;function bd(t){const e=`${t.site}^${t.cut}`,n=ao.get(e);if(n!==void 0)return n;const A=Oe(t.site);if(Ye(A))throw new Error(`${t.name}: ${A.reason}`);const s={motif:A,offset:t.cut};return ao.set(e,s),s}const Qe=256;function da(t,e,n,A,s){const r=t.subarray(0,e).sort();let o=0,i=Number.NaN;for(let c=0;c<r.length;c++){const l=Math.floor(r[c]/Qe);l===i||!(l>A&&l<s)||(i=l,r[o++]=r[c])}const a={top:new Int32Array(o),bottom:new Int32Array(o),enzyme:new Uint8Array(o)};for(let c=0;c<o;c++){const l=Math.floor(r[c]/Qe),g=r[c]-l*Qe;a.top[c]=l,a.bottom[c]=l+n[g],a.enzyme[c]=g}return a}function Dd(t,e,n=0){let A=new Float64Array(Math.max(16,t.length>>7)),s=0;e.forEach((o,i)=>{const a=bd(o),{hits:c}=ps(t,a.motif,{bothStrands:!0,offset:n});if(s+c.length>A.length){const l=new Float64Array(Math.max(A.length*2,s+c.length));l.set(A.subarray(0,s)),A=l}for(const l of c)A[s++]=(l.start+a.offset)*Qe+i});const r=Int32Array.from(e,md);return da(A,s,r,Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY)}function Md(t,e){let n=0;for(const o of t)n+=o.top.length;const A=new Float64Array(n),s=new Int32Array(Qe);let r=0;for(const o of t)for(let i=0;i<o.top.length;i++)A[r++]=o.top[i]*Qe+o.enzyme[i],s[o.enzyme[i]]=o.bottom[i]-o.top[i];return da(A,r,s,0,e)}const Fd=16e6;[...ua.map(t=>({value:t.name,label:`${t.name} (${Ia(t)})`})),...Object.entries(Sn).map(([t,e])=>({value:t,label:`${t} (${e.join(" + ")})`}))];function Sd(t){const e=typeof t.enzyme=="string"?t.enzyme:"none",n=typeof t.sites=="string"?t.sites:"";return{choice:e,sites:n}}async function Rd(t,e,n={}){const A=n.contigs??t.contigs,s=kd(e),r=Math.max(1,Math.floor(n.piece??Fd)),o=t.read?.bind(t),i=A.reduce((l,g)=>l+g.length,0);let a=0;const c=[];for(const l of A){const g=o===void 0?t.bases(l.name):void 0;if(o===void 0&&g===void 0)continue;const f=g?.length??l.length,h=[];let u=!0;for(let I=0;I<f;I+=r){n.throwIfCancelled?.();const d=Math.min(f,I+r),C=Math.min(f,d+s),E=g!==void 0?g.subarray(I,C):await o?.(l.name,I,C);if(E===void 0){u=!1;break}h.push(Dd(E,e,I)),a+=d-I,n.progress?.(a,i,l.name)}u&&c.push({contig:l.name,length:f,cuts:Md(h,f)})}return c}function Ld(t,e){const n=Nd(e),A=Rn(t);return A===void 0?n:`${A} (${n})`}function xd(t,e){const n=Rn(t);return n!==void 0?n.replace(/[^A-Za-z0-9]/g,""):e.map(A=>A.name.replace(/\^/g,"_").replace(/[^A-Za-z0-9_]/g,"")).join("-")}const Gd=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to cut."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const{choice:A,sites:s}=Sd(t.params),r=yd(A,s);if(!Array.isArray(r))return t.note(r.refusal),[];if(r.length===0)return t.note("No enzyme was chosen, so there is nothing to cut."),[];const o=On(t.params,"sequences");if(o!==null&&o.length===0)return t.note("No sequence is ticked, so there is nothing to cut."),[];const i=Object.entries(t.inputs.contigLengths??{}).filter(([,Q])=>Q>0).map(([Q])=>Q),a=ji(n,o,i);if(a.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to cut."),[];const c=a.length===n.contigs.length;t.progress(0,1,a.length===1?`cutting ${a[0].name}`:`cutting ${a.length.toLocaleString()} sequences`);const l=await Rd(n,r,{contigs:a,progress:(Q,m,p)=>t.progress(Q,m,`cutting ${p}`),throwIfCancelled:()=>t.throwIfCancelled()});if(t.progress(1,1,"done"),l.length===0)return t.note("None of the ticked sequences could be read from this reference."),[];const g=Ld(A,r),f=c?g:a.length<=3?`${g} on ${a.map(Q=>Q.name).join(", ")}`:`${g} on ${a.length.toLocaleString()} sequences`;let h=0,u=0;for(const Q of l)h+=Q.cuts.top.length,u+=Q.length;const I=h+l.length;t.note(h===0?`No ${g} site anywhere in ${c?"this reference":"the sequences ticked"}, so each sequence is one fragment.`:`${h.toLocaleString()} ${g} ${h===1?"cut":"cuts"} on ${l.length.toLocaleString()} ${l.length===1?"sequence":"sequences"}: ${I.toLocaleString()} fragments, ${Math.round(u/I).toLocaleString()} bp long on average.`);const d=`restriction-${xd(A,r)}${c?"":Ud(a)}`,C=vd(l,r),E=[Td(C,f,d)],B=Jd(t,C,f,d);return B!==null&&E.push(B),E};function Ud(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
17
|
-
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function
|
|
18
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!
|
|
19
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!n&&c.length!==4||!
|
|
20
|
-
`,s);i<0&&(i=r);let a=i;a>s&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(s,a);if(s=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=
|
|
21
|
-
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o===""||o.charCodeAt(0)===35||o.startsWith("track ")||o.startsWith("browser "))continue;const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(
|
|
22
|
-
`,A);r<0&&(r=s);let o=r;o>A&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(A,o);if(A=r+1,!(i===""||i.charCodeAt(0)===35)){if(i.startsWith("track ")){/junction/i.test(i)&&(n=!0);continue}i.startsWith("browser ")||e.push(i.includes(" ")?i.split(" "):i.trim().split(/\s+/))}}return{rows:e,declared:n}}function
|
|
23
|
-
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!
|
|
24
|
-
`)){let A=n;A.endsWith("\r")&&(A=A.slice(0,-1)),!(A===""||A.charCodeAt(0)===35)&&(A.startsWith("track ")||A.startsWith("browser ")||e(A.includes(" ")?A.split(" "):A.trim().split(/\s+/)))}}function UC(t){return/\b(percentMod|percentMeth|fractionModified)\b/.test(t)&&/\b(validCov|coverage|Nvalid_cov)\b/.test(t)}function vC(t){const e=t.codes.find(s=>s.code===t.drawn),n=[`${t.signal.length.toLocaleString()} ${e?.label??t.drawn} calls`,`${t.meanCoverage.toFixed(1)}× mean depth`],A=t.codes.filter(s=>s.code!==t.drawn);return A.length>0&&n.push(`not drawn: ${A.map(s=>`${s.label} (${s.rows.toLocaleString()})`).join(", ")}`),n.join(" · ")}const Gn=440477507,Un=".2bit",Ja=16,TC=new Uint8Array([84,67,65,71]),JC=78;function $a(t){if(t.length<4)return!1;const e=new DataView(t.buffer,t.byteOffset,4);return e.getUint32(0,!0)===Gn||e.getUint32(0,!1)===Gn}function $C(t){if(t.length<Ja)throw new Error("This file starts like a .2bit and is too short to hold one.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint32(0,!0)===Gn;if(!n&&e.getUint32(0,!1)!==Gn)throw new Error("This is not a .2bit: its first four bytes are not the format’s signature.");const A=e.getUint32(4,n);if(A!==0)throw new Error(`This is a .2bit of version ${A}. This viewer reads version 0 — the ordinary one, with 32-bit offsets. Version 1 is the “long” variant for files past 4 GB, whose offsets and sizes are 64-bit, and reading one as though it were version 0 would return wrong residues rather than fail. Convert it with \`twoBitToFa\` and \`faToTwoBit\`.`);const s=e.getUint32(8,n);if(s===0)throw new Error("This .2bit declares no sequences.");return{littleEndian:n,version:A,count:s}}function Co(t,e,n=Ja){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=[];let r=n;const o=new TextDecoder;for(;s.length<e.count&&!(r+1>t.length);){const i=t[r];if(r+1+i+4>t.length)break;const a=o.decode(t.subarray(r+1,r+1+i)),c=A.getUint32(r+1+i,e.littleEndian);s.push({name:a,offset:c}),r+=1+i+4}return{entries:s,complete:s.length===e.count,consumed:r}}function Qo(t,e,n,A={}){if(e+8>t.length)return 8;const s=new DataView(t.buffer,t.byteOffset,t.byteLength),r=Ya(s,e,n,A),o=e+8+r*8;return o+4>t.length?o+4-e:null}function Ya(t,e,n,A){return nt(t.getUint32(e+4,n),{format:Un,field:`N-block count${A.name===void 0?"":` of ${A.name}`}`,ceiling:t.getUint32(e,n),...A.fileLeft===void 0?{}:{available:A.fileLeft-8-4},bytesPerItem:8})}function YC(t,e,n,A,s=0,r){const o=new DataView(e.buffer,e.byteOffset,e.byteLength),i=o.getUint32(n,A),a=Ya(o,n,A,{name:t,fileLeft:e.length-n}),c=new Int32Array(a),l=new Int32Array(a),g=n+8,f=g+a*4;for(let d=0;d<a;d++){const C=o.getUint32(g+d*4,A);c[d]=C,l[d]=C+o.getUint32(f+d*4,A)}const h=f+a*4,u=nt(o.getUint32(h,A),{format:Un,field:`mask-block count of ${t}`,ceiling:i,...r===void 0?{}:{available:r-(s+h+4)-4},bytesPerItem:8}),I=s+h+4+u*8+4;return r!==void 0&&ss(I,Math.ceil(i/4),{format:Un,field:`packed bases of ${t}`,size:r}),{name:t,length:i,nStarts:c,nEnds:l,dnaAt:I}}const OC=8192;function _C(t,e,n){const A=Math.max(0,Math.min(e,t.length)),s=Math.max(A,Math.min(n,t.length)),r=Math.floor(A/4),o=Math.ceil(s/4);return{from:t.dnaAt+r,to:t.dnaAt+o,firstBase:r*4}}function KC(t,e,n,A,s){const r=Math.max(0,Math.min(A,n.length)),o=Math.max(r,Math.min(s,n.length)),i=new Uint8Array(o-r);for(let a=r;a<o;a++){const c=a-e,l=t[c>>2];if(l===void 0)break;const g=6-((c&3)<<1);i[a-r]=TC[l>>g&3]}for(let a=0;a<n.nStarts.length;a++){const c=n.nStarts[a];if(c>=o)break;const l=n.nEnds[a];l<=r||i.fill(JC,Math.max(r,c)-r,Math.min(o,l)-r)}return i}function qC(t){return t.map(e=>({name:e.name,length:e.length}))}const Bo=65536,Eo=1e5;async function HC(t,e){let n=await t(Bo,0);const A=$C(n);if(A.count>Eo)throw new Error(`This .2bit declares ${A.count.toLocaleString()} sequences, which is past the ${Eo.toLocaleString()} this viewer will open one record at a time. A file that says this is far more likely to be truncated than to be an assembly.`);let s=Co(n,A);for(;!s.complete;){const a=await t(Bo,n.length);if(a.length===0)throw new Error(`This .2bit ends part-way through its index: it declares ${A.count.toLocaleString()} sequences and names ${s.entries.length.toLocaleString()}. The file is truncated.`);const c=new Uint8Array(n.length+a.length);c.set(n),c.set(a,n.length),n=c,s=Co(n,A)}const r=new Map,o=[];let i=0;for(const a of s.entries){e!==void 0&&ss(a.offset,8,{format:Un,field:`index entry for ${a.name}`,size:e});const c={name:a.name,...e===void 0?{}:{fileLeft:e-a.offset}};let l=await t(OC,a.offset),g=Qo(l,0,A.littleEndian,c);for(;g!==null;){const h=await t(g,a.offset);if(h.length<=l.length)throw new Error(`This .2bit ends part-way through the record for ${a.name}.`);l=h,g=Qo(l,0,A.littleEndian,c)}const f=YC(a.name,l,0,A.littleEndian,a.offset,e);r.set(f.name,f),o.push(f),i+=f.length}return{ordered:o,records:r,total:i}}const WC=2291137574,PC=2273964779,mo=[137,72,68,70,13,10,26,10];function zC(t){return t.length<mo.length?!1:mo.every((e,n)=>t[n]===e)}function Oa(t){if(t.length<4)return null;const e=new DataView(t.buffer,t.byteOffset,4);for(const n of[!0,!1]){const A=e.getUint32(0,n);if(A===WC)return"bigwig";if(A===PC)return"bigbed"}return null}function ft(t,e){const n=pe(rl(t),e);for(let A=0;A<n.names.length;A++)t[A]=n.names[A];return n}function Z(t,e,n){const A=El(t,qa(e)),s=XC(t,e),r=n?.contested??[];return{...A,...s===null?{}:{genomes:s},...r.length===0?{}:{contested:r.slice(0,4).map(o=>`${o.asked} → ${o.name}`)}}}function XC(t,e){const n=new Set;for(const r of e)r.genome!==void 0&&r.genome!==""&&n.add(r.genome);if(n.size===0)return null;const A=new Set(t),s=new Set;for(const r of e)r.genome===void 0||r.genome===""||A.has(r.name)&&s.add(r.genome);return{matched:s.size,total:n.size,named:[...s].slice(0,4)}}function qn(t,e){const n=t.bases.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.bases.get(t.contigs[A].name)}function Ms(t,e){const n=t.records.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.records.get(t.contigs[A].name)}async function _a(t,e,n,A,s){const r=Ms(t,e);if(r===void 0)return;const o=Math.max(0,Math.floor(n)),i=Math.min(r.length,Math.ceil(A));if(!(i>o))return new Uint8Array(0);const a=t.held.get(r.name);if(a!==void 0&&a.start<=o&&a.start+a.bases.length>=i)return a.bases.subarray(o-a.start,i-a.start);const c=await Ka(t,r,o,i,s);return t.held.set(r.name,{start:o,bases:c}),c}async function Ka(t,e,n,A,s){const r=s===void 0?{}:{onProgress:s};if(_t(t)){const i=e,a=_C(i,n,A),c=await t.handle.read(a.to-a.from,a.from,r);return KC(c,a.firstBase,i,n,A)}const o=Xd(e,n,A);return Vd(await t.handle.read(o.to-o.from,o.from,r))}function qa(t){return t.map(e=>e.name)}const Fs=new Map,Hn=new Map;function Ss(t){return t.indexed===!0}function _t(t){return t.twobit===!0}function we(t){return Ss(t)||_t(t)}const re=new Map,KA=new Map,Wn=new Map,vn=new Map;function VC(t,e){return`${tt(t)}|${tt(e)}`}const wo=8<<20,Rs=3e8,qA=64e6,po=4e6;let Mt=null,oe=null;function tt(t){return t.kind==="local"?`${t.name}|${t.file.size}`:t.url}self.onmessage=t=>{jC(t.data)};const ZC=Nh();setInterval(()=>{const t={type:"busy",fraction:ZC.busy()};self.postMessage(t)},yh);const Pn=new Set,HA=new Set;let WA=0;function PA(t){return Pn.has(t)}async function Ls(t){return await Bs(),!Pn.has(t)}function ze(){const t=new Error("cancelled");return t.name="AbortError",t}async function jC(t){HA.add(t.id);try{const e=await tQ(t);if(PA(t.id))throw ze();const n={type:"result",id:t.id,payload:e};self.postMessage(n,Eh(e))}catch(e){const n={type:"error",id:t.id,message:e instanceof Error?e.message:String(e),...e instanceof Error&&e.name==="AbortError"?{cancelled:!0}:{}};self.postMessage(n)}finally{HA.delete(t.id),Pn.delete(t.id),t.id>WA&&(WA=t.id)}}function Qn(t){return(e,n)=>{const A={type:"progress",id:t,done:e,total:n??0};self.postMessage(A)}}async function tQ(t){switch(t.kind){case"load":return aQ(t.entry,t.source,t.mapContigs,Qn(t.id));case"sample":return ja(t.entry,t.regions,t.basesPerPixel,t.reads,t.id,t.exact===!0);case"register":return KA.set(t.entry,t.vector),null;case"run":return eQ(t);case"bases":return EQ(t.entry,t.regions,Qn(t.id));case"assembly":return nQ(t.source,Qn(t.id));case"reads":return vQ(t.entry,t.regions,t.maxRows,t.basesPerPixel,t.reads,t.id);case"cancel":return(HA.has(t.target)||t.target>WA)&&Pn.add(t.target),null;case"drop":{Fs.delete(t.entry);const e=re.get(t.entry);e!==void 0&&oe?.store===e&&(oe=null),re.delete(t.entry),KA.delete(t.entry),Hn.delete(t.entry),Wn.delete(t.entry);for(const[n,A]of vn)if(A.holders.delete(t.entry)){A.holders.size===0&&vn.delete(n);break}return null}}}async function eQ(t){const e=qd[t.task];if(e===void 0)throw new Error(`no track analysis runner is registered for the task ${t.task}`);const n=[],A=performance.now(),s={params:t.params,framing:t.framing,inputs:t.inputs,cancelled:()=>PA(t.id),throwIfCancelled:()=>{if(PA(t.id))throw ze()},progress:(o,i,a)=>{const c={type:"progress",id:t.id,done:o,total:i,...a===void 0?{}:{note:a}};self.postMessage(c)},note:o=>{n.push(o)},sample:(o,i,a)=>ja(o,i,a,void 0,t.id),lengthOf:o=>t.inputs.contigLengths?.[o],residues:o=>{const i=re.get(o);if(i!==void 0)return we(i)?{contigs:i.contigs,bases:()=>{},read:async(a,c,l)=>{const g=Ms(i,a);if(g===void 0)return;const f=Math.max(0,Math.floor(c)),h=Math.min(g.length,Math.ceil(l));return h>f?Ka(i,g,f,h):new Uint8Array(0)},refusal:_t(i)?`This .2bit is read by range rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(qA/1e6)} MB is held whole (\`twoBitToFa\`).`:`This FASTA is read by range from its index rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(qA/1e6)} MB is held whole.`}:{contigs:i.contigs,bases:a=>qn(i,a)}}};return{outputs:await e(s),provenance:{task:t.task,taskVersion:0,params:t.params,framing:t.framing,app:[Hd,Wd].filter(o=>o!=="").join(" "),createdAt:new Date().toISOString()},notes:n,ms:performance.now()-A}}async function nQ(t,e){const n=xt(t),A=await n.read(64,0);if(zC(A))return{format:"hdf5",contigs:[],origin:"features",exact:!0};const s=Oa(A);if(s!==null){const h=await(s==="bigwig"?new To({filehandle:xt(t)}):new $o({filehandle:xt(t)})).getHeader();return{format:s,contigs:xs(h),origin:s,exact:!0}}if(We(A)){const f=await ke(n,t),h=await tc(n,f??Number.MAX_SAFE_INTEGER);if(h!==null)return{format:"bam",contigs:h.refs.map(u=>({name:u.name,length:u.length})),origin:"bam",exact:!0}}if(kn(A))return{format:"fasta",contigs:(await Xa(t,n,e)).contigs,origin:"fasta",exact:!0};if($a(A))return{format:"twobit",contigs:(await Va(t,n,e)).contigs,origin:"twobit",exact:!0};const r=await n.readFile({onProgress:e}),o=await ls(r);if(kn(o))return{format:"fasta",contigs:Us(t,o).contigs,origin:"fasta",exact:!0};const i=new TextDecoder().decode(o);if(i.trim()==="")throw new Error("This file is empty.");if(bh(i,t.name))return Mt={key:tt(t),format:"sizes",features:null},{format:"sizes",contigs:kh(i),origin:"sizes",exact:!0};if(ti(i)){const f=rg(i);if(f.length>0)return{format:"vcf",contigs:f,origin:"vcf",exact:!0};const h=Ai(i),u=new Map;for(let I=0;I<h.length;I++)lt(u,h.contigs[h.contig[I]],h.end[I]);return{format:"vcf",contigs:It(u),origin:"features",exact:!1}}if(Is(A)){const f=await za(n),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(pA(i,t.name)||wA(i,t.name)||di(i,t.name)){const f=pA(i,t.name)?pi(i,t.name):wA(i,t.name)?Bi(i,t.name):Ei(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(li(i,t.name)){const f=hi(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"barchart",contigs:It(h),origin:"features",exact:!1}}if(Ma(i)){const f=Fa(i);Mt={key:tt(t),format:"cytoband",features:f};const h=yC(f);if(h!==null)return{format:"cytoband",contigs:h,origin:"cytoband",exact:!0};const u=new Map;for(let I=0;I<f.length;I++)lt(u,f.contigs[f.contig[I]],f.end[I]);return{format:"cytoband",contigs:It(u),origin:"features",exact:!1}}if(Ds(i,t.name)!==null){const f=Ga(i,t.name);Mt={key:tt(t),format:"junctions",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"junctions",contigs:It(h),origin:"features",exact:!1}}if(Qa(i,t.name)){const f=Ba(i);return{format:"interact",contigs:hA(f),origin:"features",exact:!1}}if(ma(i,t.name)){const f=wa(i);return{format:"longrange",contigs:hA(f),origin:"features",exact:!1}}if(Na(i,t.name)){const f=ka(i);Mt={key:tt(t),format:"genepred",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"genepred",contigs:It(h),origin:"features",exact:!1}}if(va(i,t.name)){const{signal:f}=Ta(i),h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:"bedmethyl",contigs:It(h),origin:"features",exact:!1}}const a=Si(i);if(a!==null){const f=a==="wig"?Li(i):Ri(i);Mt={key:tt(t),format:a,features:null};const h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:a,contigs:It(h),origin:"features",exact:!1}}const c=si(i,t.name);if(c==="bedpe"){const f=ci(i);return Mt={key:tt(t),format:c,features:null},{format:c,contigs:hA(f),origin:"features",exact:!1}}const l=c==="gtf"?ii(i):fs(i,t.name);Mt={key:tt(t),format:c,features:l};const g=new Map;for(let f=0;f<l.length;f++)lt(g,l.contigs[l.contig[f]],l.end[f]);return{format:c,contigs:It(g),origin:"features",exact:!1}}function xs(t){return Object.values(t.refsByNumber).sort((e,n)=>e.id-n.id).map(e=>({name:e.name,length:e.length}))}function lt(t,e,n){const A=t.get(e);(A===void 0||n>A)&&t.set(e,n)}function hA(t){const e=new Map;for(let n=0;n<t.length;n++)lt(e,t.contigs[t.contig1[n]],t.end1[n]),lt(e,t.contigs[t.contig2[n]],t.end2[n]);return It(e)}function It(t){const e=[];for(const[n,A]of t){const s=10**Math.max(0,Math.floor(Math.log10(Math.max(1,A)))-2);e.push({name:n,length:(Math.floor(A/s)+1)*s})}return e}const Zt=new Map,AQ=8;function xt(t){if(t.kind==="local")return new oc(t.file);const{credential:e,headers:n}=t,A=`${t.url}|${e===void 0?"":JSON.stringify(e)}|${n===void 0?"":JSON.stringify(n)}`,s=Zt.get(A);if(s!==void 0)return Zt.delete(A),Zt.set(A,s),s;const r=e===void 0&&n===void 0?new mr(t.url):new mr(t.url,{fetch:(o,i)=>{const a=typeof o=="string"?o:o.url;return fetch(o,Ti(i,{url:a,...n===void 0?{}:{headers:n},...e===void 0?{}:{credential:e}}))}});for(Zt.set(A,r);Zt.size>AQ;){const o=Zt.keys().next().value;Zt.delete(o)}return r}async function sQ(t,e,n,A){const s=Gs(t);if(s===null||!We(n))return null;try{const r=await Ot(await xt(s).readFile()),o=Cl(r),i=await ke(e,t);if(i===null)return null;const a=Ql(o,Bl(o,qa(A)),i);if(a.length===0||a.reduce((f,h)=>f+(h.to-h.from),0)>i*.8)return null;const l=[];for(const f of a){const h=await e.read(f.to-f.from,f.from),u=new TextDecoder().decode(await Ot(h,f.lastBlock-f.from));l.push(rQ(u,f.from===0,iQ(h,f,i)))}const g=l.join("");return g===""?null:g}catch{return null}}function rQ(t,e,n){let A=t;if(!e){const s=A.indexOf(`
|
|
1
|
+
async function $e(t){return t.bytes?t.bytes():new Uint8Array(await t.arrayBuffer())}const cc=50;async function $s(t,e){const n=t.headers.get("content-length"),A=n?parseInt(n,10):void 0,s=t.body;if(!s||A===void 0){const c=await $e(t);return e(c.byteLength,A??c.byteLength),c}const r=s.getReader();let o=new Uint8Array(A),i=0,a=0;e(0,A);for(let c=await r.read();!c.done;c=await r.read()){if(i+c.value.byteLength>o.length){const g=new Uint8Array(Math.max(i+c.value.byteLength,o.length*2));g.set(o.subarray(0,i)),o=g}o.set(c.value,i),i+=c.value.byteLength;const l=Date.now();l-a>=cc&&(a=l,e(i,A))}return e(i,A),i===o.length?o:o.subarray(0,i)}class lc{blob;constructor(e){this.blob=e}async read(e,n=0){return e===0?new Uint8Array(0):$e(this.blob.slice(n,n+e))}async readFile(e){const n=typeof e=="string"?e:e?.encoding;if(n==="utf8")return this.blob.text();if(n)throw new Error(`unsupported encoding: ${n}`);return $e(this.blob)}stat(){return Promise.resolve({size:this.blob.size})}close(){return Promise.resolve()}}function gc(t){return(typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"?t.message:`${t}`).replace(/\.$/,"")}class Fo{url;_stat;fetchImplementation;baseHeaders;baseOverrides;constructor(e,n={}){this.url=e,this.baseHeaders=n.headers??{},this.baseOverrides=n.overrides??{},this.fetchImplementation=n.fetch??globalThis.fetch.bind(globalThis)}buildRequest(e,n){return{...this.baseOverrides,...e.overrides,headers:{...this.baseHeaders,...e.headers,...n},method:"GET",redirect:"follow",mode:"cors",signal:e.signal}}async fetch(e,n){const A=r=>new Error(`${gc(r)} fetching ${e}`,{cause:r});let s;try{s=await this.fetchImplementation(e,n)}catch(r){if(`${r}`.includes("Failed to fetch")){console.warn(`generic-filehandle: refetching ${e} to attempt to work around chrome CORS header caching bug`);try{s=await this.fetchImplementation(e,{...n,cache:"reload"})}catch(o){throw A(o)}}else throw A(r)}return s}async read(e,n,A={}){if(e===0)return new Uint8Array(0);if(Number.isNaN(e)||Number.isNaN(n))throw new TypeError(`read() called with NaN length or position (length=${e}, position=${n}). The index file may be corrupt.`);const s=await this.fetch(this.url,this.buildRequest(A,{range:`bytes=${n}-${n+e-1}`}));if(s.status===416)return new Uint8Array(0);if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(s.status===200&&n===0||s.status===206){const r=s.headers.get("content-range"),o=/\/(\d+)$/.exec(r??"");o?.[1]&&(this._stat={size:parseInt(o[1],10)});const i=A.onProgress?await $s(s,A.onProgress):await $e(s);return!this._stat&&s.status===200&&(this._stat={size:i.byteLength}),i.byteLength<=e?i:i.subarray(0,e)}throw new Error(s.status===200?`${this.url} fetch returned status 200, expected 206`:`HTTP ${s.status} fetching ${this.url}`)}async readFile(e={}){const n=typeof e=="string"?e:e.encoding,A=typeof e=="string"?{}:e,s=await this.fetch(this.url,this.buildRequest(A));if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(n==="utf8")return s.text();if(n)throw new Error(`unsupported encoding: ${n}`);return A.onProgress?$s(s,A.onProgress):$e(s)}async stat(){return this._stat||await this.read(10,0),this._stat??{size:0}}close(){return Promise.resolve()}}class fc{readFile(){return Promise.reject(new Error("unimplemented"))}read(){return Promise.reject(new Error("unimplemented"))}stat(){return Promise.reject(new Error("unimplemented"))}close(){return Promise.reject(new Error("unimplemented"))}}class hc{}class uc{constructor(){this.signals=new Set,this.abortController=new AbortController}addSignal(e=new hc){if(this.signal.aborted)throw new Error("cannot add a signal, already aborted!");this.signals.add(e),e.aborted?this.handleAborted(e):typeof e.addEventListener=="function"&&e.addEventListener("abort",()=>{this.handleAborted(e)})}handleAborted(e){this.signals.delete(e),this.signals.size===0&&this.abortController.abort()}get signal(){return this.abortController.signal}abort(){this.abortController.abort()}}class Ic{constructor(){this.callbacks=new Set}addCallback(e=()=>{}){this.callbacks.add(e),this.currentMessage&&e(this.currentMessage)}callback(e){this.currentMessage=e;for(const n of this.callbacks)n(e)}}class Bn{constructor({fill:e,cache:n}){if(typeof e!="function")throw new TypeError("must pass a fill function");if(typeof n!="object")throw new TypeError("must pass a cache object");if(typeof n.get!="function"||typeof n.set!="function"||typeof n.delete!="function")throw new TypeError("cache must implement get(key), set(key, val), and and delete(key)");this.cache=n,this.fillCallback=e}static isAbortException(e){return e.name==="AbortError"||e.code==="ERR_ABORTED"||e.message==="AbortError: aborted"||e.message==="Error: aborted"}evict(e,n){this.cache.get(e)===n&&this.cache.delete(e)}fill(e,n,A,s){const r=new uc,o=new Ic;o.addCallback(s);const i={aborter:r,promise:this.fillCallback(n,r.signal,a=>{o.callback(a)}),settled:!1,statusReporter:o,get aborted(){return this.aborter.signal.aborted}};i.aborter.addSignal(A),i.aborter.signal.addEventListener("abort",()=>{i.settled||this.evict(e,i)}),i.promise.then(()=>{i.settled=!0},()=>{i.settled=!0,this.evict(e,i)}).catch(a=>{throw console.error(a),a}),this.cache.set(e,i)}static checkSinglePromise(e,n){function A(){if(n?.aborted)throw Object.assign(new Error("aborted"),{code:"ERR_ABORTED"})}return e.then(s=>(A(),s),s=>{throw A(),s})}has(e){return this.cache.has(e)}get(e,n,A,s){if(!A&&n instanceof AbortSignal)throw new TypeError("second get argument appears to be an AbortSignal, perhaps you meant to pass `null` for the fill data?");const r=this.cache.get(e);return r?r.aborted&&!r.settled?(this.evict(e,r),this.get(e,n,A,s)):r.settled?r.promise:(r.aborter.addSignal(A),r.statusReporter.addCallback(s),Bn.checkSinglePromise(r.promise,A)):(this.fill(e,n,A,s),Bn.checkSinglePromise(this.cache.get(e).promise,A))}delete(e){const n=this.cache.get(e);n&&(n.settled||n.aborter.abort(),this.cache.delete(e))}clear(){const e=this.cache.keys();let n=0;for(let A=e.next();!A.done;A=e.next())this.delete(A.value),n+=1;return n}}var X=function(t,e,n,A,s){if(A==="m")throw new TypeError("Private method is not writable");if(A==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return A==="a"?s.call(t,n):s?s.value=n:e.set(t,n),n},D=function(t,e,n,A){if(n==="a"&&!A)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!A:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?A:n==="a"?A.call(t):A?A.value:e.get(t)},Y,ot,_,W,qt,be,Ht,Xe,ut,Js,zn,Xn,Vn,Os,Ve;class dc extends Map{constructor(e={}){if(super(),Y.add(this),ot.set(this,0),_.set(this,new Map),W.set(this,new Map),qt.set(this,void 0),be.set(this,void 0),Ht.set(this,void 0),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof e.maxAge=="number"&&e.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");X(this,qt,e.maxSize,"f"),X(this,be,e.maxAge||Number.POSITIVE_INFINITY,"f"),X(this,Ht,e.onEviction,"f")}get __oldCache(){return D(this,W,"f")}get(e){if(D(this,_,"f").has(e)){const n=D(this,_,"f").get(e);return D(this,Y,"m",zn).call(this,e,n)}if(D(this,W,"f").has(e)){const n=D(this,W,"f").get(e);if(!D(this,Y,"m",ut).call(this,e,n))return D(this,Y,"m",Os).call(this,e,n),n.value}}set(e,n,{maxAge:A=D(this,be,"f")}={}){const s=typeof A=="number"&&A!==Number.POSITIVE_INFINITY?Date.now()+A:void 0;return D(this,_,"f").has(e)?D(this,_,"f").set(e,{value:n,expiry:s}):D(this,Y,"m",Vn).call(this,e,{value:n,expiry:s}),this}has(e){return D(this,_,"f").has(e)?!D(this,Y,"m",ut).call(this,e,D(this,_,"f").get(e)):D(this,W,"f").has(e)?!D(this,Y,"m",ut).call(this,e,D(this,W,"f").get(e)):!1}peek(e){if(D(this,_,"f").has(e))return D(this,Y,"m",Xn).call(this,e,D(this,_,"f"));if(D(this,W,"f").has(e))return D(this,Y,"m",Xn).call(this,e,D(this,W,"f"))}expiresIn(e){const n=D(this,_,"f").get(e)??D(this,W,"f").get(e);if(n)return n.expiry?n.expiry-Date.now():Number.POSITIVE_INFINITY}delete(e){var n;const A=D(this,_,"f").delete(e);return A&&X(this,ot,(n=D(this,ot,"f"),n--,n),"f"),D(this,W,"f").delete(e)||A}clear(){D(this,_,"f").clear(),D(this,W,"f").clear(),X(this,ot,0,"f")}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");const n=[...D(this,Y,"m",Ve).call(this)],A=n.length-e;A<0?(X(this,_,new Map(n),"f"),X(this,W,new Map,"f"),X(this,ot,n.length,"f")):(A>0&&D(this,Y,"m",Xe).call(this,n.slice(0,A)),X(this,W,new Map(n.slice(A)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f")),X(this,qt,e,"f")}evict(e=1){const n=e;if(!n||n<=0)return;const A=[...D(this,Y,"m",Ve).call(this)],s=Math.trunc(Math.min(n,Math.max(A.length-1,0)));s<=0||(D(this,Y,"m",Xe).call(this,A.slice(0,s)),X(this,W,new Map(A.slice(s)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f"))}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[(ot=new WeakMap,_=new WeakMap,W=new WeakMap,qt=new WeakMap,be=new WeakMap,Ht=new WeakMap,Y=new WeakSet,Xe=function(n){if(typeof D(this,Ht,"f")=="function")for(const[A,s]of n)D(this,Ht,"f").call(this,A,s.value)},ut=function(n,A){return typeof A.expiry=="number"&&A.expiry<=Date.now()?(typeof D(this,Ht,"f")=="function"&&D(this,Ht,"f").call(this,n,A.value),this.delete(n)):!1},Js=function(n,A){if(!D(this,Y,"m",ut).call(this,n,A))return A.value},zn=function(n,A){return A.expiry?D(this,Y,"m",Js).call(this,n,A):A.value},Xn=function(n,A){const s=A.get(n);return D(this,Y,"m",zn).call(this,n,s)},Vn=function(n,A){var s;D(this,_,"f").set(n,A),X(this,ot,(s=D(this,ot,"f"),s++,s),"f"),D(this,ot,"f")>=D(this,qt,"f")&&(X(this,ot,0,"f"),D(this,Y,"m",Xe).call(this,D(this,W,"f")),X(this,W,D(this,_,"f"),"f"),X(this,_,new Map,"f"))},Os=function(n,A){D(this,W,"f").delete(n),D(this,Y,"m",Vn).call(this,n,A)},Ve=function*(){for(const n of D(this,W,"f")){const[A,s]=n;D(this,_,"f").has(A)||D(this,Y,"m",ut).call(this,A,s)||(yield n)}for(const n of D(this,_,"f")){const[A,s]=n;D(this,Y,"m",ut).call(this,A,s)||(yield n)}},Symbol.iterator)](){for(const e of D(this,_,"f")){const[n,A]=e;D(this,Y,"m",ut).call(this,n,A)||(yield[n,A.value])}for(const e of D(this,W,"f")){const[n,A]=e;D(this,_,"f").has(n)||D(this,Y,"m",ut).call(this,n,A)||(yield[n,A.value])}}*entriesDescending(){let e=[...D(this,_,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;D(this,Y,"m",ut).call(this,s,r)||(yield[s,r.value])}e=[...D(this,W,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;D(this,_,"f").has(s)||D(this,Y,"m",ut).call(this,s,r)||(yield[s,r.value])}}*entriesAscending(){for(const[e,n]of D(this,Y,"m",Ve).call(this))yield[e,n.value]}get size(){if(!D(this,ot,"f"))return D(this,W,"f").size;let e=0;for(const n of D(this,W,"f").keys())D(this,_,"f").has(n)||e++;return Math.min(D(this,ot,"f")+e,D(this,qt,"f"))}get maxSize(){return D(this,qt,"f")}get maxAge(){return D(this,be,"f")}entries(){return this.entriesAscending()}forEach(e,n=this){for(const[A,s]of this.entriesAscending())e.call(n,s,A,this)}get[Symbol.toStringTag](){return"QuickLRU"}toString(){return`QuickLRU(${this.size}/${this.maxSize})`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}}function Cc(t){if(t.length===0)return[];const e=t.toSorted((s,r)=>s.min-r.min),n=[];let A=e[0];for(let s=1;s<e.length;s++){const r=e[s];r.min>A.max+1?(n.push(A),A=r):r.max>A.max&&(A={min:A.min,max:r.max})}return n.push(A),n}var Qc={},Ys={};function gt(t){var e=Ys[t];if(e!==void 0)return e.exports;var n=Ys[t]={exports:{}};return Qc[t](n,n.exports,gt),n.exports}(()=>{var t=Object.getPrototypeOf?n=>Object.getPrototypeOf(n):n=>n.__proto__,e;gt.t=function(n,A){if(A&1&&(n=this(n)),A&8||typeof n=="object"&&n&&(A&4&&n.__esModule||A&16&&typeof n.then=="function"))return n;var s=Object.create(null);gt.r(s);var r={};e=e||[null,t({}),t([]),t(t)];for(var o=A&2&&n;(typeof o=="object"||typeof o=="function")&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach(i=>r[i]=()=>n[i]);return r.default=()=>n,gt.d(s,r),s}})();gt.d=(t,e)=>{for(var n in e)gt.o(e,n)&&!gt.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})};gt.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);gt.r=t=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var ZA={};gt.r(ZA);gt.d(ZA,{__wbg_Error_ef53bc310eb298a0:()=>wc,__wbg_set_wasm:()=>ts,decompress_and_parse_bigwig:()=>Ro,decompress_and_parse_summary:()=>Lo,inflate_raw:()=>Ec,inflate_raw_batch:()=>Go,inflate_raw_unknown_size:()=>mc});const So="data:application/wasm;base64,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AkH4AXEiAkGAncAAaiEGIAJBiJ3AAGooAgAhAgsgBiAANgIIIAIgADYCDCAAIAY2AgwgACACNgIIDAELIAggAiADaiIAQQNyNgIEIAggAGoiACAAKAIEQQFyNgIECyAIQQhqIgANAQsCQAJAAkACQAJAAkBBACgCkJ9AIgAgA08NAAJAQQAoApSfQCIAIANLDQAgAUEEakG0n8AAIANBr4AEakGAgHxxECMCQCABKAIEIgYNAEEAIQAMCAsgASgCDCEFQQBBACgCoJ9AIAEoAggiCWoiADYCoJ9AQQAgAEEAKAKkn0AiAiAAIAJLGzYCpJ9AAkACQAJAQQAoApyfQCICRQ0AQfCcwAAhAANAIAYgACgCACIIIAAoAgQiB2pGDQIgACgCCCIADQAMAwsLAkACQEEAKAKsn0AiAEUNACAGIABPDQELQQAgBjYCrJ9AC0EAQf8fNgKwn0BBACAFNgL8nEBBACAJNgL0nEBBACAGNgLwnEBBAEGAncAANgKMnUBBAEGIncAANgKUnUBBAEGAncAANgKInUBBAEGQncAANgKcnUBBAEGIncAANgKQnUBBAEGYncAANgKknUBBAEGQncAANgKYnUBBAEGgncAANgKsnUBBAEGYncAANgKgnUBBAEGoncAANgK0nUBBAEGgncAANgKonUBBAEGwncAANgK8nUBBAEGoncAANgKwnUBBAEG4ncAANgLEnUBBAEGwncAANgK4nUBBAEHAncAANgLMnUBBAEG4ncAANgLAnUBBAEHAncAANgLInUBBAEHIncAANgLUnUBBAEHIncAANgLQnUBBAEHQncAANgLcnUBBAEHQncAANgLYnUBBAEHYncAANgLknUBBAEHYncAANgLgnUBBAEHgncAANgLsnUBBAEHgncAANgLonUBBAEHoncAANgL0nUBBAEHoncAANgLwnUBBAEHwncAANgL8nUBBAEHwncAANgL4nUBBAEH4ncAANgKEnkBBAEH4ncAANgKAnkBBAEGAnsAANgKMnkBBAEGInsAANgKUnkBBAEGAnsAANgKInkBBAEGQnsAANgKcnkBBAEGInsAANgKQnkBBAEGYnsAANgKknkBBAEGQnsAANgKYnkBBAEGgnsAANgKsnkBBAEGYnsAANgKgnkBBAEGonsAANgK0nkBBAEGgnsAANgKonkBBAEGwnsAANgK8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bGVkOiDAAMACOiDAAC9ydXN0Yy84YmFiMjZmNGY2OGUwZTI2ZjBiYjc5NjBiZTMzNGQ1YjUyMGVhNDUyL2xpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvcndsb2NrL25vX3RocmVhZHMucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMjIvc3JjL2V4dGVybnJlZi5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi4xMy9zcmMvZGxtYWxsb2MucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbGliZGVmbGF0ZXItMS4yNS4yL3NyYy9saWIucnMAY29tcHJlc3NlZCBibG9jayBleHRlbmRzIHBhc3QgdGhlIGlucHV0IGJ1ZmZlcmJsb2NrIG9mZnNldCBvdmVyZmxvd3NibG9jayBpcyBzaG9ydGVyIHRoYW4gdGhlIDItYnl0ZSB6bGliIGhlYWRlcgAAAM4CEAAKAAAAUQAAAAsAAADOAhAACgAAAGcAAAALAAAAzgIQAAoAAABZAAAAPQAAAM4CEAAKAAAAYgAAACsAAADOAhAACgAAAFwAAAAPAAAAZGVjb21wcmVzc2lvbiBvdXRwdXQgdG9vIGxhcmdlAADOAhAACgAAAJIAAAA9AAAAzgIQAAoAAACYAAAAHQAAAM4CEAAKAAAAAQEAAD0AAADOAhAACgAAAAcBAAAdAAAAQmFkRGF0YUluc3VmZmljaWVudFNwYWNllQEQAGcAAACEAAAAEQAAAJUBEABnAAAAkgAAABEAAABsaWJkZWZsYXRlX2RlZmxhdGVfZGVjb21wcmVzcyByZXR1cm5lZCBhbiB1bmtub3duIGVycm9yIHR5cGU6IHRoaXMgaXMgYW4gaW50ZXJuYWwgYnVnIHRoYXQgKiptdXN0KiogYmUgZml4ZWR5AhAAXwAAAA0BAAAVAAAAbGliZGVmbGF0ZV9hbGxvY19kZWNvbXByZXNzb3IgcmV0dXJuZWQgTlVMTDogb3V0IG9mIG1lbW9yeQAAeQIQAF8AAACdAAAAEQAAAAwAAAACAAAAAwAAAAAAAAAAAAAAEBESAAgHCQYKBQsEDAMNAg4BDwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAAAAAAAAQAAAAIAAAADAAAABAABAAUAAQAHAAIACQACAA0AAwARAAMAGQAEACEABAAxAAUAQQAFAGEABgCBAAYAwQAHAAEBBwCBAQgAAQIIAAEDCQABBAkAAQYKAAEICgABDAsAARALAAEYDAABIAwAATANAAFADQABYA0AAWANAAFgAAAAgAAAAYAAAAKAAAADgAAABIAAAAWAAAAGgAAAB4AAAAiAAAAJgAAACoAAAAuAAAAMgAAADYAAAA6AAAAPgAAAEIAAABGAAAASgAAAE4AAABSAAAAVgAAAFoAAABeAAAAYgAAAGYAAABqAAAAbgAAAHIAAAB2AAAAegAAAH4AAACCAAAAhgAAAIoAAACOAAAAkgAAAJYAAACaAAAAngAAAKIAAACmAAAAqgAAAK4AAACyAAAAtgAAALoAAAC+AAAAwgAAAMYAAADKAAAAzgAAANIAAADWAAAA2gAAAN4AAADiAAAA5gAAAOoAAADuAAAA8gAAAPYAAAD6AAAA/gAAAQIAAAEGAAABCgAAAQ4AAAESAAABFgAAARoAAAEeAAABIgAAASYAAAEqAAABLgAAATIAAAE2AAABOgAAAT4AAAFCAAABRgAAAUoAAAFOAAABUgAAAVYAAAFaAAABXgAAAWIAAAFmAAABagAAAW4AAAFyAAABdgAAAXoAAAF+AAABggAAAYYAAAGKAAABjgAAAZIAAAGWAAABmgAAAZ4AAAGiAAABpgAAAaoAAAGuAAABsgAAAbYAAAG6AAABvgAAAcIAAAHGAAABygAAAc4AAAHSAAAB1gAAAdoAAAHeAAAB4gAAAeYAAAHqAAAB7gAAAfIAAAH2AAAB+gAAAf4AAAICAAACBgAAAgoAAAIOAAACEgAAAhYAAAIaAAACHgAAAiIAAAImAAACKgAAAi4AAAIyAAACNgAAAjoAAAI+AAACQgAAAkYAAAJKAAACTgAAAlIAAAJWAAACWgAAAl4AAAJiAAACZgAAAmoAAAJuAAACcgAAAnYAAAJ6AAACfgAAAoIAAAKGAAACigAAAo4AAAKSAAAClgAAApoAAAKeAAACogAAAqYAAAKqAAACrgAAArIAAAK2AAACugAAAr4AAALCAAACxgAAAsoAAALOAAAC0gAAAtYAAALaAAAC3gAAAuIAAALmAAAC6gAAAu4AAALyAAAC9gAAAvoAAAL+AAADAgAAAwYAAAMKAAADDgAAAxIAAAMWAAADGgAAAx4AAAMiAAADJgAAAyoAAAMuAAADMgAAAzYAAAM6AAADPgAAA0IAAANGAAADSgAAA04AAANSAAADVgAAA1oAAANeAAADYgAAA2YAAANqAAADbgAAA3IAAAN2AAADegAAA34AAAOCAAADhgAAA4oAAAOOAAADkgAAA5YAAAOaAAADngAAA6IAAAOmAAADqgAAA64AAAOyAAADtgAAA7oAAAO+AAADwgAAA8YAAAPKAAADzgAAA9IAAAPWAAAD2gAAA94AAAPiAAAD5gAAA+oAAAPuAAAD8gAAA/YAAAP6AAAD/gACgAAAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAEACwABAA0AAQAPAAEAEQACABMAAgAXAAIAGwACAB8AAwAjAAMAKwADADMAAwA7AAQAQwAEAFMABABjAAQAcwAFAIMABQCjAAUAwwAFAOMAAAACAQAAAgEAAAIBAAAAAAgAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAMAAAABAAAAAoAAAALAAAADAAAAAAAAAAIAAAABAAAAA0AAAAOAAAADwAAABAAAAARAAAAEAAAAAQAAAASAAAAEwAAABQAAAAIAAAAXPbpX9wC9rnxwXBs8mHBJNoHjEl4ZUzTwn2PTZafJs9hc3NlcnRpb24gZmFpbGVkOiBwc2l6ZSA+PSBzaXplICsgbWluX292ZXJoZWFkAABOAhAAKgAAALEEAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogcHNpemUgPD0gc2l6ZSArIG1heF9vdmVyaGVhZAAATgIQACoAAAC3BAAADQAAAHJ3bG9jayBvdmVyZmxvd2VkIHJlYWQgbG9ja3M3ARAAXQAAABUAAAAsAAAAAAAAAAgAAAAEAAAAFQAAAAkAAAAMAAAABAAAABYAAAByd2xvY2sgaGFzIG5vdCBiZWVuIGxvY2tlZCBmb3IgcmVhZGluZwAANwEQAF0AAAA+AAAACQAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/QEQAFAAAAAcAAAABQAAABcAAAAMAAAABAAAABgAAAAZAAAAGgAAAAAAAAAAAAAAAQAAABsAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdAAA7gAQAEgAAACPAgAADgAAAEVycm9yMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlSZWZDZWxsIGFscmVhZHkgYm9ycm93ZWQAQaybwAALBAQAAAAAKQRuYW1lASIBXx9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAEgJcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkCBndhbHJ1cwYwLjI2LjIMd2FzbS1iaW5kZ2VuEzAuMi4xMjIgKGRkZDMyMjUxNCk=";var Bc=gt.t(So);function Ro(t,e,n,A,s,r){try{const g=U.__wbindgen_add_to_stack_pointer(-16),f=qe(t,U.__wbindgen_export),h=it,u=Be(e,U.__wbindgen_export),I=it,d=Be(n,U.__wbindgen_export),C=it;U.decompress_and_parse_bigwig(g,f,h,u,I,d,C,A,s,r);var o=z().getInt32(g+0,!0),i=z().getInt32(g+4,!0),a=z().getInt32(g+8,!0),c=z().getInt32(g+12,!0);if(c)throw He(a);var l=Ke(o,i).slice();return U.__wbindgen_export2(o,i*1,1),l}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Lo(t,e,n,A,s,r,o){try{const f=U.__wbindgen_add_to_stack_pointer(-16),h=qe(t,U.__wbindgen_export),u=it,I=Be(e,U.__wbindgen_export),d=it,C=Be(n,U.__wbindgen_export),B=it;U.decompress_and_parse_summary(f,h,u,I,d,C,B,A,s,r,o);var i=z().getInt32(f+0,!0),a=z().getInt32(f+4,!0),c=z().getInt32(f+8,!0),l=z().getInt32(f+12,!0);if(l)throw He(c);var g=Ke(i,a).slice();return U.__wbindgen_export2(i,a*1,1),g}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Ec(t,e){try{const i=U.__wbindgen_add_to_stack_pointer(-16),a=qe(t,U.__wbindgen_export),c=it;U.inflate_raw(i,a,c,e);var n=z().getInt32(i+0,!0),A=z().getInt32(i+4,!0),s=z().getInt32(i+8,!0),r=z().getInt32(i+12,!0);if(r)throw He(s);var o=Ke(n,A).slice();return U.__wbindgen_export2(n,A*1,1),o}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Go(t,e,n,A){try{const c=U.__wbindgen_add_to_stack_pointer(-16),l=qe(t,U.__wbindgen_export),g=it,f=Be(e,U.__wbindgen_export),h=it,u=Be(n,U.__wbindgen_export),I=it;U.inflate_raw_batch(c,l,g,f,h,u,I,A);var s=z().getInt32(c+0,!0),r=z().getInt32(c+4,!0),o=z().getInt32(c+8,!0),i=z().getInt32(c+12,!0);if(i)throw He(o);var a=Ke(s,r).slice();return U.__wbindgen_export2(s,r*1,1),a}finally{U.__wbindgen_add_to_stack_pointer(16)}}function mc(t){try{const o=U.__wbindgen_add_to_stack_pointer(-16),i=qe(t,U.__wbindgen_export),a=it;U.inflate_raw_unknown_size(o,i,a);var e=z().getInt32(o+0,!0),n=z().getInt32(o+4,!0),A=z().getInt32(o+8,!0),s=z().getInt32(o+12,!0);if(s)throw He(A);var r=Ke(e,n).slice();return U.__wbindgen_export2(e,n*1,1),r}finally{U.__wbindgen_add_to_stack_pointer(16)}}function wc(t,e){const n=Error(Nc(t,e));return pc(n)}function pc(t){ve===Ft.length&&Ft.push(Ft.length+1);const e=ve;return ve=Ft[e],Ft[e]=t,e}function yc(t){t<1028||(Ft[t]=ve,ve=t)}function Ke(t,e){return t=t>>>0,jA().subarray(t/1,t/1+e)}let ae=null;function z(){return(ae===null||ae.buffer.detached===!0||ae.buffer.detached===void 0&&ae.buffer!==U.memory.buffer)&&(ae=new DataView(U.memory.buffer)),ae}function Nc(t,e){return Dc(t>>>0,e)}let Ze=null;function kc(){return(Ze===null||Ze.byteLength===0)&&(Ze=new Uint32Array(U.memory.buffer)),Ze}let je=null;function jA(){return(je===null||je.byteLength===0)&&(je=new Uint8Array(U.memory.buffer)),je}function bc(t){return Ft[t]}let Ft=new Array(1024).fill(void 0);Ft.push(void 0,null,!0,!1);let ve=Ft.length;function Be(t,e){const n=e(t.length*4,4)>>>0;return kc().set(t,n/4),it=t.length,n}function qe(t,e){const n=e(t.length*1,1)>>>0;return jA().set(t,n/1),it=t.length,n}function He(t){const e=bc(t);return yc(t),e}let ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});ln.decode();const Mc=2146435072;let Zn=0;function Dc(t,e){return Zn+=e,Zn>=Mc&&(ln=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),ln.decode(),Zn=e),ln.decode(jA().subarray(t,t+e))}let it=0,U;function ts(t){U=t}ts(Bc);let tn=null,jn=null;async function es(){return tn||(jn||(jn=(async()=>{const e=await(await fetch(So)).arrayBuffer(),{instance:n}=await WebAssembly.instantiate(e,{"./inflate_wasm_bg.js":ZA});return ts(n.exports),tn=n.exports,tn})()),jn)}async function Fc(t,e,n,A){await es();const s=Go(t,e,n,A),r=new DataView(s.buffer,s.byteOffset,s.byteLength),o=r.getUint32(0,!0),i=4,a=i+(o+1)*4,c=new Array(o+1);for(let g=0;g<=o;g++)c[g]=r.getUint32(i+g*4,!0);return{data:s.subarray(a),offsets:c}}function Sc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n)}}function Rc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0),minScores:new Float32Array(0),maxScores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4,o=r+n*4,i=o+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n),minScores:new Float32Array(t.buffer,t.byteOffset+o,n),maxScores:new Float32Array(t.buffer,t.byteOffset+i,n)}}async function Lc(t,e,n,A,s,r){await es();const o=Ro(t,e,n,A,s,r);return Sc(o)}async function Gc(t,e,n,A,s,r,o){await es();const i=Lo(t,e,n,A,s,r,o);return Rc(i)}function ns(t){const e=new Uint32Array(t.length),n=new Uint32Array(t.length);for(let A=0;A<t.length;A++){const s=t[A];e[A]=s.offset,n[A]=s.length}return{inputOffsets:e,inputLengths:n}}async function xc(t,e,n){const{inputOffsets:A,inputLengths:s}=ns(e);return Fc(t,A,s,n)}async function vc(t,e,n,A,s){const{inputOffsets:r,inputLengths:o}=ns(e);return Lc(t,r,o,n,A,s)}async function Uc(t,e,n,A,s,r){const{inputOffsets:o,inputLengths:i}=ns(e);return Gc(t,o,i,n,A,s,r)}const As=new TextDecoder("utf8");function rt(t,e=0){return new DataView(t.buffer,t.byteOffset+e,t.length-e)}function j(t,e){return t.getUint32(e,!0)+t.getUint32(e+4,!0)*2**32}function CA(t,e,n){const A=t.indexOf(0,e),s=A!==-1&&A<e+n?A:e+n;return As.decode(t.subarray(e,s))}function Tc(t){const e=t.toSorted((s,r)=>s.offset-r.offset),n=[];let A;for(const s of e)A&&s.offset-(A.offset+A.length)<=2e3?(A.length=Math.max(A.length,s.offset+s.length-A.offset),A.blocks.push(s)):(A={blocks:[s],length:s.length,offset:s.offset},n.push(A));return n}const _s=610839776;function $c(t,e){let n=0;for(const s of t)n+=s.length;let A=0;return e?.(0,n),s=>{A+=s,e?.(A,n)}}function Ie(t,e,n,A){return t<A&&e>n}function xo(t,e){return e?t/e:t}function Jc(t,e){const n=[];let A=0;const s=rt(t);for(;A<t.byteLength;){const r=s.getUint32(A,!0);A+=4;const o=s.getUint32(A,!0);A+=4;const i=s.getUint32(A,!0);A+=4;const a=s.getUint32(A,!0);A+=4;const c=s.getFloat32(A,!0);A+=4;const l=s.getFloat32(A,!0);A+=4;const g=s.getFloat32(A,!0);A+=8,(!e||r===e.chrId&&Ie(o,i,e.start,e.end))&&n.push({start:o,end:i,maxScore:l,minScore:c,summary:!0,score:xo(g,a)})}return n}function Oc(t,e,n){const A=[];let s=0;const r=rt(t);for(;s<t.byteLength;){const o=s,i=r.getUint32(s,!0);s+=4;const a=r.getInt32(s,!0);s+=4;const c=r.getInt32(s,!0);s+=4;const l=t.indexOf(0,s),g=l===-1?t.length:l,f=As.decode(t.subarray(s,g));s=g+1,(!n||i===n.chrId&&Ie(a,c,n.start,n.end))&&A.push({start:a,end:c,rest:f,uniqueId:`bb-${e}-${o}`})}return A}function Yc(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0);let a=24;const c=[];switch(o){case 1:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getInt32(a,!0);a+=4;const h=n.getFloat32(a,!0);a+=4,(!e||Ie(g,f,e.start,e.end))&&c.push({start:g,end:f,score:h})}break}case 2:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getFloat32(a,!0);a+=4;const h=g+r;(!e||Ie(g,h,e.start,e.end))&&c.push({score:f,start:g,end:h})}break}case 3:{for(let l=0;l<i;l++){const g=n.getFloat32(a,!0);a+=4;const f=A+l*s,h=f+r;(!e||Ie(f,h,e.start,e.end))&&c.push({score:g,start:f,end:h})}break}}return c}function Ks(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0),a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i),g=e.start,f=e.end;let h=0;switch(o){case 1:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=n.getInt32(u+4,!0);d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+8,!0),h++),u+=12}break}case 2:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+4,!0),h++),u+=8}break}case 3:{let u=24;for(let I=0;I<i;I++){const d=A+I*s,C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u,!0),h++),u+=4}break}}return h<i?{starts:a.subarray(0,h),ends:c.subarray(0,h),scores:l.subarray(0,h)}:{starts:a,ends:c,scores:l}}function qs(t,e){const n=rt(t),A=Math.floor(t.byteLength/32),s=new Int32Array(A),r=new Int32Array(A),o=new Float32Array(A),i=new Float32Array(A),a=new Float32Array(A);let c=0,l=0;for(;l<t.byteLength;){const g=n.getUint32(l,!0);l+=4;const f=n.getUint32(l,!0);l+=4;const h=n.getUint32(l,!0);l+=4;const u=n.getUint32(l,!0);l+=4;const I=n.getFloat32(l,!0);l+=4;const d=n.getFloat32(l,!0);l+=4;const C=n.getFloat32(l,!0);l+=8,g===e.chrId&&Ie(f,h,e.start,e.end)&&(s[c]=f,r[c]=h,o[c]=xo(C,u),i[c]=I,a[c]=d,c++)}return c<A?{starts:s.subarray(0,c),ends:r.subarray(0,c),scores:o.subarray(0,c),minScores:i.subarray(0,c),maxScores:a.subarray(0,c)}:{starts:s,ends:r,scores:o,minScores:i,maxScores:a}}function Ue(t,e,n,A){if(t.length===1)return e(t[0]);const s=new A(n);let r=0;for(const o of t){const i=e(o);s.set(i,r),r+=i.length}return s}function vo(t){let e=0;for(const n of t)e+=n.starts.length;return e}function Uo(t){const e=vo(t);return{starts:Ue(t,n=>n.starts,e,Int32Array),ends:Ue(t,n=>n.ends,e,Int32Array),scores:Ue(t,n=>n.scores,e,Float32Array),isSummary:!1}}function _c(t){const e=vo(t),{starts:n,ends:A,scores:s}=Uo(t);return{starts:n,ends:A,scores:s,minScores:Ue(t,r=>r.minScores,e,Float32Array),maxScores:Ue(t,r=>r.maxScores,e,Float32Array),isSummary:!0}}function To(t){let e=0;for(const i of t)for(const a of i)e+=a.starts.length;const n=new Int32Array(e),A=new Int32Array(e),s=new Float32Array(e),r=[0];let o=0;for(const i of t){for(const a of i)n.set(a.starts,o),A.set(a.ends,o),s.set(a.scores,o),o+=a.starts.length;r.push(o)}return{starts:n,ends:A,scores:s,regionOffsets:r,totalCount:e}}function Kc(t){const{starts:e,ends:n,scores:A,regionOffsets:s}=To(t);return{starts:e,ends:n,scores:A,regionOffsets:s,isSummary:!1}}function qc(t){const{starts:e,ends:n,scores:A,regionOffsets:s,totalCount:r}=To(t),o=new Float32Array(r),i=new Float32Array(r);let a=0;for(const c of t)for(const l of c)o.set(l.minScores,a),i.set(l.maxScores,a),a+=l.starts.length;return{starts:e,ends:n,scores:A,minScores:o,maxScores:i,regionOffsets:s,isSummary:!0}}function Hs(t,e,n,A){switch(t){case"summary":return Jc(e,A);case"bigwig":return Yc(e,A);case"bigbed":return Oc(e,n,A)}}class Hc{rTreePromise;rTreeNodeCache=new Bn({cache:new dc({maxSize:1e3}),fill:async({length:e,offset:n},A)=>this.bbi.read(e,n,{signal:A})});bbi;refsByName;rTreeOffset;uncompressBufSize;blockType;constructor(e,n,A,s,r){if(!(A>=0))throw new Error("invalid rTreeOffset!");this.bbi=e,this.refsByName=n,this.rTreeOffset=A,this.uncompressBufSize=s,this.blockType=r}async _collectBlocks(e,n,A,s){const r=this.refsByName[e];if(r===void 0||n>=A)return;this.rTreePromise||(this.rTreePromise=this.bbi.read(48,this.rTreeOffset,{signal:s?.signal}).catch(u=>{throw this.rTreePromise=void 0,u}));const o=await this.rTreePromise,i=rt(o),a=i.getUint32(0,!0);if(a!==_s)throw new Error(`invalid cirTree magic: 0x${a.toString(16)} (expected 0x${_s.toString(16)}) at offset ${this.rTreeOffset}, file may be corrupt or unsupported`);const l=4+i.getUint32(4,!0)*32,g=(u,I,d,C)=>(u<r||u===r&&I<A)&&(d>r||d===r&&C>n),f=[];let h=[this.rTreeOffset+48];for(;h.length>0;){const u=Cc(h.map(d=>({min:d,max:d+l}))),I=[];for(const{min:d,max:C}of u){const B=C-d,Q=d,E=await this.rTreeNodeCache.get(`${B}_${Q}`,{length:B,offset:Q},s?.signal);for(const m of h)if(d<=m&&m<=C){const p=E.subarray(m-Q),w=rt(p),y=w.getUint8(0),N=w.getUint16(2,!0);if(y===1||y===0){const k=y===1?32:24;let b=4;for(let M=0;M<N;M++){const F=w.getUint32(b,!0),S=w.getUint32(b+4,!0),v=w.getUint32(b+8,!0),G=w.getUint32(b+12,!0);if(g(F,S,v,G)){const O=j(w,b+16);if(y===1){const $=j(w,b+24);f.push({offset:O,length:$})}else I.push(O)}b+=k}}}}h=I}return{blocks:f,chrId:r}}async readWigData(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);if(!r)return[];const{blocks:o,chrId:i}=r;return this.readFeatures(o,{...s,request:{chrId:i,start:n,end:A}})}async getBlockSizeForRange(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);let o=0;if(r)for(const i of r.blocks)o+=i.length;return o}async getBlockSizeForRangeMulti(e,n={}){const{blockByOffset:A}=await this._collectBlocksMulti(e,n);let s=0;for(const r of A.values())s+=r.length;return s}async _collectBlocksMulti(e,n){const A=await Promise.all(e.map(({refName:o,start:i,end:a})=>this._collectBlocks(o,i,a,n))),s=new Map,r=new Map;for(let o=0;o<A.length;o++){const i=A[o];if(i){const{start:a,end:c}=e[o],l={chrId:i.chrId,start:a,end:c};for(const g of i.blocks){const f=r.get(g.offset);f?f.push({regionIndex:o,request:l}):(s.set(g.offset,g),r.set(g.offset,[{regionIndex:o,request:l}]))}}}return{blockByOffset:s,tagsByOffset:r}}async readWigDataMulti(e,n={}){const A=e.map(()=>[]),{blockByOffset:s,tagsByOffset:r}=await this._collectBlocksMulti(e,n),{blockType:o}=this;return await this._forEachDecodedBlock([...s.values()],n.signal,n.onProgress,(i,a)=>{const c=r.get(a);if(c)for(const{regionIndex:l,request:g}of c){const f=Hs(o,i,a,g);for(const h of f)A[l].push(h)}}),A}assertNotBigBed(e){if(this.blockType==="bigbed")throw new Error(`${e} is not supported for BigBed data; use getFeatures/getFeaturesMulti instead`)}async readWigDataAsArrays(e,n,A,s){this.assertNotBigBed("getFeaturesAsArrays");const r=await this._collectBlocks(e,n,A,s),o=r?r.blocks:[],i={chrId:r?r.chrId:0,start:n,end:A};return this.blockType==="summary"?this._readSummaryFeaturesAsArrays(o,i,s):this._readBigWigFeaturesAsArrays(o,i,s)}async readWigDataAsArraysMulti(e,n={}){this.assertNotBigBed("getFeaturesAsArraysMulti");const A=await this._collectBlocksMulti(e,n);return this.blockType==="summary"?qc(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>qs(s,r),n)):Kc(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>Ks(s,r),n))}async _readBlocksAsArraysMulti(e,n,A,s){const{blockByOffset:r,tagsByOffset:o}=e,i=Array.from({length:n},()=>[]);return await this._forEachDecodedBlock([...r.values()],s.signal,s.onProgress,(a,c)=>{const l=o.get(c);if(l)for(const{regionIndex:g,request:f}of l){const h=A(a,f);h.starts.length>0&&i[g].push(h)}}),i}async _forEachBlockGroup(e,n,A,s){const r=Tc(e),o=$c(r,A);for(const i of r){const a=await this.bbi.read(i.length,i.offset,{signal:n});o(i.length),await s(a,i.blocks.map(c=>({offset:c.offset-i.offset,length:c.length})),i.offset)}}async _forEachDecodedBlock(e,n,A,s){const{uncompressBufSize:r}=this;await this._forEachBlockGroup(e,n,A,async(o,i,a)=>{if(r>0){const{data:c,offsets:l}=await xc(o,i,r);for(let g=0;g<i.length;g++)s(c.subarray(l[g],l[g+1]),a+i[g].offset)}else for(const c of i)s(o.subarray(c.offset,c.offset+c.length),a+c.offset)})}async readFeatures(e,n={}){const{blockType:A}=this,{signal:s,request:r,onProgress:o}=n,i=[];return await this._forEachDecodedBlock(e,s,o,(a,c)=>{const l=Hs(A,a,c,r);for(const g of l)i.push(g)}),i}async _readBlocksAsArrays(e,n,A,s,r){const{uncompressBufSize:o}=this,i=[],a=c=>{c.starts.length>0&&i.push(c)};return await this._forEachBlockGroup(e,n,r,async(c,l)=>{if(o>0)a(await A(c,l));else for(const g of l)a(s(c.subarray(g.offset,g.offset+g.length)))}),i}async _readBigWigFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>vc(r,o,this.uncompressBufSize,n.start,n.end),r=>Ks(r,n),A.onProgress);return Uo(s)}async _readSummaryFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Uc(r,o,this.uncompressBufSize,n.chrId,n.start,n.end),r=>qs(r,n),A.onProgress);return _c(s)}}const Wc=-2003829722,Ws=-2021002517;class $o{bbi;headerP;getHeader(e){return this.headerP||(this.headerP=this._getHeader(e).catch(n=>{throw this.headerP=void 0,n})),this.headerP}constructor(e){const{filehandle:n,path:A,url:s}=e;if(n)this.bbi=n;else if(s)this.bbi=new Fo(s);else if(A)this.bbi=new fc(A);else throw new Error("no file given")}async _getHeader(e){const n=await this._getMainHeader(e),A=await this._readChromosomeTree(n,e);return{...n,...A}}async _getMainHeader(e,n=2e3){const A=await this.bbi.read(n,0,e),s=rt(A);let r=0;const o=s.getInt32(r,!0);if(r+=4,o!==Wc&&o!==Ws)throw new Error("not a BigWig/BigBed file");const i=s.getUint16(r,!0);r+=2;const a=s.getUint16(r,!0);r+=2;const c=j(s,r);r+=8;const l=j(s,r);r+=8;const g=j(s,r);r+=8;const f=s.getUint16(r,!0);r+=2;const h=s.getUint16(r,!0);r+=2;const u=j(s,r);r+=8;const I=j(s,r);r+=8;const d=s.getUint32(r,!0);r+=4;const C=j(s,r);r+=8;const B=[];for(let y=0;y<a;y++){const N=s.getUint32(r,!0);r+=4,r+=4;const k=j(s,r);r+=8;const b=j(s,r);r+=8,B.push({reductionLevel:N,dataOffset:k,indexOffset:b})}const Q=o===Ws?"bigbed":"bigwig",E=A.length<n,m=u!==0&&!A.includes(0,u);if(!E&&(u>n||I>n-40||m))return this._getMainHeader(e,n*2);let p;if(I){const y=rt(A,I);p={basesCovered:j(y,0),scoreMin:y.getFloat64(8,!0),scoreMax:y.getFloat64(16,!0),scoreSum:y.getFloat64(24,!0),scoreSumSquares:y.getFloat64(32,!0)}}else throw new Error("no stats");let w="";if(u){const y=A.indexOf(0,u),N=y===-1?A.length:y;w=As.decode(A.subarray(u,N))}return{zoomLevels:B,magic:o,extHeaderOffset:C,numZoomLevels:a,fieldCount:f,totalSummary:p,definedFieldCount:h,uncompressBufSize:d,asOffset:u,chromosomeTreeOffset:c,totalSummaryOffset:I,unzoomedDataOffset:l,unzoomedIndexOffset:g,fileType:Q,version:i,autoSql:w}}async _readChromosomeTree(e,n){const A=[],s={},r=e.chromosomeTreeOffset,o=rt(await this.bbi.read(32,r,n)),i=o.getUint32(4,!0),a=o.getUint32(8,!0),c=o.getUint32(12,!0),l=4+i*(a+Math.max(c,8)),g=async f=>{const h=await this.bbi.read(l,f,n),u=rt(h),I=u.getUint8(0),d=u.getUint16(2,!0);let C=4;if(I)for(let B=0;B<d;B++){const Q=CA(h,C,a);C+=a;const E=u.getUint32(C,!0);C+=4;const m=u.getUint32(C,!0);C+=4,s[Q]=E,A[E]={name:Q,id:E,length:m}}else{const B=[];for(let Q=0;Q<d;Q++){C+=a;const E=j(u,C);C+=8,B.push(g(E))}await Promise.all(B)}};return await g(r+32),{refsByName:s,refsByNumber:A}}viewCache=new Map;getOrCreateBlockView(e,n,A,s){const r=`${n}_${s}`;let o=this.viewCache.get(r);return o||(o=new Hc(this.bbi,e,n,A,s),this.viewCache.set(r,o)),o}async getUnzoomedView(e){const{unzoomedIndexOffset:n,refsByName:A,uncompressBufSize:s,fileType:r}=await this.getHeader(e);return this.getOrCreateBlockView(A,n,s,r)}async _getView(e){const{basesPerSpan:n,scale:A}=e??{},s=n?1/n:A??1;return this.getView(s,e)}async getFeatures(e,n,A,s){return(await this._getView(s)).readWigData(e,n,A,s)}async getRegionByteSize(e,n,A,s){return(await this._getView(s)).getBlockSizeForRange(e,n,A,s)}async getRegionByteSizeMulti(e,n){return(await this._getView(n)).getBlockSizeForRangeMulti(e,n)}async getFeaturesMulti(e,n){return(await this._getView(n)).readWigDataMulti(e,n)}async getFeaturesAsArrays(e,n,A,s){return(await this._getView(s)).readWigDataAsArrays(e,n,A,s)}async getFeaturesAsArraysMulti(e,n){return(await this._getView(n)).readWigDataAsArraysMulti(e,n)}}class Jo extends $o{async getView(e,n){const{zoomLevels:A,refsByName:s,uncompressBufSize:r}=await this.getHeader(n),o=1/e,i=A.length-1;for(let a=i;a>=0;a-=1){const c=A[a];if(c.reductionLevel<=2*o)return this.getOrCreateBlockView(s,c.indexOffset,r,"summary")}return this.getUnzoomedView(n)}}function Pc(t,e){if(e<0)return;let n=0;for(let s=0;s<e;s++){if(n=t.indexOf(" ",n),n===-1)return;n++}const A=t.indexOf(" ",n);return A===-1?t.slice(n):t.slice(n,A)}function Ps(t,e){return t<e?-1:t>e?1:0}async function Oo(t,e,n,A,s,r,o,i){const a=4+n*(A+s),c=await t.read(a,e,i),l=rt(c),g=l.getInt8(0),f=l.getInt16(2,!0);let h=4;if(g===0){const u=[];for(let Q=0;Q<f;Q++){const E=CA(c,h,A);h+=A;const m=j(l,h);h+=8,u.push({key:E,offset:m})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const Q=Math.floor((I+d)/2);Ps(r,u[Q].key)>=0?(C=Q,I=Q+1):d=Q-1}const B=u[Math.max(C,0)].offset;return Oo(t,B,n,A,s,r,o,i)}else if(g===1){const u=[];for(let E=0;E<f;E++){const m=CA(c,h,A);h+=A;const p=j(l,h);h+=8;const w=l.getUint32(h,!0);h+=4,h+=4,u.push({key:m,offset:p,length:w})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const E=Math.floor((I+d)/2),m=Ps(r,u[E].key);if(m===0){C=E;break}else m<0?d=E-1:I=E+1}if(C===-1)return[];let B=C;for(;B>0&&u[B-1].key===r;)B--;let Q=C;for(;Q<u.length-1&&u[Q+1].key===r;)Q++;return u.slice(B,Q+1).map(E=>({...E,field:o}))}return[]}class Yo extends $o{indicesP;readIndices(e={}){return this.indicesP||(this.indicesP=this._readIndices(e).catch(n=>{throw this.indicesP=void 0,n})),this.indicesP}async getView(e,n){return this.getUnzoomedView(n)}async _readIndices(e){const{extHeaderOffset:n}=await this.getHeader(e);if(n===0)return[];const A=await this.bbi.read(64,n,e),s=rt(A),r=s.getUint16(2,!0),o=j(s,4);if(r===0)return[];const i=20,a=i*r,c=await this.bbi.read(a,o,e),l=[];for(let g=0;g<r;g+=1){const f=rt(c,g*i),h=f.getInt16(0,!0),u=f.getInt16(2,!0),I=j(f,4),d=f.getInt16(16,!0);l.push({type:h,fieldcount:u,offset:I,field:d})}return l}async searchExtraIndexBlocks(e,n={}){const A=await this.readIndices(n);if(A.length===0)return[];const s=A.map(async o=>{const{offset:i,field:a}=o,c=await this.bbi.read(32,i,n),l=rt(c),g=l.getInt32(4,!0),f=l.getInt32(8,!0),h=l.getInt32(12,!0);return Oo(this.bbi,i+32,g,f,h,e,a,n)});return(await Promise.all(s)).flat()}async searchExtraIndex(e,n={}){const A=await this.searchExtraIndexBlocks(e,n);if(A.length===0)return[];const s=await this.getUnzoomedView(n),r=new Map;for(const i of A){const a=i.field??0,c=r.get(a);c?c.set(i.offset,i):r.set(a,new Map([[i.offset,i]]))}return(await Promise.all([...r].map(async([i,a])=>(await s.readFeatures([...a.values()],n)).map(l=>({...l,field:i}))))).flat().filter(i=>i.rest?Pc(i.rest,i.field-3)===e:!1)}}const zc=["exact","case","decorated","prefix","padded","roman","organelle","accession","version"],zs=new Set(["gi","gb","ref","emb","dbj","tpg","tpe","tpd","lcl","pir","prf","sp","tr","pdb","ena","bbs"]);function ss(t){let e=t.trim().split(/\s+/)[0]??"";if(e=e.replace(/[,;]+$/,""),e.includes("|")){const n=e.split("|").filter(A=>A!=="");if(n.some(A=>zs.has(A.toLowerCase()))){const A=n.filter((s,r)=>zs.has(s.toLowerCase())?!1:!(/^[0-9]+$/.test(s)&&r>0&&n[r-1].toLowerCase()==="gi"));A.length>0&&(e=A[A.length-1])}}return e}const _o=/^(?:chromosome|chrom|chr)[ _.-]?/i;function Ko(t){const e=t.replace(_o,"");if(e===""||e===t)return null;const n=e.toLowerCase();return/^[0-9]/.test(e)||mn.has(n)||En.has(n)||Tn(e)>0||/^un[_.-]/i.test(e)||/^[A-Za-z]{1,2}[0-9]/.test(e)||Ho.test(e)||Wo.test(e.replace(/\.[0-9]+$/,""))?e:null}const Xc=/^(?:lg|linkage_?group|group)[ _.-]?(?=[0-9])/i,qo=/_(random|alt|fix|hap\d+|maternal|paternal)$/i,Vc=/(?:^|[_.-])([A-Z]{2}[0-9]{5,6})v([0-9]+)(?:$|[_.-])/,Ho=/^(N[CGTWZ]|AC)_([0-9]{5,})$/i,Wo=/^[A-Z]{1,6}[0-9]{5,8}$/,Zc=[["mito",["m","mt","mtdna","mito","mitochondrion","mitochondria","mitochondrial","mitochondrion_genome","dmel_mitochondrion_genome","mitochondrial_genome","mitochondrion_dna","chrmt","nc_012920","j01415","nc_001224","nc_005089"]],["plastid",["c","pt","cp","chloroplast","plastid","chloroplast_genome","chrc","nc_000932"]],["2micron",["2-micron","2micron","2u","2-micron_plasmid","nc_001398"]]],En=new Map;for(const[t,e]of Zc)for(const n of e)En.set(n,t);const mn=new Set(["x","y","z","w"]),jc=/^(XL|L|X{0,3})(IX|IV|V?I{0,3})$/i,tl={"":0,x:10,xx:20,xxx:30,xl:40,l:50},el={"":0,i:1,ii:2,iii:3,iv:4,v:5,vi:6,vii:7,viii:8,ix:9};function Tn(t){const e=jc.exec(t);if(e===null)return 0;const n=tl[e[1].toLowerCase()],A=el[e[2].toLowerCase()];return n===void 0||A===void 0?0:n+A}const nl=[{from:1,to:22,first:1,tail:["x","y"]},{from:67,to:85,first:1,tail:["x","y"]}];function Al(t){for(const e of nl){if(t>=e.from&&t<=e.to)return String(e.first+(t-e.from));const n=t-e.to-1;if(n>=0&&n<e.tail.length)return e.tail[n]}return null}const QA=200;function sl(t){return t.length<2||mn.has(t.toLowerCase())?!1:Tn(t)>0}function Po(t){const e=t.map(a=>zo(a)),A=e.filter(a=>sl(a)).length>=2,s=e.filter(a=>/^[0-9]+$/.test(a)&&Number(a)>=1&&Number(a)<=QA),r=s.length<QA,o=a=>e.some(c=>c.toLowerCase()===a),i=r&&s.length>=2;return{roman:A,ordinals:r,xIsTen:A&&!i&&(o("ix")||o("xi"))}}function zo(t){const e=ss(t);return(Ko(e)??e).replace(qo,"")}function gn(t,e){const n=[],A=ss(t);A!==t.trim()&&n.push("decorated");const s=Ko(A),r=s??A;s!==null&&n.push("prefix");const o=qo.exec(r),i=o===null?r:r.slice(0,o.index),a=o===null?"":`+${o[1].toLowerCase()}`,c=i.toLowerCase(),l=Vc.exec(r);if(l!==null)return n.push("accession"),{key:`acc:${l[1].toLowerCase()}`,via:n,version:l[2],opaque:!1};const g=/^(.*?)\.([0-9]+)$/.exec(i),f=g===null?i:g[1],h=g===null?null:g[2],u=En.get(c)??En.get(f.toLowerCase());if(u!==void 0)return u!==c&&n.push("organelle"),{key:`org:${u}`,via:n,version:h,opaque:!1};const I=Ho.exec(f);if(I!==null){n.push("accession");const B=I[1].toLowerCase()==="nc"?Al(Number(I[2])):null;return B!==null?{key:mn.has(B)?`sex:${B}${a}`:`num:${B}${a}`,via:n,version:h,opaque:!1}:{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1}}if(Wo.test(f))return n.push("accession"),{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1};if(/^[0-9]+$/.test(i)&&e.ordinals&&Number(i)<=QA)return/^0[0-9]/.test(i)&&n.push("padded"),{key:`num:${Number(i)}${a}`,via:n,version:null,opaque:!1};const d=/^([0-9]{1,2})([a-z]{1,2})$/i.exec(i);if(d!==null&&e.ordinals)return d[1].startsWith("0")&&n.push("padded"),{key:`num:${Number(d[1])}${d[2].toLowerCase()}${a}`,via:n,version:null,opaque:!1};const C=Xc.exec(i);if(C!==null){const B=i.slice(C[0].length);if(/^[0-9]+$/.test(B))return/^0[0-9]/.test(B)&&n.push("padded"),{key:`lg:${Number(B)}${a}`,via:n,version:null,opaque:!1}}if(mn.has(c)&&!(c==="x"&&e.xIsTen))return{key:`sex:${c}${a}`,via:n,version:null,opaque:!1};if(e.roman){const B=Tn(i);if(B>0)return n.push("roman"),{key:`num:${B}${a}`,via:n,version:null,opaque:!1}}return{key:`raw:${c}${a}`,via:n,version:null,opaque:!0}}function Ee(t){return zc.indexOf(t)}function rl(t,e){let n="case";for(const A of[...t.via,...e.via])Ee(A)>Ee(n)&&(n=A);return n}function tA(t,e){return t===void 0||e===void 0||t<=0||e<=0?"unknown":t===e?"agree":"differ"}const Xs=new WeakMap;class St{names;context;styleCache=null;get style(){return this.styleCache??=il(this.names,this.context),this.styleCache}exact=new Map;folded=new Map;keyed=new Map;constructor(e){this.names=e.map(n=>n.name),this.context=Po(this.names);for(const n of e){this.exact.has(n.name)||this.exact.set(n.name,n),Vs(this.folded,n.name.toLowerCase(),n);const A=gn(n.name,this.context);Vs(this.keyed,A.key,{sequence:n,canon:A})}}static of(e){return new St(e)}static ofNames(e){return new St(e.map(n=>({name:n})))}static for(e){const n=Xs.get(e);if(n!==void 0)return n;const A=typeof e[0]=="string"?St.ofNames(e):St.of(e);return Xs.set(e,A),A}has(e){return this.exact.has(e)}find(e,n={}){const{length:A}=n,s=this.exact.get(e);if(s!==void 0)return{name:s.name,asked:e,tier:"exact",lengths:tA(A,s.length)};const r=this.folded.get(e.toLowerCase());if(r!==void 0&&r.length===1)return{name:r[0].name,asked:e,tier:"case",lengths:tA(A,r[0].length)};const o=n.from??this.context,i=this.byKey(e,gn(e,o),A);if(i!==null)return i;if(!o.roman){const a=zo(e).toLowerCase();if(a!=="x"&&a!=="l"&&Tn(a)>0)return this.byKey(e,gn(e,{...o,roman:!0,xIsTen:!1}),A)}return null}byKey(e,n,A){const s=this.keyed.get(n.key);if(s===void 0||s.length===0)return null;const r=ol(s,A);if(r===null)return null;const o=rl(n,r.canon),i=n.version!==null&&r.canon.version!==null&&n.version!==r.canon.version;return{name:r.sequence.name,asked:e,tier:i&&Ee(o)<Ee("version")?"version":o,lengths:tA(A,r.sequence.length)}}}function ol(t,e){if(t.length===1)return t[0];if(e===void 0||e<=0)return null;const n=t.filter(A=>A.sequence.length===e);return n.length===1?n[0]:null}function Vs(t,e,n){const A=t.get(e);A===void 0?t.set(e,[n]):A.push(n)}function il(t,e=Po(t)){if(t.length===0)return"empty";let n=0,A=0,s=0,r=0;for(const i of t){const a=gn(i,e);if(a.opaque){r++;continue}a.via.includes("accession")?s++:_o.test(ss(i))?n++:A++}const o=n+A+s;return o===0||r>o*4?"assembly":e.roman&&n<=A?"roman":s>n&&s>A?"accession":n>0&&A>0?"mixed":n>0?e.roman?"roman":"ucsc":e.roman?"roman":"ensembl"}function al(t,e){const n=St.of(e),A=St.of(t).context,s=[];for(const g of t){const f=n.find(g.name,{length:g.length,from:A});f!==null&&s.push({source:g,match:f})}s.sort((g,f)=>Ee(g.match.tier)-Ee(f.match.tier));const r=new Map,o=new Set;for(const g of s){const f=r.get(g.match.name);f===void 0?r.set(g.match.name,{source:g.source.name,tier:g.match.tier}):f.tier===g.match.tier&&o.add(g.match.name)}const i=new Map,a=[];let c=0;for(const g of s){const f=r.get(g.match.name);f===void 0||f.source!==g.source.name||o.has(g.match.name)||(i.set(g.source.name,g.match),g.match.tier!=="exact"&&c++,g.match.lengths==="differ"&&a.push(g.match))}const l=t.map(g=>g.name).filter(g=>!i.has(g));return{pairs:i,unmatched:l,contested:a,renamed:c}}function pe(t,e){const n=al(t,e),A=new Map,s=t.map(r=>{const o=n.pairs.get(r.name);return o===void 0?r.name:(A.set(o.name,r.name),o.name)});for(const r of t)A.has(r.name)||A.set(r.name,r.name);return{names:s,sourceOf:A,renamed:n.renamed,contested:n.contested}}function cl(t){return t.map(e=>({name:e}))}function Kt(t,e){const n=ll(t),A=n.get(e);if(A!==void 0)return A;const s=St.for(t).find(e);return s===null?-1:n.get(s.name)??-1}const Zs=new WeakMap;function ll(t){const e=Zs.get(t);if(e!==void 0)return e;const n=new Map;return t.forEach((A,s)=>{const r=typeof A=="string"?A:A.name;n.has(r)||n.set(r,s)}),Zs.set(t,n),n}class Rt extends Error{code;detail;constructor(e,n,A={}){super(n),this.name="ViewerError",this.code=e,this.detail=A}}const eA=new Intl.NumberFormat(void 0,{maximumFractionDigits:0}),gl=new Intl.NumberFormat(void 0,{maximumFractionDigits:3}),fl=new Intl.NumberFormat(void 0,{maximumSignificantDigits:3}),js=new Map,hl=new Intl.NumberFormat("en-US",{maximumFractionDigits:0}),x={int(t){return Number.isFinite(t)?eA.format(t):"—"},num(t){if(!Number.isFinite(t))return"—";if(Number.isInteger(t))return eA.format(t);const e=Math.abs(t);return e>=.001?gl.format(t):e>=1e-7?fl.format(t):t.toExponential(2)},fixed(t,e){if(!Number.isFinite(t))return"—";let n=js.get(e);return n===void 0&&(n=new Intl.NumberFormat(void 0,{minimumFractionDigits:e,maximumFractionDigits:e}),js.set(e,n)),n.format(t)},pct(t,e=1){return Number.isFinite(t)?`${(t*100).toFixed(e)}%`:"—"},pos(t){return Number.isFinite(t)?hl.format(Math.round(t)):"—"},bp(t){return Number.isFinite(t)?Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)} Mb`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(1)} kb`:`${eA.format(t)} bp`:"—"},bytes(t){if(!Number.isFinite(t))return"—";const e=["B","kB","MB","GB","TB"];let n=t,A=0;for(;n>=1e3&&A<e.length-1;)n/=1e3,A++;return`${A===0?n:n.toFixed(1)} ${e[A]}`}};function Xo(t){return!Number.isFinite(t)||t<=0?"—":t>=1e6?`${nA(t/1e6)} Mb`:t>=1e3?`${nA(t/1e3)} kb`:`${nA(t)} bp`}function nA(t){return String(Number(t.toFixed(2)))}function nt(t,e){const n=Il(t),A=dl(n,e);if(A===null)return n;throw new Rt("format",`The ${e.field} of this ${e.format} reads ${EA(t)}, ${A.reason}. `+de,{format:e.format,field:e.field,value:typeof t=="bigint"?t.toString():t,ceiling:e.ceiling,...e.available===void 0?{}:{available:e.available},...A.most===void 0?{}:{most:A.most}})}function rs(t,e,n){const A={format:n.format,field:n.field,offset:t,length:e,size:n.size};if(!BA(t)||!BA(e))throw new Rt("format",`The ${n.field} of this ${n.format} points at ${EA(e)} bytes from byte ${EA(t)}, which is not a place in a file. ${de}`,A);if(n.ceiling!==void 0&&e>n.ceiling)throw new Rt("format",`The ${n.field} of this ${n.format} is ${x.int(e)} bytes long, more than the ${x.int(n.ceiling)} any real one holds. ${de}`,{...A,ceiling:n.ceiling});if(t+e>n.size)throw new Rt("format",`The ${n.field} of this ${n.format} points at bytes ${x.int(t)} to ${x.int(t+e)}, past the end of a file of ${x.int(n.size)}. ${de}`,A)}const tr=65536,Vo=2**29;async function os(t,e){if(typeof DecompressionStream>"u")throw new Rt("unsupported",`Reading a ${e.format} needs DecompressionStream, which this runtime does not have. Every browser since 2023 has it; a very old one does not.`,{format:e.format});const n=new DecompressionStream(e.encoding),A=n.writable.getWriter(),s=n.readable.getReader(),r=[];let o=0,i=!1;const a=(async()=>{for(;;){const{done:I,value:d}=await s.read();if(I)return;if(o+=d.byteLength,o>e.maxBytes){i=!0,await s.cancel();return}r.push(d)}})(),c=(async()=>{for(let I=0;I<t.byteLength;I+=tr){if(i)return;const d=t.subarray(I,Math.min(I+tr,t.byteLength));await A.write(d)}i||await A.close()})(),[l,g]=await Promise.allSettled([a,c]);if(i)throw Zo(e,e.maxBytes,t.byteLength);const f=l.status==="rejected"?l.reason:g.status==="rejected"?g.reason:null;if(f!==null){const I=f instanceof Error?f.message:String(f);throw new Rt("format",`The ${e.field} of this ${e.format} does not inflate (${I.replace(/\.$/,"")}). ${de}`,{format:e.format,field:e.field})}if(r.length===1)return r[0];const h=new Uint8Array(o);let u=0;for(const I of r)h.set(I,u),u+=I.length;return h}function ul(t,e){return Math.min(e.ceiling,Math.max(e.floor,Math.ceil(t*e.ratio)))}function Zo(t,e,n){return new Rt("format",`The ${t.field} of this ${t.format} inflates to more than ${x.bytes(e)}, past what any real one holds. ${de}`,{format:t.format,field:t.field,maxBytes:e,compressed:n})}const de="The file is truncated, corrupt, or not the format its first bytes claim.";function Il(t){return typeof t=="number"?t:t>=BigInt(Number.MIN_SAFE_INTEGER)&&t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):Number.NaN}function BA(t){return Number.isSafeInteger(t)&&t>=0}function dl(t,e){if(!BA(t))return{reason:"which is not a count"};if(t>e.ceiling)return{reason:`more than the ${x.int(e.ceiling)} any real one declares`};if(e.available!==void 0){const n=Math.floor(Math.max(0,e.available)/Math.max(1,e.bytesPerItem??1));if(t>n){const A=Math.max(0,e.available);return{reason:`and the ${x.int(A)} byte${A===1?"":"s"} after it could hold at most ${x.int(n)}`,most:n}}}return null}function EA(t){return typeof t=="bigint"?t.toString():Number.isSafeInteger(t)?x.int(t):String(t)}const Cl=65536;async function Ql(t){return t.length===0?t:os(t,{format:"BGZF file",field:"member",encoding:"deflate-raw",maxBytes:Cl})}const is=12,Et=65536;function We(t){return t.length<is||t[0]!==31||t[1]!==139||t[2]!==8||(t[3]&4)===0?!1:ye(t)!==null}function ye(t){if(t.length<is)return null;const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint16(10,!0);let A=12;const s=Math.min(12+n,t.length);for(;A+4<=s;){const r=t[A],o=t[A+1],i=e.getUint16(A+2,!0);if(r===66&&o===67&&i===2)return e.getUint16(A+4,!0)+1;A+=4+i}return null}const Bl=Ql;async function Yt(t,e=Number.POSITIVE_INFINITY,n=Vo){const A=[];let s=0,r=0;for(;r+is<=t.length;){const a=r,c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const g=new DataView(t.buffer,t.byteOffset+r,c).getUint16(10,!0),f=r+12+g,h=r+c-8;if(h>f){const u=await Bl(t.subarray(f,h));if(u.length>0){if(s+u.length>n)throw Zo({format:"BGZF file",field:"span read"},n,t.length);A.push(u),s+=u.length}}if(r+=c,a>=e)break}const o=new Uint8Array(s);let i=0;for(const a of A)o.set(a,i),i+=a.length;return o}function El(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<36||t[0]!==84||t[1]!==66||t[2]!==73||t[3]!==1)throw new Error("This is not a tabix index: the magic bytes are not TBI\\1.");const n=e.getInt32(4,!0),A=e.getInt32(8,!0),s=String.fromCharCode(e.getInt32(24,!0)),r=e.getInt32(28,!0),o=e.getInt32(32,!0),i=[],a=new TextDecoder().decode(t.subarray(36,36+o));for(const g of a.split("\0"))g!==""&&i.push(g);let c=36+o;const l=new Map;for(let g=0;g<n;g++){const f=e.getInt32(c,!0);c+=4;let h=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY;for(let d=0;d<f;d++){c+=4;const C=e.getInt32(c,!0);c+=4;for(let B=0;B<C;B++){const Q=Number(e.getBigUint64(c,!0)>>16n),E=Number(e.getBigUint64(c+8,!0)>>16n);c+=16,Q<h&&(h=Q),E>u&&(u=E)}}const I=e.getInt32(c,!0);c+=4;for(let d=0;d<I;d++){const C=Number(e.getBigUint64(c,!0)>>16n);c+=8,C>0&&C<h&&(h=C)}Number.isFinite(h)&&Number.isFinite(u)&&g<i.length&&l.set(i[g],{from:h,to:u})}return{names:i,spans:l,format:A,meta:s,skip:r}}function ml(t,e,n){const A=[];for(const r of e){const o=t.spans.get(r);o!==void 0&&A.push({from:o.from,to:Math.min(n,o.to+Et),lastBlock:o.to})}A.sort((r,o)=>r.from-o.from);const s=[];for(const r of A){const o=s[s.length-1];o!==void 0&&r.from<=o.to+(1<<20)?(o.to=Math.max(o.to,r.to),o.lastBlock=Math.max(o.lastBlock,r.lastBlock)):s.push({...r})}return s}function wl(t,e){if(e.length===0)return t.names;const n=St.ofNames(t.names),A=new Set;for(const s of e){const r=n.find(s);r!==null&&A.add(r.name)}return A.size===0?t.names:[...A]}class et{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s={}){const r=Math.min(n,A),o=Math.max(r+1,Math.max(n,A));this.rows.push({contig:this.contigId(e),start:r,end:o,strand:s.strand??0,score:s.score??Number.NaN,name:s.name??"",id:s.id??"",detail:s.detail??"",exons:s.exons??null,cds:s.cds??null,bars:s.bars??null,xyz:s.xyz??null,hap:s.hap??0})}get length(){return this.rows.length}finish(e=null,n=null){const A=this.rows;A.sort((h,u)=>h.contig-u.contig||h.start-u.start||h.end-u.end||h.hap-u.hap);const s=A.length,r={contigs:this.contigs,length:s,contig:new Int32Array(s),start:new Int32Array(s),end:new Int32Array(s),strand:new Int8Array(s),score:new Float32Array(s),name:new Array(s),id:new Array(s),detail:new Array(s),exonAt:new Int32Array(s+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(s),cdsEnd:new Int32Array(s),contigAt:new Int32Array(this.contigs.length+1),maxSpan:new Int32Array(this.contigs.length)};let o=0;for(const h of A)o+=h.exons===null?0:h.exons.length>>1;r.exonStart=new Int32Array(o),r.exonEnd=new Int32Array(o);const i=e===null?0:e.labels.length,a=new Float32Array(i*s).fill(Number.NaN);let c=0;const l=n===null?null:{x:new Float32Array(s),y:new Float32Array(s),z:new Float32Array(s),hap:new Int8Array(s)};let g=0;for(let h=0;h<s;h++){const u=A[h];if(r.contig[h]=u.contig,r.start[h]=u.start,r.end[h]=u.end,r.strand[h]=u.strand,r.score[h]=u.score,r.name[h]=u.name,r.id[h]=u.id,r.detail[h]=u.detail,r.cdsStart[h]=u.cds===null?-1:u.cds[0],r.cdsEnd[h]=u.cds===null?-1:u.cds[1],r.exonAt[h]=g,u.exons!==null){const d=[];for(let C=0;C+1<u.exons.length;C+=2)d.push([u.exons[C],u.exons[C+1]]);d.sort((C,B)=>C[0]-B[0]);for(const[C,B]of d)r.exonStart[g]=C,r.exonEnd[g]=B,g++}if(i>0&&u.bars!==null&&u.bars.length===i)for(let d=0;d<i;d++){const C=u.bars[d];a[h*i+d]=C,C>c&&(c=C)}l!==null&&(l.x[h]=u.xyz===null?Number.NaN:u.xyz[0],l.y[h]=u.xyz===null?Number.NaN:u.xyz[1],l.z[h]=u.xyz===null?Number.NaN:u.xyz[2],l.hap[h]=u.hap);const I=u.end-u.start;I>r.maxSpan[u.contig]&&(r.maxSpan[u.contig]=I)}r.exonAt[s]=g;let f=0;for(let h=0;h<this.contigs.length;h++)for(r.contigAt[h]=f;f<s&&r.contig[f]===h;)f++;if(r.contigAt[this.contigs.length]=f,e!==null){const{limit:h,...u}=e;r.bars={...u,values:a,max:Number.isFinite(h)&&h>0?h:c}}return l!==null&&n!==null&&(r.model={...l,haplotypes:[...n.haplotypes],width:n.width}),r}}function pl(t,e,n=4){const A=new Set(t),s=new Set(e),r=e.filter(i=>!A.has(i)),o=t.filter(i=>!s.has(i));return{matched:e.length-r.length,total:e.length,missing:r.slice(0,n),extra:o.slice(0,n)}}class $n{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s,r,o,i={}){this.rows.push({c1:this.contigId(e),s1:n,e1:Math.max(n+1,A),c2:this.contigId(s),s2:r,e2:Math.max(r+1,o),score:i.score??Number.NaN,name:i.name??"",detail:i.detail??""})}get length(){return this.rows.length}finish(){const e=this.rows.length,n={contigs:this.contigs,length:e,contig1:new Int32Array(e),start1:new Int32Array(e),end1:new Int32Array(e),contig2:new Int32Array(e),start2:new Int32Array(e),end2:new Int32Array(e),score:new Float32Array(e),name:new Array(e),detail:new Array(e)};for(let A=0;A<e;A++){const s=this.rows[A];n.contig1[A]=s.c1,n.start1[A]=s.s1,n.end1[A]=s.e1,n.contig2[A]=s.c2,n.start2[A]=s.s2,n.end2[A]=s.e2,n.score[A]=s.score,n.name[A]=s.name,n.detail[A]=s.detail}return n}}const Me=256,yl=["#FFFEF9","#FCF9CE","#FFF2A9","#FDE188","#FFCA67","#FAAA4B","#F78E40","#F15C34","#ED3024","#D42027","#B01F29","#7A1128","#1A0A10"],Nl=["#FFFFFF","#FFF5F0","#FEE0D2","#FCBBA1","#FC9272","#FB6A4A","#EF3B2C","#CB181D","#A50F15","#67000D"],kl=["#053061","#2166AC","#4393C3","#92C5DE","#D1E5F0","#F7F7F7","#FDDBC7","#F4A582","#D6604D","#B2182B","#67001F"],bl=["#1659b1","#487BA8","#819EC8","#D1E6F1","#FFFFFF","#FAC1C1","#F1606C","#EE222A"],Ml=[0,.125,.25,.375,.5,2/3,5/6,1],Dl=["#00004D","#0000FF","#FFFFFF","#FF0000","#800000"];function De(t,e,n){const A=t.map(i=>[Number.parseInt(i.slice(1,3),16),Number.parseInt(i.slice(3,5),16),Number.parseInt(i.slice(5,7),16)]),s=A.length-1,r=n??A.map((i,a)=>a/s),o=new Array(e*3);for(let i=0;i<e;i++){const a=i/(e-1);let c=0;for(;c<s-1&&a>=r[c+1];)c++;const l=r[c+1]-r[c],g=l>0?(a-r[c])/l:0;for(let f=0;f<3;f++)o[i*3+f]=Math.round(A[c][f]+(A[c+1][f]-A[c][f])*g)}return o}De(yl,Me),De(Nl,Me),De(kl,Me),De(bl,Me,Ml),De(Dl,Me);const Fl="RdBu_r";(()=>{const t=new Int8Array(256).fill(-1),e=(n,A)=>{for(const s of n)t[s.charCodeAt(0)]=A,t[s.toLowerCase().charCodeAt(0)]=A};return e("TU",0),e("C",1),e("A",2),e("G",3),t})();const er=[66,65,77,1],fn=32,At={PAIRED:1,PROPER_PAIR:2,UNMAPPED:4,MATE_UNMAPPED:8,REVERSE:16,FIRST_IN_PAIR:64,SECOND_IN_PAIR:128,SECONDARY:256,QC_FAIL:512,DUPLICATE:1024,SUPPLEMENTARY:2048};function as(t,e,n,A){const s={c:1,C:1,s:2,S:2,i:4,I:4,f:4,A:1};if(n==="Z"||n==="H"){let o=e;for(;o<A&&t[o]!==0;)o++;return o+1}if(n==="B"){const o=String.fromCharCode(t[e]),i=new DataView(t.buffer,t.byteOffset,t.byteLength).getInt32(e+1,!0),a=s[o];return a===void 0||i<0?-1:e+5+i*a}const r=s[n];return r===void 0?-1:e+r}const jo=At.UNMAPPED|At.SECONDARY|At.SUPPLEMENTARY|At.QC_FAIL;function ti(t){return t.length<er.length?!1:er.every((e,n)=>t[n]===e)}function Sl(t){if(!ti(t))throw new Error("This is not a BAM: the first four bytes are not BAM\\1.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<8)return null;const n=e.getInt32(4,!0);if(n<0)throw new Error("This BAM header declares a negative length.");let A=8+n;if(t.length<A+4)return null;const s=new TextDecoder().decode(t.subarray(8,A)),r=e.getInt32(A,!0);if(A+=4,r<0)throw new Error("This BAM header declares a negative reference count.");const o=[];for(let i=0;i<r;i++){if(t.length<A+4)return null;const a=e.getInt32(A,!0);if(A+=4,a<0)throw new Error("This BAM header declares a negative name length.");if(t.length<A+a+4)return null;const c=new TextDecoder().decode(t.subarray(A,A+a-1));A+=a;const l=e.getInt32(A,!0);A+=4,o.push({name:c,length:l})}return{text:s,refs:o,sortOrder:Rl(s),recordsFrom:A}}function Rl(t){for(const e of t.split(`
|
|
2
|
+
`))if(e.startsWith("@HD"))for(const n of e.split(" ")){if(!n.startsWith("SO:"))continue;const A=n.slice(3).trim();return A==="coordinate"||A==="queryname"||A==="unsorted"?A:"unknown"}return"unknown"}const Ll=[!0,!1,!0,!0,!1,!1,!1,!0,!0],Gl=[!0,!0,!1,!1,!0,!1,!1,!0,!0];function mt(t){return Ll[t]===!0}function Ot(t){return Gl[t]===!0}function ei(t,e,n){let A=0;for(let s=0;s<n;s++){const r=t.getUint32(e+s*4,!0);mt(r&15)&&(A+=r>>>4)}return A}function wn(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s={at:0,bytes:0,refId:-1,pos:-1,end:-1,mapq:0,flag:0,nameBytes:0,cigarOps:0,cigarAt:0,seqLength:0,seqAt:0,nextRefId:-1,nextPos:-1,tlen:0};let r=e;for(;r+4<=t.length;){const o=A.getInt32(r,!0);if(o<=0)break;const i=r+4;if(i+o>t.length||o<fn)break;const a=A.getUint8(i+8),c=A.getUint16(i+12,!0),l=i+fn+a,g=A.getInt32(i+16,!0),f=A.getInt32(i+4,!0),h=fn+a+c*4+Math.ceil(g/2)+g;if(g<0||h>o)break;if(s.at=i,s.bytes=o+4,s.refId=A.getInt32(i,!0),s.pos=f,s.mapq=A.getUint8(i+9),s.flag=A.getUint16(i+14,!0),s.nameBytes=a,s.cigarOps=c,s.cigarAt=l,s.seqLength=g,s.seqAt=l+c*4,s.nextRefId=A.getInt32(i+20,!0),s.nextPos=A.getInt32(i+24,!0),s.tlen=A.getInt32(i+28,!0),s.end=f<0?f:f+ei(A,l,c),n(s)===!1)return;r+=4+o}}function xl(t,e){const n=e.at+fn;return new TextDecoder().decode(t.subarray(n,n+e.nameBytes-1))}const cs="=ACMGRSVTWYHKDBN";function vl(t,e,n){let A="";for(let s=0;s<n;s++){const r=t[e+(s>>1)];A+=cs[s%2===0?r>>4:r&15]}return A}function Ul(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s={};let r=e;for(;r+3<=n;){const o=String.fromCharCode(t[r],t[r+1]),i=String.fromCharCode(t[r+2]);if(r+=3,i==="B"){const c=String.fromCharCode(t[r]),l=A.getInt32(r+1,!0);r+=5;const g=nr[c];if(g===void 0||l<0||r+l*g>n)return s;const f=[];for(let h=0;h<l;h++)f.push(Ar(A,r+h*g,c));r+=l*g,s[o]=f;continue}if(i==="Z"||i==="H"){let c=r;for(;c<n&&t[c]!==0;)c++;s[o]=new TextDecoder().decode(t.subarray(r,c)),r=c+1;continue}if(i==="A"){s[o]=String.fromCharCode(t[r]),r+=1;continue}const a=nr[i];if(a===void 0)return s;s[o]=Ar(A,r,i),r+=a}return s}const nr={c:1,C:1,s:2,S:2,i:4,I:4,f:4};function Ar(t,e,n){switch(n){case"c":return t.getInt8(e);case"C":return t.getUint8(e);case"s":return t.getInt16(e,!0);case"S":return t.getUint16(e,!0);case"i":return t.getInt32(e,!0);case"I":return t.getUint32(e,!0);case"f":return t.getFloat32(e,!0);default:return 0}}function Pe(t,e){if(e.cigarOps!==2)return null;const n=new DataView(t.buffer,t.byteOffset,t.byteLength),A=n.getUint32(e.cigarAt,!0),s=n.getUint32(e.cigarAt+4,!0);if((A&15)!==4||A>>>4!==e.seqLength||(s&15)!==3)return null;const r=e.seqAt+(e.seqLength+1>>1),i=Ul(t,r+e.seqLength,e.at+e.bytes-4).CG;return Array.isArray(i)?Uint32Array.from(i):null}const Tl=/^([ACGTUN])([-+])([A-Za-z]+|\d+)([.?]?)((?:,\d+)*),?$/;function $l(t){const e=[];for(const n of t.split(";")){const A=n.trim();if(A==="")continue;const s=Tl.exec(A);if(s===null)return null;const[,r,o,i,a,c]=s,l=/^\d+$/.test(i)?[i]:[...i],g=c===""?[]:c.slice(1).split(",").map(Number);e.push({base:r==="U"?"T":r,strand:o,codes:l,mode:a==="?"?"explicit":"implicit",skips:g})}return e}const Jl={A:"T",C:"G",G:"C",T:"A",U:"A",N:"N",M:"K",K:"M",R:"Y",Y:"R",S:"S",W:"W",B:"V",V:"B",D:"H",H:"D"};function Ol(t){let e="";for(let n=t.length-1;n>=0;n--){const A=t[n].toUpperCase();e+=Jl[A]??"N"}return e}function Yl(t,e,n,A){const s=$l(n);if(s===null||t.length===0)return[];const r=e?Ol(t):t.toUpperCase(),o=r.length,i=l=>e?o-1-l:l,a=[];let c=0;for(const l of s){const g=l.skips.length*l.codes.length;if(A!==null&&c+g>A.length)return[];const f=u=>l.base==="N"||u===l.base;let h=0;for(let u=0;u<l.skips.length;u++){let I=l.skips[u];for(;h<o;){if(f(r[h])){if(I===0)break;if(l.mode==="implicit")for(const d of l.codes)a.push({query:i(h),code:d,prob:0,implicit:!0});I--}h++}if(h>=o)return[];for(let d=0;d<l.codes.length;d++){const C=A===null?255:A[c+u*l.codes.length+d];a.push({query:i(h),code:l.codes[d],prob:C,implicit:!1})}h++}if(l.mode==="implicit"){for(;h<o;h++)if(f(r[h]))for(const u of l.codes)a.push({query:i(h),code:u,prob:0,implicit:!0})}c+=g}return a.sort((l,g)=>l.query-g.query),a}function _l(t,e,n){const A=new Int32Array(n).fill(-1);let s=e,r=0;for(let o=0;o<t.length;o++){const i=t[o]&15,a=t[o]>>>4,c=mt(i),l=Ot(i);if(c&&l)for(let g=0;g<a&&r+g<n;g++)A[r+g]=s+g;c&&(s+=a),l&&(r+=a)}return A}function Kl(t,e,n,A){if(t.length===0)return[];const s=_l(e,n,A),r=[];for(const o of t){const i=s[o.query];i===void 0||i<0||r.push({pos:i,code:o.code,prob:o.prob,implicit:o.implicit})}return r.sort((o,i)=>o.pos-i.pos),r}function ql(t,e){const n={mm:null,ml:null,mn:null},A=new DataView(t.buffer,t.byteOffset,t.byteLength);let s=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const r=e.at+e.bytes-4;for(;s+3<=r;){const o=t[s],i=t[s+1],a=String.fromCharCode(t[s+2]);if(s+=3,o===77)if((i===77||i===109)&&a==="Z"){let c=s;for(;c<r&&t[c]!==0;)c++;n.mm=new TextDecoder().decode(t.subarray(s,c))}else if((i===76||i===108)&&a==="B"&&t[s]===67){const c=A.getInt32(s+1,!0);c>=0&&s+5+c<=r&&(n.ml=t.slice(s+5,s+5+c))}else i===78&&"cCsSiI".includes(a)&&(n.mn=Hl(A,s,a));if(s=as(t,s,a,r),s<0)break}return n}function Hl(t,e,n){switch(n){case"c":return t.getInt8(e);case"C":return t.getUint8(e);case"s":return t.getInt16(e,!0);case"S":return t.getUint16(e,!0);case"i":return t.getInt32(e,!0);default:return t.getUint32(e,!0)}}function ni(t,e,n=null){if(e.seqLength<=0)return[];const A=ql(t,e);if(A.mm===null||A.mm==="")return[];if(A.mn!==null&&A.mn!==e.seqLength)return[];const s=vl(t,e.seqAt,e.seqLength),r=Yl(s,(e.flag&16)!==0,A.mm,A.ml);return r.length===0?[]:Kl(r,n??Wl(t,e),e.pos,e.seqLength)}function Wl(t,e){const n=Pe(t,e);if(n!==null)return n;const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=new Uint32Array(e.cigarOps);for(let r=0;r<e.cigarOps;r++)s[r]=A.getUint32(e.cigarAt+r*4,!0);return s}function Pl(t){return(t+.5)/256}function zl(t,e){const n=Pl(t);return n>=e?1:n<=1-e?0:-1}const Xl={m:"5mC",h:"5hmC",f:"5fC",c:"5caC",C:"any C mod",g:"5hmU",e:"5fU",b:"5caU",T:"any T mod",U:"any U mod",a:"6mA",A:"any A mod",o:"8oxoG",G:"any G mod",n:"Xao",N:"any mod",21839:"4mC",17802:"pseU",17596:"inosine",27551:"5mC",76792:"5hmC",28871:"6mA"};function Vl(t){return Xl[t]??(/^\d+$/.test(t)?`ChEBI:${t}`:t)}const ct=" · ";function Ai(t){let e=0,n=0;const A=t.length;for(;n<A&&e<Zl;){let s=t.indexOf(`
|
|
3
|
+
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o==="")continue;if(o.startsWith("##")){if(/^##fileformat=VCF/i.test(o))return!0;continue}if(o.startsWith("#")){if(/^#CHROM\s+POS\s+ID\s+REF\s+ALT/i.test(o))return!0;continue}const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(!jl(i))return!1;e++}return e>=1}const Zl=4;function si(t){return t.length<8||!/^\d+$/.test(t[1])?!1:ri(t[3])&&eg(t[4])}function jl(t){return si(t)&&tg(t[5])}function tg(t){return t===void 0?!1:t==="."?!0:t!==""&&Number.isFinite(Number(t))}function ri(t){return t!==void 0&&/^[ACGTNacgtnRYKMSWBDHVryksmwbdhv]+$/.test(t)}function eg(t){return t===void 0||t===""?!1:t.split(",").every(e=>e==="."||e==="*"||ri(e)||/^<[^<>]+>$/.test(e)||/[[\]]/.test(e)||/^\.[ACGTNacgtn]+$/.test(e)||/^[ACGTNacgtn]+\.$/.test(e))}function ng(t,e){const n=e.split(",").filter(s=>s!==""&&s!=="."&&s!=="*");if(n.length===0)return"snv";let A=null;for(const s of n){const r=/^<[^<>]+>$/.test(s)||/[[\]]/.test(s)?"structural":s.length===t.length?"snv":s.length>t.length?"insertion":"deletion";if(A===null)A=r;else if(A!==r)return"mixed"}return A??"snv"}function Ce(t,e){if(!(t===""||t===".")){for(const n of t.split(";"))if(n.startsWith(e)){if(n.length===e.length)return"";if(n.charCodeAt(e.length)===61)return n.slice(e.length+1)}}}function pn(t){if(t===void 0||t===""||t===".")return;const e=Number(t);return Number.isFinite(e)?e:void 0}function Ag(t,e,n,A){const s=t+Math.max(1,e.length);if(!/<[^<>]+>/.test(n))return s;const r=pn(Ce(A,"END"));if(r!==void 0&&r>t)return r;if(sg(n,A))return s;const o=rg(A);return o>0?t+o+1:s}function sg(t,e){return/<INS(:|>)/i.test(t)?!0:/^INS(:|$)/i.test(Ce(e,"SVTYPE")??"")}function rg(t){const e=Ce(t,"SVLEN");if(e===void 0||e==="")return 0;let n=0;for(const A of e.split(",")){const s=pn(A);s!==void 0&&Math.abs(s)>n&&(n=Math.abs(s))}return n}function oi(t){const e=new et;let n=0;if(ls(t,s=>{if(s.startsWith("##"))return;if(s.startsWith("#")){const I=mA(s);/^#CHROM$/i.test(I[0]??"")&&Math.max(0,I.length-9);return}const r=mA(s);if(!si(r)){n++;return}const[o,i,a,c,l,g,f,h]=r,u=Math.max(0,Number(i)-1);e.add(o,u,Ag(u,c,l,h??""),{...a===void 0||a==="."||a===""?{}:{name:a,id:a},...pn(g)===void 0?{}:{score:pn(g)},detail:ig(c,l,g,f,h??"")})}),e.length===0&&n>0)throw new Error(`No usable rows: all ${n} data lines failed the "contig, position, ID, REF, ALT" test a VCF record begins with.`);return e.finish()}function og(t){let e=0;return ls(t,n=>{if(!n.startsWith("#"))return!1;if(n.startsWith("##"))return;const A=mA(n);return/^#CHROM$/i.test(A[0]??"")&&(e=Math.max(0,A.length-9)),!1}),e}function ig(t,e,n,A,s){const r=[`${t}>${e}`,`type ${ng(t,e)}`];n!==void 0&&n!=="."&&n!==""&&r.push(`QUAL ${n}`),A!==void 0&&A!=="."&&A!==""&&r.push(`filter ${A}`);const o=Ce(s,"AF");o!==void 0&&o!==""&&r.push(`AF ${o}`);const i=Ce(s,"DP");i!==void 0&&i!==""&&r.push(`DP ${i}`);const a=Ce(s,"SVTYPE");return a!==void 0&&a!==""&&r.push(`SVTYPE ${a}`),r.join(ct)}function ls(t,e){let n=0;const A=t.length;for(;n<A;){let s=t.indexOf(`
|
|
4
|
+
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o!==""&&e(o)===!1)return}}function mA(t){return t.includes(" ")?t.split(" "):t.trim().split(/\s+/)}function ag(t){const e=[];return ls(t,n=>{if(!n.startsWith("#"))return!1;if(!n.startsWith("##contig=<"))return;const A=/[<,]ID=([^,>]+)/.exec(n),s=/[<,]length=(\d+)/.exec(n);A===null||s===null||e.push({name:A[1],length:Number(s[1])})}),e}async function gs(t,e=Vo){if(!(t.length>2&&t[0]===31&&t[1]===139))return t;if(typeof DecompressionStream>"u")throw new Error("This file is gzipped and this browser has no DecompressionStream to un-gzip it with. Decompress it and drop the plain text file.");return We(t)?Yt(t,Number.POSITIVE_INFINITY,e):os(t,{format:"file",field:"gzip stream",encoding:"gzip",maxBytes:e})}function wt(t,e){let n=0,A=0;const s=t.length;for(;n<s;){let r=t.indexOf(`
|
|
5
|
+
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);n=r+1,A++,!(i===""||i.charCodeAt(0)===35)&&(i.startsWith("track ")||i.startsWith("browser ")||e(i.includes(" ")?i.split(" "):i.trim().split(/\s+/),A))}}function Jn(t){let e=null;return wt(t,n=>{e??=n}),e}function R(t){return t!==void 0&&/^[+-]?\d+$/.test(t)}function Wt(t){return t!==void 0&&t!==""&&Number.isFinite(Number(t))}function sr(t){return R(t)&&Number(t)>=0}function ii(t,e=""){const n=fs(t);if(n!==null){const s=n.map(r=>r.trim().toLowerCase());return s.includes("chrom2")||s.includes("chr2")||s.includes("start2")?"bedpe":"bed"}const A=Jn(t);return A===null?/\.(gtf|gff3?)(\.b?gz)?$/i.test(e)?"gtf":/\.(bedpe|pairs)(\.b?gz)?$/i.test(e)?"bedpe":"bed":R(A[1])&&R(A[2])?A.length>=6&&!R(A[3])&&R(A[4])&&R(A[5])?"bedpe":"bed":A.length>=8&&R(A[3])&&R(A[4])?"gtf":"bed"}function fs(t){const e=Jn(t);return e===null||e.length<3||R(e[1])||R(e[3])?null:e}function Ut(t,e){const n=t.map(A=>A.trim().toLowerCase());for(const A of e){const s=n.indexOf(A);if(s>=0)return s}return-1}function hs(t,e=""){const n=new et,A=fs(t),s=cg(t,e);let r=0,o=!0;if(wt(t,i=>{if(o&&A!==null){o=!1;return}if(o=!1,i.length<3||!R(i[1])||!R(i[2])){r++;return}const a=i[0],c=Number(i[1]),l=Number(i[2]),g=i[3]!==void 0&&i[3]!=="."?i[3]:"",f=ai(i[5]),h=wA(s===null?i[4]:i[ci(s)]),u=lg(i,c,l),I=gg(i,s);n.add(a,c,l,{strand:f,score:h,name:g,detail:fg(i,s),...u===null?{}:{exons:u},...I===null?{}:{cds:I}})}),n.length===0&&r>0)throw new Error(`No usable rows: all ${r} lines failed the "contig, start, end" test that every BED-like format begins with.`);return n.finish()}function cg(t,e){if(/\.narrowpeak(\.b?gz)?$/i.test(e))return"narrow";if(/\.gappedpeak(\.b?gz)?$/i.test(e))return"gapped";if(/\.broadpeak(\.b?gz)?$/i.test(e))return"broad";const n=Jn(t);return n===null?null:n.length===10&&Wt(n[6])&&Wt(n[7])&&Wt(n[8])?R(n[9])?"narrow":null:n.length===15&&Wt(n[12])&&Wt(n[13])&&Wt(n[14])?"gapped":n.length!==9||n[8]!==void 0&&n[8].includes(",")?null:[n[6],n[7],n[8]].some(s=>s!==void 0&&Wt(s)&&!R(s))?"broad":null}function ai(t){return t==="+"?1:t==="-"?-1:0}function wA(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}function ci(t){return t==="gapped"?12:6}function lg(t,e,n){if(t.length<12)return null;const A=(t[10]??"").split(",").filter(i=>i!==""),s=(t[11]??"").split(",").filter(i=>i!=="");if(A.length===0||A.length!==s.length||!R(t[9])||Number(t[9])!==A.length||!A.every(sr)||!s.every(sr))return null;const r=A.length-1;if(Number(s[0])!==0||e+Number(s[r])+Number(A[r])!==n)return null;const o=[];for(let i=0;i<A.length;i++){const a=e+Number(s[i]);o.push(a,a+Number(A[i]))}return o}function gg(t,e){if(e==="narrow"||e==="broad"||t.length<8||!R(t[6])||!R(t[7]))return null;const n=Number(t[6]),A=Number(t[7]);return A>n?[n,A]:null}function fg(t,e){if(e===null){const s=t[4];return s===void 0||s===""||s==="."?"":`score ${s}`}const n=ci(e),A=[`signal ${t[n]??"—"}`,`-log10 p ${t[n+1]??"—"}`,`-log10 q ${t[n+2]??"—"}`];return e==="narrow"&&t[9]!==void 0&&t[9]!=="-1"&&A.push(`summit +${t[9]}`),A.join(ct)}function li(t){const e=new Map,n=new Map,A=new Map,s=[],r=[],o=pg(t);wt(t,l=>{if(l.length<8||!R(l[3])||!R(l[4]))return;const g=l[0],f=l[1]??"",h=(l[2]??"").toLowerCase(),u=Number(l[3])-1,I=Number(l[4]),d=ai(l[6]),C=yg(l[8]??"",o),B=mg(h,C,o);if(B==="landmark")return;const Q=Cg(C,B),E=gi(C,Ig),m=C.get("gene_biotype")??C.get("gene_type")??"",p=C.get("product")??"";if(B==="gene"){for(const N of[Q,C.get("id")??""])N!==""&&(E!==""&&n.set(N,E),m!==""&&A.set(N,m));s.push({contig:g,start:u,end:I,strand:d,geneId:Q,geneName:E,biotype:m,source:f,product:p,exons:[],pieces:[],cdsFrom:-1,cdsTo:-1});return}const w=Eg(C,B);if(w===null&&B!=="standalone")return;let y=w===null?void 0:e.get(w);y===void 0&&(y={contig:g,start:u,end:I,strand:d,geneId:Q,geneName:E,biotype:m,source:f,product:p,exons:[],pieces:[],cdsFrom:-1,cdsTo:-1},w===null?r.push(y):e.set(w,y)),B==="transcript"?(y.start=u,y.end=I):(u<y.start&&(y.start=u),I>y.end&&(y.end=I)),y.geneId===""&&(y.geneId=Q),y.geneName===""&&(y.geneName=E),y.biotype===""&&(y.biotype=m),y.product===""&&(y.product=p),h==="exon"&&y.exons.push(u,I),(h==="cds"||h==="stop_codon")&&((y.cdsFrom<0||u<y.cdsFrom)&&(y.cdsFrom=u),I>y.cdsTo&&(y.cdsTo=I)),(h==="cds"||h==="stop_codon"||hg.test(h))&&y.pieces.push(u,I)});const i=[...e.values(),...r],a=i.length>0?i:s;if(a.length===0)throw new Error("No features found. Every row either described the sequence itself rather than something on it, or named a parent that the file never defines — on a GTF, that means no row carried a `transcript_id`.");const c=new et;for(const l of a){if(l.exons.length===0){const d=ug(l.pieces);d.length>=4&&(l.exons=d)}const g=l.geneId===""?"":n.get(l.geneId)??"",f=g!==""?g:l.geneName,h=f!==""?f:l.geneId,u=l.biotype!==""?l.biotype:A.get(l.geneId)??"",I=[u===""?"":`biotype ${u}`,l.product===""?"":`product ${l.product}`,l.source===""?"":`source ${l.source}`,l.exons.length>0?`${l.exons.length>>1} exons`:""].filter(d=>d!=="").join(ct);c.add(l.contig,l.start,l.end,{strand:l.strand,name:h,id:l.geneId,detail:I,...l.exons.length>0?{exons:l.exons}:{},...l.cdsFrom>=0&&l.cdsTo>l.cdsFrom?{cds:[l.cdsFrom,l.cdsTo]}:{}})}return c.finish()}const hg=/^(five_prime_|three_prime_|5'|3')?utr$/;function ug(t){const e=[];for(let A=0;A+1<t.length;A+=2)e.push([t[A],t[A+1]]);e.sort((A,s)=>A[0]-s[0]||A[1]-s[1]);const n=[];for(const[A,s]of e){const r=n.length-1;r>0&&A<=n[r]?n[r]=Math.max(n[r],s):n.push(A,s)}return n}const Ig=["gene_name","genename","gene_symbol","symbol","gene","name"],dg=["gene_id","geneid","locus_tag"];function gi(t,e){for(const n of e){const A=t.get(n);if(A!==void 0&&A!=="")return A}return""}function Cg(t,e){const n=gi(t,dg);if(n!=="")return n;if(e==="gene"||e==="standalone")return t.get("id")??"";if(e!=="transcript")return"";const A=t.get("parent")??"";return A===""?"":A.split(",")[0]}function Qg(t){return t.endsWith("gene")}function Bg(t){return t==="transcript"||t.endsWith("_transcript")||t.endsWith("rna")}function Eg(t,e){const n=t.get("transcript_id");if(n!==void 0&&n!=="")return n;if(e==="part"){const s=t.get("parent");return s===void 0||s===""?null:s.split(",")[0]}const A=t.get("id");return A===void 0||A===""?null:A}function mg(t,e,n){return wg.has(t)?"landmark":Qg(t)?"gene":Bg(t)?"transcript":rr(e,"transcript_id")||!n||rr(e,"parent")?"part":"standalone"}const wg=new Set(["region","source","chromosome","contig","scaffold","supercontig"]);function rr(t,e){const n=t.get(e);return n!==void 0&&n!==""}function pg(t){const n=Jn(t)?.[8];if(n===void 0)return!1;const A=n.indexOf("="),s=n.indexOf('"');return A>=0&&(s<0||A<s)}function yg(t,e){const n=new Map;for(const A of t.split(";")){const s=A.trim();if(s==="")continue;if(e){const i=s.indexOf("=");if(i<0)continue;n.set(s.slice(0,i).toLowerCase(),Ng(s.slice(i+1)));continue}const r=s.indexOf(" ");if(r<0)continue;const o=s.slice(r+1).trim();n.set(s.slice(0,r).toLowerCase(),o.startsWith('"')&&o.endsWith('"')?o.slice(1,-1):o)}return n}function Ng(t){if(!t.includes("%"))return t;try{return decodeURIComponent(t)}catch{return t}}function fi(t){const e=fs(t),n=new $n,A=e===null?{c1:0,s1:1,e1:2,c2:3,s2:4,e2:5,name:6,score:7}:{c1:Ut(e,["chrom1","chr1","chrom_1"]),s1:Ut(e,["start1","x1","start_1"]),e1:Ut(e,["end1","x2","end_1"]),c2:Ut(e,["chrom2","chr2","chrom_2"]),s2:Ut(e,["start2","y1","start_2"]),e2:Ut(e,["end2","y2","end_2"]),name:Ut(e,["name","id","label"]),score:Ut(e,["score","value","obs/exp","count"])};if(A.c1<0||A.s1<0||A.e1<0||A.c2<0||A.s2<0||A.e2<0)throw new Error("This looks like a paired file but its header does not name all six coordinate columns. Expected chrom1, start1, end1, chrom2, start2 and end2.");const s=e===null?[]:e.map((i,a)=>({name:i.trim(),index:a})).filter(i=>i.name!==""&&![A.c1,A.s1,A.e1,A.c2,A.s2,A.e2,A.name].includes(i.index));let r=!0,o=0;if(wt(t,i=>{if(r&&e!==null){r=!1;return}if(r=!1,!R(i[A.s1])||!R(i[A.e1])){o++;return}if(!R(i[A.s2])||!R(i[A.e2])){o++;return}const a=s.map(c=>{const l=i[c.index];return l===void 0||l===""?"":`${c.name} ${l}`}).filter(c=>c!=="").join(" · ");n.add(i[A.c1],Number(i[A.s1]),Number(i[A.e1]),i[A.c2],Number(i[A.s2]),Number(i[A.e2]),{score:A.score<0?Number.NaN:wA(i[A.score]),name:A.name<0?"":i[A.name]??"",detail:a})}),n.length===0)throw new Error(o>0?`No usable rows: all ${o} lines were missing one of the six coordinates.`:"No rows found.");return n.finish()}const kg=2,bg="top",Mg="total",Dg=4;function hi(t,e=""){const n=/\.(bigbarchart|barchart)(\.b?gz)?$/i.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<Dg;){let o=t.indexOf(`
|
|
6
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!Fg(c,n))return!1;A++}return A>0}function Fg(t,e){return t.length<9||!R(t[1])||!R(t[2])||!e&&R(t[6])?!1:ui(t)>0}function ui(t){const e=Number(t[7]);return!R(t[7])||e<kg?0:Ii(t[8]??"").length===e?e:0}function Ii(t){const e=t.trim();if(e==="")return[];const n=e.split(",");n.length>0&&n[n.length-1]===""&&n.pop();const A=[];for(const s of n){const r=Number(s);if(s.trim()===""||!Number.isFinite(r))return[];A.push(r)}return A}function di(t,e=""){const n=$g(t),A=new et,s=Ci(n.barchartbars);let r=s.length,o=0,i=0;if(wt(t,a=>{if(a.length<3||!R(a[1])||!R(a[2])){o++;return}const c=ui(a);r===0&&c>0&&(r=c);const l=c===r&&c>0?Ii(a[8]??""):null;l===null&&i++;const g=Number(a[1]),f=Number(a[2]),h=or(a[3]),u=or(a[6]);A.add(a[0],g,f,{strand:vg(a[5]),score:Ug(a[4]),name:u===""?h:u,id:h,detail:Gg(l,s),...l===null?{}:{bars:l}})}),A.length===0&&o>0)throw new Error(`No usable rows: all ${o} lines failed the "contig, start, end" test that every BED-like format begins with.`);if(r===0)throw new Error(`No row of ${e===""?"this file":e} carries a category count and a matching list of values, which is the whole of what makes a barChart one.`);return A.finish(Sg(n,s,r,i))}function Sg(t,e,n,A){return{labels:e.length===n?e:Rg(n),named:e.length===n,colours:Lg(Ci(t.barchartcolors),n),unit:t.barchartunit??"",label:t.barchartlabel??"",metric:t.barchartmetric??"",limit:Number(t.maxlimit??Number.NaN),unplaced:A}}function Rg(t){const e=[];for(let n=0;n<t;n++)e.push(String(n+1));return e}function Lg(t,e){return t.length===e?t:[]}function Gg(t,e){if(t===null||t.length===0)return"";let n=0,A=0;for(let r=0;r<t.length;r++)n+=t[r],t[r]>t[A]&&(A=r);const s=[`${Mg} ${xg(n)}`];return e.length===t.length&&s.unshift(`${bg} ${e[A]}`),s.join(ct)}function xg(t){return Number.isInteger(t)?String(t):t.toFixed(2)}function or(t){return t===void 0||t==="."?"":t}function vg(t){return t==="+"?1:t==="-"?-1:0}function Ug(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}const Tg=100;function $g(t){const e={};let n=0,A=0;const s=t.length;for(;n<s&&A<Tg;){let r=t.indexOf(`
|
|
7
|
+
`,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);if(n=r+1,A++,!(i===""||i.charCodeAt(0)===35)){if(!i.startsWith("track ")){if(!i.startsWith("browser "))break;continue}for(const[,a,c,l]of i.matchAll(/(\w+)=(?:"([^"]*)"|(\S+))/g))e[a.toLowerCase()]=c??l??"";break}}return e}function Ci(t){if(t===void 0)return[];const e=t.trim();return e===""?[]:e.split(/[\s,]+/)}function Jg(t){return/\bexpCount\b/.test(t)&&/\bexpScores\b/.test(t)}function Og(t){const e=t.bars,n=`${t.length.toLocaleString()} feature${t.length===1?"":"s"}`;if(e===void 0)return n;const A=e.label===""?"categories":e.label.toLowerCase(),s=[n,`${e.labels.length} ${A}`];return e.unplaced>0&&s.push(`${e.unplaced.toLocaleString()} with no chart`),s.join(" · ")}const us="haplotype";function Qi(t){const e=t.split(/[\\/]/).pop()??t,n=e.split(/[?#]/)[0]??e;return/\.(g3d|3dg)(\.txt)?(\.gz)?$/i.test(n)?"g3d":/\.bed3d(\.txt)?(\.gz)?$/i.test(n)?"bed3d":/\.pdb(\.gz)?$/i.test(n)?"pdb":null}function Yg(t){return Qi(t)==="pdb"}const AA="shared",ir="maternal",ar="paternal",_g=200,Kg=1/3;function pA(t,e=""){return Ei(t,e,"g3d")}function Bi(t,e=""){return Ei(t,e,"bed3d")}function Ei(t,e,n){if(Qi(e)===n)return!0;const A=[];let s=!1,r=0;const o=t.length;for(;r<o&&A.length<_g;){let i=t.indexOf(`
|
|
8
|
+
`,r);i<0&&(i=o);let a=i;a>r&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(r,a);if(r=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=mi(l,n);if(g===null)return!1;g!==Is&&((!Number.isInteger(g.xyz[0])||!Number.isInteger(g.xyz[1])||!Number.isInteger(g.xyz[2])||g.xyz[0]<0||g.xyz[1]<0||g.xyz[2]<0)&&(s=!0),A.push(g))}return A.length===0||!s?!1:Wg(A)}const Is="unplaced",qg=/^(|[+-]?nan|na|n\/a|none|null|\.|[+-]?inf(inity)?)$/i;function mi(t,e){const n=e==="g3d"?2:3;if(t.length<n+3||t.length>n+4||!R(t[1]))return null;let A=null;if(e==="bed3d"&&(!R(t[2])||(A=Number(t[2]),A<=Number(t[1]))))return null;const s=[t[n],t[n+1],t[n+2]];if(s.some(l=>l!==void 0&&qg.test(l)))return Is;const[r,o,i]=s.map(Number);if(!Number.isFinite(r)||!Number.isFinite(o)||!Number.isFinite(i))return null;let a=t[0],c=t[n+3];if(c!==void 0){if(!/^[A-Za-z][\w.-]*$/.test(c))return null}else{const l=/^(.+)\(([\w.-]+)\)$/.exec(a);l!==null&&(a=l[1],c=l[2])}return a===""?null:{contig:a,start:Number(t[1]),end:A,xyz:[r,o,i],hap:Hg(c)}}function Hg(t){if(t===void 0||t==="")return AA;const e=t.toLowerCase();return e==="m"||e==="mat"||e===ir?ir:e==="p"||e==="pat"||e===ar?ar:e==="s"||e===AA?AA:t}function Wg(t){const e=new Map;for(const i of t){const a=`${i.contig}\0${i.hap}`,c=e.get(a);c===void 0?e.set(a,[i]):c.push(i)}let n=[1/0,1/0,1/0],A=[-1/0,-1/0,-1/0];for(const i of t)n=n.map((a,c)=>Math.min(a,i.xyz[c])),A=A.map((a,c)=>Math.max(a,i.xyz[c]));const s=Math.hypot(A[0]-n[0],A[1]-n[1],A[2]-n[2]);if(!(s>0))return!0;const r=[];for(const i of e.values())if(!(i.length<6)){i.sort((a,c)=>a.start-c.start);for(let a=1;a<i.length;a++){const c=i[a-1].xyz,l=i[a].xyz;r.push(Math.hypot(l[0]-c[0],l[1]-c[1],l[2]-c[2]))}}return r.length===0?!0:(r.sort((i,a)=>i-a),r[r.length>>1]<s*Kg)}function Pg(t){const e=new Map;for(const s of t){const r=[...s].sort((o,i)=>o-i);for(let o=1;o<r.length;o++){const i=r[o]-r[o-1];i<=0||e.set(i,(e.get(i)??0)+1)}}let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}function zg(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=1,A=0;for(const[s,r]of e)(r>A||r===A&&s<n)&&(A=r,n=s);return n}function wi(t,e=""){return yi(t,e,"g3d")}function pi(t,e=""){return yi(t,e,"bed3d")}function yi(t,e,n){const A=[];let s=0,r=0;if(wt(t,h=>{const u=mi(h,n);u===Is?r++:u===null?s++:A.push(u)}),A.length===0){const h=n==="g3d"?"chromosome, start, x, y, z":"chromosome, start, end, x, y, z";throw new Error(r>0&&s===0?`No bead in this file has a place: all ${r} rows carry \`nan\` where their coordinates go.`:s>0?`No usable rows: all ${s} lines failed the "${h}" test that a ${n} begins with.`:`${e===""?"This file":e} has no rows.`)}const o=[],i=new Map,a=new Map;for(const h of A){i.has(h.hap)||(i.set(h.hap,o.length),o.push(h.hap));const u=`${h.contig}\0${h.hap}`,I=a.get(u);I===void 0?a.set(u,[h.start]):I.push(h.start)}const c=n==="g3d"?Pg(a.values()):zg(A.map(h=>(h.end??h.start)-h.start)),l=o.length>1,g=new et;for(const h of A)g.add(h.contig,h.start,h.end??h.start+c,{xyz:h.xyz,hap:i.get(h.hap)??0,detail:l?`${us} ${h.hap}`:""});const f={width:c,haplotypes:o};return g.finish(null,f)}function Ni(t){const e=t.model,n=`${cr(t.length)} bead${t.length===1?"":"s"}`;if(e===void 0)return n;const A=[n,Xo(e.width)];return e.haplotypes.length>1&&A.push(`${e.haplotypes.length} haplotypes`),A.push(`${cr(t.contigs.length)} sequence${t.contigs.length===1?"":"s"}`),A.join(ct)}function cr(t){return t.toLocaleString("en-US")}const fe=99999,Xg="BEA",lr="REMARK 250 CHROMOSOMIX",gr=1;function Vg(t,e,n){return Number.isFinite(t)&&Number.isFinite(e)&&Number.isFinite(n)}function yA(t,e=""){if(Yg(e))return!0;const n=/^[ \t]*(\S[^\n]*)/m.exec(t)?.[1]??"";return/^(HEADER|TITLE |COMPND|SOURCE|KEYWDS|EXPDTA|AUTHOR|REMARK|CRYST1|MODEL |ATOM |HETATM)/.test(n)?/^(ATOM |HETATM)/m.test(t):!1}function ki(t,e=""){const n=[],A=[];let s=null,r=null,o=null,i=null;const a=[];let c=0,l=!1,g=0;const f=t.length;for(;g<f;){let N=t.indexOf(`
|
|
9
|
+
`,g);N<0&&(N=f);let k=N;k>g&&t.charCodeAt(k-1)===13&&k--;const b=t.slice(g,k);if(g=N+1,b.startsWith(`${lr} `)){const G=b.slice(lr.length+1).trim().split(/\s+/),[O,...$]=G;if(O==="PLACEMENT")s=Number($[0]);else if(O==="FRAME"&&$.length===4){const[K,V,H,ht]=$.map(Number);[K,V,H].every(Number.isFinite)&&ht>0&&(r={cx:K,cy:V,cz:H,factor:ht})}else if(O==="WIDTH"){const K=Number($[0]);Number.isInteger(K)&&K>0&&(o=K)}else if(O==="HAPLOTYPES")i=$.map(sA);else if(O==="CHAIN"&&$.length>=6){const K=Number($[2]),V=Number($[3]);en(K)&&en(V)&&K<=V&&n.push({first:K,last:V,hap:sA($[4]),sequence:sA($.slice(5).join(" "))})}else if(O==="RUN"&&$.length===4){const[K,V,H,ht]=$.map(Number);en(K)&&Number.isInteger(V)&&V>0&&K+V-1<=fe&&Number.isInteger(H)&&H>=0&&Number.isInteger(ht)&&ht>0&&A.push({first:K,count:V,start:H,width:ht})}continue}if(l)continue;if(b.startsWith("ENDMDL")){l=!0;continue}if(!b.startsWith("HETATM")&&!b.startsWith("ATOM "))continue;const M=Number(b.slice(6,11)),F=Number(b.slice(30,38)),S=Number(b.slice(38,46)),v=Number(b.slice(46,54));!en(M)||!Vg(F,S,v)||(b.slice(17,20)===Xg&&c++,a.push({serial:M,x:F,y:S,z:v}))}const h=e===""?"This file":e;if(a.length===0)throw new Error(`${h} has no ATOM or HETATM record with a place, so there is no bead to read.`);if(s===null||n.length===0||A.length===0)throw new Error(c===a.length?"These beads are named the way this app writes a PDB, but the lines that said where each one is on the genome are gone: PyMOL drops REMARK records when it saves. Open the PDB as this app wrote it, or its bed3d.":"A PDB says where each bead is in space and not where it is on the genome, and this one does not say: pastis and the other solvers write their beads in bin order and nothing else. Write the coordinates beside the bins they were modelled at, as a bed3d (chrom, start, end, x, y, z), and open that.");if(s!==gr)throw new Error(`This PDB's placement table is version ${String(s)}, and this reader understands version ${gr}.`);const u=new Int32Array(fe+1).fill(-1);n.forEach((N,k)=>{for(let b=N.first;b<=N.last;b++)u[b]=k});const I=new Float64Array(fe+1).fill(-1),d=new Float64Array(fe+1);for(const N of A)for(let k=0;k<N.count;k++)I[N.first+k]=N.start+k*N.width,d[N.first+k]=N.width;const C=i??[],B=new Map;C.forEach((N,k)=>B.set(N,k));const Q=r??{cx:0,cy:0,cz:0,factor:1},E=new Uint8Array(fe+1),m=[];for(const N of a){const k=u[N.serial],b=I[N.serial];if(k<0||b<0||E[N.serial]===1)continue;E[N.serial]=1;const M=n[k];B.has(M.hap)||(B.set(M.hap,C.length),C.push(M.hap)),m.push({contig:M.sequence,start:b,end:b+d[N.serial],xyz:[N.x/Q.factor+Q.cx,N.y/Q.factor+Q.cy,N.z/Q.factor+Q.cz],hap:M.hap})}if(m.length===0)throw new Error(`${h} has a placement table, and it places none of the file's ${x.int(a.length)} atoms.`);const p=C.length>1,w=new et;for(const N of m)w.add(N.contig,N.start,N.end,{xyz:N.xyz,hap:B.get(N.hap)??0,detail:p?`${us} ${N.hap}`:""});const y={width:o??Zg(m.map(N=>N.end-N.start)),haplotypes:C};return w.finish(null,y)}function en(t){return Number.isInteger(t)&&t>=1&&t<=fe}function sA(t){try{return decodeURIComponent(t)}catch{return t}}function Zg(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}const rA="MessagePack value",fr=64,jg=BigInt(Number.MAX_SAFE_INTEGER),tf=BigInt(Number.MIN_SAFE_INTEGER);function bi(t,e=0){const n=new ef(t,e);return{value:n.next(),end:n.at}}class ef{constructor(e,n){this.bytes=e,this.at=n,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength)}at;view;decoder=new TextDecoder;depth=0;next(){const e=this.u8();if(e<=127)return e;if(e>=224)return e-256;if(e>=128&&e<=143)return this.map(e&15);if(e>=144&&e<=159)return this.array(e&15);if(e>=160&&e<=191)return this.str(e&31);switch(e){case 192:return null;case 194:return!1;case 195:return!0;case 196:return this.bin(this.u8());case 197:return this.bin(this.u16());case 198:return this.bin(this.u32());case 202:return this.f32();case 203:return this.f64();case 204:return this.u8();case 205:return this.u16();case 206:return this.u32();case 207:return this.big(this.view.getBigUint64(this.take(8)));case 208:return this.i8();case 209:return this.i16();case 210:return this.i32();case 211:return this.big(this.view.getBigInt64(this.take(8)));case 217:return this.str(this.u8());case 218:return this.str(this.u16());case 219:return this.str(this.u32());case 220:return this.array(this.u16());case 221:return this.array(this.u32());case 222:return this.map(this.u16());case 223:return this.map(this.u32());default:throw new Error(`msgpack: unsupported type byte 0x${e.toString(16).padStart(2,"0")} at offset ${this.at-1}.`)}}take(e){const n=this.at;if(n+e>this.bytes.length)throw new Error(`msgpack: truncated: needed ${e} byte${e===1?"":"s"} at offset ${n} of ${this.bytes.length}.`);return this.at=n+e,n}u8(){return this.view.getUint8(this.take(1))}u16(){return this.view.getUint16(this.take(2))}u32(){return this.view.getUint32(this.take(4))}i8(){return this.view.getInt8(this.take(1))}i16(){return this.view.getInt16(this.take(2))}i32(){return this.view.getInt32(this.take(4))}f32(){return this.view.getFloat32(this.take(4))}f64(){return this.view.getFloat64(this.take(8))}big(e){if(e>jg||e<tf)throw new Error(`msgpack: the 64-bit integer ${e} at offset ${this.at-9} does not fit a JavaScript number.`);return Number(e)}str(e){const n=this.take(e);return this.decoder.decode(this.bytes.subarray(n,n+e))}bin(e){const n=this.take(e);return this.bytes.subarray(n,n+e)}open(e,n,A){if(this.depth>=fr)throw new Rt("format",`This ${rA} nests deeper than ${fr} levels at offset ${this.at}, which no document this reader opens does. The file is corrupt, or not the format its first bytes claim.`,{format:rA,offset:this.at,depth:this.depth});return this.depth++,nt(e,{format:rA,field:`${n} length at offset ${this.at}`,ceiling:2**32-1,available:this.bytes.length-this.at,bytesPerItem:A})}array(e){const n=this.open(e,"array",1),A=new Array(n);for(let s=0;s<n;s++)A[s]=this.next();return this.depth--,A}map(e){const n=this.open(e,"map",2),A=new Map;for(let s=0;s<n;s++){const r=this.at,o=this.next();if(typeof o!="string"&&typeof o!="number")throw new Error(`msgpack: a map key at offset ${r} is neither a string nor an integer.`);A.set(o,this.next())}return this.depth--,A}}const hr=64e3,yn="binary g3d",Mi={ratio:64,floor:64<<20,ceiling:1<<30},nf=[165,109,97,103,105,99],Af=[163,71,51,68];function ds(t){if(t.length===0)return!1;const e=t[0];let n;if(e>=128&&e<=143)n=1;else if(e===222)n=3;else return!1;const A=[...nf,...Af];if(t.length<n+A.length)return!1;for(let s=0;s<A.length;s++)if(t[n+s]!==A[s])return!1;return!0}async function sf(t,e){const n=e===void 0?hr:Math.min(hr,e),A=await t(n,0);if(!ds(A))throw new Error("Not a binary g3d: the file does not begin with the G3D magic.");const{value:s}=bi(A);if(!(s instanceof Map))throw new Error("Not a binary g3d: the header is not a map.");if(s.get("magic")!=="G3D")throw new Error('Not a binary g3d: the magic is not "G3D".');const r=s.get("version");if(r!==2)throw r===1?new Error("This is a version-1 g3d, written by a g3dtools older than 0.2. Run `g3dtools load` over the original text to rewrite it as a version-2 file, which is the layout this reader and the WashU browser both understand."):new Error(`Unsupported g3d version ${String(r)}: this reader understands version 2.`);const o=Ge(s.get("resolutions"),"resolutions"),i=cf(s.get("categories"),"categories"),a=s.get("offsets");if(!(a instanceof Map))throw new Error("This g3d has no offsets map in its header.");const c=new Map;for(const[l,g]of a){const f=typeof l=="number"?l:Number(l);if(!Number.isInteger(f)||!(g instanceof Map))continue;const h=g.get("offset"),u=g.get("size");if(typeof h!="number"||typeof u!="number")continue;const I=`${f} bp block`;nt(h,{format:yn,field:`offset of the ${I}`,ceiling:Number.MAX_SAFE_INTEGER}),nt(u,{format:yn,field:`size of the ${I}`,ceiling:Mi.ceiling}),c.set(f,{offset:h,size:u})}for(const l of o)if(!c.has(l))throw new Error(`This g3d lists a resolution of ${l} bp but has no block for it.`);return{version:r,genome:typeof s.get("genome")=="string"?s.get("genome"):"",name:typeof s.get("name")=="string"?s.get("name"):"",resolutions:o,categories:i,offsets:c,...e===void 0?{}:{fileSize:e}}}async function rf(t,e,n){const A=e.offsets.get(n);if(A===void 0)throw new Error(`This g3d has no model at ${n} bp; it has ${e.resolutions.join(", ")}.`);e.fileSize!==void 0&&rs(A.offset,A.size,{format:yn,field:`${n} bp block`,size:e.fileSize});const s=await t(A.size,A.offset);if(s.length!==A.size)throw new Error(`The ${n} bp block of this g3d is ${s.length} bytes where the header promised ${A.size}.`);const{value:r}=bi(await af(s,n));if(!(r instanceof Map))throw new Error(`The ${n} bp block of this g3d is not a map.`);const o=[...e.categories],i=o.length>1,a=new et;for(const[l,g]of r){const f=String(l);let h=o.indexOf(f);h<0&&(h=o.length,o.push(f));const u=i?`${us} ${f}`:"";if(g instanceof Map)for(const[I,d]of g){if(!(d instanceof Map))continue;const C=`${f}/${String(I)} at ${n} bp`,B=Ge(d.get("start"),`start of ${C}`),Q=Ge(d.get("x"),`x of ${C}`),E=Ge(d.get("y"),`y of ${C}`),m=Ge(d.get("z"),`z of ${C}`);if(Q.length!==B.length||E.length!==B.length||m.length!==B.length)throw new Error(`The columns of ${C} in this g3d are not the same length.`);const p=String(I);for(let w=0;w<B.length;w++)a.add(p,B[w],B[w]+n,{xyz:[Q[w],E[w],m[w]],hap:h,detail:u})}}const c={width:n,haplotypes:o};return a.finish(null,c)}function of(t){const e=t.resolutions.length,n=t.categories.length;return["binary g3d",`${e} resolution${e===1?"":"s"}`,`${n} categor${n===1?"y":"ies"}`].join(ct)}async function af(t,e){return os(t,{format:yn,field:`${e} bp block`,encoding:"deflate",maxBytes:ul(t.byteLength,Mi)})}function Ge(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="number")throw new Error(`This g3d's ${e} holds a value that is not a number.`);return t}function cf(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="string")throw new Error(`This g3d's ${e} holds a value that is not a string.`);return t}const lf=[66,65,73,1],gf=[67,83,73,1],ff=14,hf=5,uf=37450,Qt="BAM index",If=65536,df=65536,Cf=10,Qf=63,he=2**31-1;function ur(t,e){return t.length<e.length?!1:e.every((n,A)=>t[A]===n)}async function Bf(t){const e=We(t)?await Yt(t):t,n=ur(e,gf)?mf:ur(e,lf)?Ef:null;if(n===null)throw new Error("This is not a BAM index: the magic bytes are neither BAI\\1 nor CSI\\1.");try{return n(e)}catch(A){throw A instanceof RangeError?new Rt("format",`This ${Qt} ends part-way through its own tables, ${e.byteLength.toLocaleString("en-US")} bytes in. It is truncated; rebuild it with \`samtools index\`.`,{bytes:e.byteLength}):A}}function Ef(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=o=>t.byteLength-o,A=nt(e.getInt32(4,!0),{format:Qt,field:"reference count",ceiling:he,available:n(8),bytesPerItem:8});let s=8;const r=[];for(let o=0;o<A;o++){const i=new Map,a=nt(e.getInt32(s,!0),{format:Qt,field:`bin count of reference ${o}`,ceiling:If,available:n(s+4)-4,bytesPerItem:8});s+=4;for(let g=0;g<a;g++){const f=e.getUint32(s,!0);s+=4;const h=nt(e.getInt32(s,!0),{format:Qt,field:`chunk count of bin ${f}`,ceiling:he,available:n(s+4),bytesPerItem:16});s+=4;const u=[];for(let I=0;I<h;I++)u.push({begin:e.getBigUint64(s,!0),end:e.getBigUint64(s+8,!0)}),s+=16;f!==uf&&i.set(f,u)}const c=nt(e.getInt32(s,!0),{format:Qt,field:`linear index size of reference ${o}`,ceiling:df,available:n(s+4),bytesPerItem:8});s+=4;const l=new BigUint64Array(c);for(let g=0;g<c;g++)l[g]=e.getBigUint64(s,!0),s+=8;r.push({bins:i,linear:l,loffset:null})}return{format:"bai",minShift:ff,depth:hf,refs:r}}function mf(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=c=>t.byteLength-c,A=nt(e.getInt32(8,!0),{format:Qt,field:"CSI depth",ceiling:Cf}),s=nt(e.getInt32(4,!0),{format:Qt,field:"CSI min_shift",ceiling:Qf-3*A});let o=16+nt(e.getInt32(12,!0),{format:Qt,field:"auxiliary data length",ceiling:he,available:n(16)-4});const i=nt(e.getInt32(o,!0),{format:Qt,field:"reference count",ceiling:he,available:n(o+4),bytesPerItem:4});o+=4;const a=[];for(let c=0;c<i;c++){const l=new Map,g=new Map,f=nt(e.getInt32(o,!0),{format:Qt,field:`bin count of reference ${c}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;for(let h=0;h<f;h++){const u=e.getUint32(o,!0);o+=4,g.set(u,e.getBigUint64(o,!0)),o+=8;const I=nt(e.getInt32(o,!0),{format:Qt,field:`chunk count of bin ${u}`,ceiling:he,available:n(o+4),bytesPerItem:16});o+=4;const d=[];for(let C=0;C<I;C++)d.push({begin:e.getBigUint64(o,!0),end:e.getBigUint64(o+8,!0)}),o+=16;l.set(u,d)}a.push({bins:l,linear:null,loffset:g})}return{format:"csi",minShift:s,depth:A,refs:a}}function Je(t,e){return Math.floor(t/2**e)}function wf(t,e,n,A){const s=[],r=Math.max(e,n-1);let o=A.minShift+A.depth*3,i=0;for(let a=0;a<=A.depth;a++){const c=i+Je(e,o),l=i+Je(r,o);if(l-c+1>t.bins.size)for(const[g,f]of t.bins)g>=c&&g<=l&&s.push(f);else for(let g=c;g<=l;g++){const f=t.bins.get(g);f!==void 0&&s.push(f)}i+=1<<a*3,o-=3}return s}function pf(t,e,n){if(t.linear!==null){const r=Je(e,n.minShift);return t.linear.length===0?0n:t.linear[Math.min(r,t.linear.length-1)]}if(t.loffset===null)return 0n;let A=n.minShift,s=0;for(let r=n.depth;r>=0;r--){s=Di(r);const o=t.loffset.get(s+Je(e,A));if(o!==void 0)return o;A+=3}return 0n}function Di(t){let e=0;for(let n=0;n<t;n++)e+=1<<n*3;return e}function yf(t,e,n){let A=null,s=n.minShift;for(let r=n.depth;r>=0;r--){const o=Di(r),i=1<<r*3,a=Je(Math.max(0,e-1),s)+1;for(let c=0;c<8&&a+c<i;c++){const l=t.bins.get(o+a+c);if(l!==void 0)for(const g of l)(A===null||g.begin<A)&&(A=g.begin)}s+=3}return A??BigInt(Number.MAX_SAFE_INTEGER)<<16n}const Nf=1<<20;function kf(t,e,n,A,s){const r=t.refs[e];if(r===void 0)return[];const o=pf(r,Math.max(0,n),t),i=yf(r,Math.max(1,A),t),a=[];for(const l of wf(r,Math.max(0,n),Math.max(1,A),t))for(const g of l)g.end>o&&g.begin<i&&a.push(g);if(a.length===0)return[];a.sort((l,g)=>l.begin<g.begin?-1:l.begin>g.begin?1:0);const c=[];for(const l of a){const g=Number(l.begin>>16n),f=Number(l.begin&0xffffn),h=Number(l.end>>16n),u=Math.min(s,h+Et),I=c[c.length-1];I!==void 0&&g<=I.to+Nf?(I.to=Math.max(I.to,u),I.lastBlock=Math.max(I.lastBlock,h)):c.push({from:g,to:u,lastBlock:h,dataFrom:f})}return c}function Fi(t){let e=0;for(const n of t)e+=n.to-n.from;return e}const bf=2*Et,Mf=Et,Ir=1<<20,Df=4*Et,Ff=16384,Sf=1<<24,Rf=1<<18,Lf=1<<24,Nn=18,Pt=[31,139,8,4],me=36;function jt(t,e){return t<0?Number.POSITIVE_INFINITY:t*2**32+e+1}class NA extends Error{constructor(e,n){super("The reads are not in coordinate order."),this.before=e,this.after=n,this.name="UnsortedError"}}function dr(t,e){return t.refId<0?"unplaced":`${e[t.refId]?.name??`reference ${t.refId}`}:${(t.pos+1).toLocaleString("en-US")}`}function Gf(t,e){const n=e-1;return t>>14===n>>14?32767/7+(t>>14):t>>17===n>>17?4095/7+(t>>17):t>>20===n>>20?511/7+(t>>20):t>>23===n>>23?63/7+(t>>23):t>>26===n>>26?7/7+(t>>26):0}class Cs{constructor(e,n,A,s){this.handle=e,this.size=n,this.refs=A,this.progress=s,this.lineStart=[];let r=0;for(const o of A)this.lineStart.push(r),r+=Math.max(0,o.length);this.lineLength=r}probes=[];answers=new Map;probing=new Map;lastWalk=null;walking=new Map;bytesRead=0;first=null;lineStart;lineLength;static async open(e,n,A,s,r){const o=new Cs(e,n,A.refs,s);if(o.first=await o.firstRecord(A.recordsFrom),o.first!==null&&A.sortOrder!=="coordinate")for(const i of[.125,.375,.625,.875])r!==void 0&&await r(),await o.probeAt(Math.floor(n*i));return o}get bytes(){return this.bytesRead}get probeCount(){return this.probes.length}async spansFor(e,n,A,s,r){if(this.first===null||A<=n)return[];const o=await this.locate(e,Math.max(0,n-Ff),s);if(o===null||o.key>=jt(e,A))return[];if(r!==void 0&&o.block+r<this.size){s!==void 0&&await s();const c=await this.probeAt(Cr(o.block+r,o.block));if(c.key<jt(e,A)){const l=c.block;return[{from:o.block,to:Math.min(this.size,l+Et),lastBlock:l,dataFrom:o.within}]}}const i=await this.locate(e,A,s),a=i===null||i.tail===!0?this.size:i.block;return[{from:o.block,to:Math.min(this.size,a+Et),lastBlock:a,dataFrom:o.within}]}locate(e,n,A){if(this.first===null)return Promise.resolve(null);const s=jt(e,n);if(this.first.key>=s)return Promise.resolve(this.first);const r=this.answers.get(s);if(r!==void 0)return r;const o=this.search(e,n,A).then(i=>(i!==null&&i.tail!==!0&&this.remember(i,!0),i));return this.answers.set(s,o),o.catch(()=>this.answers.delete(s)),o}async search(e,n,A){if(this.first===null)return null;const s=jt(e,n);let r=this.first,o=null;for(const c of this.probes)if(c.key<s)r=c;else{o=c;break}let i=!0;for(;;){const c=o===null?this.size:o.block,l=c-r.block;if(l<=Df)break;A!==void 0&&await A();const g=i?this.guess(r,o,e,n):null,f=await this.probeAt(Cr(g??Math.floor((r.block+c)/2),r.block));if(f.block>=c)break;f.key>=s?o=f:r=f,i=(o===null?this.size:o.block)-r.block<=l/2}const a=o===null||o.tail===!0?this.size:Math.min(this.size,o.block+Et);return this.walk(r,a,s)}lineOf(e,n){return(this.lineStart[e]??this.lineLength)+Math.max(0,n)}guess(e,n,A,s){const r=this.lineOf(A,s),o=this.lineOf(e.refId,e.pos),i=n===null||n.tail===!0||n.refId<0?this.lineLength:this.lineOf(n.refId,n.pos);if(i<=o)return null;const a=(r-o)/(i-o);if(!(a>0&&a<1))return null;const c=n===null?this.size:n.block,l=e.block+Math.floor(a*(c-e.block));return Math.min(Math.max(l,e.block+1),c-2*Et)}async walk(e,n,A){if(n<=e.block)return null;let s=this.lastWalk;if(s===null||e.block<s.from||n>s.to){const c=`${e.block}-${n}`;let l=this.walking.get(c);if(l===void 0){l=this.read(n-e.block,e.block).then(async f=>{const{bytes:h,blocks:u}=await kA(f,e.block);return{from:e.block,to:n,bytes:h,blocks:u}}),this.walking.set(c,l);const g=()=>{this.walking.delete(c)};l.then(g,g)}s=await l,this.lastWalk=s}const{bytes:r,blocks:o}=s,i=o.find(c=>c.fileAt===e.block);if(i===void 0)return this.lastWalk=null,this.walk(e,n,A);let a=null;return wn(r,i.from+e.within,c=>jt(c.refId,c.pos)<A?!0:(a=bA(o,c.at-4,c.refId,c.pos),!1)),a}probeAt(e){const n=this.probing.get(e);if(n!==void 0)return n;const A=this.probe(e);this.probing.set(e,A);const s=()=>{this.probing.delete(e)};return A.then(s,s),A}async probe(e){let n=bf;for(;;){const A=Math.min(this.size,e+n);if(A<=e)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});const s=await this.read(A-e,e),r=await vf(s,e,this.refs,this.size);if(r.kind==="record")return this.remember(r.placed);if(r.kind==="end"||A>=this.size)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});if(n>=Ir)throw new Error(`no alignment record could be made out within ${Ir>>20} MB of byte ${e.toLocaleString("en-US")}`);n*=4}}remember(e,n=!1){let A=this.probes.length;for(;A>0&&this.probes[A-1].block>e.block;)A--;const s=this.probes[A-1];if(s!==void 0&&s.block===e.block&&s.within===e.within)return s;if(n)return this.probes.splice(A,0,e),e;const r=A===0?this.first:this.probes[A-1],o=A<this.probes.length?this.probes[A]:null;if(r!==null&&r.key>e.key)throw new NA(r,e);if(o!==null&&e.key>o.key)throw new NA(e,o);return this.probes.splice(A,0,e),e}async firstRecord(e){let n=Rf;for(;;){const A=await this.read(Math.min(n,this.size),0);let s=0,r=0;for(;s+Nn<=A.length;){const o=ye(A.subarray(s,Math.min(s+64,A.length)));if(o===null||s+o>A.length)break;const i=Si(A,s+o-4);if(e<r+i){const{bytes:a,blocks:c}=await kA(A.subarray(s),s),l=e-r;if(l+me>a.length){if(A.length>=this.size)return null;break}if(!MA(a,l,this.refs))throw new Error("the first alignment record is not where the header says it begins");const g=new DataView(a.buffer,a.byteOffset,a.byteLength);return bA(c,l,g.getInt32(l+4,!0),g.getInt32(l+8,!0))}r+=i,s+=o}if(A.length>=this.size)return null;if(n>=Lf)throw new Error("the header does not end within the first 16 MB");n*=4}}async read(e,n){const A=await this.handle.read(e,n);return this.bytesRead+=A.length,this.progress!==void 0&&this.progress(this.bytesRead),A}}async function kA(t,e){const n=[],A=[];let s=0,r=0,o=!1;for(;r+Nn<=t.length;){const c=ye(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const l=await Yt(t.subarray(r,r+c),0);l.length===0&&(o=!0),A.push({fileAt:e+r,from:s,to:s+l.length}),n.push(l),s+=l.length,r+=c}const i=new Uint8Array(s);let a=0;for(const c of n)i.set(c,a),a+=c.length;return{bytes:i,blocks:A,sawEnd:o}}function bA(t,e,n,A){for(const r of t)if(e>=r.from&&e<r.to)return{block:r.fileAt,within:e-r.from,refId:n,pos:A,key:jt(n,A)};const s=t[t.length-1];return{block:s.fileAt,within:e-s.from,refId:n,pos:A,key:jt(n,A)}}function xf(t,e,n){for(let A=0;A+Nn<=t.length;A++){if(t[A]!==Pt[0]||t[A+1]!==Pt[1]||t[A+2]!==Pt[2]||t[A+3]!==Pt[3])continue;const s=ye(t.subarray(A,Math.min(A+64,t.length)));if(s===null||s>Et||s<Nn+8)continue;const r=A+s;if(r>t.length)return e+r===n?A:"more";if(!(Si(t,r-4)>Et)){if(e+r===n)return A;if(r+3<=t.length){if(t[r]===Pt[0]&&t[r+1]===Pt[1]&&t[r+2]===Pt[2])return A;continue}return"more"}}return"more"}async function vf(t,e,n,A){const s=xf(t,e,A);if(s==="more")return e+t.length>=A?{kind:"end"}:{kind:"more"};const{bytes:r,blocks:o,sawEnd:i}=await kA(t.subarray(s),e+s);if(r.length===0)return i||e+t.length>=A?{kind:"end"}:{kind:"more"};const a=Uf(r,n);if(a>=0){const c=new DataView(r.buffer,r.byteOffset,r.byteLength);return{kind:"record",placed:bA(o,a,c.getInt32(a+4,!0),c.getInt32(a+8,!0))}}return i||e+t.length>=A?{kind:"end"}:{kind:"more"}}function Uf(t,e){const n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let A=0;A+me<=t.length;A++){if(!MA(t,A,e,n))continue;const s=A+4+n.getInt32(A,!0);if(s+me<=t.length){if(MA(t,s,e,n))return A;continue}if(Tf(t,A,n))return A}return-1}function MA(t,e,n,A=new DataView(t.buffer,t.byteOffset,t.byteLength)){if(e+me>t.length)return!1;const s=A.getInt32(e,!0);if(s<32||s>Sf)return!1;const r=A.getInt32(e+4,!0);if(r<-1||r>=n.length)return!1;const o=A.getInt32(e+8,!0);if(o<-1||r>=0&&o>n[r].length)return!1;const i=t[e+12];if(i<1)return!1;const a=A.getUint16(e+16,!0),c=A.getInt32(e+20,!0);if(c<0)return!1;const l=A.getInt32(e+24,!0);if(l<-1||l>=n.length||A.getInt32(e+28,!0)<-1||32+i+a*4+(c+1>>1)+c>s)return!1;const g=e+me,f=g+i;if(f>t.length||t[f-1]!==0)return!1;for(let h=g;h<f-1;h++){const u=t[h];if(u<33||u>126)return!1}return!0}function Tf(t,e,n){const A=n.getInt32(e+8,!0);if(A<0||A>=1<<29)return!1;const s=e+me+t[e+12],r=n.getUint16(e+16,!0);if(s+r*4>t.length)return!1;const o=A+ei(n,s,r);return n.getUint16(e+14,!0)===Gf(A,Math.max(o,A+1))}function Cr(t,e){const n=t-t%Mf;return n>e?n:t}function Si(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0}const DA=62,Qr=10;function kn(t){return t.length>0&&t[0]===DA}function $f(t){const e=new TextDecoder,n=[];t.length>0&&t[0]===DA&&n.push(0);for(let o=1;o<t.length;o++)t[o]===DA&&t[o-1]===Qr&&n.push(o);const A=[],s=new Map;let r=0;for(let o=0;o<n.length;o++){const i=n[o];let a=t.indexOf(Qr,i);a<0&&(a=t.length);const c=Jf(e,t,i+1,a),l=Math.min(a+1,t.length),g=o+1<n.length?n[o+1]:t.length;if(c===""||s.has(c))continue;let f=0;for(let I=l;I<g;I++)t[I]>32&&f++;if(f===0)continue;const h=new Uint8Array(f);let u=0;for(let I=l;I<g;I++){const d=t[I];d>32&&(h[u++]=d)}s.set(c,h),A.push({name:c,length:f}),r+=f}return{contigs:A,bases:s,total:r}}function Jf(t,e,n,A){let s=n;for(;s<A&&e[s]>32;)s++;return t.decode(e.subarray(n,s)).trim()}const Ne=(()=>{const t=new Uint8Array(256).fill(4),e=(n,A)=>{t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A};return e("A",0),e("C",1),e("G",2),e("T",3),e("U",3),t})(),Of=25;function Br(t,e,n,A){const s=Math.max(0,Math.floor(e)),r=Math.min(t.length,Math.ceil(n)),o=Math.max(Of,Math.round(A)),i=r>s?Math.ceil((r-s)/o):0,a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i);for(let g=0;g<i;g++){const f=s+g*o,h=Math.min(r,f+o);let u=0,I=0;for(let d=f;d<h;d++){const C=Ne[t[d]];C===1||C===2?u++:(C===0||C===3)&&I++}a[g]=f,c[g]=h,l[g]=u+I>0?u/(u+I):Number.NaN}return{starts:a,ends:c,values:l}}const Ri={exclude:jo,minMapq:0};function Yf(t,e,n,A,s,r,o=Ri,i,a,c){const l=s-A;if(r<=0||l<=0)return{depth:new Float32Array(0),variant:null,total:0,kept:0,max:0};const g=l/r,f=new Float64Array(r),h=new Float64Array(r+1),u=i===void 0?null:new Float64Array(r),I=i===void 0?null:new Float64Array(r+1);let d=0,C=0;wn(t,e,p=>{if(d++,p.refId===n&&(p.flag&o.exclude)===0&&!(p.mapq<o.minMapq)&&!(p.pos<0||p.end<=A||p.pos>=s)){if(C++,Wf(t,p,(w,y)=>{const N=Math.max(w,A),k=Math.min(y,s);k<=N||Er(f,h,(N-A)/g,(k-A)/g,r)}),a!==void 0){let w=null;qf(t,p,(y,N)=>{if(N<=A||y>=s)return;w??=Hf(t,p);const k=`${y}:${N}:${w}`;a.set(k,(a.get(k)??0)+1)})}if(c!==void 0)for(const w of ni(t,p)){if(w.pos<A||w.pos>=s)continue;const y=zl(w.prob,c.threshold);if(y<0)continue;let N=c.tally.get(w.code);N===void 0&&(N={calls:new Float64Array(r),modified:new Float64Array(r)},c.tally.set(w.code,N));const k=Math.min(r-1,Math.floor((w.pos-A)/g));N.calls[k]++,y===1&&N.modified[k]++}i===void 0||u===null||I===null||_f(t,p,i,w=>{w<A||w>=s||Er(u,I,(w-A)/g,(w+1-A)/g,r)},[A,s])}});let B=0,Q=0;const E=new Float32Array(r);for(let p=0;p<r;p++){B+=h[p];const w=B+f[p];E[p]=w,w>Q&&(Q=w)}let m=null;if(u!==null&&I!==null){m=new Float32Array(r);let p=0;for(let w=0;w<r;w++)p+=I[w],m[w]=p+u[w]}return{depth:E,variant:m,total:d,kept:C,max:Q}}function _f(t,e,n,A,s=[Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY]){const r=new DataView(t.buffer,t.byteOffset,t.byteLength),o=Pe(t,e),i=o===null?e.cigarOps:o.length,a=f=>o===null?r.getUint32(e.cigarAt+f*4,!0):o[f],c=n.start+n.bases.length;let l=e.pos,g=0;for(let f=0;f<i;f++){const h=a(f),u=h&15,I=h>>>4;if(u===2){const d=Math.max(0,s[0]-l),C=Math.min(I,s[1]-l);for(let B=d;B<C;B++)A(l+B);l+=I;continue}if(mt(u)&&Ot(u)){const d=Math.max(0,n.start-l,s[0]-l),C=Math.min(I,c-l,s[1]-l,e.seqLength-g);for(let B=d;B<C;B++){const Q=l+B-n.start,E=Ne[n.bases[Q]];if(E===4)continue;const m=Kf(t,e.seqAt,g+B);m!==4&&m!==E&&A(l+B)}l+=I,g+=I;continue}mt(u)&&(l+=I),Ot(u)&&(g+=I)}}function Kf(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[cs.charCodeAt(s)]}function Er(t,e,n,A,s){const r=Math.min(s-1,Math.max(0,Math.floor(n))),o=Math.min(s-1,Math.max(0,Math.ceil(A)-1));if(!(o<r)){if(r===o){t[r]+=Math.min(A,r+1)-Math.max(n,r);return}t[r]+=r+1-Math.max(n,r),t[o]+=Math.min(A,o+1)-o,o>r+1&&(e[r+1]+=1,e[o]-=1)}}function qf(t,e,n){const A=Pe(t,e),s=A===null?e.cigarOps:A.length,r=A===null?new DataView(t.buffer,t.byteOffset,t.byteLength):null;let o=e.pos;for(let i=0;i<s;i++){const a=r===null?A[i]:r.getUint32(e.cigarAt+i*4,!0),c=a&15,l=a>>>4;if(c===3){l>0&&n(o,o+l),o+=l;continue}mt(c)&&(o+=l)}}function Hf(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=t[A],o=t[A+1],i=String.fromCharCode(t[A+2]);if(A+=3,i==="A"&&(r===88&&o===83||r===116&&o===115)){const a=t[A]===43?1:t[A]===45?-1:0;return r===88?a:(e.flag&At.REVERSE)!==0?-a:a}if(A=as(t,A,i,s),A<0)return 0}return 0}function Wf(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=Pe(t,e),r=s===null?e.cigarOps:s.length,o=l=>s===null?A.getUint32(e.cigarAt+l*4,!0):s[l];let i=e.pos,a=e.pos,c=!1;for(let l=0;l<r;l++){const g=o(l),f=g&15,h=g>>>4;if(f===3){c&&i>a&&n(a,i),c=!1,i+=h,a=i;continue}mt(f)&&(c||(a=i,c=!0),i+=h)}c&&i>a&&n(a,i)}function Pf(t,e,n){let A=2166136261;for(let s=e;s<n;s++)A^=t[s],A=Math.imul(A,16777619)>>>0;return A/4294967296}function zf(t,e,n,A,s,r,o){const i=new DataView(t.buffer,t.byteOffset,t.byteLength),a=o.filter;let c=0;const l=[];wn(t,e,C=>{mr(C,A,s,r,a)&&(c++,l.push(Pf(t,C.at+32,C.at+32+C.nameBytes-1)))});const g=Math.max(1,Math.min(o.maxReads,o.maxRows*Xf)),f=c<=g?1:g/c,h=f<1,u=[],I=[];let d=0;return wn(t,e,C=>{!mr(C,A,s,r,a)||l[d++]>=f||I.push(Vf(t,i,C,o,u))}),{pile:rh(I,n,A,s,r,o),total:c,kept:I.length,capped:h,rows:u.length,usedMd:I.some(C=>C.fromMd),usedCigar:I.some(C=>C.fromCigar)}}const Xf=8;function mr(t,e,n,A,s){return t.refId!==e||(t.flag&s.exclude)!==0||t.mapq<s.minMapq?!1:t.pos>=0&&t.end>n&&t.pos<A}function Vf(t,e,n,A,s){const r=Pe(t,n),o=r===null?n.cigarOps:r.length,i=h=>r===null?e.getUint32(n.cigarAt+h*4,!0):r[h],a=[];let c=0,l=0;for(let h=0;h<o;h++){const u=i(h);a.push(u);const I=u&15,d=u>>>4;I===4&&(h===0||h===1&&(i(0)&15)===5?c=d:(h===o-1||h===o-2&&(i(o-1)&15)===5)&&(l=d))}const g=th(t,n,a,A.reference),f=jf(s,n.pos-c,n.end+l);return{refStart:n.pos,refEnd:n.end,clipStart:c,clipEnd:l,row:f,flag:n.flag,mapq:n.mapq,mateContig:n.nextRefId,matePos:n.nextPos,tlen:n.tlen,name:xl(t,n),ops:a,diffPos:g.pos,diffBase:g.base,fromMd:g.fromMd,fromCigar:g.fromCigar,mods:A.colourBy==="basemod"?ni(t,n,a):null}}const Zf=3;function jf(t,e,n){for(let A=0;A<t.length;A++)if(t[A]+Zf<=e)return t[A]=n,A;return t.push(n),t.length-1}function FA(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return Ne[cs.charCodeAt(s)]}function th(t,e,n,A){const s={pos:[],base:[],fromMd:!1,fromCigar:!1};if(n.some(o=>(o&15)===8)){let o=e.pos,i=0;for(const a of n){const c=a&15,l=a>>>4;if(c===8){const g=Math.min(l,e.seqLength-i);for(let f=0;f<g;f++)s.pos.push(o+f),s.base.push(FA(t,e.seqAt,i+f))}mt(c)&&(o+=l),Ot(c)&&(i+=l)}return s.fromCigar=!0,s}const r=eh(t,e);if(r!==null)return nh(t,e,n,r,s),s.fromMd=!0,s;if(A!==void 0){let o=e.pos,i=0;const a=A.start+A.bases.length;for(const c of n){const l=c&15,g=c>>>4;if(mt(l)&&Ot(l)){const f=Math.max(0,A.start-o),h=Math.min(g,a-o,e.seqLength-i);for(let u=f;u<h;u++){const I=o+u-A.start,d=Ne[A.bases[I]],C=FA(t,e.seqAt,i+u);d!==C&&d<4&&C<4&&(s.pos.push(o+u),s.base.push(C))}}mt(l)&&(o+=g),Ot(l)&&(i+=g)}}return s}function eh(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=String.fromCharCode(t[A],t[A+1]),o=String.fromCharCode(t[A+2]);if(A+=3,r==="MD"&&o==="Z"){let i=A;for(;i<s&&t[i]!==0;)i++;return new TextDecoder().decode(t.subarray(A,i))}if(A=as(t,A,o,s),A<0)return null}return null}function nh(t,e,n,A,s){const r=[],o=[];let i=e.pos,a=0;for(const l of n){const g=l&15,f=l>>>4;if(mt(g)&&Ot(g)){const h=Math.min(f,e.seqLength-a);for(let u=0;u<h;u++)r.push(i+u),o.push(a+u)}mt(g)&&(i+=f),Ot(g)&&(a+=f)}let c=0;for(const l of A.match(/(\d+|\^[A-Za-z]+|[A-Za-z])/g)??[]){if(l.charCodeAt(0)===94)continue;const g=Number(l);if(Number.isFinite(g)&&l!==""){c+=g;continue}c<r.length&&(s.pos.push(r[c]),s.base.push(FA(t,e.seqAt,o[c]))),c+=1}}const Li=1e3;function Ah(t,e,n){switch(e){case"strand":return(t.flag&At.REVERSE)!==0?1:0;case"mapq":return t.mapq===0?0:t.mapq<30?1:2;case"pair":return(t.flag&At.PAIRED)===0?0:(t.flag&At.PROPER_PAIR)!==0?1:2;case"mate":return(t.flag&At.PAIRED)===0?0:(t.flag&At.MATE_UNMAPPED)!==0||t.mateContig<0?1:t.mateContig===n?2:3;case"insert":{const A=Math.abs(t.tlen);return(t.flag&At.PAIRED)===0||A===0?0:A>Li?2:1}default:return 0}}function sh(t){switch(t){case"strand":return["forward","reverse"];case"mapq":return["MAPQ 0","MAPQ < 30","MAPQ ≥ 30"];case"pair":return["unpaired","proper pair","not a proper pair"];case"mate":return["unpaired","mate unmapped","same sequence","another sequence"];case"insert":return["unpaired","ordinary insert",`insert > ${Li}`];case"basemod":return["reads"];default:return["reads"]}}function rh(t,e,n,A,s,r){const o=t.length,i={contig:e,start:A,end:s,length:o,refStart:new Int32Array(o),refEnd:new Int32Array(o),clipStart:new Int32Array(o),clipEnd:new Int32Array(o),row:new Int16Array(o),flags:new Uint16Array(o),mapq:new Uint8Array(o),mateContig:new Int32Array(o),matePos:new Int32Array(o),tlen:new Int32Array(o),group:new Uint8Array(o),mate:new Int32Array(o).fill(-1),opAt:new Int32Array(o+1),opCode:new Uint8Array(t.reduce((l,g)=>l+g.ops.length,0)),opLen:new Int32Array(t.reduce((l,g)=>l+g.ops.length,0)),diffAt:new Int32Array(o+1),diffPos:new Int32Array(t.reduce((l,g)=>l+g.diffPos.length,0)),diffBase:new Uint8Array(t.reduce((l,g)=>l+g.diffPos.length,0)),contigs:[],groups:sh(r.colourBy),names:[]};let a=0,c=0;for(let l=0;l<o;l++){const g=t[l];i.refStart[l]=g.refStart,i.refEnd[l]=g.refEnd,i.clipStart[l]=g.clipStart,i.clipEnd[l]=g.clipEnd,i.row[l]=g.row,i.flags[l]=g.flag,i.mapq[l]=g.mapq,i.mateContig[l]=g.mateContig,i.matePos[l]=g.matePos,i.tlen[l]=g.tlen,i.opAt[l]=a;for(const f of g.ops)i.opCode[a]=f&15,i.opLen[a]=f>>>4,a++;i.diffAt[l]=c;for(let f=0;f<g.diffPos.length;f++)i.diffPos[c]=g.diffPos[f],i.diffBase[c]=g.diffBase[f],c++;r.withNames&&i.names.push(g.name)}i.opAt[o]=a,i.diffAt[o]=c,r.colourBy==="basemod"&&(i.mods=oh(t));for(let l=0;l<o;l++)i.group[l]=Ah(t[l],r.colourBy,n);return ih(i,n,e,r),ah(i,t),i}function oh(t){const e=new Map;let n=0;for(const i of t)for(const a of i.mods??[]){const c=e.get(a.code)??[0,0];a.prob>=128&&c[0]++,c[1]++,e.set(a.code,c),n++}const A=[...e.entries()].sort((i,a)=>a[1][0]-i[1][0]||a[1][1]-i[1][1]||(i[0]<a[0]?-1:1)),s=new Map(A.map(([i],a)=>[i,a])),r={at:new Int32Array(t.length+1),pos:new Int32Array(n),code:new Uint8Array(n),prob:new Uint8Array(n),codes:A.map(([i])=>i),counts:A.map(([,[i]])=>i)};let o=0;for(let i=0;i<t.length;i++){r.at[i]=o;for(const a of t[i].mods??[])r.pos[o]=a.pos,r.code[o]=s.get(a.code)??0,r.prob[o]=a.prob,o++}return r.at[t.length]=o,r}function ih(t,e,n,A){const s=new Map;for(let r=0;r<t.length;r++){const o=t.mateContig[r];if(o<0){t.mateContig[r]=-1;continue}let i=s.get(o);i===void 0&&(i=t.contigs.length,t.contigs.push(o===e?n:A.refNameOf?.(o)??""),s.set(o,i)),t.mateContig[r]=i}}function ah(t,e){const n=new Map;for(let A=0;A<e.length;A++){const s=e[A].name;if(s===""||(t.flags[A]&At.SUPPLEMENTARY)!==0)continue;const r=n.get(s);if(r===void 0){n.set(s,A);continue}t.mate[r]===-1&&t.mate[A]===-1&&((t.flags[r]^t.flags[A])&(At.FIRST_IN_PAIR|At.SECOND_IN_PAIR))!==0&&(t.mate[r]=A,t.mate[A]=r)}}function Gi(t){const e=t.split(`
|
|
10
|
+
`,200);let n=0;for(const A of e){const s=A.trim();if(s==="")continue;if(/^(fixedStep|variableStep)\b/i.test(s))return"wig";if(/^track\b/i.test(s)){if(/type\s*=\s*"?bedGraph/i.test(s))return"bedgraph";if(/type\s*=\s*"?wiggle_0/i.test(s))return"wig";continue}if(s.startsWith("#")||/^browser\b/i.test(s))continue;const r=s.split(/\t| +/);if(r.length!==4||!R(r[1])||!R(r[2]))return null;const o=Number(r[3]);if(!Number.isFinite(o)||r[3].trim()==="")return null;if(n+=1,n>=4)return"bedgraph"}return n>0?"bedgraph":null}class Qs{constructor(e){this.name=e}starts=[];ends=[];values=[];push(e,n,A){this.starts.push(e),this.ends.push(n),this.values.push(A)}get length(){return this.starts.length}finish(){const e=this.starts.length,n=Int32Array.from({length:e},(i,a)=>a);let A=!0;for(let i=1;i<e;i++)if(this.starts[i]<this.starts[i-1]){A=!1;break}A||n.sort((i,a)=>this.starts[i]-this.starts[a]);const s=new Int32Array(e),r=new Int32Array(e),o=new Float32Array(e);for(let i=0;i<e;i++){const a=n[i];s[i]=this.starts[a],r[i]=this.ends[a],o[i]=this.values[a]}return{name:this.name,starts:s,ends:r,values:o}}}function xi(t){const e=new Map;let n=Number.POSITIVE_INFINITY,A=Number.NEGATIVE_INFINITY,s=0;for(const r of t.split(`
|
|
11
|
+
`)){const o=r.trim();if(o===""||o.startsWith("#")||/^(track|browser)\b/i.test(o))continue;const i=o.split(/\t| +/);if(i.length<4)continue;const a=Number(i[1]),c=Number(i[2]),l=Number(i[3]);if(!Number.isInteger(a)||!Number.isInteger(c)||!Number.isFinite(l)||c<=a)continue;let g=e.get(i[0]);g===void 0&&(g=new Qs(i[0]),e.set(i[0],g)),g.push(a,c,l),s+=1,l<n&&(n=l),l>A&&(A=l)}return Bs(e,s,n,A)}function vi(t){const e=new Map;let n=Number.POSITIVE_INFINITY,A=Number.NEGATIVE_INFINITY,s=0,r=null,o="",i=1,a=1,c=0,l=null;const g=(f,h)=>{l===null||!Number.isFinite(h)||(l.push(f,f+i,h),s+=1,h<n&&(n=h),h>A&&(A=h))};for(const f of t.split(`
|
|
12
|
+
`)){const h=f.trim();if(h===""||h.startsWith("#")||/^(track|browser)\b/i.test(h))continue;const u=/^(fixedStep|variableStep)\s+(.*)$/i.exec(h);if(u!==null){r=u[1].toLowerCase()==="fixedstep"?"fixed":"variable";const I=new Map;for(const d of u[2].split(/\s+/)){const C=d.indexOf("=");C>0&&I.set(d.slice(0,C).toLowerCase(),d.slice(C+1))}if(o=I.get("chrom")??"",i=Number(I.get("span")??1)||1,a=Number(I.get("step")??1)||1,c=(Number(I.get("start")??1)||1)-1,o===""){l=null;continue}l=e.get(o)??new Qs(o),e.set(o,l);continue}if(!(r===null||l===null))if(r==="fixed")g(c,Number(h)),c+=a;else{const I=h.split(/\t| +/);if(I.length<2)continue;const d=Number(I[0]);if(!Number.isInteger(d))continue;g(d-1,Number(I[1]))}}return Bs(e,s,n,A)}function Bs(t,e,n,A){const s=[];for(const r of t.values())r.length>0&&s.push(r.finish());return{contigs:s,length:e,min:Number.isFinite(n)?n:0,max:Number.isFinite(A)?A:0}}class Ui{constructor(e){this.set=e;for(const n of e.contigs)this.byName.set(n.name,n)}byName=new Map;held(e){const n=this.byName.get(e);if(n!==void 0)return n;const A=Kt(this.set.contigs,e);return A<0?void 0:this.set.contigs[A]}get contigNames(){return this.set.contigs.map(e=>e.name)}get extent(){return{min:this.set.min,max:this.set.max}}get length(){return this.set.length}has(e){return this.held(e)!==void 0}samples(e,n,A,s){const r=this.held(e);if(r===void 0||A<=n)return null;const o=ch(r.ends,n);let i=o;for(;i<r.starts.length&&r.starts[i]<A;)i+=1;if(i<=o)return{starts:new Int32Array(0),ends:new Int32Array(0),values:new Float32Array(0),min:null,max:null,summary:!1};const a=Math.max(1,s),c=Math.ceil((A-n)/a);if(i-o<=c)return{starts:r.starts.slice(o,i),ends:r.ends.slice(o,i),values:r.values.slice(o,i),min:null,max:null,summary:!1};const l=new Int32Array(c),g=new Int32Array(c),f=new Float32Array(c),h=new Float32Array(c),u=new Float32Array(c),I=new Float64Array(c),d=new Float64Array(c);h.fill(Number.NaN),u.fill(Number.NaN);for(let C=0;C<c;C++)l[C]=Math.round(n+C*a),g[C]=Math.round(Math.min(A,n+(C+1)*a));for(let C=o;C<i;C++){const B=Math.max(r.starts[C],n),Q=Math.min(r.ends[C],A);if(Q<=B)continue;const E=r.values[C],m=Math.max(0,Math.floor((B-n)/a)),p=Math.min(c-1,Math.floor((Q-1-n)/a));for(let w=m;w<=p;w++){const y=Math.min(Q,g[w])-Math.max(B,l[w]);y<=0||(d[w]+=E*y,I[w]+=y,(Number.isNaN(h[w])||E<h[w])&&(h[w]=E),(Number.isNaN(u[w])||E>u[w])&&(u[w]=E))}}for(let C=0;C<c;C++)f[C]=I[C]>0?d[C]/I[C]:Number.NaN;return{starts:l,ends:g,values:f,min:h,max:u,summary:!0}}}function ch(t,e){let n=0,A=t.length;for(;n<A;){const s=n+A>>1;t[s]<=e?n=s+1:A=s}return n}const lh=1<<18,gh=64<<20;class wr extends Fo{constructor(e,n,A=lh,s=gh){super(e,n),this.chunkBytes=A,this.budgetBytes=s}chunks=new Map;inflight=new Map;held=0;end=null;fetched=0;requests=0;async read(e,n,A){if(e<=0||this.end!==null&&n>=this.end)return new Uint8Array(0);const s=Math.floor(n/this.chunkBytes),r=Math.floor((n+e-1)/this.chunkBytes),o=[];let i=null;const a=[];for(let g=s;g<=r;g++){const f=this.inflight.get(g);if(this.chunks.has(g)||f!==void 0){f!==void 0&&!o.includes(f)&&o.push(f),i!==null&&a.push([i,g-1]),i=null;continue}i===null&&(i=g)}i!==null&&a.push([i,r]);for(const[g,f]of a){const h=this.fetchRun(g,f,A);for(let I=g;I<=f;I++)this.inflight.set(I,h);const u=()=>{for(let I=g;I<=f;I++)this.inflight.get(I)===h&&this.inflight.delete(I)};h.then(u,u),o.push(h)}await Promise.all(o);const c=new Uint8Array(e);let l=0;for(let g=s;g<=r;g++){const f=this.chunks.get(g);if(f===void 0)break;this.touch(g,f);const h=g*this.chunkBytes,u=Math.max(n,h)-h,I=Math.min(n+e,h+f.length)-h;if(I<=u||(c.set(f.subarray(u,I),Math.max(n,h)-n),l=Math.max(n,h)-n+(I-u),f.length<this.chunkBytes))break}return l===e?c:c.subarray(0,l)}async fetchRun(e,n,A){const s=e*this.chunkBytes;let r=(n-e+1)*this.chunkBytes;if(this.end!==null&&(r=Math.min(r,Math.max(0,this.end-s))),r<=0)return;this.requests+=1;const o=await super.read(r,s,A);this.fetched+=o.length,o.length<r&&(this.end=s+o.length);for(let i=e;i<=n;i++){const a=(i-e)*this.chunkBytes;if(a>=o.length)break;this.store(i,o.slice(a,Math.min(a+this.chunkBytes,o.length)))}}store(e,n){const A=this.chunks.get(e);for(A!==void 0&&(this.held-=A.length),this.chunks.set(e,n),this.held+=n.length;this.held>this.budgetBytes&&this.chunks.size>1;){const s=this.chunks.keys().next().value,r=this.chunks.get(s);this.chunks.delete(s),this.held-=r.length}}touch(e,n){this.chunks.delete(e),this.chunks.set(e,n)}}const fh=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),hh=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),yt=64,Ti=32;function pt(t,e){return t>>>e|t<<32-e}function hn(t){const e=new Uint32Array(hh),n=new Uint32Array(64),A=t.length*8,s=new Uint8Array((Math.floor((t.length+8)/yt)+1)*yt);s.set(t),s[t.length]=128;const r=new DataView(s.buffer);r.setUint32(s.length-8,Math.floor(A/4294967296),!1),r.setUint32(s.length-4,A>>>0,!1);for(let a=0;a<s.length;a+=yt){for(let C=0;C<16;C++)n[C]=r.getUint32(a+C*4,!1);for(let C=16;C<64;C++){const B=n[C-15],Q=n[C-2],E=pt(B,7)^pt(B,18)^B>>>3,m=pt(Q,17)^pt(Q,19)^Q>>>10;n[C]=n[C-16]+E+n[C-7]+m>>>0}let[c,l,g,f,h,u,I,d]=e;for(let C=0;C<64;C++){const B=pt(h,6)^pt(h,11)^pt(h,25),Q=h&u^~h&I,E=d+B+Q+fh[C]+n[C]>>>0,m=pt(c,2)^pt(c,13)^pt(c,22),p=c&l^c&g^l&g,w=m+p>>>0;d=I,I=u,u=h,h=f+E>>>0,f=g,g=l,l=c,c=E+w>>>0}e[0]=e[0]+c>>>0,e[1]=e[1]+l>>>0,e[2]=e[2]+g>>>0,e[3]=e[3]+f>>>0,e[4]=e[4]+h>>>0,e[5]=e[5]+u>>>0,e[6]=e[6]+I>>>0,e[7]=e[7]+d>>>0}const o=new Uint8Array(Ti),i=new DataView(o.buffer);for(let a=0;a<8;a++)i.setUint32(a*4,e[a],!1);return o}function xe(t,e){const n=new Uint8Array(yt);n.set(t.length>yt?hn(t):t);const A=new Uint8Array(yt+e.length),s=new Uint8Array(yt+Ti);for(let r=0;r<yt;r++)A[r]=n[r]^54,s[r]=n[r]^92;return A.set(e,yt),s.set(hn(A),yt),hn(s)}function pr(t){let e="";for(const n of t)e+=n.toString(16).padStart(2,"0");return e}function te(t){return new TextEncoder().encode(t)}const uh="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",yr="AWS4-HMAC-SHA256",$i="s3",Ji="aws4_request";function Ih(t){const e=(n,A=2)=>String(n).padStart(A,"0");return`${e(t.getUTCFullYear(),4)}${e(t.getUTCMonth()+1)}${e(t.getUTCDate())}T${e(t.getUTCHours())}${e(t.getUTCMinutes())}${e(t.getUTCSeconds())}Z`}function SA(t){return encodeURIComponent(t).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function dh(t){return t===""?"/":t.split("/").map(e=>SA(decodeURIComponent(e))).join("/")}function Ch(t){const e=[];return t.forEach((n,A)=>e.push([SA(A),SA(n)])),e.sort((n,A)=>n[0]===A[0]?n[1]<A[1]?-1:1:n[0]<A[0]?-1:1),e.map(([n,A])=>`${n}=${A}`).join("&")}let nn=null;function Qh(t,e,n){const A=`${t}|${e}|${n}`;if(nn!==null&&nn.id===A)return nn.key;const s=xe(te(`AWS4${t}`),te(e)),r=xe(s,te(n)),o=xe(r,te($i)),i=xe(o,te(Ji));return nn={id:A,key:i},i}function Bh(t){const e=new URL(t.url),n=t.now??new Date,A=Ih(n),s=A.slice(0,8),r=t.payloadHash??uh,{credential:o}=t,i=[["host",e.host],["x-amz-content-sha256",r],["x-amz-date",A]];o.sessionToken!==void 0&&o.sessionToken!==""&&i.push(["x-amz-security-token",o.sessionToken]);const a=i.map(([I,d])=>`${I}:${d.trim()}
|
|
13
|
+
`).join(""),c=i.map(([I])=>I).join(";"),l=[t.method.toUpperCase(),dh(e.pathname),Ch(e.searchParams),a,c,r].join(`
|
|
14
|
+
`),g=`${s}/${o.region}/${$i}/${Ji}`,f=[yr,A,g,pr(hn(te(l)))].join(`
|
|
15
|
+
`),h=pr(xe(Qh(o.secretAccessKey,s,o.region),te(f))),u={Authorization:`${yr} Credential=${o.accessKeyId}/${g}, SignedHeaders=${c}, Signature=${h}`,"x-amz-content-sha256":r,"x-amz-date":A};return o.sessionToken!==void 0&&o.sessionToken!==""&&(u["x-amz-security-token"]=o.sessionToken),u}function Eh(t){const e={...t.headers};return t.credential===void 0?e:{...e,...Bh({method:(t.method??"GET").toUpperCase(),url:t.url,credential:t.credential})}}function Oi(t,e){const n=e.method??mh(t);return{...t,headers:{...wh(t?.headers),...Eh({...e,method:n})}}}function mh(t){const e=t?.method;return typeof e=="string"&&e!==""?e:"GET"}function wh(t){if(t===void 0)return{};if(typeof Headers<"u"&&t instanceof Headers){const e={};return t.forEach((n,A)=>{e[A]=n}),e}return Array.isArray(t)?Object.fromEntries(t):{...t}}function ph(t){const e=[],n=new Set,A=s=>{if(!(s===null||typeof s!="object")){if(ArrayBuffer.isView(s)){const r=s.buffer;r instanceof ArrayBuffer&&!n.has(r)&&(n.add(r),e.push(r));return}if(Array.isArray(s)){if(s.length===0||typeof s[0]!="object")return;for(const r of s)A(r);return}for(const r of Object.values(s))A(r)}};return A(t),e}function Es(){return typeof MessageChannel>"u"?new Promise(t=>{setTimeout(t,0)}):new Promise(t=>{const e=new MessageChannel;e.port1.onmessage=()=>{e.port1.close(),e.port2.close(),t()},e.port2.postMessage(void 0)})}const yh=200,Nh=3e3,kh=3e4,bh=1e3;function Mh(t=yh,e=Nh){const n=[];let A=performance.now();const s=setInterval(()=>{const r=performance.now(),o=r-A;for(A=r,o<kh?n.push({at:r,span:o,late:Math.max(0,o-t)}):n.length=0;n.length>0&&r-n[0].at>e;)n.shift()},t);return{busy(){if(n.length<3)return 0;let r=0,o=0;for(const i of n)r+=i.span,o+=i.late;return r<=0?0:Math.min(1,o/r)},reset(){n.length=0,A=performance.now()},stop(){clearInterval(s)}}}function Dh(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#")||/^(track|browser)\b/.test(s))continue;const r=s.split(/\s+/);if(r.length<2)return[];const o=Number(r[1]);if(!Number.isInteger(o)||o<=0)return[];n.has(r[0])||(n.add(r[0]),e.push({name:r[0],length:o}))}return e}function Fh(t,e=""){const n=/\.fai$/i.test(e);let A=0;for(const s of t.split(/\r?\n/,200)){const r=s.trim();if(r===""||r.startsWith("#")||/^(track|browser)\b/.test(r))continue;const o=r.split(/\s+/);if((n?o.length<2:o.length!==2)||!/^\d+$/.test(o[1])||Number(o[1])<=0)return!1;A++}return A>0}const Sh=4096;function Rh(t,e){const n=Kt(t.contigs,e);return n<0?void 0:t.contigs[n]}function Lh(t,e,n){const A=Rh(t,e.contig);if(A===void 0||A.bins===0)return null;const s=Math.max(0,Math.floor(e.start)),r=Math.min(A.length,Math.ceil(e.end));if(!(r>s))return null;const o=Math.floor(s/t.binsize),i=Math.min(A.bins-1,Math.floor((r-1)/t.binsize));if(i<o)return null;const a=i-o+1,c=n?1:Math.max(1,Math.ceil(a/Sh)),l=Math.ceil(a/c),g=new Int32Array(l),f=new Int32Array(l),h=new Float32Array(l),u=c>1?new Float32Array(l):null,I=c>1?new Float32Array(l):null;let d=0;for(let C=0;C<l;C++){const B=o+C*c,Q=Math.min(i+1,B+c);let E=0,m=0,p=Number.POSITIVE_INFINITY,w=Number.NEGATIVE_INFINITY;for(let y=B;y<Q;y++){const N=A.startBin+y-t.firstBin;if(N<0||N>=t.values.length)continue;const k=t.values[N];Number.isNaN(k)||(E+=k,m++,k<p&&(p=k),k>w&&(w=k))}m!==0&&(g[d]=B*t.binsize,f[d]=Math.min(A.length,Q*t.binsize),h[d]=E/m,u!==null&&I!==null&&(u[d]=p,I[d]=w),d++)}return d===0?null:{contig:e.contig,start:s,end:r,starts:g.slice(0,d),ends:f.slice(0,d),values:h.slice(0,d),min:u===null?null:u.slice(0,d),max:I===null?null:I.slice(0,d),variant:null,summary:c>1}}function Gh(t,e,n,A=!1){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const i of e){const a=Lh(t,i,A);if(a!==null){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push(a)}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}function T(t,e,n){const A=t[e];return typeof A=="number"&&Number.isFinite(A)?A:n}function st(t,e,n){const A=t[e];return typeof A=="string"?A:n}function Lt(t,e,n){const A=t[e];return typeof A=="boolean"?A:n}function On(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n!==""?[n]:[]}function Yn(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n.trim()!==""?[n.trim()]:null}function at(t,e){const n=t[e];return typeof n=="string"&&n!==""?n:null}function ne(t,e,n){return{value:t?.[n],chosen:at(e,n)!==null}}function _n(t,e){return t.value!==void 0?null:t.chosen?e.gone:e.unchosen}function xh(t){let e=0,n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isNaN(s)||(e+=s,n++)}return n===0?Number.NaN:e/n}function Yi(t){const e=ms(t);return ws(e,.5)}function vh(t,e){const n=ms(t),A=n.length;if(A===0)return Number.NaN;const s=Number.isFinite(e)?Math.min(.5,Math.max(0,e)):0,r=Math.floor(A*s);if(A-2*r<=0)return ws(n,.5);let o=0;for(let i=r;i<A-r;i++)o+=n[i];return o/(A-2*r)}function Bt(t,e=0,n=t.length-e){if(n<8){let s=0;for(let r=0;r<n;r++)s+=t[e+r];return s}if(n<=128){let s=t[e],r=t[e+1],o=t[e+2],i=t[e+3],a=t[e+4],c=t[e+5],l=t[e+6],g=t[e+7],f=8;for(;f<n-n%8;f+=8){const u=e+f;s+=t[u],r+=t[u+1],o+=t[u+2],i+=t[u+3],a+=t[u+4],c+=t[u+5],l+=t[u+6],g+=t[u+7]}let h=s+r+(o+i)+(a+c+(l+g));for(;f<n;f++)h+=t[e+f];return h}let A=Math.floor(n/2);return A-=A%8,Bt(t,e,A)+Bt(t,e+A,n-A)}function RA(t,e=0,n=t.length-e){return Bt(t,e,n)/n}const bn=3;function _i(t,e){const n=Math.min(t.length,e.length);let A=0,s=0,r=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];Number.isNaN(f)||Number.isNaN(h)||(s+=f,r+=h,A++)}if(A<bn)return Number.NaN;const o=s/A,i=r/A;let a=0,c=0,l=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];if(Number.isNaN(f)||Number.isNaN(h))continue;const u=f-o,I=h-i;a+=u*I,c+=u*u,l+=I*I}return c<=0||l<=0?Number.NaN:a/Math.sqrt(c*l)}function Uh(t,e){const n=Math.min(t.length,e.length);let A=0;for(let i=0;i<n;i++)!Number.isNaN(t[i])&&!Number.isNaN(e[i])&&A++;if(A<bn)return Number.NaN;const s=new Float64Array(A),r=new Float64Array(A);let o=0;for(let i=0;i<n;i++){const a=t[i],c=e[i];Number.isNaN(a)||Number.isNaN(c)||(s[o]=a,r[o]=c,o++)}return _i(Nr(s),Nr(r))}function Nr(t){const e=t.length,n=new Float64Array(e),A=[];for(let r=0;r<e;r++)Number.isNaN(t[r])?n[r]=Number.NaN:A.push(r);A.sort((r,o)=>t[r]-t[o]);let s=0;for(;s<A.length;){let r=s+1;for(;r<A.length&&t[A[r]]===t[A[s]];)r++;const o=(s+r+1)/2;for(let i=s;i<r;i++)n[A[i]]=o;s=r}return n}function Ki(t,e){const n=Math.max(1,Math.trunc(e)),A=ms(t);if(A.length===0)return new Float64Array(0);const s=new Float64Array(n+1);for(let r=0;r<=n;r++)s[r]=ws(A,r/n);return s}function ms(t){let e=0;for(let s=0;s<t.length;s++)Number.isNaN(t[s])||e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++){const r=t[s];Number.isNaN(r)||(n[A]=r,A++)}return n.sort(),n}function ws(t,e){const n=t.length;if(n===0)return Number.NaN;if(n===1)return t[0];const A=Math.min(1,Math.max(0,e))*(n-1),s=Math.floor(A),r=Math.min(n-1,s+1),o=A-s;return t[s]+o*(t[r]-t[s])}const Th=2e5,$h=50,Jh=async t=>{const e=On(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig and tick it under Tracks."),[];const n=ne(t.inputs.features,t.params,"features"),A=n.value;if(A===void 0)return t.note(_n(n,{unchosen:"A FRiP needs the features to measure inside, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),[];const s=[];let r=0;for(let Q=0;Q<A.contigs.length;Q++){const E=A.contigs[Q];let m=Number.NaN,p=Number.NaN;const w=()=>{Number.isNaN(m)||(s.push({contig:E,start:m,end:p}),r+=p-m)};for(let y=A.contigAt[Q];y<A.contigAt[Q+1];y++){const N=A.start[y],k=A.end[y];k<=N||(Number.isNaN(m)?(m=N,p=k):N<=p?p=Math.max(p,k):(w(),m=N,p=k))}w()}if(s.length===0)return t.note("The feature set covers no bases, so there is nothing to measure inside."),[];const o=t.inputs.contigLengths??{};let i=0;for(const Q of Object.values(o))i+=Q;i<=0&&t.note("This session knows no sequence lengths, so the fraction of the assembly the set covers cannot be worked out and the enrichment column is left empty. Load a chrom.sizes, or the map itself.");const a=new Float64Array(s.length);for(let Q=0;Q<s.length;Q++)a[Q]=s[Q].end-s[Q].start;const c=Yi(a),l=Math.max(0,Math.round(T(t.params,"resolution",0))),g=l>0?l:Math.max(1,Math.round(c/$h)),f=i>0?Math.max(1,Math.round(i/Th)):g,h=[];for(const[Q,E]of Object.entries(o))E>0&&h.push({contig:Q,start:0,end:E});const u=Q=>t.inputs.labels?.[Q]??Q,I=[],d=[],C=Lt(t.params,"perFeature",!1);for(let Q=0;Q<e.length;Q++){t.throwIfCancelled();const E=e[Q],m=u(E);t.progress(Q,e.length,`${m} · features`);const p=await kr(t,E,s,g);t.throwIfCancelled(),t.progress(Q+.5,e.length,`${m} · assembly`);const w=h.length>0?await kr(t,E,h,f):{signal:Number.NaN},y=w.signal>0?p.signal/w.signal:Number.NaN,N=i>0?r/i:Number.NaN;if(I.push({track:m,frip:y,covered:N,enrichment:N>0?y/N:Number.NaN,signal:p.signal,totalSignal:w.signal,inFeature:p.span>0?p.covered/p.span:Number.NaN}),C){const k=await Oh(t,E,A,g);t.throwIfCancelled();for(const b of k)d.push({track:m,...b,share:w.signal>0?Number(b.signal)/w.signal:Number.NaN})}}t.progress(e.length,e.length,"done"),t.note(`Features read at ${g.toLocaleString()} bp and the assembly at ${f.toLocaleString()} bp — a span-weighted sum estimates the same area at either, and the finer one is spent where the boundaries are.`);const B=[{kind:"table",id:"frip",label:`In ${s.length.toLocaleString()} merged feature${s.length===1?"":"s"}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"frip",label:"FRiP",kind:"number",digits:4,hint:"Signal inside over signal everywhere."},{key:"covered",label:"Genome covered",kind:"number",digits:4,hint:"Merged bases of the set over the assembly."},{key:"enrichment",label:"Enrichment",kind:"number",digits:2,hint:"FRiP over the covered fraction. 1 is a track with no preference."},{key:"signal",label:"Signal inside",kind:"number",digits:0},{key:"totalSignal",label:"Signal total",kind:"number",digits:0},{key:"inFeature",label:"Set with data",kind:"number",digits:3,hint:"Of the set’s bases, how many the track has a value for."}],rows:I.sort((Q,E)=>Number(E.enrichment)-Number(Q.enrichment))}];return C&&d.length>0&&B.push({kind:"table",id:"frip-features",label:"Per feature",columns:[{key:"track",label:"Track",kind:"text"},{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},{key:"signal",label:"Signal",kind:"number",digits:2},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"share",label:"Share of total",kind:"number",digits:6,hint:"This feature’s signal over the track’s whole signal."}],rows:d.sort((Q,E)=>Number(E.signal)-Number(Q.signal))}),B};async function kr(t,e,n,A){const s=new Map;for(const a of n){const c=s.get(a.contig);c===void 0?s.set(a.contig,[a]):c.push(a)}let r=0,o=0,i=0;for(const[,a]of s){t.throwIfCancelled();for(const g of a)o+=g.end-g.start;const c=await t.sample(e,a,A),l=new Map;for(const g of a)l.set(Mn(g),g);for(const g of c.regions){const f=l.get(Mn(g));if(f!==void 0)for(let h=0;h<g.values.length;h++){const u=g.values[h];if(!Number.isFinite(u))continue;const I=Math.max(f.start,g.starts[h]),d=Math.min(f.end,g.ends[h]);d<=I||(r+=u*(d-I),i+=d-I)}}}return{signal:r,span:o,covered:i}}async function Oh(t,e,n,A){const s=[],r=new Map;for(let o=0;o<n.length;o++){const i=n.contigs[n.contig[o]],a=r.get(i);a===void 0?r.set(i,[o]):a.push(o)}for(const[,o]of r){t.throwIfCancelled();const i=o.map(l=>Yh(n,l)),a=await t.sample(e,i,A),c=new Map;for(const l of a.regions)c.set(Mn(l),l);for(let l=0;l<o.length;l++){const g=i[l],f=c.get(Mn(g));if(f===void 0)continue;let h=0,u=0;for(let I=0;I<f.values.length;I++){const d=f.values[I];if(!Number.isFinite(d))continue;const C=Math.max(g.start,f.starts[I]),B=Math.min(g.end,f.ends[I]);B<=C||(h+=d*(B-C),u+=B-C)}s.push({contig:g.contig,start:g.start,end:g.end,name:n.name[o[l]]??"",signal:h,mean:u>0?h/u:Number.NaN})}}return s}function Yh(t,e){return{contig:t.contigs[t.contig[e]],start:t.start[e],end:t.end[e]}}function Mn(t){return`${t.contig}:${t.start}-${t.end}`}function _h(t){return .5*Kh(-t/Math.SQRT2)}function Kh(t){const e=Math.abs(t),n=e<2?1-qh(e):Hh(e);return t>=0?n:2-n}function qh(t){let e=t,n=t;for(let A=1;A<200&&(e*=2*t*t/(2*A+1),n+=e,!(e<Math.abs(n)*1e-17));A++);return 2/Math.sqrt(Math.PI)*Math.exp(-t*t)*n}function Hh(t){let n=1/t,A=1e300,s=n;for(let r=1;r<300;r++){const o=r/2;n=t+o*n,n===0&&(n=1e-300),A=t+o/A,A===0&&(A=1e-300),n=1/n;const i=A*n;if(s*=i,Math.abs(i-1)<1e-16)break}return Math.exp(-t*t)/Math.sqrt(Math.PI)*s}function Wh(t){const e=t.length,n=new Float64Array(e).fill(Number.NaN),A=[];for(let o=0;o<e;o++)Number.isFinite(t[o])&&A.push(o);A.sort((o,i)=>t[i]-t[o]);const s=A.length;let r=Number.POSITIVE_INFINITY;for(let o=0;o<s;o++){const i=s/(s-o);r=Math.min(r,i*t[A[o]]),n[A[o]]=Math.min(1,r)}return n}function qi(t){return t.rows[1]<=t.rows[0]&&t.cols[1]<=t.cols[0]}function Ae(t){let e=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&(n[A++]=t[s]);return n.sort()}function Te(t,e){const n=t.length;if(n===0)return Number.NaN;const A=Math.min(n-1,Math.max(0,e*(n-1))),s=Math.floor(A),r=Math.min(n-1,s+1);return t[s]+(t[r]-t[s])*(A-s)}function Ph(t){const e=Ae(t),n=e.length;if(n===0)return{n:0,mean:Number.NaN,sd:Number.NaN,median:Number.NaN,q1:Number.NaN,q3:Number.NaN};let A=0;for(let o=0;o<n;o++)A+=e[o];const s=A/n;let r=0;for(let o=0;o<n;o++)r+=(e[o]-s)**2;return{n,mean:s,sd:n>1?Math.sqrt(r/(n-1)):Number.NaN,median:Te(e,.5),q1:Te(e,.25),q3:Te(e,.75)}}function Hi(t){const e=t.length,n=Array.from({length:e},(o,i)=>i).sort((o,i)=>t[o]-t[i]),A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o+1<e&&t[n[o+1]]===t[n[r]];)o++;const i=(r+o)/2+1;for(let c=r;c<=o;c++)A[n[c]]=i;const a=o-r+1;a>1&&(s+=a*a*a-a),r=o+1}return{ranks:A,ties:s}}function zh(t,e){const n=Ae(t),A=Ae(e),s=n.length,r=A.length;if(s===0||r===0)return{u:Number.NaN,z:Number.NaN,p:Number.NaN,effect:Number.NaN};const o=new Float64Array(s+r);o.set(n,0),o.set(A,s);const{ranks:i,ties:a}=Hi(o);let c=0;for(let C=0;C<s;C++)c+=i[C];const l=c-s*(s+1)/2,g=s+r,f=s*r/2,h=s*r/12*(g+1-a/(g*(g-1))),u=2*l/(s*r)-1;if(!(h>0))return{u:l,z:0,p:1,effect:u};const I=l-f,d=(I-.5*Math.sign(I))/Math.sqrt(h);return{u:l,z:d,p:Math.min(1,2*_h(-Math.abs(d))),effect:u}}function Xh(t){const e=t.map(Ae).filter(g=>g.length>0),n=e.length,A=e.reduce((g,f)=>g+f.length,0);if(n<2||A<2)return{h:Number.NaN,df:Math.max(0,n-1),p:Number.NaN};const s=new Float64Array(A);let r=0;for(const g of e)s.set(g,r),r+=g.length;const{ranks:o,ties:i}=Hi(s);let a=0;r=0;for(const g of e){let f=0;for(let h=0;h<g.length;h++)f+=o[r+h];a+=f*f/g.length,r+=g.length}a=12/(A*(A+1))*a-3*(A+1);const c=1-i/(A*A*A-A);if(!(c>0))return{h:Number.NaN,df:n-1,p:Number.NaN};const l=a/c;return{h:l,df:n-1,p:Vh(l,n-1)}}function Vh(t,e){return!(e>0)||Number.isNaN(t)?Number.NaN:t<=0?1:Zh(e/2,t/2)}function Zh(t,e){const n=Math.exp(-e+t*Math.log(e)-Wi(t));if(e<t+1){let a=1/t,c=a;for(let l=1;l<1e3&&(a*=e/(t+l),c+=a,!(Math.abs(a)<Math.abs(c)*1e-16));l++);return Math.max(0,1-c*n)}const A=1e-300;let s=e+1-t,r=1/A,o=1/s,i=o;for(let a=1;a<1e3;a++){const c=-a*(a-t);s+=2,o=c*o+s,Math.abs(o)<A&&(o=A),r=s+c/r,Math.abs(r)<A&&(r=A),o=1/o;const l=o*r;if(i*=l,Math.abs(l-1)<1e-16)break}return Math.min(1,n*i)}function Wi(t){if(t<.5)return Math.log(Math.PI/Math.sin(Math.PI*t))-Wi(1-t);const e=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,15056327351493116e-23],n=t-1;let A=e[0];const s=n+7.5;for(let r=1;r<9;r++)A+=e[r]/(n+r);return .5*Math.log(2*Math.PI)+(n+.5)*Math.log(s)-s+Math.log(A)}const jh=1e4;function tu(t){return t.end-t.start+(t.wrap??0)}const Dn=["#0072b2","#d55e00","#009e73","#cc79a7","#e69f00","#56b4e9","#f0e442","#000000"],eu="#999999",br="rest of the genome",ue=2e4,nu=async t=>{const e=On(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig, or run a task that makes one, and tick it under Tracks."),[];const n=[];for(const[Q,E]of Object.entries(t.inputs.contigLengths??{}))E>0&&n.push({name:Q,length:E});if(n.length===0)return t.note("This session knows no sequence lengths, so there is no genome to cut into stretches. Load a chrom.sizes, or the map itself."),[];const A=T(t.params,"resolution",0),s=!(A>0),r=A>0?Math.round(A):t.framing.binsize>0&&!qi(t.framing)?t.framing.binsize:jh,o=new Set(t.framing.circular??[]);let i=st(t.params,"groupBy","features")==="track"?await su(t,n,r,s,o):Au(t,n,s?Number.POSITIVE_INFINITY:r,o);if(i===null)return[];const a=s?{one:"entry"}:{one:"stretch"};if(i=ru(i,t,a.one),i.stretches.length===0)return t.note(`No ${a.one} of the genome fell in any group, so there is nothing to compare.`),[];const c=Q=>t.inputs.labels?.[Q]??Q,l=i.names.length,g=[],f=[],h=[];for(let Q=0;Q<e.length;Q++){t.throwIfCancelled();const E=c(e[Q]);t.progress(Q,e.length,E);const m=await ps(t,e[Q],i.stretches),p=i.names.map(()=>[]);for(let k=0;k<i.stretches.length;k++)Number.isFinite(m[k])&&p[i.stretches[k].group].push(m[k]);if(p.every(k=>k.length===0)){t.note(`${E} has no value over any stretch — its sequence names may not be the assembly's.`);continue}let w=0,y=0;for(const k of p){for(const b of k)y+=b;w+=k.length}for(let k=0;k<l;k++){const b=Ph(p[k]),M=w-b.n,F=M>0?(y-b.mean*b.n)/M:Number.NaN;let S=0;for(const v of i.stretches)v.group===k&&(S+=tu(v));g.push({track:E,group:i.names[k],n:b.n,bases:S,mean:b.mean,sd:b.sd,median:b.median,q1:b.q1,q3:b.q3,vsRest:b.n>0?b.mean-F:Number.NaN})}const N=p.map((k,b)=>({group:k,g:b})).filter(k=>k.group.length>0);if(N.length>2){const k=Xh(N.map(b=>b.group));f.push({track:E,test:"Kruskal–Wallis H",a:`all ${N.length} groups`,b:"",statistic:k.h,effect:Number.NaN,difference:Number.NaN,p:k.p})}for(let k=0;k<N.length;k++)for(let b=k+1;b<N.length;b++){const M=N[k],F=N[b],S=zh(M.group,F.group);f.push({track:E,test:"Mann–Whitney U",a:i.names[M.g],b:i.names[F.g],statistic:S.u,effect:S.effect,difference:Te(Ae(M.group),.5)-Te(Ae(F.group),.5),p:S.p})}h.push({kind:"curve",id:`groupsignal-${Q+1}`,label:`${E} by ${i.of}`,series:p.map((k,b)=>{const M=cu(k);return{name:i.names[b],x:Float64Array.from(M,(F,S)=>S),y:M,colour:i.colours[b],n:k.length,mark:"violin"}}),xLabel:i.of,yLabel:E,xScale:"linear",yScale:"linear"})}if(t.progress(e.length,e.length,"done"),h.length===0)return[];const u=Wh(f.map(Q=>Number(Q.p)));f.forEach((Q,E)=>{Q.q=u[E]});const I=h.some(Q=>Q.series.some(E=>(E.n??0)>ue)),d=i.stretches.length.toLocaleString(),C=s?i.segments!==void 0?`${d} entries, each a run of ${r.toLocaleString()} bp bins in one group,`:`${d} entries, each a run of features under one name or a stretch between them,`:`${d} stretches of at most ${r.toLocaleString()} bp`;t.note(`Compared over ${C} in ${l} groups, each the track's mean over the bases it has a value for.${I?` A violin of more than ${ue.toLocaleString()} is drawn from that many, evenly by rank; the tests use every one.`:""}`);const B=[...h];if(B.push({kind:"table",id:"groupsignal-groups",label:`Groups · ${i.of}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"group",label:"Group",kind:"text"},{key:"n",label:s?"Entries":"Stretches",kind:"number"},{key:"bases",label:"Bases",kind:"number"},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"sd",label:"SD",kind:"number",digits:4},{key:"median",label:"Median",kind:"number",digits:4},{key:"q1",label:"Q1",kind:"number",digits:4},{key:"q3",label:"Q3",kind:"number",digits:4},{key:"vsRest",label:"Mean − rest",kind:"number",digits:4,hint:"This group’s mean less that of every other stretch."}],rows:g}),B.push({kind:"table",id:"groupsignal-tests",label:"Between groups",columns:[{key:"track",label:"Track",kind:"text"},{key:"test",label:"Test",kind:"text"},{key:"a",label:"Group",kind:"text"},{key:"b",label:"Against",kind:"text"},{key:"difference",label:"Median difference",kind:"number",digits:4},{key:"effect",label:"Effect",kind:"number",digits:3,hint:"Rank-biserial r: +1 where every value of the group is above every value against it."},{key:"statistic",label:"U or H",kind:"number",digits:2},{key:"p",label:"P",kind:"number",digits:4,scientific:!0},{key:"q",label:"q",kind:"number",digits:4,scientific:!0,hint:"Benjamini–Hochberg, over every test of the run."}],rows:f}),i.segments!==void 0&&B.push({kind:"intervals",id:"groupsignal-segments",label:`Groups · ${i.of}`,payload:{kind:"features",data:i.segments},noun:{one:"segment",many:"segments"},display:"lane",look:"corner"}),st(t.params,"groupBy","features")!=="track"&&Lt(t.params,"perFeature",!1)){const Q=await au(t,e,c);Q!==null&&B.push(Q)}return B};function Au(t,e,n,A){const s=ne(t.inputs.features,t.params,"features"),r={chosen:s.chosen,value:s.chosen?s.value:void 0},o=r.value;if(o===void 0)return t.note(_n(r,{unchosen:"No feature set was chosen to make the groups from.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),null;const i=st(t.params,"split","name"),a=t.inputs.labels?.[at(t.params,"features")??""]??"the set",c=new Array(o.length).fill(null);let l;if(i==="score"){const m=Pi(t),p=Ki(o.score,m);if(p.length===0)return t.note(`${a} carries no scores, so it cannot be cut into quantiles of them.`),null;l=Array.from({length:m},(w,y)=>zi(y,p));for(let w=0;w<o.length;w++){const y=Xi(o.score[w],p);y>=0&&(c[w]=l[y])}}else if(i==="strand"){l=["+ strand","− strand","no strand"];for(let m=0;m<o.length;m++)c[m]=o.strand[m]>0?l[0]:o.strand[m]<0?l[1]:l[2]}else if(i==="none")l=[a],c.fill(a);else{for(let m=0;m<o.length;m++)c[m]=o.name[m]===""?"(no name)":o.name[m];l=[...new Set(c.filter(m=>m!==null))].sort((m,p)=>m.localeCompare(p,void 0,{numeric:!0}))}const g=l.filter(m=>c.includes(m)),f=Lt(t.params,"outside",!0),h=f?[...g,br]:g,u=new Map(h.map((m,p)=>[m,p])),I=m=>e.find(p=>p.name===m)?.length??t.lengthOf(m),d=new Map,C=new Set;for(let m=0;m<o.contigs.length;m++){const p=o.contigs[m],w=I(p);if(w===void 0){o.contigAt[m+1]>o.contigAt[m]&&C.add(p);continue}const y=h.map(()=>[]);for(let N=o.contigAt[m];N<o.contigAt[m+1];N++){const k=c[N];if(k===null)continue;const b=Math.max(0,o.start[N]),M=Math.min(w,o.end[N]);M>b&&y[u.get(k)??0].push([b,M])}d.set(p,y.map(Mr))}C.size>0&&t.note(`${[...C].slice(0,6).join(", ")}${C.size>6?", …":""} ${C.size===1?"is":"are"} not a sequence of this assembly, so ${C.size===1?"its":"their"} features were left out.`);const B=[],Q=new Map;for(const[m,p]of d)p.forEach((w,y)=>{for(const[N,k]of w)for(const[b,M]of oA(N,k,n))B.push({contig:m,start:b,end:M,group:y})}),Q.set(m,Mr(p.flat()));if(f){const m=h.length-1;for(const{name:p,length:w}of e){let y=0;for(const[N,k]of Q.get(p)??[]){for(const[b,M]of oA(y,N,n))B.push({contig:p,start:b,end:M,group:m});y=Math.max(y,k)}for(const[N,k]of oA(y,w,n))B.push({contig:p,start:N,end:k,group:m})}}const E=i==="score"?"score":i==="strand"?"strand":i==="none"?"":"name";return{names:h,colours:h.map((m,p)=>m===br?eu:Dn[p%Dn.length]),stretches:n===Number.POSITIVE_INFINITY?Vi(B,e,A):B,of:E===""?a:`${a}, by ${E}`}}async function su(t,e,n,A,s){const r=at(t.params,"groupTrack");if(r===null)return t.note("No track was chosen to group the bins by."),null;const o=t.inputs.labels?.[r]??r,i=[];for(const d of e)for(let C=0;C<d.length;C+=n)i.push({contig:d.name,start:C,end:Math.min(d.length,C+n),group:-1});const a=await ps(t,r,i),c=st(t.params,"cut","sign")==="quantiles"?"quantiles":"sign";let l;if(c==="sign"){l=["above 0","below 0"];for(let d=0;d<i.length;d++)i[d].group=a[d]>0?0:a[d]<0?1:-1}else{const d=Pi(t),C=Ki(a,d);if(C.length===0)return t.note(`${o} has no value over any bin, so there is nothing to cut into quantiles.`),null;l=Array.from({length:d},(B,Q)=>zi(Q,C));for(let B=0;B<i.length;B++)i[B].group=Xi(a[B],C)}const g=i.filter(d=>d.group>=0);g.length<i.length&&t.note(`${(i.length-g.length).toLocaleString()} of ${i.length.toLocaleString()} bins had no reading of ${o}${c==="sign"?", or read exactly 0,":""} and are in no group.`);const f=new et,h=[];let u=null;const I=()=>{u!==null&&(f.add(u.contig,u.start,u.end,{name:l[u.group]}),h.push(u)),u=null};for(const d of g){if(u!==null&&u.contig===d.contig&&u.group===d.group&&u.end===d.start){u.end=d.end;continue}I(),u={...d}}return I(),{names:l,colours:l.map((d,C)=>Dn[C%Dn.length]),stretches:A?Vi(h,e,s):g,of:`${o}, ${c==="sign"?"by sign":"in quantiles"}`,segments:f.finish()}}function ru(t,e,n){const A=new Array(t.names.length).fill(0);for(const i of t.stretches)A[i.group]++;if(A.every(i=>i>0))return t;const s=t.names.filter((i,a)=>A[a]===0);e.note(`${s.join(", ")} had no ${n} in ${s.length===1?"it":"them"}, and ${s.length===1?"is":"are"} left out.`);const r=t.names.map((i,a)=>a).filter(i=>A[i]>0),o=new Map(r.map((i,a)=>[i,a]));return{...t,names:r.map(i=>t.names[i]),colours:r.map(i=>t.colours[i]),stretches:t.stretches.map(i=>({...i,group:o.get(i.group)??0}))}}function Pi(t){return Math.max(2,Math.min(10,Math.round(T(t.params,"quantiles",4))))}function zi(t,e){const n=A=>Math.abs(A)>=100?A.toFixed(0):A.toPrecision(3);return`Q${t+1} (${n(e[t])} to ${n(e[t+1])})`}function Xi(t,e){if(!Number.isFinite(t)||e.length<2)return-1;const n=e.length-1;if(t<e[0]||t>e[n])return-1;for(let A=0;A<n;A++)if(t<e[A+1])return A;return n-1}function Mr(t){const e=[...t].sort((A,s)=>A[0]-s[0]),n=[];for(const[A,s]of e){const r=n[n.length-1];r!==void 0&&A<=r[1]?r[1]=Math.max(r[1],s):n.push([A,s])}return n}function Vi(t,e,n){if(n.size===0)return t;const A=new Map(e.map(o=>[o.name,o.length])),s=new Map;for(const o of t){const i=A.get(o.contig);if(!n.has(o.contig)||i===void 0)continue;const a=`${o.contig} ${o.group}`,c=s.get(a)??{};o.start===0&&o.end<i&&(c.head=o),o.end===i&&o.start>0&&(c.tail=o),s.set(a,c)}const r=new Set;for(const{head:o,tail:i}of s.values())o===void 0||i===void 0||(i.wrap=o.end,r.add(o));return r.size===0?t:t.filter(o=>!r.has(o))}function oA(t,e,n){if(!(e>t))return[];if(e-t<=n)return[[t,e]];const A=[];let s=t;for(;s<e;){const o=Math.min(e,(Math.floor(s/n)+1)*n);A.push([s,o]),s=o}A.length>1&&A[0][1]-A[0][0]<n/2&&(A[1][0]=A[0][0],A.shift());const r=A.length-1;return r>0&&A[r][1]-A[r][0]<n/2&&(A[r-1][1]=A[r][1],A.pop()),A}const iA=1<<20,ou=4096;async function ps(t,e,n){const A=new Float64Array(n.length).fill(Number.NaN),s=new Map;n.forEach((r,o)=>{const i=s.get(r.contig);i===void 0?s.set(r.contig,[o]):i.push(o)});for(const[r,o]of s){const i=new Map,a=new Map;for(const g of o){const{start:f,end:h,wrap:u}=n[g],I=[],d=u===void 0?[[f,h]]:[[f,h],[0,u]];for(const[C,B]of d)for(let Q=C;Q<B;Q+=iA){const E={contig:r,start:Q,end:Math.min(B,Q+iA)},m=`${E.start}-${E.end}`;i.set(m,E),I.push(m)}a.set(g,I)}const c=[...i.values()].sort((g,f)=>g.start-f.start||g.end-f.end),l=new Map;for(let g=0;g<c.length;){t.throwIfCancelled();let f=g+1,h=c[g].end-c[g].start;for(;f<c.length&&f-g<ou&&(h+=c[f].end-c[f].start,!(h>iA));)f++;const u=await t.sample(e,c.slice(g,f),1);for(const I of u.regions)l.set(`${I.start}-${I.end}`,iu(I,I.start,I.end));g=f}for(const g of o){let f=0,h=0;for(const u of a.get(g)??[]){const I=l.get(u);I!==void 0&&(f+=I[0],h+=I[1])}h>0&&(A[g]=f/h)}}return A}function iu(t,e,n){let A=0,s=0;for(let r=0;r<t.values.length;r++){const o=t.values[r];if(!Number.isFinite(o))continue;const i=Math.max(e,t.starts[r]),a=Math.min(n,t.ends[r]);a<=i||(A+=o*(a-i),s+=a-i)}return[A,s]}async function au(t,e,n){const A=ne(t.inputs.features,t.params,"features").value;if(A===void 0)return null;const s=[];for(let i=0;i<A.length;i++)s.push({contig:A.contigs[A.contig[i]],start:A.start[i],end:A.end[i],group:i});const r=e.map((i,a)=>`track${a+1}`),o=s.map(i=>({contig:i.contig,start:i.start,end:i.end,name:A.name[i.group]??""}));for(let i=0;i<e.length;i++)(await ps(t,e[i],s)).forEach((c,l)=>{o[l][r[i]]=c});return{kind:"table",id:"groupsignal-features",label:"Per feature",columns:[{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},...e.map((i,a)=>({key:r[a],label:n(i),kind:"number",digits:4}))],rows:o}}function cu(t){const e=Ae(t);if(e.length<=ue)return e;const n=new Float64Array(ue);for(let A=0;A<ue;A++)n[A]=e[Math.round(A*(e.length-1)/(ue-1))];return n}function lu(t,e){const n=Math.max(1,Math.round(e.flank/e.step)),A=n*2,s={slots:A,bodyFrom:n,bodyTo:n,flankStep:e.step},r=[];for(const o of t){const i=e.at==="start"?o.strand<0?o.end:o.start:e.at==="end"?o.strand<0?o.start:o.end:o.start+Math.floor((o.end-o.start)/2),a=e.lengthOf(o.contig),c={from:i-n*e.step,to:i+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l))continue;const f=Math.floor((l-c.from)/e.step),h=Math.floor((c.to-g)/e.step),u=o.strand<0?h:f,I=A-(o.strand<0?f:h);if(!(I>u))continue;const d={start:c.from+f*e.step,end:c.to-h*e.step};r.push({contig:o.contig,start:l,end:g,strand:o.strand,slotFrom:u,slotTo:I,...d.start===l&&d.end===g?{}:{span:d}})}return{windows:r,layout:s}}function gu(t,e){const n=Math.max(0,Math.round(e.flank/e.step)),A=e.body+n*2,s={slots:A,bodyFrom:n,bodyTo:n+e.body,flankStep:e.step},r=[];let o=0;for(const i of t){if(i.end-i.start<e.body){o++;continue}const a=e.lengthOf(i.contig),c={from:i.start-n*e.step,to:i.end+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l)){o++;continue}const f=Math.round((l-c.from)/e.step),h=Math.round((c.to-g)/e.step),u=i.strand<0?h:f,I=A-(i.strand<0?f:h);if(!(I>u)){o++;continue}const d=Math.min(Math.max(i.start,l),g),C=Math.min(Math.max(i.end,d),g),B=Math.min(Math.max(s.bodyFrom,u),I),Q=Math.min(Math.max(s.bodyTo,B),I);r.push({contig:i.contig,start:l,end:g,strand:i.strand,slotFrom:u,slotTo:I,body:{start:d,end:C,slotFrom:B,slotTo:Q}})}return{windows:r,layout:s,dropped:o}}function fu(t,e,n){const A=new Float64Array(n).fill(Number.NaN),s=e.slotTo-e.slotFrom;if(s<=0||e.end-e.start<=0)return A;const o=new Float64Array(s),i=new Float64Array(s),a=hu(s),{values:c,starts:l,ends:g}=t,f=e.span?.start??e.start,h=e.span?.end??e.end,u=e.strand<0,I=e.body===void 0;for(let d=0;d<c.length;d++){const C=c[d];if(!Number.isFinite(C))continue;const B=Math.max(f,l[d]),Q=Math.min(h,g[d]);if(!(Q>B))continue;let E,m;if(I){const y=(B-f)/(h-f),N=(Q-f)/(h-f);E=u?1-N:y,m=u?1-y:N}else{const y=Fr(e,B),N=Fr(e,Q);E=u?N:y,m=u?y:N}const p=Math.max(0,Math.floor(E*s)),w=Math.min(s-1,Math.ceil(m*s)-1);for(let y=p;y<=w;y++){const N=Math.min(m,a[y+1])-Math.max(E,a[y]);N>0&&(o[y]+=C*N,i[y]+=N)}}for(let d=0;d<s;d++)i[d]>0&&(A[e.slotFrom+d]=o[d]/i[d]);return A}const Dr=new Map;function hu(t){let e=Dr.get(t);if(e===void 0){e=new Float64Array(t+1);for(let n=0;n<=t;n++)e[n]=n/t;Dr.set(t,e)}return e}function Fr(t,e){const n=t.body;if(n===void 0){const c=t.span?.start??t.start,l=t.span?.end??t.end,g=(e-c)/(l-c);return t.strand<0?1-g:g}const A=t.strand<0,s=A?t.end:t.start,r=A?n.end:n.start,o=A?n.start:n.end,i=A?t.start:t.end;return(t.slotFrom+aA(e,s,r)*(n.slotFrom-t.slotFrom)+aA(e,r,o)*(n.slotTo-n.slotFrom)+aA(e,o,i)*(t.slotTo-n.slotTo)-t.slotFrom)/(t.slotTo-t.slotFrom)}function aA(t,e,n){if(e===n)return 1;const A=(t-e)/(n-e);return A<0?0:A>1?1:A}function uu(t,e,n,A){const s=new Float64Array(n).fill(Number.NaN),r=new Float64Array(n).fill(Number.NaN),o=new Float64Array(n).fill(Number.NaN);if(e===0)return{mean:s,low:r,high:o,n:0};const i=new Float64Array(e),a=[i],c=g=>A.average==="median"?Yi(g):A.average==="trimmed"?vh(g,A.trim):xh(g);for(let g=0;g<n;g++){for(let f=0;f<e;f++)i[f]=t[f*n+g];if(s[g]=c(i),A.band==="sd"){const f=Zi(a,s[g]);Number.isFinite(f)&&(r[g]=s[g]-f,o[g]=s[g]+f)}}if(A.band==="bootstrap"&&e>1){const g=new Float64Array(A.iterations*n),f=new Int32Array(e),h=new Float64Array(e);for(let d=0;d<A.iterations;d++){for(let C=0;C<e;C++)f[C]=Math.floor(A.rng()*e)%e;for(let C=0;C<n;C++){for(let B=0;B<e;B++)h[B]=t[f[B]*n+C];g[d*n+C]=c(h)}}const u=(1-A.level)/2,I=new Float64Array(A.iterations);for(let d=0;d<n;d++){for(let B=0;B<A.iterations;B++)I[B]=g[B*n+d];const C=Array.from(I).filter(Number.isFinite).sort((B,Q)=>B-Q);C.length!==0&&(r[d]=C[Math.floor(u*(C.length-1))],o[d]=C[Math.ceil((1-u)*(C.length-1))])}}let l=0;for(let g=0;g<e;g++)for(let f=0;f<n;f++)if(Number.isFinite(t[g*n+f])){l++;break}return{mean:s,low:r,high:o,n:l}}function Iu(t){const e=du(t),n=Zi(t,e);if(!Number.isFinite(e))return{mean:e,sd:n,scaled:!1};const A=Number.isFinite(n)&&n>0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(s[r]=A?(o-e)/n:o-e)}return{mean:e,sd:n,scaled:A}}function du(t){let e=0,n=0;for(const A of t)for(let s=0;s<A.length;s++){const r=A[s];Number.isFinite(r)&&(e+=r,n++)}return n===0?Number.NaN:e/n}function Zi(t,e){if(!Number.isFinite(e))return Number.NaN;let n=0,A=0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(n+=(o-e)**2,A++)}return A>1?Math.sqrt(n/(A-1)):Number.NaN}function LA(t){const e=new Float64Array(t.slots),n=t.bodyTo>t.bodyFrom;for(let A=0;A<t.slots;A++)e[A]=n?A:(A-t.bodyFrom+.5)*t.flankStep;return n?{x:e,label:"Position (upstream · body · downstream)",scaled:{from:-.5,start:t.bodyFrom-.5,end:t.bodyTo-.5,to:t.slots-.5,flankStep:t.flankStep}}:{x:e,label:"Distance from the anchor (bp)"}}function ji(t){let e=(Number.isFinite(t)?Math.trunc(t):0)>>>0;return function(){e=e+1831565813>>>0;let A=e;return A=Math.imul(A^A>>>15,A|1),A^=A+Math.imul(A^A>>>7,A|61),((A^A>>>14)>>>0)/4294967296}}function Cu(t){return Xo(t)}function Sr(t){const e=Math.round(t);return e===0?"0":`${e<0?"-":"+"}${Cu(Math.abs(e))}`}function Qu(t,e){if(!Number.isFinite(e))return"";const n=1e-9*Math.max(1,Math.abs(t.to-t.from));if(Math.abs(e-t.start)<=n)return"Start";if(Math.abs(e-t.end)<=n)return"End";if(e<t.start)return Sr((e-t.start)*t.flankStep);if(e>t.end)return Sr((e-t.end)*t.flankStep);const A=(e-t.start)/(t.end-t.start),s=A*100;return x.pct(A,Math.abs(s-Math.round(s))<1e-6?0:1)}function Bu(t,e,n){const A=[];for(let s=0;s<t.length;s++)A.push({contig:t.contigs[t.contig[s]],start:t.start[s],end:t.end[s],strand:n?t.strand[s]:1,rank:e===null?0:Eu(t,s,e)});return A}function Eu(t,e,n){if(n==="score")return t.score[e];for(const A of t.detail[e].split(ct)){const s=A.search(/[=:]/);if(s<0||A.slice(0,s).trim()!==n)continue;const r=Number.parseFloat(A.slice(s+1).trim());return Number.isFinite(r)?r:Number.NaN}return Number.NaN}function mu(t,e){if(e.rankBy===null||e.subset==="all")return[{name:"all",features:t}];const n=[...t].sort((r,o)=>Number.isNaN(r.rank)?Number.isNaN(o.rank)?0:1:Number.isNaN(o.rank)?-1:o.rank-r.rank);if(e.subset==="top")return[{name:`top ${e.count}`,features:n.slice(0,e.count)}];if(e.subset==="bottom")return[{name:`bottom ${e.count}`,features:n.slice(-e.count)}];const A=[],s=Math.ceil(n.length/e.groups);for(let r=0;r<e.groups;r++){const o=n.slice(r*s,(r+1)*s);o.length!==0&&A.push({name:`group ${r+1}`,features:o})}return A}const wu=async t=>{const e=On(t.params,"tracks"),n=ne(t.inputs.features,t.params,"features"),A=n.value;if(e.length===0||A===void 0){const b=_n(n,{unchosen:"No feature set was chosen. Load a BED or a GTF and pick it under Features.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."});return t.note(e.length===0&&b!==null?"A metaplot needs a track to read and a set of positions to read it at, and neither is in hand.":e.length===0?"No track was chosen. Load a bigWig and tick it under Tracks.":b??""),[]}const s=Lt(t.params,"stranded",!0),r=at(t.params,"rankBy"),o=Bu(A,r,s),i=mu(o,{rankBy:r,subset:st(t.params,"subset","all"),count:Math.max(1,Math.round(T(t.params,"count",500))),groups:Math.max(2,Math.round(T(t.params,"groups",4)))}),a=Lt(t.params,"zscore",!1),c=Math.max(1,Math.round(T(t.params,"step",50))),l=Math.max(0,Math.round(T(t.params,"flank",2e3))),g=st(t.params,"mode","reference")==="scaled",f=Math.max(10,Math.round(T(t.params,"body",100))),h=b=>t.lengthOf(b)??Number.MAX_SAFE_INTEGER,u=i.map(b=>g?gu(b.features,{body:f,flank:l,step:c,lengthOf:h}):{...lu(b.features,{at:st(t.params,"at","start"),flank:l,step:c,lengthOf:h}),dropped:0}),I=u.reduce((b,M)=>b+M.dropped,0),d=[],C=[],B=u.length===0?null:u[0].layout,Q=Lt(t.params,"heatmap",!0),E=[],m=u.map(b=>({total:new Float64Array(b.windows.length),seen:new Float64Array(b.windows.length)})),p=e.length*i.length;let w=0;for(const b of e){const M=[];for(const[F,S]of i.entries()){t.throwIfCancelled(),t.progress(w,p,`${t.inputs.labels?.[b]??b} · ${S.name}`),w++;const v=u[F];v.windows.length!==0&&M.push({group:F,rows:await Nu(t,b,v.windows,v.layout),count:v.windows.length,layout:v.layout})}a&&Iu(M.map(F=>F.rows));for(const F of M){const S=uu(F.rows,F.count,F.layout.slots,{average:st(t.params,"average","mean"),trim:.1,band:st(t.params,"band","bootstrap"),iterations:Math.max(20,Math.round(T(t.params,"iterations",200))),level:.95,rng:ji(Math.round(T(t.params,"seed",1)))}),v=t.inputs.labels?.[b]??b,G=i.length===1?v:`${v} · ${i[F.group].name}`;d.push({name:G,x:LA(F.layout).x,y:S.mean,low:S.low,high:S.high,n:S.n}),Q&&(Mu(m[F.group],F.rows,F.count,F.layout.slots),E.push({group:F.group,rows:Float32Array.from(F.rows),count:F.count,name:G}))}}if(t.progress(p,p,"done"),B===null||d.length===0)return t.note("No feature produced a usable window. Check that the track and the set share an assembly."),[];I>0&&t.note(`${I.toLocaleString()} features were dropped: shorter than the body width, or with no window left after clipping to the sequence.`);const y=LA(B);C.push({kind:"curve",id:"metaplot",label:"Metaplot",series:d,xLabel:y.label,...y.scaled===void 0?{}:{xScaled:y.scaled},yLabel:a?"Signal (z-score, per track)":"Mean signal",xScale:"linear",yScale:"linear"});const N=E.length===0?[]:m.map(Du),k={zscore:a,tracks:e.length};return E.forEach((b,M)=>{C.push(Fu(b,N[b.group],M,B,y.label,k))}),C},pu=1<<20,yu=4096;async function Nu(t,e,n,A){const s=new Float64Array(n.length*A.slots).fill(Number.NaN),r=new Map;for(let o=0;o<n.length;o++){const i=r.get(n[o].contig);i===void 0?r.set(n[o].contig,[o]):i.push(o)}for(const[o,i]of r){const a=new Map;for(const g of i){const f=`${n[g].start}-${n[g].end}`,h=a.get(f);h===void 0?a.set(f,[g]):h.push(g)}const c=[...a.keys()].map(g=>{const[f,h]=g.split("-").map(Number);return{contig:o,start:f,end:h}}).sort((g,f)=>g.start-f.start||g.end-f.end),l=new Map;for(let g=0;g<c.length;){t.throwIfCancelled();let f=g+1,h=c[g].end-c[g].start;for(;f<c.length&&f-g<yu&&(h+=c[f].end-c[f].start,!(h>pu));)f++;const u=await t.sample(e,c.slice(g,f),1);g=f;for(const I of u.regions)for(const d of a.get(`${I.start}-${I.end}`)??[]){const C=n[d],{body:B,span:Q}=C,E=`${C.start}-${C.end}:${C.strand}:${C.slotFrom}-${C.slotTo}`+(Q===void 0?"":`:${Q.start}-${Q.end}`)+(B===void 0?"":`:${B.start}-${B.end}:${B.slotFrom}-${B.slotTo}`),m=l.get(E);if(m!==void 0){s.copyWithin(d*A.slots,m*A.slots,(m+1)*A.slots);continue}l.set(E,d),s.set(fu(I,C,A.slots),d*A.slots)}}}return s}function ku(t){const e=Math.max(1,Math.floor(t.length/1e5)),n=[];for(let i=0;i<t.length;i+=e){const a=t[i];Number.isFinite(a)&&n.push(a)}if(n.length===0)return null;n.sort((i,a)=>i-a);const A=i=>n[Math.min(n.length-1,Math.floor(i*(n.length-1)))],s=A(.99),r=n[0]>=0?0:-Math.max(Math.abs(A(.01)),Math.abs(s)),o=n[0]>=0?s:Math.max(Math.abs(A(.01)),Math.abs(s));return o>r?[r,o]:null}function bu(t){const{x:e,scaled:n}=LA(t);if(e.length===0)return{labels:[]};if(n!==void 0){const o=[n.start,n.end];n.start>n.from&&o.push(n.from),n.to>n.end&&o.push(n.to),o.push((n.start+n.end)/2);const i=n.to-n.from;return{labels:o.map(a=>Qu(n,a)),at:o.map(a=>(a-n.from)/i)}}const A=t.flankStep>0?t.flankStep:1,s=e[0]-A/2,r=e[e.length-1]+A/2;return{labels:[0,.25,.5,.75,1].map(o=>{const i=s+o*(r-s);return Math.abs(i)>=1e4?`${Number((i/1e3).toFixed(1))} kb`:String(Math.round(i))})}}function Mu(t,e,n,A){for(let s=0;s<n;s++){let r=0,o=0;for(let i=0;i<A;i++){const a=e[s*A+i];Number.isFinite(a)&&(r+=a,o++)}t.total[s]+=r,t.seen[s]+=o}}function Du(t){const e=t.total.length,n=new Float64Array(e);for(let A=0;A<e;A++)n[A]=t.seen[A]===0?Number.NaN:t.total[A]/t.seen[A];return Array.from({length:e},(A,s)=>s).sort((A,s)=>Number.isNaN(n[A])?Number.isNaN(n[s])?0:1:Number.isNaN(n[s])?-1:n[s]-n[A])}function Fu(t,e,n,A,s,r){const{rows:o,count:i}=t,a=new Float32Array(i*A.slots);for(let g=0;g<i;g++)a.set(o.subarray(e[g]*A.slots,(e[g]+1)*A.slots),g*A.slots);const c=ku(a),l=bu(A);return{kind:"matrix",id:n===0?"metaplot-heatmap":`metaplot-heatmap-${n+1}`,label:`${t.name} · per feature${r.zscore?", z-scored":""}`,nrows:i,ncols:A.slots,values:a,xLabel:s,yLabel:r.tracks===1?`Features, strongest first (${i.toLocaleString()})`:`Features, strongest first across ${r.tracks} tracks (${i.toLocaleString()})`,xTicks:l.labels,...l.at===void 0?{}:{xTickAt:l.at},yTicks:[],colormap:"viridis",...c===null?{}:{range:c},aspect:"fill"}}const Nt=1,kt=2,bt=4,dt=8,Su=Nt|kt|bt|dt,ta=(()=>{const t=new Uint8Array(256),e={A:Nt,C:kt,G:bt,T:dt,U:dt,R:Nt|bt,Y:kt|dt,S:bt|kt,W:Nt|dt,K:bt|dt,M:Nt|kt,B:kt|bt|dt,D:Nt|bt|dt,H:Nt|kt|dt,V:Nt|kt|bt,N:Su};for(const[n,A]of Object.entries(e))t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A;return t})(),Ru=(()=>{const t=new Uint8Array(16);for(let e=0;e<16;e++){let n=0;(e&Nt)!==0&&(n|=dt),(e&kt)!==0&&(n|=bt),(e&bt)!==0&&(n|=kt),(e&dt)!==0&&(n|=Nt),t[e]=n}return t})();function Oe(t){return!(t instanceof Uint8Array)}const Rr=200;function Ye(t){const e=t.replace(/\s+/g,"");if(e==="")return{reason:"Type a sequence to search for."};if(e.length>Rr)return{reason:`${e.length} bases is longer than this searches for (${Rr}). It looks for short motifs, so a query that long is a job for an aligner.`};const n=new Uint8Array(e.length);for(let A=0;A<e.length;A++){const s=ta[e.charCodeAt(A)]??0;if(s===0)return{reason:`“${e[A]}” is not a IUPAC base. Use A C G T U and the ambiguity codes R Y S W K M B D H V N.`};n[A]=s}return n}function ea(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=Ru[t[t.length-1-n]??0]??0;return e}function Lu(t){const e=ea(t);for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function Lr(t,e,n,A){let s=0;for(let r=0;r<e.length;r++){const o=ta[t[n+r]??0]??0,i=e[r]??0;if((o===0||(o&~i)!==0)&&(s++,s>A))return s}return s}function ys(t,e,n={}){const A=[];if(e.length===0||t.length<e.length)return{hits:A,truncated:!1};const s=n.offset??0,r=n.limit??Number.POSITIVE_INFINITY,o=Math.max(0,Math.min(e.length-1,Math.floor(n.mismatches??0))),i=n.bothStrands===!0,a=i&&Lu(e),c=i&&!a?ea(e):null,l=a?0:1,g=t.length-e.length;for(let f=0;f<=g;f++){const h=Lr(t,e,f,o);if(h<=o&&(A.push({start:f+s,end:f+e.length+s,strand:l,mismatches:h}),A.length>=r))return{hits:A,truncated:f<g};if(c!==null){const u=Lr(t,c,f,o);if(u<=o&&(A.push({start:f+s,end:f+e.length+s,strand:-1,mismatches:u}),A.length>=r))return{hits:A,truncated:f<g}}}return{hits:A,truncated:!1}}function Gu(t){return Math.max(0,t.length-1)}function xu(t){return t>0?"+":t<0?"−":"±"}function vu(t,e){const n=new et,A=e.replace(/\s+/g,"").toUpperCase();for(const s of t.hits)for(let r=0;r<s.starts.length;r++){const o=s.strands[r],i=s.mismatches?.[r];n.add(s.contig,s.starts[r],s.ends[r],{strand:o,name:`${A} ${xu(o)}`,...i===void 0?{}:{score:i,detail:`${i} ${i===1?"mismatch":"mismatches"}`}})}return n.finish()}function na(t,e,n){const A=[];let s=0;for(const i of e){const a=Math.max(1,Math.ceil(i.length/n));A.push({name:i.name,startBin:s,bins:a,length:i.length}),s+=a}const r=new Float32Array(s),o=new Map(A.map(i=>[i.name,i]));for(const i of t.hits){const a=o.get(i.contig);if(a!==void 0)for(let c=0;c<i.starts.length;c++){const l=Math.min(a.bins-1,Math.floor(i.starts[c]/n));r[a.startBin+l]+=1}}return{binsize:n,firstBin:0,values:r,contigs:A}}function Uu(t,e,n=0){const A=t.replace(/\s+/g,"").toUpperCase(),s=[...e?["both strands"]:[],...n>0?[`≤ ${n} ${n===1?"mismatch":"mismatches"}`]:[]];return s.length===0?A:`${A} (${s.join(", ")})`}const un=5e5,Tu=16e6;function $u(t){const e=t.pattern;return typeof e=="string"?e.replace(/\s+/g,"").toUpperCase():""}async function Ju(t,e,n){const A=Math.max(1,Math.min(n.limit,un)),s=n.mismatches??0,r=n.contigs??t.contigs,o=Gu(e),i=t.read?.bind(t),a=Math.max(1,Math.floor(n.piece??Tu)),c=[];let l=0,g=!1;const f=r.reduce((u,I)=>u+I.length,0);let h=0;for(const u of r){if(l>=A){g=!0;break}const I=[];let d=!1;const C=(w,y)=>{const N=A-l-I.length,k=ys(w,e,{bothStrands:n.bothStrands,limit:N+1,mismatches:s,offset:y});for(let b=0;b<Math.min(k.hits.length,N);b++)I.push(k.hits[b]);(k.truncated||k.hits.length>N)&&(d=!0)};if(i===void 0){const w=t.bases(u.name);if(w===void 0)continue;C(w,0),h+=u.length,n.progress?.(h,f,u.name)}else for(let w=0;w<u.length&&!d;w+=a){n.throwIfCancelled?.();const y=Math.min(u.length,w+a),N=await i(u.name,w,Math.min(u.length,y+o));if(N===void 0)break;C(N,w),h+=y-w,n.progress?.(h,f,u.name)}d&&(g=!0);const B=I.length;if(B===0){if(d)break;continue}const Q=new Int32Array(B),E=new Int32Array(B),m=new Int8Array(B),p=s>0?new Uint8Array(B):void 0;for(let w=0;w<B;w++){const y=I[w];Q[w]=y.start,E[w]=y.end,m[w]=y.strand,p!==void 0&&(p[w]=y.mismatches)}if(c.push({contig:u.name,starts:Q,ends:E,strands:m,...p===void 0?{}:{mismatches:p}}),l+=B,d)break}return{hits:c,total:l,truncated:g}}function Aa(t,e,n){if(e===null)return[...t.contigs];const A=new Set(e);if(n.length>0&&n.every(r=>A.has(r)))return[...t.contigs];const s=new Set;for(const r of e){const o=Kt(t.contigs,r);o>=0&&s.add(o)}return t.contigs.filter((r,o)=>s.has(o))}const Ou=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to search."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=Yn(t.params,"sequences");if(A!==null&&A.length===0)return t.note("No sequence is ticked, so there is nothing to search."),[];const s=Object.entries(t.inputs.contigLengths??{}).filter(([,B])=>B>0).map(([B])=>B),r=Aa(n,A,s);if(r.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to search."),[];const o=r.length===n.contigs.length,i=$u(t.params),a=Ye(i);if(Oe(a))return t.note(a.reason),[];const c=Lt(t.params,"bothStrands",!0),l=Math.min(un,Math.max(1,Math.round(T(t.params,"limit",un)))),g=Math.max(0,Math.min(a.length-1,Math.round(T(t.params,"mismatches",0))));t.progress(0,1,r.length===1?`searching ${r[0].name}`:`searching ${r.length.toLocaleString()} sequences`);const f=await Ju(n,a,{bothStrands:c,limit:l,mismatches:g,contigs:r,...n.read===void 0?{}:{progress:(B,Q,E)=>t.progress(B,Q,`searching ${E}`),throwIfCancelled:()=>t.throwIfCancelled()}});t.progress(1,1,"done");const h=Yu(Uu(i,c,g),r,o);if(f.total===0)return t.note(o?`No match for ${h} anywhere in this reference.`:`No match for ${h}.`),[];const u=`${f.total.toLocaleString()} site${f.total===1?"":"s"}`;t.note(f.truncated?`${u} — the search stopped at the limit of ${l.toLocaleString()} and there are more. `+(l<un?"Raise “Most sites”, or narrow the pattern.":r.length>1?"That is the most one run reports, so narrow the pattern or tick fewer sequences.":"That is the most one run reports, so narrow the pattern."):`${u}, on ${f.hits.length.toLocaleString()} ${f.hits.length===1?"sequence":"sequences"}.`);const I=`motif-${i}${c?"-both":""}${g>0?`-mm${g}`:""}`+(o?"":_u(r)),d=[Ku(f,i,h,I)],C=qu(t,f,h,I);return C!==null&&d.push(C),d};function Yu(t,e,n){return n?t:e.length<=3?`${t} on ${e.map(A=>A.name).join(", ")}`:`${t} on ${e.length.toLocaleString()} sequences`}function _u(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
16
|
+
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Ku(t,e,n,A){return{kind:"intervals",id:A,label:n,payload:{kind:"features",data:vu(t,e)},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function qu(t,e,n,A){const s=t.framing.binsize,r=Kn(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none — so there is nothing for a density to be per. Open the map and run it again for that half."),null;const o=na(e,r,s);return{kind:"profile",id:`${A}-density`,label:`${n} density`,values:o.values,extent:[0,o.values.length],binsize:s,unit:"sites"}}function Kn(t){const e=t.inputs.contigLengths;if(e===void 0)return[];const n=[];for(const[A,s]of Object.entries(e))s>0&&n.push({name:A,length:s});return n}let ce=null,An=null;function Hu(){if(ce===null||An===null){ce=new Uint32Array(256);for(let t=0;t<256;t++){const e=Ne[t];ce[t]=e<4?1<<8*e:0}An=new Uint32Array(65536);for(let t=0;t<65536;t++)An[t]=ce[t&255]+ce[t>>>8]}return[ce,An]}const Wu=63;function Ns(t,e){const n=Math.max(1,Math.round(e)),A=t.length===0?0:Math.ceil(t.length/n),s=new Int32Array(A),r=new Int32Array(A),o=new Int32Array(A),i=new Int32Array(A),[a,c]=Hu(),l=4-(t.byteOffset&3)&3,g=new Uint32Array(t.buffer,t.byteOffset+l,Math.max(0,t.length-l>>2));for(let f=0;f<A;f++){const h=f*n,u=Math.min(t.length,h+n),I=Math.min(u,h<=l?l:l+(h-l+3>>2<<2)),d=u-I>>2;let C=0;for(let y=h;y<I;y++)C+=a[t[y]];for(let y=I+4*d;y<u;y++)C+=a[t[y]];let B=C&255,Q=C>>>8&255,E=C>>>16&255,m=C>>>24,p=I-l>>2;const w=p+d;for(;p<w;){const y=Math.min(w,p+Wu);let N=0;for(;p<y;p++){const k=g[p];N+=c[k&65535]+c[k>>>16]}B+=N&255,Q+=N>>>8&255,E+=N>>>16&255,m+=N>>>24}s[f]=B,r[f]=Q,o[f]=E,i[f]=m}return{step:n,steps:A,a:s,c:r,g:o,t:i}}const sa=1<<22;function Pu(t,e=sa){const n=Math.max(1,Math.round(t));return n*Math.max(1,Math.floor(e/n))}async function zu(t,e,n=sa){const A=Math.max(1,Math.round(e)),s=Pu(A,n),r=[];let o=0;for(let l=0;;l+=s){const g=await t(l,l+s);if(g===void 0)return;if(r.push(Ns(g,A)),o+=g.length,g.length<s)break}const i=r.reduce((l,g)=>l+g.steps,0),a={step:A,steps:i,a:new Int32Array(i),c:new Int32Array(i),g:new Int32Array(i),t:new Int32Array(i)};let c=0;for(const l of r)a.a.set(l.a,c),a.c.set(l.c,c),a.g.set(l.g,c),a.t.set(l.t,c),c+=l.steps;return{counts:a,length:o}}function ra(t,e,n){const A=Math.max(0,Math.floor(Math.max(1,Math.round(e))/2)),s=t.steps;if(A===0||s===0)return t;const r=o=>{const i=new Int32Array(s),a=new Float64Array(s+1);for(let g=0;g<s;g++)a[g+1]=a[g]+o[g];const c=a[s],l=g=>{if(!n)return a[Math.max(0,Math.min(s,g))];const f=Math.floor(g/s);return f*c+a[g-f*s]};for(let g=0;g<s;g++){const f=n?g-Math.min(A,Math.floor((s-1)/2)):g-A,h=n?g+Math.min(A,Math.floor((s-1)/2))+1:g+A+1;i[g]=l(h)-l(f)}return i};return{...t,a:r(t.a),c:r(t.c),g:r(t.g),t:r(t.t)}}function Xu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n],s=A+t.a[n]+t.t[n];e[n]=s>0?A/s:Number.NaN}return e}function GA(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n];e[n]=A>0?(t.g[n]-t.c[n])/A:Number.NaN}return e}function Vu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.a[n]+t.t[n];e[n]=A>0?(t.a[n]-t.t[n])/A:Number.NaN}return e}function oa(t){const e=new Float32Array(t.length);let n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isFinite(s)&&(n+=s),e[A]=n}return e}const Zu=1e4;function ju(t){return["gc","gcSkew","atSkew","cumulative"].filter(e=>t[e]!==!1)}function tI(t){return qi(t.framing)}const Gr={gc:{name:"GC content",unit:""},gcSkew:{name:"GC skew",unit:""},atSkew:{name:"AT skew",unit:""},cumulative:{name:"Cumulative GC skew",unit:""}},eI=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=ju(t.params);if(A.length===0)return t.note("No track was ticked, so there is nothing to make."),[];const s=T(t.params,"resolution",0),r=s>0?Math.round(s):t.framing.binsize>0&&!tI(t)?t.framing.binsize:Zu,o=Kn(t);if(o.length===0)return t.note("There are no sequences to lay the bins out on. Open a map, or load the FASTA itself."),[];const i=Math.max(0,Math.round(T(t.params,"window",0))),a=Math.max(1,Math.round(i/r)),c=a%2===1?a:a+1,l=new Set(t.framing.circular??[]),g=o.reduce((E,m)=>E+Math.max(1,Math.ceil(m.length/r)),0),f={gc:new Float32Array(g).fill(Number.NaN),gcSkew:new Float32Array(g).fill(Number.NaN),atSkew:new Float32Array(g).fill(Number.NaN),cumulative:new Float32Array(g).fill(Number.NaN)},{read:h}=n,u=[],I=[];let d=0;for(let E=0;E<o.length;E++){const m=o[E],p=Math.max(1,Math.ceil(m.length/r));t.progress(E,o.length,m.name);let w;if(h!==void 0)w=await zu((M,F)=>(t.throwIfCancelled(),h(m.name,M,F)),r);else{const M=n.bases(m.name);w=M===void 0?void 0:{counts:Ns(M,r),length:M.length}}if(w===void 0){u.push(m.name),d+=p;continue}w.length!==m.length&&I.push(m.name);const{counts:y}=w,N=c>1?ra(y,c,l.has(m.name)):y,k={gc:Xu(N),gcSkew:GA(N),atSkew:Vu(N),cumulative:oa(GA(y))},b=Math.min(p,y.steps);for(const M of A)f[M].set(k[M].subarray(0,b),d);d+=p}if(t.progress(o.length,o.length,"done"),u.length===o.length)return t.note("The reference has none of the map’s sequences under any name this viewer knows, so nothing could be measured."),[];u.length>0&&t.note(`${u.length.toLocaleString()} of the map’s sequences are not in this reference and are gaps on every track: ${u.slice(0,6).join(", ")}${u.length>6?", …":""}.`),I.length>0&&t.note(`${I.slice(0,6).join(", ")}${I.length>6?", …":""} ${I.length===1?"is":"are"} not the length the map says — the reference may be another assembly version. Bins were read from its start.`),c>1&&t.note(`Each bin was read over ${c} bins (${(c*r).toLocaleString()} bp) centred on it; the cumulative skew sums each bin’s own.`);const C=t.inputs.labels?.[e]??"reference",B=c>1?` · ${(c*r).toLocaleString()} bp window`:"";return A.map(E=>({kind:"profile",id:`composition-${E.toLowerCase()}`,label:`${Gr[E].name} · ${C}${E==="cumulative"?"":B}`,values:f[E],extent:[0,g],binsize:r,unit:Gr[E].unit}))},_e=19,ia=50,nI=2e6,AI=5e3,sI=500,rI=10;function xr(t){const e=[0];for(const n of t)e.push(e[e.length-1]+n.length);return{names:t.map(n=>n.name),lengths:t.map(n=>n.length),offsets:e}}function oI(t,e=nI){return Math.max(1,Math.ceil(2*t/e-1))}const iI=(()=>{const t=new Int8Array(256).fill(-1);for(const[e,n]of[["A",0],["C",1],["G",2],["T",3]])t[e.charCodeAt(0)]=n,t[e.toLowerCase().charCodeAt(0)]=n;return t})();function aI(t){const e=t>>>0,n=Math.floor(t/4294967296)>>>0;let A=Math.imul(e^Math.imul(n,2654435761),2246822507);return A^=A>>>13,A=Math.imul(A,3266489909),A^=A>>>16,A>>>0}class cI{hash=new Uint32Array(1024);position=new Uint32Array(1024);strand=new Int8Array(1024);count=0;push(e,n,A){if(this.count===this.hash.length){const s=this.hash.length*2,r=new Uint32Array(s);r.set(this.hash),this.hash=r;const o=new Uint32Array(s);o.set(this.position),this.position=o;const i=new Int8Array(s);i.set(this.strand),this.strand=i}this.hash[this.count]=e,this.position[this.count]=n,this.strand[this.count]=A,this.count++}finish(){return{hash:this.hash.slice(0,this.count),position:this.position.slice(0,this.count),strand:this.strand.slice(0,this.count),count:this.count}}}function vr(t,e,n,A=_e){const s=new cI,r=4**(A-1),o=new Float64Array(n+1),i=new Float64Array(n+1),a=new Int8Array(n+1);for(let c=0;c<t.names.length;c++){const l=e(t.names[c]);if(l===void 0)continue;const g=t.offsets[c];let f=0,h=0,u=0,I=0,d=0,C=-1,B=0;const Q=o.length;for(let E=0;E<l.length;E++){const m=iI[l[E]];if(m<0){u=0,d=0,B=0;continue}if(f=f%r*4+m,h=Math.floor(h/4)+(3-m)*r,u++,u<A)continue;const p=E-A+1;if(B++,f===h)continue;const w=f<h?1:-1,y=aI(f<h?f:h);for(;d>0&&o[(I+d-1)%Q]>=y;)d--;for(o[(I+d)%Q]=y,i[(I+d)%Q]=p,a[(I+d)%Q]=w,d++;d>0&&i[I]<=p-n;)I=(I+1)%Q,d--;if(B<n)continue;const N=i[I];N!==C&&(s.push(o[I],g+N,a[I]),C=N)}}return s.finish()}function Fn(t,e=t.length,n){let A=new Uint32Array(e);if(n===void 0)for(let o=0;o<e;o++)A[o]=o;else A.set(n.subarray(0,e));let s=new Uint32Array(e);const r=new Uint32Array(65537);for(const o of[0,16]){r.fill(0);for(let i=0;i<e;i++)r[(t[A[i]]>>>o&65535)+1]++;for(let i=0;i<65536;i++)r[i+1]+=r[i];for(let i=0;i<e;i++)s[r[t[A[i]]>>>o&65535]++]=A[i];[A,s]=[s,A]}return A}function lI(t,e,n=ia){const A=Fn(t.hash,t.count),s=Fn(e.hash,e.count);let r=new Uint32Array(1024),o=new Uint32Array(1024),i=new Int8Array(1024),a=0,c=0,l=0,g=0;for(;l<t.count&&g<e.count;){const f=t.hash[A[l]],h=e.hash[s[g]];if(f<h){l++;continue}if(h<f){g++;continue}let u=l;for(;u<t.count&&t.hash[A[u]]===f;)u++;let I=g;for(;I<e.count&&e.hash[s[I]]===h;)I++;if(u-l>n||I-g>n)c++;else for(let d=l;d<u;d++)for(let C=g;C<I;C++){if(a===r.length){const B=r.length*2,Q=new Uint32Array(B);Q.set(r),r=Q;const E=new Uint32Array(B);E.set(o),o=E;const m=new Int8Array(B);m.set(i),i=m}r[a]=t.position[A[d]],o[a]=e.position[s[C]],i[a]=t.strand[A[d]]===e.strand[s[C]]?1:-1,a++}l=u,g=I}return{x:r.slice(0,a),y:o.slice(0,a),strand:i.slice(0,a),count:a,dropped:c}}function gI(t,e=AI,n=sI,A=rI,s){const r=[];s?.fill(-1);let o=0;for(let a=0;a<t.count;a++)t.y[a]>o&&(o=t.y[a]);for(const a of[1,-1]){let c=0;for(let Q=0;Q<t.count;Q++)t.strand[Q]===a&&c++;const l=new Uint32Array(c),g=new Uint32Array(c),f=new Uint32Array(c),h=Math.ceil(o/n)+1;for(let Q=0,E=0;Q<t.count;Q++)t.strand[Q]===a&&(l[E]=Q,g[E]=t.x[Q],f[E]=a===1?Math.round((t.x[Q]-t.y[Q])/n)+h:Math.round((t.x[Q]+t.y[Q])/n),E++);const u=Fn(f,c,Fn(g,c)),I=new Uint32Array(c),d=new Uint32Array(c);for(let Q=0;Q<c;Q++)I[Q]=l[u[Q]],d[Q]=f[u[Q]];let C=0;const B=Q=>{const E=Q-C;if(E>=A){let m=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY,w=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;for(let N=C;N<Q;N++){const k=I[N];m=Math.min(m,t.x[k]),p=Math.max(p,t.x[k]+_e),w=Math.min(w,t.y[k]),y=Math.max(y,t.y[k]+_e)}if(s!==void 0)for(let N=C;N<Q;N++)s[I[N]]=r.length;r.push({x0:m,x1:p,y0:w,y1:y,strand:a,anchors:E})}C=Q};for(let Q=1;Q<=I.length;Q++){if(Q===I.length){B(Q);break}const E=I[Q-1],m=I[Q];(d[Q-1]!==d[Q]||t.x[m]-t.x[E]>e)&&B(Q)}}const i=r.map((a,c)=>c).sort((a,c)=>r[a].x0-r[c].x0||r[a].y0-r[c].y0);if(s!==void 0){const a=new Int32Array(r.length);i.forEach((c,l)=>a[c]=l);for(let c=0;c<t.count;c++)s[c]>=0&&(s[c]=a[s[c]])}return i.map(a=>r[a])}const fI=100,hI=4e5;function uI(t,e,n){const A=e.offsets[e.offsets.length-1],s=n.offsets[n.offsets.length-1],r=Math.max(fI,Math.ceil(Math.max(A,s)/hI)),o=new Uint8Array(Math.ceil(A/r)+1),i=new Uint8Array(Math.ceil(s/r)+1),a=(h,u)=>{const I=Math.floor(h/r);return[I,Math.max(I+1,Math.ceil(u/r))]},c=(h,u,I)=>{const[d,C]=a(u,I);let B=0;for(let Q=d;Q<C;Q++)B+=h[Q];return B/(C-d)},l=(h,u,I)=>{const[d,C]=a(u,I);h.fill(1,d,C)},g=new Uint8Array(t.length),f=t.map((h,u)=>u).sort((h,u)=>t[u].anchors-t[h].anchors||h-u);for(const h of f){const u=t[h];c(o,u.x0,u.x1)>.5||c(i,u.y0,u.y1)>.5||(g[h]=1,l(o,u.x0,u.x1),l(i,u.y0,u.y1))}return g}function II(t,e,n,A,s){const r=e.offsets[e.offsets.length-1],o=n.offsets[n.offsets.length-1],i=Math.max(1,Math.ceil(Math.max(r,o)/Math.max(1,A))),a=Math.max(1,Math.ceil(r/i)),c=Math.max(1,Math.ceil(o/i)),l=new Float32Array(a*c);for(let g=0;g<t.count;g++){if(s!==void 0&&s[g]!==1)continue;const f=Math.min(a-1,Math.floor(t.x[g]/i)),h=Math.min(c-1,Math.floor(t.y[g]/i));l[h*a+f]+=t.strand[g]}return{values:l,ncols:a,nrows:c,cellSize:i}}function Ur(t,e){let n=0,A=t.names.length-1;for(;n<A;){const s=n+A+1>>1;t.offsets[s]<=e?n=s:A=s-1}return{sequence:n,at:e-t.offsets[n]}}const Tr=400;function dI(t,e,n,A,s){const r=t.length,o={x:{label:A,names:[...e.names],lengths:[...e.lengths]},y:{label:s,names:[...n.names],lengths:[...n.lengths]},x0:new Float64Array(r),x1:new Float64Array(r),y0:new Float64Array(r),y1:new Float64Array(r),strand:new Int8Array(r),anchors:new Int32Array(r)};return t.forEach((i,a)=>{o.x0[a]=i.x0,o.x1[a]=i.x1,o.y0[a]=i.y0,o.y1[a]=i.y1,o.strand[a]=i.strand,o.anchors[a]=i.anchors}),o}function $r(t,e){return t.names.map((n,A)=>({label:n,from:t.offsets[A]/e,to:t.offsets[A+1]/e}))}const CI=async t=>{const e=at(t.params,"x"),n=at(t.params,"y");if(t.residues===void 0)return t.note("This session cannot read residues, so there is nothing to set against anything."),[];if(e===null||n===null)return t.note("Choose the two sequence sets: one along x, one along y."),[];const A=t.residues(e),s=t.residues(n);if(A===void 0||s===void 0)return t.note("A sequence set chosen is no longer loaded. Drop the FASTA again, or pick another."),[];for(const S of[A,s])if(S.refusal!==void 0)return t.note(S.refusal),[];const r=xr(A.contigs),o=xr(s.contigs),i=r.offsets[r.offsets.length-1],a=oI(i);t.progress(0,4,"minimizers along x");const c=vr(r,S=>A.bases(S),a);t.throwIfCancelled(),t.progress(1,4,"minimizers along y");const l=vr(o,S=>s.bases(S),a);t.throwIfCancelled(),t.progress(2,4,"anchors");const g=lI(c,l);t.throwIfCancelled(),t.progress(3,4,"streaks");const f=new Int32Array(g.count),h=gI(g,void 0,void 0,void 0,f),u=e===n,I=!u&&st(t.params,"streaks","one to one")==="one to one",d=I?uI(h,r,o):new Uint8Array(h.length).fill(1),C=h.filter((S,v)=>d[v]===1),B=new Uint8Array(g.count);for(let S=0;S<g.count;S++)f[S]>=0&&d[f[S]]===1&&(B[S]=1);const Q=Math.round(T(t.params,"cells",Tr)),E=II(g,r,o,Q>0?Q:Tr,B);t.progress(4,4);const m=c.count>0?Math.round(i/c.count):0,p=h.length-C.length;t.note(`Exact ${_e}-mers, one in about ${m.toLocaleString("en-US")} bases; hashes above ${ia} copies on either side dropped (${g.dropped.toLocaleString("en-US")} of them). ${g.count.toLocaleString("en-US")} anchors, ${h.length.toLocaleString("en-US")} streaks`+(I?`, ${C.length.toLocaleString("en-US")} of them one to one — ${p.toLocaleString("en-US")} a stronger streak had taken the stretch of`:"")+(u?", every one drawn, the set against itself":"")+`. Not an alignment, and it writes none: a streak is ten or more shared ${_e}-mers along one diagonal.`);const w=[];for(const S of E.values)Math.abs(S)>=3&&w.push(Math.abs(S));w.sort((S,v)=>S-v);const y=w.length===0?3:Math.max(3,w[Math.floor(.5*(w.length-1))]),N={kind:"matrix",id:"dotplot-density",label:I?"Streaks one to one, the same way round (red) and the other (blue)":"Streaks, the same way round (red) and the other (blue)",nrows:E.nrows,ncols:E.ncols,values:E.values,xLabel:"along x",yLabel:"along y",xTicks:[],yTicks:[],colormap:"RdBu_r",centre:0,range:[-y,y],xSegments:$r(r,E.cellSize),ySegments:$r(o,E.cellSize),stats:[{label:"anchors",value:g.count},{label:I?"streaks one to one":"streaks",value:C.length},{label:"bases a cell",value:E.cellSize}],large:!0,streaks:dI(C,r,o,t.inputs.labels?.[e]??"along x",t.inputs.labels?.[n]??"along y")},k=C.map(S=>{const v=Ur(r,S.x0),G=Ur(o,S.y0);return{xSequence:r.names[v.sequence],xStart:v.at,xEnd:v.at+(S.x1-S.x0),ySequence:o.names[G.sequence],yStart:G.at,yEnd:G.at+(S.y1-S.y0),strand:S.strand===1?"+":"-",anchors:S.anchors}}),b={kind:"table",id:"dotplot-streaks",label:"Streaks",columns:[{key:"xSequence",label:"x sequence",kind:"text"},{key:"xStart",label:"x start",kind:"number",coordinate:"start"},{key:"xEnd",label:"x end",kind:"number",coordinate:"end"},{key:"ySequence",label:"y sequence",kind:"text"},{key:"yStart",label:"y start",kind:"number",coordinate:"start"},{key:"yEnd",label:"y end",kind:"number",coordinate:"end"},{key:"strand",label:"strand",kind:"text",hint:"+ the same way round, − the other"},{key:"anchors",label:"anchors",kind:"number"}],rows:k},M=new $n;for(const S of k)M.add(S.xSequence,S.xStart,S.xEnd,S.ySequence,S.yStart,S.yEnd,{score:S.anchors,name:S.strand==="+"?"same way round":"the other way round",detail:`${S.anchors} anchors`});const F={kind:"intervals",id:"dotplot-pairs",label:"Streaks, as pairs",payload:{kind:"pairs",data:M.finish()},noun:{one:"streak",many:"streaks"},display:"overlay"};return[N,b,F]};function xA(t,e,n,A){const s=Math.abs(t-e);return A&&n>0?Math.min(s,n-s%n):s}function QI(t,e,n){if(t.length===0)return Number.NaN;if(!n||!(e>0)){let i=0;for(const a of t)i+=a;return i/t.length}let A=0,s=0;for(const i of t){const a=2*Math.PI*i/e;A+=Math.sin(a),s+=Math.cos(a)}const o=(Math.atan2(A,s)/(2*Math.PI)*e%e+e)%e;return o>=e?0:o}function Jr(t,e,n,A){if(t.length===0)return null;let s=-1,r=0;for(let i=0;i<t.length;i++){let a=0;for(const c of t)xA(t[i],c,e,n)<=A&&a++;a>r&&(r=a,s=i)}const o=t.filter(i=>xA(t[s],i,e,n)<=A);return{centre:QI(o,e,n),count:o.length}}function BI(t,e,n){let A=-1,s=-1;for(let o=0;o<t.length;o++){const i=t[o];Number.isFinite(i)&&((A<0||i<t[A])&&(A=o),(s<0||i>t[s])&&(s=o))}const r=o=>o<0?Number.NaN:Math.min(n-1,Math.floor(o*e+e/2));return{low:r(A),high:r(s)}}const EI=10;function mI(t){const{length:e,circular:n,low:A,high:s}=t,r=e/8,o=Jr(t.matS,e,n,r),i=Jr(t.parS,e,n,r),a=t.minMatS??EI,c=(h,u)=>xA(h,u,e,n);let l=s,g="skew";if(o!==null&&t.matS.length>=a)l=c(A,o.centre)<c(s,o.centre)?A:s,g="matS";else if(i!==null)l=c(A,i.centre)>c(s,i.centre)?A:s,g="parS";else if(t.coverageAt!==void 0){const h=t.coverageAt(A),u=t.coverageAt(s);Number.isFinite(h)&&Number.isFinite(u)&&h!==u&&(l=h<u?A:s,g="coverage")}return{ori:l===s?A:s,ter:l,rule:g,agreesWithSkew:l===s,matS:o,parS:i}}function wI(t,e,n,A,s){const r=Math.max(s?3:1,Math.round(A)),o=s?r:r+3,i=n>0?r/n:0,a=Q=>{let E=Q*i;s||(E=Math.max(0,Math.min(r-1e-9,E)));const m=Math.floor(E),p=E-m,w=[(1-p)**3/6,(3*p**3-6*p**2+4)/6,(-3*p**3+3*p**2+3*p+1)/6,p**3/6];return{first:s?m-1:m,w}},c=Q=>s?(Q%o+o)%o:Q,l=new Float64Array(o*o),g=new Float64Array(o);let f=0;for(let Q=0;Q<t.length;Q++){const E=e[Q];if(!Number.isFinite(E))continue;f++;const{first:m,w:p}=a(t[Q]);for(let w=0;w<4;w++){const y=c(m+w);g[y]+=p[w]*E;for(let N=0;N<4;N++)l[y*o+c(m+N)]+=p[w]*p[N]}}let h=0,u=0;for(let Q=0;Q<e.length;Q++)Number.isFinite(e[Q])&&(h+=e[Q],u++);h=u>0?h/u:0;const I=1e-6*Math.max(1,f/o);for(let Q=0;Q<o;Q++)l[Q*o+Q]+=I,g[Q]+=I*h;const d=pI(l,g,o),C=Q=>{if(d===null)return Number.NaN;const{first:E,w:m}=a(Q);let p=0;for(let w=0;w<4;w++)p+=m[w]*d[c(E+w)];return p},B=new Float64Array(t.length);for(let Q=0;Q<t.length;Q++)B[Q]=C(t[Q]);return{fitted:B,at:C}}function pI(t,e,n){const A=Float64Array.from(t),s=Float64Array.from(e);for(let o=0;o<n;o++){let i=o;for(let a=o+1;a<n;a++)Math.abs(A[a*n+o])>Math.abs(A[i*n+o])&&(i=a);if(Math.abs(A[i*n+o])<1e-300)return null;if(i!==o){for(let c=0;c<n;c++){const l=A[o*n+c];A[o*n+c]=A[i*n+c],A[i*n+c]=l}const a=s[o];s[o]=s[i],s[i]=a}for(let a=o+1;a<n;a++){const c=A[a*n+o]/A[o*n+o];if(c!==0){for(let l=o;l<n;l++)A[a*n+l]-=c*A[o*n+l];s[a]-=c*s[o]}}}const r=new Float64Array(n);for(let o=n-1;o>=0;o--){let i=s[o];for(let a=o+1;a<n;a++)i-=A[o*n+a]*r[a];r[o]=i/A[o*n+o]}return r}function yI(t){let e=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY;for(const s of t)Number.isFinite(s)&&(s>e&&(e=s),s<n&&(n=s));return{ratio:n>0&&Number.isFinite(e)?e/n:Number.NaN,highest:e,lowest:n}}const NI="TGTTNCACGTGNAACA",kI="GTGACRNYGTCAC";function bI(t,e){const n=t[e];return n==null?e==="parS"?NI:kI:typeof n=="string"?n.replace(/\s+/g,"").toUpperCase():""}const MI=5e3,cA={matS:"nearest the matS cluster",parS:"farthest from the parS cluster",coverage:"lower coverage",skew:"skew maximum"};function Or(t,e,n){const A={mids:[],starts:[],ends:[],strands:[],mismatches:[]};if(e===null)return A;for(const s of ys(t,e,{bothStrands:!0,mismatches:n}).hits)A.mids.push((s.start+s.end)/2),A.starts.push(s.start),A.ends.push(s.end),A.strands.push(s.strand),A.mismatches.push(s.mismatches);return A}const DI=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load the genome’s FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.refusal!==void 0)return t.note(n.refusal),[];const A={parS:{motif:null,pattern:"",mismatches:0},matS:{motif:null,pattern:"",mismatches:0}};for(const N of["parS","matS"]){const k=bI(t.params,N);if(k==="")continue;const b=Ye(k);if(Oe(b)){t.note(`${N}: ${b.reason} Its step was skipped.`);continue}const M=Math.round(T(t.params,`${N}Mismatches`,N==="parS"?1:0));A[N]={motif:b,pattern:k,mismatches:Math.max(0,Math.min(b.length-1,M))}}const s=Math.max(100,Math.round(T(t.params,"window",5e3))),r=Math.max(10,Math.min(s,Math.round(T(t.params,"step",1e3)))),o=Math.max(4,Math.min(40,Math.round(T(t.params,"knots",10)))),i=at(t.params,"coverage"),a=new Set(t.framing.circular??[]),c=Kn(t),l=c.length>0?c.map(N=>N.name):n.contigs.map(N=>N.name),g=Yn(t.params,"sequences"),f=g===null?l:l.filter(N=>g.includes(N));if(f.length===0)return t.note("No sequence is ticked, so there is nothing to read."),[];const h=new et,u=new et,I=new et;let d=0,C=0;const B=[],Q=new Map,E=[];for(let N=0;N<f.length;N++){const k=f[N];t.progress(N,f.length,k);const b=n.bases(k);if(b===void 0){E.push(k);continue}const M=b.length;if(M<4*s){E.push(k);continue}const F=a.has(k),S=Ns(b,r),v=GA(ra(S,Math.max(1,Math.round(s/r)),F)),G=BI(oa(v),r,M);if(!Number.isFinite(G.low)||!Number.isFinite(G.high)){E.push(k);continue}const O=Or(b,A.parS.motif,A.parS.mismatches),$=Or(b,A.matS.motif,A.matS.mismatches);let K,V=Number.NaN;if(i!==null){const L=(await t.sample(i,[{contig:k,start:0,end:M}],MI)).regions[0];if(L!==void 0&&L.values.length>3){const J=new Float64Array(L.values.length),Mt=new Float64Array(L.values.length);for(let P=0;P<L.values.length;P++)J[P]=(L.starts[P]+L.ends[P])/2,Mt[P]=L.values[P];const vt=wI(J,Mt,M,o,F);K=vt.at,Q.set(k,vt.at),V=yI(vt.fitted).ratio}}const H=mI({length:M,circular:F,low:G.low,high:G.high,parS:O.mids,matS:$.mids,...K===void 0?{}:{coverageAt:K}}),ht=Math.floor(s/2),xt=`${cA[H.rule]}${H.agreesWithSkew?"":" · disagrees with the skew"}`;for(const[q,L]of[["ori",H.ori],["ter",H.ter]])h.add(k,Math.max(0,L-ht),Math.min(M,L+ht),{name:q,detail:q==="ter"?`terminus · ${xt}`:"origin"});for(let q=0;q<O.starts.length;q++)u.add(k,O.starts[q],O.ends[q],{strand:O.strands[q],name:"parS",score:O.mismatches[q],detail:`${O.mismatches[q]} ${O.mismatches[q]===1?"mismatch":"mismatches"}`});for(let q=0;q<$.starts.length;q++)I.add(k,$.starts[q],$.ends[q],{strand:$.strands[q],name:"matS",score:$.mismatches[q],detail:`${$.mismatches[q]} ${$.mismatches[q]===1?"mismatch":"mismatches"}`});d+=O.starts.length,C+=$.starts.length,H.agreesWithSkew||t.note(`${k}: the terminus was placed ${cA[H.rule]}, at the cumulative skew’s minimum — which is where the skew alone would put the origin. Check the assembly, or the motifs.`),B.push({sequence:k,length:M,topology:F?"circular":"linear",ori:H.ori+1,ter:H.ter+1,rule:cA[H.rule],parS:O.starts.length,parSCluster:H.parS?.count??0,matS:$.starts.length,ratio:V})}if(t.progress(f.length,f.length,"done"),E.length>0&&t.note(`${E.length.toLocaleString()} ${E.length===1?"sequence was":"sequences were"} not placed — not in the reference, or shorter than four skew windows: ${E.slice(0,6).join(", ")}${E.length>6?", …":""}.`),B.length===0)return[];i===null&&t.note("No coverage track was chosen, so there is no ori/ter ratio and no coverage step.");const m=B.filter(N=>N.topology==="linear").length;m>0&&t.note(`${m.toLocaleString()} ${m===1?"sequence was":"sequences were"} read as linear. A bacterial chromosome is usually circular — tick it in the Chromosomes table and run this again, or the origin at its first base is split between its two ends.`);const w=[{kind:"intervals",id:"oriter-loci",label:`Origin and terminus · ${t.inputs.labels?.[e]??"reference"}`,payload:{kind:"features",data:h.finish()},noun:{one:"locus",many:"loci"},display:"lane",look:"point"}];d>0&&w.push({kind:"intervals",id:"oriter-pars",label:`parS sites · ${A.parS.pattern}`,payload:{kind:"features",data:u.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"}),C>0&&w.push({kind:"intervals",id:"oriter-mats",label:`matS sites · ${A.matS.pattern}`,payload:{kind:"features",data:I.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"});const y=t.framing.binsize;if(Q.size>0&&y>0&&c.length>0){const N=c.reduce((F,S)=>F+Math.max(1,Math.ceil(S.length/y)),0),k=new Float32Array(N).fill(Number.NaN);let b=0;for(const F of c){const S=Math.max(1,Math.ceil(F.length/y)),v=Q.get(F.name);if(v!==void 0)for(let G=0;G<S;G++)k[b+G]=v(Math.min(F.length-1,(G+.5)*y));b+=S}const M=t.inputs.labels?.[i??""]??"coverage";w.push({kind:"profile",id:"oriter-coverage-fit",label:`${M} · spline fit`,values:k,extent:[0,N],binsize:y,unit:""})}return w.push({kind:"table",id:"oriter-table",label:"Origin and terminus per sequence",columns:[{key:"sequence",label:"sequence",kind:"text"},{key:"length",label:"length",kind:"number"},{key:"topology",label:"read as",kind:"text"},{key:"ori",label:"ori",kind:"number",hint:"Centre of the origin locus, 1-based."},{key:"ter",label:"ter",kind:"number",hint:"Centre of the terminus locus, 1-based."},{key:"rule",label:"terminus placed by",kind:"text"},{key:"parS",label:"parS",kind:"number",hint:"Sites found on this sequence."},{key:"parSCluster",label:"in cluster",kind:"number",hint:"parS sites within an eighth of the sequence of the densest one."},{key:"matS",label:"matS",kind:"number",hint:"Sites found on this sequence."},{key:"ratio",label:"ori/ter",kind:"number",digits:2,hint:"Highest over lowest smoothed coverage: copies of the origin per copy of the terminus."}],rows:B}),w};function vA(t,e,n){const A=t.contigs.indexOf(e);if(A<0)return[];const s=[];for(let r=t.contigAt[A];r<t.contigAt[A+1];r++){const o=t.start[r],i=t.end[r];if(i<=o)continue;const a=s[s.length-1];a!==void 0&&o<=a[1]?a[1]=Math.max(a[1],i):s.push([o,i])}return s}function Yr(t){let e=0;for(const[n,A]of t)e+=A-n;return e}function FI(t,e){let n=0,A=0,s=0;for(;A<t.length&&s<e.length;){const r=Math.max(t[A][0],e[s][0]),o=Math.min(t[A][1],e[s][1]);o>r&&(n+=o-r),t[A][1]<e[s][1]?A++:s++}return n}function _r(t,e,n,A){const s=t.contigs.indexOf(e);if(s<0||n.length===0)return 0;let r=0,o=0;for(let i=t.contigAt[s];i<t.contigAt[s+1];i++){const a=t.start[i],c=t.end[i],l=c-a;if(l<=0)continue;for(;o<n.length&&n[o][1]<=a;)o++;let g=0;for(let f=o;f<n.length&&n[f][0]<c;f++)g+=Math.max(0,Math.min(c,n[f][1])-Math.max(a,n[f][0]));g/l>=A&&g>0&&r++}return r}function aa(t,e,n){const A=new Set([...t.contigs,...e.contigs]);let s=0,r=0,o=0,i=0,a=0;for(const l of A){const g=vA(t,l,n.minFraction),f=vA(e,l,n.minFraction);s+=Yr(g),r+=Yr(f),o+=FI(g,f),i+=_r(t,l,f,n.minFraction),a+=_r(e,l,g,n.minFraction)}const c=s+r-o;return{basesA:s,basesB:r,intersection:o,union:c,jaccard:c>0?o/c:Number.NaN,featuresAHit:i,featuresBHit:a,featuresA:t.length,featuresB:e.length}}function SI(t,e,n,A,s){let r=0,o=0,i=0,a=0,c=0,l=Number.NaN,g=Number.NaN;const f=()=>{if(!Number.isNaN(l)){for(o+=g-l;c<A.length&&A[c][1]<=l;)c++;for(let h=c;h<A.length&&A[h][0]<g;h++)r+=Math.min(g,A[h][1])-Math.max(l,A[h][0])}};for(let h=0;h<n.length;h++){const u=n[h],I=t[u],d=I+e[u];for(;a<A.length&&A[a][1]<=I;)a++;let C=0;for(let Q=a;Q<A.length&&A[Q][0]<d;Q++)C+=Math.max(0,Math.min(d,A[Q][1])-Math.max(I,A[Q][0]));const B=d-I;B>0&&C>0&&C/B>=s&&i++,Number.isNaN(l)?(l=I,g=d):I<=g?g=Math.max(g,d):(f(),l=I,g=d)}return f(),{intersection:r,covered:o,hits:i}}function lA(t,e){const n=e.length;let A=0;for(let c=0;c<n;c++)A+=e[c];const s=n>0?A/n:Number.NaN;let r=0;for(let c=0;c<n;c++)r+=(e[c]-s)**2;const o=n>1?Math.sqrt(r/(n-1)):Number.NaN;let i=0,a=0;for(let c=0;c<n;c++)e[c]>=t&&i++,e[c]<=t&&a++;return{observed:t,mean:s,sd:o,z:o>0?(t-s)/o:Number.NaN,fold:s>0?t/s:Number.NaN,pEnriched:(i+1)/(n+1),pDepleted:(a+1)/(n+1)}}function RI(t,e,n){const A=aa(t,e,{minFraction:n.minFraction}),s=[],r=[],o=[];for(const I of t.contigs){const d=t.contigs.indexOf(I),C=[];let B=0;for(let m=t.contigAt[d];m<t.contigAt[d+1];m++){const p=t.end[m]-t.start[m];p<=0||(C.push(p),B=Math.max(B,t.end[m]))}if(C.length===0)continue;let E=n.lengthOf(I);if(E===void 0||E<=0){const m=e.contigs.indexOf(I);let p=B;if(m>=0)for(let w=e.contigAt[m];w<e.contigAt[m+1];w++)p=Math.max(p,e.end[w]);E=p,r.push(I)}if(!Number.isFinite(E)||E<=0){o.push(I);continue}s.push({contig:I,length:E,lengths:C,runs:vA(e,I)})}if(s.length===0)return null;const i=Math.max(1,Math.trunc(n.iterations)),a=ji(n.seed),c=new Float64Array(i),l=new Float64Array(i),g=new Float64Array(i);let f=0;for(const I of s)f=Math.max(f,I.lengths.length);const h=new Float64Array(f),u=new Int32Array(f);for(let I=0;I<i;I++){if(n.cancelled?.()===!0)return null;let d=0,C=0,B=0;for(const E of s){const m=E.lengths.length;for(let y=0;y<m;y++){const N=Math.max(0,E.length-E.lengths[y]);h[y]=Math.floor(a()*(N+1)),u[y]=y}const p=u.subarray(0,m);p.sort((y,N)=>h[y]-h[N]);const w=SI(h,E.lengths,p,E.runs,n.minFraction);d+=w.intersection,C+=w.covered,B+=w.hits}l[I]=d,g[I]=B;const Q=C+A.basesB-d;c[I]=Q>0?d/Q:Number.NaN,n.onProgress?.(I+1,i)}return{iterations:i,jaccard:lA(A.jaccard,c),intersection:lA(A.intersection,l),featuresHit:lA(A.featuresAHit,g),assumedLengths:r,droppedContigs:o}}const LI=async t=>{const e=ne(t.inputs.features,t.params,"a"),n=ne(t.inputs.features,t.params,"b"),A=e.value,s=n.value;if(A===void 0||s===void 0){const u=[e,n].filter(d=>d.value===void 0),I=u.filter(d=>d.chosen).length;return t.note(I===u.length?`The interval ${u.length===2?"sets":"set"} chosen ${u.length===2?"are":"is"} no longer loaded. Re-open the file, or pick another.`:`Two interval sets are needed and ${u.length===2&&I===0?"neither has":"one has not"} been chosen. Load two BED files, or a BED and a GTF, and pick one in each box.`),[]}t.progress(0,1,"comparing");const r=aa(A,s,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6)))});t.progress(1,1,"done"),Number.isFinite(r.jaccard)||t.note("Neither set covers any bases, so there is nothing to compare.");const i=[{kind:"table",id:"overlap",label:"Overlap",columns:[{key:"measure",label:"Measure",kind:"text"},{key:"value",label:"Value",kind:"number",digits:4},{key:"note",label:"Note",kind:"text"}],rows:[{measure:"Jaccard (bases)",value:r.jaccard,note:"Symmetric; 1 is identical."},{measure:"Shared bases",value:r.intersection,note:""},{measure:"Bases in either",value:r.union,note:""},{measure:"Bases in the first",value:r.basesA,note:"After merging its own overlaps."},{measure:"Bases in the second",value:r.basesB,note:"After merging its own overlaps."},{measure:"First set hit",value:r.featuresA===0?Number.NaN:r.featuresAHit/r.featuresA,note:`${r.featuresAHit.toLocaleString()} of ${r.featuresA.toLocaleString()} features.`},{measure:"Second set hit",value:r.featuresB===0?Number.NaN:r.featuresBHit/r.featuresB,note:`${r.featuresBHit.toLocaleString()} of ${r.featuresB.toLocaleString()} features.`}]}];if(!Lt(t.params,"shuffle",!1))return i;const a=st(t.params,"shuffleWhich","a")!=="b",c=Math.max(20,Math.trunc(T(t.params,"iterations",1e3)));t.progress(0,c,"shuffling");const l=RI(a?A:s,a?s:A,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6))),iterations:c,seed:T(t.params,"seed",1),lengthOf:u=>t.lengthOf(u),cancelled:()=>t.cancelled(),onProgress:(u,I)=>t.progress(u,I,"shuffling")});if(t.throwIfCancelled(),l===null)return t.note("The set chosen to move occupies no sequence this session knows a length for, so there was nothing to shuffle it within. Load the assembly — a chrom.sizes, or the map itself."),i;l.assumedLengths.length>0&&t.note(`${l.assumedLengths.length.toLocaleString()} sequence${l.assumedLengths.length===1?" has":"s have"} no known length, so the null was drawn over the furthest position either set reaches there — which is shorter than the sequence and overstates the enrichment. ${l.assumedLengths.slice(0,6).join(", ")}${l.assumedLengths.length>6?", …":""}.`),l.droppedContigs.length>0&&t.note(`${l.droppedContigs.length.toLocaleString()} sequence${l.droppedContigs.length===1?"":"s"} could not be shuffled at all and ${l.droppedContigs.length===1?"is":"are"} left out of the null: ${l.droppedContigs.slice(0,6).join(", ")}${l.droppedContigs.length>6?", …":""}.`);const g=a?"first":"second",f=(u,I,d)=>({measure:u,observed:I.observed,expected:I.mean,fold:I.fold,z:I.z,p:I.observed>=I.mean?I.pEnriched:I.pDepleted,tail:I.observed>=I.mean?"enriched":"depleted",digits:d}),h=[f("Jaccard (bases)",l.jaccard,4),f("Shared bases",l.intersection,0),f(`Features of the ${g} set hit`,l.featuresHit,0)].map(({digits:u,...I})=>I);return i.push({kind:"table",id:"overlap-null",label:`Against ${l.iterations.toLocaleString()} shuffles of the ${g} set`,columns:[{key:"measure",label:"Measure",kind:"text"},{key:"observed",label:"Observed",kind:"number",digits:4},{key:"expected",label:"Expected",kind:"number",digits:4,hint:"Mean of the null."},{key:"fold",label:"Fold",kind:"number",digits:2,hint:"Observed over expected."},{key:"z",label:"z",kind:"number",digits:2},{key:"p",label:"p",kind:"number",digits:5,hint:`Permutation p on the tail the observation fell on, with Phipson and Smyth’s +1: the smallest this run can report is ${(1/(l.iterations+1)).toPrecision(2)}.`},{key:"tail",label:"Tail",kind:"text"}],rows:h}),i},Jt={maxIter:3e3,convergenceEps:1e-6,start:[.1,1,.2,.5],pseudoValueEps:1e-8,finalPseudoValueEps:1e-12,emStepsPerRound:30},Ct=[0,.2,.1,.01],ee=[20,20,.99,.99],Kr={min:Ct,max:ee};class se extends Error{constructor(e){super(e),this.name="IdrError"}}const In=new Float64Array(1),qr=new Int32Array(In.buffer),ca=new Uint8Array(Float64Array.of(1).buffer)[7]===63?1:0,GI=1-ca,Hr=.8450629115104675,xI=.1283791670955126,vI=1.0270333367641007,Fe=[.12837916709551256,-.3250421072470015,-.02848174957559851,-.005770270296489442,-23763016656650163e-21],Se=[.39791722395915535,.0650222499887673,.005081306281875766,.00013249473800432164,-3960228278775368e-21],zt=[-.0023621185607526594,.41485611868374833,-.3722078760357013,.31834661990116175,-.11089469428239668,.035478304325618236,-.002166375594868791],le=[.10642088040084423,.540397917702171,.07182865441419627,.12617121980876164,.01363708391202905,.011984499846799107],Tt=[-.009864944034847148,-.6938585727071818,-10.558626225323291,-62.375332450326006,-162.39666946257347,-184.60509290671104,-81.2874355063066,-9.814329344169145],$t=[19.651271667439257,137.65775414351904,434.56587747522923,645.3872717332679,429.00814002756783,108.63500554177944,6.570249770319282,-.0604244152148581],Xt=[-.0098649429247001,-.799283237680523,-17.757954917754752,-160.63638485582192,-637.5664433683896,-1025.0951316110772,-483.5191916086514],Vt=[30.33806074348246,325.7925129965739,1536.729586084437,3199.8582195085955,2553.0504064331644,474.52854120695537,-22.44095244658582];function Wr(t){In[0]=t;const e=qr[ca],n=e&2147483647;if(n>=2146435072)return 1-(e>>>31<<1)+1/t;if(n<1072365568){if(n<1043333120)return n<8388608?.125*(8*t+vI*t):t+xI*t;const c=t*t,l=Fe[0]+c*(Fe[1]+c*(Fe[2]+c*(Fe[3]+c*Fe[4]))),g=1+c*(Se[0]+c*(Se[1]+c*(Se[2]+c*(Se[3]+c*Se[4])))),f=l/g;return t+t*f}if(n<1072955392){const c=Math.abs(t)-1,l=zt[0]+c*(zt[1]+c*(zt[2]+c*(zt[3]+c*(zt[4]+c*(zt[5]+c*zt[6]))))),g=1+c*(le[0]+c*(le[1]+c*(le[2]+c*(le[3]+c*(le[4]+c*le[5])))));return e>=0?Hr+l/g:-Hr-l/g}if(n>=1075314688)return e>=0?1-1e-300:1e-300-1;const A=Math.abs(t),s=1/(A*A);let r,o;n<1074191214?(r=Tt[0]+s*(Tt[1]+s*(Tt[2]+s*(Tt[3]+s*(Tt[4]+s*(Tt[5]+s*(Tt[6]+s*Tt[7])))))),o=1+s*($t[0]+s*($t[1]+s*($t[2]+s*($t[3]+s*($t[4]+s*($t[5]+s*($t[6]+s*$t[7])))))))):(r=Xt[0]+s*(Xt[1]+s*(Xt[2]+s*(Xt[3]+s*(Xt[4]+s*(Xt[5]+s*Xt[6]))))),o=1+s*(Vt[0]+s*(Vt[1]+s*(Vt[2]+s*(Vt[3]+s*(Vt[4]+s*(Vt[5]+s*Vt[6]))))))),In[0]=A,qr[GI]=0;const i=In[0],a=Math.exp(-i*i-.5625)*Math.exp((i-A)*(i+A)+r/o);return e>=0?1-a/A:a/A-1}function dn(t,e,n,A){const s=(t-e)/n;return .5*A*Wr(s/Math.SQRT2)+.5*(1-A)*Wr(t/Math.SQRT2)+.5}function Pr(t,e,n,A,s,r,o){let i=0;for(let a=0;a<1e3;a++){i=s+(r-s)/2;const c=dn(i,e,n,A);if(Math.abs(c-t)<o)return i;c<t?s=i:r=i}return i}function UA(t,e,n,A,s,r){const o=Xr(t.length,n,A,s,r),i=e.length===t.length?o:Xr(e.length,n,A,s,r);return[zr(t,o),zr(e,i)]}function zr(t,e){const n=new Float64Array(t.length);for(let A=0;A<t.length;A++)n[A]=e[t[A]];return n}function Xr(t,e,n,A,s){const r=new Float64Array(t);if(t===0)return r;const o=t+1,i=1/o;let a=0<=e?0:e;for(;dn(a,e,n,A)>i;)a-=1;let c=0>=e?0:e;for(;dn(c,e,n,A)<1-i;)c+=1;a=Pr(i,e,n,A,a,c,s),r[0]=a;for(let l=1;l<t;l++){const g=(l+1)/o;dn(c,e,n,A)<g&&(c+=10);const f=Pr(g,e,n,A,a,c,s);r[l]=f,a=f,c=a+2*(f-r[l-1])}return r}class la{constructor(e,n){this.z1=e,this.z2=n,this.n=e.length,this.noise=new Float64Array(this.n),this.signal=new Float64Array(this.n),this.terms=new Float64Array(this.n),Vr(0,1,0,e,n,this.noise)}n;noise;signal;terms;at=[Number.NaN,Number.NaN,Number.NaN];logLik(e){this.signalAt(e);const n=e[3];for(let A=0;A<this.n;A++)this.terms[A]=Math.log(n*this.signal[A]+(1-n)*this.noise[A]);return Bt(this.terms)}membership(e){this.signalAt(e);const n=e[3],A=new Float64Array(this.n);for(let s=0;s<this.n;s++){const r=n*this.signal[s];A[s]=r/(r+(1-n)*this.noise[s])}return A}signalAt(e){const n=this.at;e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2]||(Vr(e[0],e[1],e[2],this.z1,this.z2,this.signal),this.at=[e[0],e[1],e[2]])}}function Vr(t,e,n,A,s,r){const o=-1.837877-Math.log(e)-Math.log(e)-.5*Math.log(1-n*n),i=2*n,a=2*(1-n*n);for(let c=0;c<A.length;c++){const l=(A[c]-t)/e,g=(s[c]-t)/e;r[c]=Math.exp(o-(l*l-i*l*g+g*g)/a)}}function UI(t,e){const{n,z1:A,z2:s}=t,r=t.membership(e),o=Bt(r),i=new Float64Array(n);for(let I=0;I<n;I++)i[I]=r[I]*A[I];const a=Bt(i)/o;for(let I=0;I<n;I++)i[I]=r[I]*s[I];const c=Bt(i)/o,l=(a+c)/2;for(let I=0;I<n;I++){const d=A[I]-l;i[I]=r[I]*(d*d)}const g=Bt(i);for(let I=0;I<n;I++){const d=s[I]-l;i[I]=r[I]*(d*d)}const f=Bt(i),h=Math.sqrt((g+f)/(2*o));for(let I=0;I<n;I++)i[I]=r[I]*(A[I]-l)*(s[I]-l);const u=2*Bt(i)/(g+f);return[l,h,u,o/n]}function ga(t){const e=[t[0],t[1],t[2],t[3]];let n=!1;return e[0]<Ct[0]&&(e[0]=Ct[0],n=!0),e[1]<Ct[1]&&(e[1]=Ct[1],n=!0),e[2]<Ct[2]?(e[2]=Ct[2],n=!0):e[2]>ee[2]&&(e[2]=ee[2],n=!0),e[3]<Ct[3]?(e[3]=Ct[3],n=!0):e[3]>ee[3]&&(e[3]=ee[3],n=!0),{theta:e,changed:n}}function TI(t,e,n,A){let s=e,r=t.logLik(s),o=[e[0],e[1],e[2],e[3]];for(let i=0;i<n;i++){const a=ga(UI(t,s));o=a.theta;const c=t.logLik(o);if(a.changed)return{theta:o,changed:!0};if(!(c+1e-6>=r))throw new se("An EM step lowered the likelihood, which stops idr’s own fit.");if(c-r<A)return{theta:o,changed:!1};s=o,r=c}return{theta:o,changed:!1}}function $I(t,e,n,A=1e-5,s=500){if(!Number.isFinite(e)||!Number.isFinite(n))throw new se("Optimization bounds must be finite scalars.");if(e>n)throw new se("The lower bound exceeds the upper bound.");const r=Math.sqrt(22e-17),o=.5*(3-Math.sqrt(5));let i=e,a=n,c=i+o*(a-i),l=c,g=c,f=0,h=0,u=g,I=t(u),d=1,C=I,B=I,Q=.5*(i+a),E=r*Math.abs(g)+A/3,m=2*E;for(;Math.abs(g-Q)>m-.5*(a-i);){let p=!0;if(Math.abs(h)>E){p=!1;let N=(g-l)*(I-C),k=(g-c)*(I-B),b=(g-c)*k-(g-l)*N;if(k=2*(k-N),k>0&&(b=-b),k=Math.abs(k),N=h,h=f,Math.abs(b)<Math.abs(.5*k*N)&&b>k*(i-g)&&b<k*(a-g)){if(f=(b+0)/k,u=g+f,u-i<m||a-u<m){const M=Math.sign(Q-g)+(Q-g===0?1:0);f=E*M}}else p=!0}p&&(h=g>=Q?i-g:a-g,f=o*h);const w=Math.sign(f)+(f===0?1:0);u=g+w*Math.max(Math.abs(f),E);const y=t(u);if(d+=1,y<=I?(u>=g?i=g:a=g,c=l,C=B,l=g,B=I,g=u,I=y):(u<g?i=u:a=u,y<=B||l===g?(c=l,C=B,l=u,B=y):(y<=C||c===g||c===l)&&(c=u,C=y)),Q=.5*(i+a),E=r*Math.abs(g)+A/3,m=2*E,d>=s)break}return g}function JI(t,e,n){const A=[e[0],e[1],e[2],e[3]],s=e[n],r=c=>(A[n]=s+c,-t.logLik(A));if(!(s>=Ct[n])||!(s<=ee[n]))throw new se("A coordinate-ascent step started outside idr’s parameter box.");const o=$I(r,Ct[n]-s,ee[n]-s),i=-r(0),a=-r(o);return a>i?(e[n]+=o,a):i}function OI(t,e,n,A){let s=t.logLik(e),r=[e[0],e[1],e[2],e[3]],o=s;for(let i=0;i<n;i++){for(let c=0;c<4;c++)o=JI(t,r,c);const a=ga(r);if(a.changed)throw new se("Coordinate ascent left idr’s parameter box, which stops idr’s own fit.");if(r=a.theta,!(o+1e-6>=s))throw new se("A coordinate-ascent round lowered the likelihood, which stops idr’s own fit.");if(o-s<A)return r;s=o}return r}async function YI(t,e,n={}){const A=n.eps??Jt.convergenceEps,s=n.maxIter??Jt.maxIter,r=Jt.pseudoValueEps,o=n.start??Jt.start;let i=[o[0],o[1],o[2],o[3]],[a,c]=UA(t,e,i[0],i[1],i[3],r),l=!1,g=0;const f=new Float64Array(t.length);for(let h=0;h<s;h++){g=h+1;const u=i,I=new la(a,c),d=TI(I,u,Jt.emStepsPerRound,A/10);i=d.theta,d.changed&&(l=!0,i=OI(I,u,Jt.emStepsPerRound,A/10));const C=Bt([Math.abs(i[0]-u[0]),Math.abs(i[1]-u[1]),Math.abs(i[2]-u[2]),Math.abs(i[3]-u[3])]),B=a,Q=c;[a,c]=UA(t,e,i[0],i[1],i[3],r);for(let p=0;p<f.length;p++)f[p]=Math.abs(B[p]-a[p]);const E=RA(f);for(let p=0;p<f.length;p++)f[p]=Math.abs(Q[p]-c[p]);const m=E+RA(f);if(n.between!==void 0&&await n.between(g),h>3&&C<A&&m<A)break}return{theta:i,rounds:g,coordinateAscent:l}}function _I(t,e,n){const A=Jt.finalPseudoValueEps,[s,r]=UA(e,n,t[0],t[1],t[3],A),o=new la(s,r).membership(t),i=Jt.convergenceEps,a=new Float64Array(o.length);for(let c=0;c<a.length;c++){let l=1-o[c];s[c]+r[c]<0&&(l=1),a[c]=l<i?i:l>1?1:l}return a}function KI(t){const e=t.length,n=Array.from({length:e},(o,i)=>i);n.sort((o,i)=>t[o]-t[i]||o-i);const A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o<e&&t[n[o]]===t[n[r]];)s+=t[n[o]],o++;const i=s/o;for(let a=r;a<o;a++)A[n[a]]=i;r=o}return A}function TA(t){return-Math.log10(Math.max(1e-5,t))}function Zr(t){const e=t.length,n=Array.from({length:e},(s,r)=>r);n.sort((s,r)=>t[s]-t[r]||s-r);const A=new Int32Array(e);for(let s=0;s<e;s++)A[n[s]]=s;return A}const sn={width:150,times:3,minWidth:75,truncate:1e5},qI=[-1/560,8/315,-1/5,8/5,-205/72,8/5,-1/5,8/315,-1/560],HI=1e6,WI=1e-10;function PI(t,e){let n=Float64Array.from(qI);const A=new Float64Array(t).fill(1/t);for(let o=0;o<e;o++)n=zI(n,A);const s=new Float64Array(n.length);for(let o=0;o<n.length;o++)s[o]=HI*n[n.length-1-o];const r=new Float64Array(s.length+1);for(let o=0;o<s.length;o++)r[o+1]=r[o]+s[o];return{width:t,times:e,values:s,cumulative:r}}function zI(t,e){const n=new Float64Array(t.length+e.length-1);for(let A=0;A<n.length;A++){let s=0;const r=Math.max(0,A-(e.length-1)),o=Math.min(A,t.length-1);for(let i=r;i<=o;i++)s+=t[i]*e[A-i];n[A]=s}return n}function ks(t,e){return Math.min(e,t.values.length)-1>>1}function XI(t,e){const n=ks(t,e);return{left:t.values.length-1-n,right:n}}function VI(t,e,n,A,s){const r=[],o=[],i=[],a=(l,g,f)=>{const h=i.length-1;if(h>=0&&o[h]===l&&fa(i[h],f)){o[h]=g;return}r.push(l),o.push(g),i.push(f)};let c=A;for(let l=0;l<t.length&&c<s;l++){const g=Math.max(t[l],c),f=Math.min(e[l],s);f<=g||(g>c&&a(c,g,Number.NaN),a(g,f,n[l]),c=f)}return c<s&&a(c,s,Number.NaN),{starts:Int32Array.from(r),ends:Int32Array.from(o),values:Float64Array.from(i),length:r.length}}function ZI(t,e){return{starts:Int32Array.of(t),ends:Int32Array.of(e),values:Float64Array.of(0),length:1}}function jI(t,e,n){if(t.length===1)return t[0];const A=[],s=[],r=[],o=new Int32Array(t.length);let i=e;for(;i<n;){let a=n,c=0;for(let f=0;f<t.length;f++){const h=t[f];for(;o[f]<h.length&&h.ends[o[f]]<=i;)o[f]++;const u=o[f];if(u>=h.length||h.starts[u]>i)throw new Error(`pooledRuns: a track does not cover ${i}`);c+=h.values[u],h.ends[u]<a&&(a=h.ends[u])}const l=Math.fround(c/t.length),g=r.length-1;g>=0&&fa(r[g],l)?s[g]=a:(A.push(i),s.push(a),r.push(l)),i=a}return{starts:Int32Array.from(A),ends:Int32Array.from(s),values:Float64Array.from(r),length:A.length}}function fa(t,e){return t===e||t!==t&&e!==e}function jr(t,e,n,A,s,r,o){const i=e.values.length,a=ks(e,n),c=new Float64Array(Math.max(0,s-A));if(o===void 0)to(t,e,a,A,s,c,A);else{let l=0;for(;l<c.length;){const g=o.indexOf(1,l),f=g<0||g>c.length?c.length:g;if(c.fill(Number.NaN,l,f),f===c.length)break;const h=o.indexOf(0,f),u=h<0||h>c.length?c.length:h;to(t,e,a,A+f,A+u,c,A),l=u}}if(r!==void 0)for(let l=0;l<t.length;l++){const g=Math.max(A,t.starts[l]-a+i-1),f=Math.min(s-1,t.ends[l]-a-1);g<=f&&r.fill(1,g-A,f-A+1)}return c}function to(t,e,n,A,s,r,o){const i=e.values.length,a=e.values,c=e.cumulative,l=t.starts,g=t.ends,f=t.values,h=A+n+1,u=s+n,I=-(n+1)-o;let d=0,C=t.length;for(;d<C;){const E=d+C>>>1;g[E]>h-i?C=E:d=E+1}const B=c[0],Q=c[i];for(;d<t.length;d++){const E=l[d];if(E+1>u)break;const m=g[d],p=f[d];let w=E+1>h?E+1:h,y=m-1<E+i?m-1:E+i;if(y>u&&(y=u),w<=y){let k=w;k===E+1&&(r[I+k]+=p*a[0],k++);for(let b=I+k,M=k-E,F=I+y;b<=F;b++,M++)r[b]+=p*(c[M]-B)}if(w=m>h?m:h,y=E+i<u?E+i:u,w<=y)if(m-E===1)for(let k=I+w,b=w-1-E,M=I+y;k<=M;k++,b++)r[k]+=p*a[b];else for(let k=I+w,b=w-E,M=w-m,F=I+y;k<=F;k++,b++,M++)r[k]+=p*(c[b]-c[M]);if(w=E+i+1>h?E+i+1:h,y=m-1<u?m-1:u,w<=y){const k=p*(Q-B);for(let b=I+w,M=I+y;b<=M;b++)r[b]+=k}w=m>E+i+1?m:E+i+1,w<h&&(w=h);const N=m+i-1;if(y=N<u?N:u,w<=y){const k=I+(y===N?y-1:y);for(let b=I+w,M=w-m;b<=k;b++,M++)r[b]+=p*(Q-c[M]);y===N&&(r[I+N]+=p*a[i-1])}}}const td=65536;function ha(t){return Math.fround(t)<WI}function ed(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)ha(t[n])&&(e[n]=1);return e}class eo{constructor(e,n,A){this.contig=e,this.length=n,this.tracks=A.length,this.absent=A,this.scores=A.map(()=>[]),this.held=A.map(()=>new Float64Array(1024))}tracks;absent;starts=[];ends=[];modes=[];flats=[];scores;previous=!1;rose=!1;open=-1;best=Number.NEGATIVE_INFINITY;ties=[];held;heldLength=0;openFlat=0;position=0;feed(e,n,A,s){if(e!==this.position)throw new Error(`ConcaveScan: fed ${e} after ${this.position}`);for(let r=0;r<n.length;r++){const o=e+r,i=Math.fround(n[r]),a=ha(i);if(o===0?a&&this.begin(0):a&&!this.previous?(this.rose=!0,this.begin(o)):!a&&this.previous&&this.close(o),a){const c=-i;c>this.best?(this.best=c,this.ties=[o]):c===this.best&&this.ties.push(o),this.hold(A,r),s!==void 0&&s[r]===1&&(this.openFlat=1)}this.previous=a}this.position=e+n.length}finish(){if(this.open>=0&&this.close(this.length),!this.rose){this.starts=[],this.ends=[],this.modes=[],this.flats=[];for(const e of this.scores)e.length=0}return{contig:this.contig,starts:Int32Array.from(this.starts),ends:Int32Array.from(this.ends),modes:Int32Array.from(this.modes),scores:this.scores.map(e=>Float64Array.from(e)),flat:Uint8Array.from(this.flats)}}begin(e){this.open=e,this.best=Number.NEGATIVE_INFINITY,this.ties=[],this.heldLength=0,this.openFlat=0,this.held[0].length>td&&(this.held=this.held.map(()=>new Float64Array(1024)))}hold(e,n){this.heldLength===this.held[0].length&&(this.held=this.held.map(A=>{const s=new Float64Array(A.length*2);return s.set(A),s}));for(let A=0;A<this.tracks;A++)this.held[A][this.heldLength]=e[A][n];this.heldLength++}close(e){this.starts.push(this.open),this.ends.push(e),this.flats.push(this.openFlat),this.modes.push(this.ties.length===0?this.open:this.ties[this.ties.length>>1]);for(let n=0;n<this.tracks;n++)this.scores[n].push(this.absent[n]?Number.NEGATIVE_INFINITY:-RA(this.held[n],0,this.heldLength));this.open=-1}}function nd(t){const e=t.length,n=Array.from({length:e},(r,o)=>o);n.sort((r,o)=>t[o]-t[r]||r-o);const A=new Float64Array(e);let s=0;for(;s<e;){let r=s+1;for(;r<e&&t[n[r]]===t[n[s]];)r++;const o=(s+1+r)/2;for(let i=s;i<r;i++)A[n[i]]=o;s=r}return A}function Ad(t,e,n,A,s){const r=e.length,o=new Float64Array(r).fill(Number.POSITIVE_INFINITY);for(const l of A){const g=nd(l);for(let f=0;f<r;f++)g[f]<o[f]&&(o[f]=g[f])}const i=(l,g)=>t[l]<t[g]?-1:t[l]>t[g]?1:e[l]-e[g]||n[l]-n[g],a=Array.from({length:r},(l,g)=>g);a.sort((l,g)=>o[l]-o[g]||i(l,g));const c=a.slice(0,Math.max(0,Math.min(r,s)));return c.sort(i),Int32Array.from(c)}class sd{constructor(e,n,A={}){this.tracks=e,this.limit=n,this.scores=Array.from({length:e},()=>new Float64Array(1024)),this.floor=new Float64Array(e).fill(Number.NEGATIVE_INFINITY),A.prune===!1&&(this.holdAll=!0),this.below=A.below===!0?new Float64Array(1024):null}size=0;contigs=[];starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;floor;seen=0;dropped=0;holdAll=!1;below;belowSize=0;add(e,n){this.seen++;let A=this.holdAll;for(let r=0;r<this.tracks;r++){const o=e.scores[r][n];o!==o&&!this.holdAll&&(this.holdAll=!0,A=!0),o>=this.floor[r]&&(A=!0)}if(!A){this.drop(e.scores[0][n],e.flat[n]);return}this.size===this.starts.length&&this.grow();const s=this.size++;this.contigs[s]=e.contig,this.starts[s]=e.starts[n],this.ends[s]=e.ends[n],this.modes[s]=e.modes[n],this.flats[s]=e.flat[n];for(let r=0;r<this.tracks;r++)this.scores[r][s]=e.scores[r][n];!this.holdAll&&this.size>=2*this.tracks*this.limit+1024&&this.prune()}finish(){this.holdAll||this.prune();const e=this.size,n={contig:this.contigs.slice(0,e),starts:this.starts.slice(0,e),ends:this.ends.slice(0,e),modes:this.modes.slice(0,e),flat:this.flats.slice(0,e),scores:this.scores.map(A=>A.slice(0,e))};return{...n,tested:Ad(n.contig,n.starts,n.ends,n.scores,this.limit),below:this.below===null?new Float64Array(0):this.below.slice(0,this.belowSize),exact:!(this.holdAll&&this.dropped>0)}}prune(){if(this.seen<this.limit)return;const e=this.size;for(let A=0;A<this.tracks;A++){const s=this.scores[A].slice(0,e).sort();this.floor[A]=s[e-this.limit]}let n=0;for(let A=0;A<e;A++){let s=!1;for(let r=0;r<this.tracks;r++)this.scores[r][A]>=this.floor[r]&&(s=!0);if(!s){this.drop(this.scores[0][A],this.flats[A]);continue}if(n!==A){this.contigs[n]=this.contigs[A],this.starts[n]=this.starts[A],this.ends[n]=this.ends[A],this.modes[n]=this.modes[A],this.flats[n]=this.flats[A];for(let r=0;r<this.tracks;r++)this.scores[r][n]=this.scores[r][A]}n++}this.size=n,this.contigs.length=n}drop(e,n){if(this.dropped++,!(this.below===null||!(e>0)||n===1)){if(this.belowSize===this.below.length){const A=new Float64Array(this.below.length*2);A.set(this.below),this.below=A}this.below[this.belowSize++]=e}}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}function rd(t,e,n,A,s){return A>0?[Math.max(0,n-A),Math.min(s,n+A+1)]:[t,e]}function ua(t){return-(Math.log(t)/Math.log(10))}const Ia=[.001,.005,.01,.05,.1,.2],gA="0.05";function da(t){return typeof t.replicate=="string"&&t.replicate!==""}const od="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",id=8,ad=-1,cd=-2;let ge;function ld(){if(ge!==void 0)return ge;ge=null;try{if(typeof WebAssembly>"u")return null;const t=atob(od),e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=t.charCodeAt(n);WebAssembly.validate(e)&&(ge=new WebAssembly.Module(e))}catch{ge=null}return ge}class $A extends Error{constructor(){super("The peak-calling kernel ran out of memory."),this.name="KernelMemoryError"}}class gd{size=0;starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;constructor(e){this.scores=Array.from({length:e},()=>new Float64Array(1024))}take(e,n,A){if(A===0)return;for(;this.size+A>this.starts.length;)this.grow();const s=e.buffer,r=n.scan_region_capacity();this.starts.set(new Int32Array(s,n.scan_region_starts()>>>0,A),this.size),this.ends.set(new Int32Array(s,n.scan_region_ends()>>>0,A),this.size),this.modes.set(new Int32Array(s,n.scan_region_modes()>>>0,A),this.size),this.flats.set(new Uint8Array(s,n.scan_region_flats()>>>0,A),this.size);const o=n.scan_regions()>>>0;this.scores.forEach((i,a)=>i.set(new Float64Array(s,o+a*r*8,A),this.size)),this.size+=A}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}class bs{constructor(e,n,A,s){this.memory=e,this.exports=n,this.contig=A,this.tracks=s,this.collected=new gd(s)}collected;static open(e,n,A,s,r){const o=ld();if(o===null||s<1||s>id)return null;try{const i=new WebAssembly.Memory({initial:2}),c=new WebAssembly.Instance(o,{env:{memory:i}}).exports,l=e.values.length;if(c.scan_open(s,l,ks(e,A),A,r)!==0)return null;const g=c.scan_kernel()>>>0;return new Float64Array(i.buffer,g,l).set(e.values),new Float64Array(i.buffer,g+l*8,l+1).set(e.cumulative),new bs(i,c,n,s)}catch{return null}}window(e,n,A,s,r){let o=0;for(let i=0;i<this.tracks;i++){const a=r[i];if(a===null){o|=1<<i;continue}const c=a.starts.length,l=this.exports.scan_input(i,c)>>>0;if(l===0)throw new $A;const g=this.memory.buffer;new Float64Array(g,l,c).set(a.values),new Int32Array(g,l+c*8,c).set(a.starts),new Int32Array(g,l+c*12,c).set(a.ends)}this.closed(this.exports.scan_window(e,n,A,s,o),e)}lastWindow(e){const n=this.memory.buffer;return{pooled:new Float64Array(n,this.exports.scan_pooled()>>>0,e).slice(),flat:new Uint8Array(n,this.exports.scan_flat()>>>0,e).slice(),own:Array.from({length:this.tracks},(A,s)=>new Float64Array(n,this.exports.scan_own(s)>>>0,e).slice())}}finish(){this.closed(this.exports.scan_finish(),-1);const{collected:e}=this,n=this.exports.scan_rose()===1?e.size:0;return{contig:this.contig,starts:e.starts.slice(0,n),ends:e.ends.slice(0,n),modes:e.modes.slice(0,n),scores:e.scores.map(A=>A.slice(0,n)),flat:e.flats.slice(0,n)}}closed(e,n){if(e===ad)throw new $A;if(e===cd)throw new Error(`ConcaveScan: fed ${n} out of order`);if(e<0)throw new Error(`pooledRuns: a track does not cover a window at ${n}`);this.collected.take(this.memory,this.exports,e)}}const fA=1<<18,no=20,rn=2e4,Ao=["#0072b2","#009e73"],fd="#999999",hd=async t=>{const e=at(t.params,"signal");if(e===null)return t.note("No track was chosen. Load a bigWig and pick it under Track."),[];const n=da(t.params)?at(t.params,"replicate"):null;if(n===e)return t.note("The replicate chosen is the track being called, and a track cannot test itself. Choose a second track, or none."),[];const A=n===null?[e]:[e,n],s=L=>t.inputs.labels?.[L]??L,r=Re(T(t.params,"width",sn.width),1,2e3),o=Re(T(t.params,"times",sn.times),0,10),i=Re(T(t.params,"minWidth",sn.minWidth),1,1e9),a=Re(T(t.params,"halfWidth",0),0,1e9),c=Re(T(t.params,"truncate",sn.truncate),1,1e9),l=Id(t),g=t.inputs.contigLengths??{},f=Yn(t.params,"sequences"),h=Object.keys(g).filter(L=>g[L]>0&&(f===null||f.includes(L)));if(h.length===0)return t.note(f!==null&&f.length===0?"No sequence is ticked, so there is nothing to call peaks on.":"This session knows no sequence lengths, so there is nothing to scan. Load a chrom.sizes, or the map itself."),[];const u=PI(r,o),I=L=>ud(t,A,h,g,u,{minWidth:i,truncate:c,below:n===null,prune:L});let d=await I(!0);if(typeof d!="string"&&!d.held.exact&&(d=await I(!1)),typeof d=="string")return t.note(d),[];const{held:C,found:B,n:Q,perSequence:E,absentOn:m}=d;for(let L=0;L<A.length;L++){if(m[L].length===h.length)return t.note(`${s(A[L])} has none of the ${h.length===1?"sequence":"sequences"} ticked. Check that it and the assembly name their sequences the same way.`),[];m[L].length>0&&t.note(`${s(A[L])} has no ${pd(m[L])}. yapc reads a track that lacks a sequence as zeros there, so it lowers the mean the regions are called on, and ranks every region there last by it.`)}const p=`${u.values.length}-tap kernel: a ${r.toLocaleString()} bp window, ${o} ${o===1?"pass":"passes"}`;if(Q===0)return t.note(`No concave region at least ${i.toLocaleString()} bp wide on ${h.length===1?h[0]:`${h.length} sequences`} (${p}). A wider smoothing window finds broader shapes; a narrower minimum keeps smaller ones.`),[];const{contig:w,starts:y,ends:N,modes:k,flat:b,scores:M,tested:F}=C;t.note(`${B.toLocaleString()} concave ${B===1?"region":"regions"} on ${h.length.toLocaleString()} ${h.length===1?"sequence":"sequences"} (${p}), ${Q.toLocaleString()} at least ${i.toLocaleString()} bp wide`+(F.length<Q?`, of which the ${F.length.toLocaleString()} strongest by each track’s curvature rank were kept.`:"."));let S=null,v=null,G=null;const O=new Uint8Array(F.length).fill(1);if(n!==null)if(F.length<no)t.note(`IDR needs at least ${no} peaks to fit — its own command refuses fewer — and there ${F.length===1?"is 1":`are ${F.length}`}. They are reported untested, ranked by curvature.`);else{const L=Zr(on(M[0],F)),J=Zr(on(M[1],F)),Mt=oo(on(M[0],F))+oo(on(M[1],F));Mt>0&&t.note(`${Mt.toLocaleString()} ${Mt===1?"score ties":"scores tie"} with another: ranked by position, where yapc breaks a tie at random.`);try{S=await YI(L,J,{between:async P=>{t.progress(0,0,`IDR, round ${P}`),await Es(),t.throwIfCancelled()}})}catch(P){throw P instanceof se?new Error(`IDR could not fit these two tracks, as idr itself could not: ${P.message}`):P}v=_I(S.theta,L,J),G=KI(v);const vt=ua(l);for(let P=0;P<F.length;P++)O[P]=TA(G[P])>=vt?1:0;t.note(dd(S,F.length,md(O),l))}else{let L=0;for(let J=0;J<F.length;J++)b[F[J]]!==0&&(O[J]=0,L++);L>0&&t.note(`${L.toLocaleString()} of the candidates ${L===1?"is":"are"} flat — the signal constant across a whole kernel’s width inside, which yapc’s test counts as concave — and ${L===1?"is":"are"} left out, as IDR would leave ${L===1?"it":"them"} out of two replicates.`),t.note("One track, so no test of significance: yapc’s cut is IDR between two replicates. These are the strongest concave regions by curvature — choose a replicate to test them, or lower “keep the strongest” to the upper of the two populations in the figure.")}const $=new Map(h.map((L,J)=>[L,J])),K=[];for(let L=0;L<F.length;L++)O[L]===1&&K.push(L);K.sort((L,J)=>($.get(w[F[L]])??0)-($.get(w[F[J]])??0)||y[F[L]]-y[F[J]]);const V=new et;let H=0,ht=0;for(const L of K){const J=F[L],[Mt,vt]=rd(y[J],N[J],k[J],a,g[w[J]]);a>0&&(Mt!==k[J]-a||vt!==k[J]+a+1)&&H++;const P=[`summit ${(k[J]+1).toLocaleString("en-US")}`];P.push(`curvature ${A.map((qQ,ac)=>io(M[ac][J])).join(" / ")}`),G!==null&&P.push(`IDR ${io(G[L])}`),V.add(w[J],Mt,vt,{name:`peak_${++ht}`,score:G!==null?TA(G[L]):M[0][J],cds:[k[J],k[J]+1],detail:P.join(ct)})}H>0&&t.note(`${H.toLocaleString()} ${H===1?"peak reaches":"peaks reach"} past a sequence end at this half-width and ${H===1?"is":"are"} cut at it; yapc writes the coordinate past the end.`),K.length===0&&t.note(`No peak passes IDR ≤ ${l}. A looser threshold keeps more; two tracks that are not replicates of one experiment will pass few at any.`);const xt=[];K.length>0&&xt.push({kind:"intervals",id:`peaks-${A.map(L=>L.replace(/[^A-Za-z0-9_]+/g,"_")).join("-")}`,label:n===null?`Peaks · ${s(e)} · no IDR`:`Peaks · ${s(e)} + ${s(n)} · IDR ≤ ${l}`,payload:{kind:"features",data:V.finish()},noun:{one:"peak",many:"peaks"},lane:{under:{entry:e}},display:"lane",look:"point"});const q=Cd(A.map(s),M,F,O,n!==null,b,C.below);return q!==null&&xt.push(q),xt.push(Qd(h,g,E,K.map(L=>w[F[L]]))),S!==null&&G!==null&&xt.push(Bd(G,l)),Lt(t.params,"perPeak",!1)&&xt.push(Ed({names:A.map(s),contig:w,starts:y,ends:N,modes:k,scores:M,tested:F,passes:O,local:v,global:G,replicate:n!==null})),t.progress(1,1,"done"),xt};async function ud(t,e,n,A,s,r){const o=n.reduce((h,u)=>h+A[u],0);let i=0;const a=new sd(e.length,r.truncate,{prune:r.prune,below:r.below}),c=e.map(()=>[]),l=new Map;let g=0,f=0;for(const h of n){const u=await Ca(t,e,h,A[h],s,C=>{i+=C,t.progress(i,o,h)});if(typeof u=="string")return u;const{regions:I}=u;let d=0;for(let C=0;C<I.starts.length;C++)I.ends[C]-I.starts[C]<r.minWidth||(d++,a.add(I,C));g+=I.starts.length,f+=d,l.set(h,{regions:I.starts.length,wide:d}),u.absent.forEach((C,B)=>{C&&c[B].push(h)})}return{held:a.finish(),found:g,n:f,perSequence:l,absentOn:c}}async function Ca(t,e,n,A,s,r,o="auto"){const{left:i,right:a}=XI(s,A),c=e.map(()=>!1),l=o==="js"?null:bs.open(s,n,A,e.length,fA);let g=null,f=0;try{for(let h=0;h<A;h+=fA){const u=Math.min(A,h+fA),I=Math.max(0,h-i),d=Math.min(A,u+a),C=[];for(let B=0;B<e.length;B++){if(c[B]){C.push(null);continue}const Q=await t.sample(e[B],[{contig:n,start:I,end:d}],1);if(Q.note!==void 0)return Q.note;const E=Q.regions[0];E===void 0&&(c[B]=!0),C.push(E??null)}if(l!==null)l.window(h,u,I,d,C);else{const B=C.map(w=>w===null?ZI(I,d):VI(w.starts,w.ends,w.values,I,d));g??=new eo(n,A,c);const Q=new Uint8Array(u-h),E=jr(jI(B,I,d),s,A,h,u,Q),m=e.length===1?null:ed(E),p=m===null?[E]:B.map(w=>jr(w,s,A,h,u,void 0,m));g.feed(h,E,p,Q)}r(u-h),f+=u-h,await Es(),t.throwIfCancelled()}}catch(h){if(!(h instanceof $A))throw h;return r(-f),Ca(t,e,n,A,s,r,"js")}return l!==null?{regions:l.finish(),absent:c}:{regions:(g??new eo(n,A,c)).finish(),absent:c}}function Id(t){const e=Number(st(t.params,"idr",gA));return Ia.includes(e)?e:(da(t.params)&&t.note(`An IDR threshold of ${st(t.params,"idr","")} is not one yapc writes; ${gA} was used.`),Number(gA))}const so=["mean","spread","correlation","reproducible share"];function dd(t,e,n,A){const[s,r,o,i]=t.theta,a=`IDR fitted over ${e.toLocaleString()} peaks in ${t.rounds.toLocaleString()} rounds: μ ${s.toFixed(2)}, σ ${r.toFixed(2)}, ρ ${o.toFixed(2)}, reproducible share ${i.toFixed(2)}; ${n.toLocaleString()} pass IDR ≤ ${A}.`,c=[],l=g=>Number.isInteger(g)?String(g):g.toFixed(2);return t.theta.forEach((g,f)=>{const[h,u]=[Kr.min[f],Kr.max[f]];g<=h+1e-4*Math.max(1,h)?c.push(`the ${so[f]} at its floor of ${l(h)}`):g>=u-1e-4*Math.max(1,u)&&c.push(`the ${so[f]} at its ceiling of ${l(u)}`)}),c.length===0?a:`${a} The fit ended at the edge of IDR’s parameter box — ${c.join(", ")} — which is where two tracks that do not rank their peaks like replicates of one experiment put it. Read these IDRs as that, not as reproducibility.`}function Cd(t,e,n,A,s,r,o){const i=[],a=new Uint8Array(r.length);for(const f of n)a[f]=1;for(let f=0;f<e.length;f++){const h=[],u=[];if(n.forEach((B,Q)=>{const E=e[f][B];!(E>0)||!s&&r[B]===1||(A[Q]===1?h.push(E):u.push(E))}),!s){for(let B=0;B<r.length;B++)a[B]===0&&e[f][B]>0&&r[B]===0&&u.push(e[f][B]);for(const B of o)u.push(B)}const I=e.length===1?"":`${t[f]} · `,d=s?`${I}passes IDR`:`${I}peaks`,C=s?`${I}fails IDR`:`${I}below the cut`;h.length>0&&i.push(ro(d,h,Ao[f]??Ao[0])),u.length>0&&i.push(ro(C,u,fd))}if(i.length===0)return null;const c=i.flatMap(f=>Array.from(f.y)),l=wd(c,.01);let g=Number.NEGATIVE_INFINITY;for(const f of c)f>g&&(g=f);return{kind:"curve",id:"peaks-curvature",label:"Curvature of every candidate",series:i,xLabel:"",yLabel:"Curvature (yapc score)",xScale:"linear",yScale:"log",...Number.isFinite(l)&&l>0&&g>l?{yDomain:[10**Math.floor(Math.log10(l)),10**Math.ceil(Math.log10(g))]}:{}}}function ro(t,e,n){const A=Float64Array.from(e).sort();let s=A;if(A.length>rn){s=new Float64Array(rn);for(let r=0;r<rn;r++)s[r]=A[Math.round(r*(A.length-1)/(rn-1))]}return{name:t,x:Float64Array.from(s,(r,o)=>o),y:s,colour:n,n:e.length,mark:"violin"}}function Qd(t,e,n,A){const s=new Map;for(const r of A)s.set(r,(s.get(r)??0)+1);return{kind:"table",id:"peaks-sequences",label:"Per sequence",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"length",label:"Length",kind:"number"},{key:"regions",label:"Concave regions",kind:"number"},{key:"wide",label:"Wide enough",kind:"number"},{key:"peaks",label:"Peaks",kind:"number"},{key:"density",label:"Peaks per Mb",kind:"number",digits:1}],rows:t.map(r=>{const o=n.get(r)??{regions:0,wide:0},i=s.get(r)??0;return{sequence:r,length:e[r],regions:o.regions,wide:o.wide,peaks:i,density:i/e[r]*1e6}})}}function Bd(t,e){const n=t.length;return{kind:"table",id:"peaks-idr",label:"IDR thresholds",columns:[{key:"threshold",label:"IDR ≤",kind:"text"},{key:"peaks",label:"Peaks",kind:"number"},{key:"share",label:"Share of tested",kind:"number",digits:3},{key:"drawn",label:"Drawn",kind:"text"}],rows:Ia.map(A=>{const s=ua(A);let r=0;for(let o=0;o<n;o++)TA(t[o])>=s&&r++;return{threshold:String(A),peaks:r,share:r/n,drawn:A===e?"yes":""}})}}function Ed(t){const{names:e,contig:n,starts:A,ends:s,modes:r,scores:o,tested:i,passes:a,local:c,global:l}=t,g=[];return i.forEach((f,h)=>{const u={sequence:n[f],start:A[f],end:s[f],summit:r[f],width:s[f]-A[f]};o.forEach((I,d)=>{u[`curvature${d}`]=I[f]}),c!==null&&l!==null&&(u.local=c[h],u.idr=l[h],u.passes=a[h]===1?"yes":"no"),g.push(u)}),l!==null?g.sort((f,h)=>Number(f.idr)-Number(h.idr)):g.sort((f,h)=>Number(h.curvature0)-Number(f.curvature0)),{kind:"table",id:"peaks-list",label:t.replicate?"Every peak tested":"Every peak",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"summit",label:"Summit",kind:"number",coordinate:"start",hint:"The most concave base."},{key:"width",label:"Width",kind:"number"},...e.map((f,h)=>({key:`curvature${h}`,label:e.length===1?"Curvature":`Curvature · ${f}`,kind:"number",digits:2})),...c!==null?[{key:"local",label:"Local IDR",kind:"number",digits:4,scientific:!0},{key:"idr",label:"IDR",kind:"number",digits:4,scientific:!0},{key:"passes",label:"Passes",kind:"text"}]:[]],rows:g}}function Re(t,e,n){return Math.min(n,Math.max(e,Math.round(t)))}function on(t,e){const n=new Float64Array(e.length);for(let A=0;A<e.length;A++)n[A]=t[e[A]];return n}function md(t){let e=0;for(const n of t)e+=n;return e}function oo(t){const e=Float64Array.from(t).sort();let n=0;for(let A=1;A<e.length;A++)e[A]===e[A-1]&&n++;return n}function wd(t,e){if(t.length===0)return Number.NaN;const n=Float64Array.from(t).sort(),A=e*(n.length-1),s=Math.floor(A),r=Math.min(n.length-1,s+1);return n[s]+(A-s)*(n[r]-n[s])}function io(t){return Number.isFinite(t)?Number(t.toPrecision(4)).toLocaleString("en-US",{maximumSignificantDigits:4}):t>0?"∞":t<0?"−∞":"—"}function pd(t){return t.length===1?t[0]:t.length<=3?`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`:`${t.slice(0,3).join(", ")} and ${(t.length-3).toLocaleString()} more`}const Qa=[{name:"DpnII",site:"GATC",cut:0},{name:"HindIII",site:"AAGCTT",cut:1},{name:"NcoI",site:"CCATGG",cut:1},{name:"EcoRI",site:"GAATTC",cut:1},{name:"BglII",site:"AGATCT",cut:1},{name:"HinfI",site:"GANTC",cut:1},{name:"DdeI",site:"CTNAG",cut:1},{name:"MseI",site:"TTAA",cut:1},{name:"NlaIII",site:"CATG",cut:4},{name:"CviQI",site:"GTAC",cut:1},{name:"AluI",site:"AGCT",cut:2}],yd={MboI:"DpnII",Sau3AI:"DpnII",Csp6I:"CviQI"},Sn={Arima:["DpnII","HinfI"]},Nd=(()=>{const t=new Map;for(const e of Qa)t.set(e.name.toLowerCase(),e);for(const[e,n]of Object.entries(yd)){const A=t.get(n.toLowerCase());A!==void 0&&t.set(e.toLowerCase(),A)}return t})();function an(t){return Nd.get(t.trim().toLowerCase())}function Rn(t){const e=t.trim().toLowerCase();return Object.keys(Sn).find(n=>n.toLowerCase()===e)}function Ba(t){return`${t.site.slice(0,t.cut)}^${t.site.slice(t.cut)}`}function kd(t){return t.site.length-2*t.cut}const bd=1/256,ao=255;function co(t){let e=1;for(const n of t){let A=0;for(let s=n;s!==0;s&=s-1)A++;e*=A/4}return e}function Md(t){const e=t.toUpperCase().replace(/U/g,"T"),n=e.indexOf("^"),A=e.replace("^","");if(n<0){const r=Ye(A);return{refusal:Oe(r)?`“${t}” is neither an enzyme this knows nor a site in IUPAC letters with a ^ where it cuts.`:`“${t}” needs a ^ where the enzyme cuts the top strand, as in ^GATC or G^ANTC.`}}if(A.includes("^"))return{refusal:`“${t}” has more than one ^, and a site is cut in one place.`};const s=Ye(A);return Oe(s)?{refusal:s.reason}:co(s)>bd?{refusal:`“${t}” would cut every ${Math.round(1/co(s))} bases or so; a site needs at least the specificity of a four-base cutter.`}:{name:`${e.slice(0,n)}^${e.slice(n+1)}`,site:A,cut:n}}function Dd(t,e){const n=t.trim();if(n===""||n==="none")return[];if(n!=="custom"){const i=Rn(n);if(i!==void 0)return Sn[i].map(c=>an(c));const a=an(n);return a===void 0?{refusal:`“${n}” is not an enzyme or a kit this knows. Pick one, or type its site under custom.`}:[a]}const A=e.split(/[\s,;]+/).filter(i=>i!=="");if(A.length===0)return{refusal:"Type an enzyme or a site, such as DpnII or G^ANTC."};const s=[],r=new Set,o=i=>{const a=`${i.site}^${i.cut}`;r.has(a)||(r.add(a),s.push(i))};for(const i of A){const a=Rn(i);if(a!==void 0){for(const g of Sn[a])o(an(g));continue}const c=an(i);if(c!==void 0){o(c);continue}const l=Md(i);if("refusal"in l)return l;o(l)}return s.length>ao?{refusal:`That is ${s.length} enzymes, and one digest takes ${ao} at most.`}:s}function Fd(t){return t.map(e=>e.name).join("+")}function Sd(t){let e=0;for(const n of t)e=Math.max(e,n.site.length);return Math.max(0,e-1)}const lo=new Map;function Rd(t){const e=`${t.site}^${t.cut}`,n=lo.get(e);if(n!==void 0)return n;const A=Ye(t.site);if(Oe(A))throw new Error(`${t.name}: ${A.reason}`);const s={motif:A,offset:t.cut};return lo.set(e,s),s}const Qe=256;function Ea(t,e,n,A,s){const r=t.subarray(0,e).sort();let o=0,i=Number.NaN;for(let c=0;c<r.length;c++){const l=Math.floor(r[c]/Qe);l===i||!(l>A&&l<s)||(i=l,r[o++]=r[c])}const a={top:new Int32Array(o),bottom:new Int32Array(o),enzyme:new Uint8Array(o)};for(let c=0;c<o;c++){const l=Math.floor(r[c]/Qe),g=r[c]-l*Qe;a.top[c]=l,a.bottom[c]=l+n[g],a.enzyme[c]=g}return a}function Ld(t,e,n=0){let A=new Float64Array(Math.max(16,t.length>>7)),s=0;e.forEach((o,i)=>{const a=Rd(o),{hits:c}=ys(t,a.motif,{bothStrands:!0,offset:n});if(s+c.length>A.length){const l=new Float64Array(Math.max(A.length*2,s+c.length));l.set(A.subarray(0,s)),A=l}for(const l of c)A[s++]=(l.start+a.offset)*Qe+i});const r=Int32Array.from(e,kd);return Ea(A,s,r,Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY)}function Gd(t,e){let n=0;for(const o of t)n+=o.top.length;const A=new Float64Array(n),s=new Int32Array(Qe);let r=0;for(const o of t)for(let i=0;i<o.top.length;i++)A[r++]=o.top[i]*Qe+o.enzyme[i],s[o.enzyme[i]]=o.bottom[i]-o.top[i];return Ea(A,r,s,0,e)}const xd=16e6;[...Qa.map(t=>({value:t.name,label:`${t.name} (${Ba(t)})`})),...Object.entries(Sn).map(([t,e])=>({value:t,label:`${t} (${e.join(" + ")})`}))];function vd(t){const e=typeof t.enzyme=="string"?t.enzyme:"none",n=typeof t.sites=="string"?t.sites:"";return{choice:e,sites:n}}async function Ud(t,e,n={}){const A=n.contigs??t.contigs,s=Sd(e),r=Math.max(1,Math.floor(n.piece??xd)),o=t.read?.bind(t),i=A.reduce((l,g)=>l+g.length,0);let a=0;const c=[];for(const l of A){const g=o===void 0?t.bases(l.name):void 0;if(o===void 0&&g===void 0)continue;const f=g?.length??l.length,h=[];let u=!0;for(let I=0;I<f;I+=r){n.throwIfCancelled?.();const d=Math.min(f,I+r),C=Math.min(f,d+s),B=g!==void 0?g.subarray(I,C):await o?.(l.name,I,C);if(B===void 0){u=!1;break}h.push(Ld(B,e,I)),a+=d-I,n.progress?.(a,i,l.name)}u&&c.push({contig:l.name,length:f,cuts:Gd(h,f)})}return c}function Td(t,e){const n=Fd(e),A=Rn(t);return A===void 0?n:`${A} (${n})`}function $d(t,e){const n=Rn(t);return n!==void 0?n.replace(/[^A-Za-z0-9]/g,""):e.map(A=>A.name.replace(/\^/g,"_").replace(/[^A-Za-z0-9_]/g,"")).join("-")}const Jd=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to cut."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const{choice:A,sites:s}=vd(t.params),r=Dd(A,s);if(!Array.isArray(r))return t.note(r.refusal),[];if(r.length===0)return t.note("No enzyme was chosen, so there is nothing to cut."),[];const o=Yn(t.params,"sequences");if(o!==null&&o.length===0)return t.note("No sequence is ticked, so there is nothing to cut."),[];const i=Object.entries(t.inputs.contigLengths??{}).filter(([,E])=>E>0).map(([E])=>E),a=Aa(n,o,i);if(a.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to cut."),[];const c=a.length===n.contigs.length;t.progress(0,1,a.length===1?`cutting ${a[0].name}`:`cutting ${a.length.toLocaleString()} sequences`);const l=await Ud(n,r,{contigs:a,progress:(E,m,p)=>t.progress(E,m,`cutting ${p}`),throwIfCancelled:()=>t.throwIfCancelled()});if(t.progress(1,1,"done"),l.length===0)return t.note("None of the ticked sequences could be read from this reference."),[];const g=Td(A,r),f=c?g:a.length<=3?`${g} on ${a.map(E=>E.name).join(", ")}`:`${g} on ${a.length.toLocaleString()} sequences`;let h=0,u=0;for(const E of l)h+=E.cuts.top.length,u+=E.length;const I=h+l.length;t.note(h===0?`No ${g} site anywhere in ${c?"this reference":"the sequences ticked"}, so each sequence is one fragment.`:`${h.toLocaleString()} ${g} ${h===1?"cut":"cuts"} on ${l.length.toLocaleString()} ${l.length===1?"sequence":"sequences"}: ${I.toLocaleString()} fragments, ${Math.round(u/I).toLocaleString()} bp long on average.`);const d=`restriction-${$d(A,r)}${c?"":Od(a)}`,C=Yd(l,r),B=[_d(C,f,d)],Q=Kd(t,C,f,d);return Q!==null&&B.push(Q),B};function Od(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
|
|
17
|
+
`))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Yd(t,e){let n=0;for(const i of t)n+=i.cuts.top.length;const A=e.map(i=>i.name),s=e.map(i=>`${i.name} cuts ${Ba(i)}`),r={contigs:t.map(i=>i.contig),length:n,contig:new Int32Array(n),start:new Int32Array(n),end:new Int32Array(n),strand:new Int8Array(n),score:new Float32Array(n).fill(Number.NaN),name:new Array(n),id:new Array(n).fill(""),detail:new Array(n),exonAt:new Int32Array(n+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(n).fill(-1),cdsEnd:new Int32Array(n).fill(-1),contigAt:new Int32Array(t.length+1),maxSpan:new Int32Array(t.length)};let o=0;return t.forEach((i,a)=>{const{top:c,enzyme:l}=i.cuts;r.contigAt[a]=o,r.contig.fill(a,o,o+c.length),r.start.set(c,o);for(let g=0;g<c.length;g++)r.end[o+g]=c[g]+1,r.name[o+g]=A[l[g]],r.detail[o+g]=s[l[g]];c.length>0&&(r.maxSpan[a]=1),o+=c.length}),r.contigAt[t.length]=o,r}function _d(t,e,n){return{kind:"intervals",id:n,label:`${e} sites`,payload:{kind:"features",data:t},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function Kd(t,e,n,A){const s=t.framing.binsize,r=Kn(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none. Open the map and run it again for that half."),null;const o=e.contigs.map((a,c)=>{const l=e.contigAt[c],g=e.contigAt[c+1];return{contig:a,starts:e.start.subarray(l,g),ends:e.end.subarray(l,g),strands:e.strand.subarray(l,g)}}),i=na({hits:o,total:e.length},r,s);return{kind:"profile",id:`${A}-density`,label:`${n} site density`,values:i.values,extent:[0,i.values.length],binsize:s,unit:"sites"}}const qd=async t=>{const e=On(t.params,"tracks");if(e.length<2)return t.note(e.length===0?"No tracks were chosen. Load two or more bigWigs and tick them under Tracks.":"Only one track was chosen, and a correlation needs two."),[];const n=I=>t.inputs.labels?.[I]??I,A=e.map(n),s=await Hd(t);if(s.count===0)return t.note("No unit to compare over. Check that the tracks and the assembly share contig names."),[];const r=[];for(let I=0;I<e.length;I++)t.throwIfCancelled(),t.progress(I,e.length,A[I]),r.push(await Pd(t,e[I],s));t.progress(e.length,e.length,"correlating");const o=zd(r),i=s.kind==="bins"?"windows":"features";if(o<bn)t.note(`Fewer than ${bn} of the ${s.count.toLocaleString()} ${i} have a value in every track, so no pair has a coefficient. Check that the tracks cover the same sequences.`);else if(o<s.count){const I=s.count-o,d=I===1;t.note(`${I.toLocaleString()} of the ${s.count.toLocaleString()} ${i} ${d?"has":"have"} no value in at least one track, and ${d?"is":"are"} left out of every pair: every coefficient is over the other ${o.toLocaleString()}.`)}const a=st(t.params,"method","spearman"),c=e.length,l=new Float32Array(c*c),g=[];for(let I=0;I<c;I++){l[I*c+I]=1;for(let d=I+1;d<c;d++){const C=a==="pearson"?_i(r[I],r[d]):Uh(r[I],r[d]);l[I*c+d]=C,l[d*c+I]=C,g.push({a:A[I],b:A[d],r:C})}}const f={kind:"matrix",id:"trackcorr",label:`Track correlation · ${a}`,nrows:c,ncols:c,values:l,xLabel:"",yLabel:"",xTicks:A,yTicks:A,colormap:Fl,centre:0,stats:[{label:"units",value:s.count,digits:0},{label:"compared",value:o,digits:0,hint:"Units every track has a value for: the ones every pair is correlated over."}]},h={kind:"table",id:"trackcorr-table",label:"Pairs",columns:[{key:"a",label:"Track",kind:"text"},{key:"b",label:"Track",kind:"text"},{key:"r",label:a==="pearson"?"Pearson r":"Spearman ρ",kind:"number",digits:3}],rows:g.sort((I,d)=>Number(d.r)-Number(I.r))};return[f,h]};async function Hd(t){if(st(t.params,"over","bins")==="features"){const s=ne(t.inputs.features,t.params,"features"),r=s.value;if(r===void 0)return t.note(_n(s,{unchosen:"Correlating over features needs a feature set, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),{kind:"features",regions:[],count:0};const o=[];for(let i=0;i<r.length;i++)o.push({contig:r.contigs[r.contig[i]],start:r.start[i],end:r.end[i]});return{kind:"features",regions:o,count:o.length}}const e=Math.max(1,Math.round(T(t.params,"binsize",100))),n=[];let A=0;for(const[s,r]of Object.entries(t.inputs.contigLengths??{})){const o=Math.floor(r/e);o!==0&&(n.push({contig:s,count:o,offset:A}),A+=o)}return{kind:"bins",size:e,tilings:n,count:A}}const Wd=1<<20,go=4096;async function Pd(t,e,n){const A=new Float64Array(n.count),s=new Float64Array(n.count),r=(o,i,a,c,l,g)=>{const f=Math.min(l,a)-Math.max(c,i);f>0&&(A[o]+=g*f,s[o]+=f)};if(n.kind==="bins"){const{size:o}=n,i=Math.max(1,Math.floor(Wd/o))*o;for(const a of n.tilings){const c=a.count*o;for(let l=0;l<c;l+=i){t.throwIfCancelled();const g=Math.min(c,l+i),f=await t.sample(e,[{contig:a.contig,start:l,end:g}],1);for(const h of f.regions)for(let u=0;u<h.values.length;u++){const I=h.values[u];if(!Number.isFinite(I))continue;const d=Math.max(l,h.starts[u]),C=Math.min(g,h.ends[u]);for(let B=Math.floor(d/o);B*o<C;B++)r(a.offset+B,B*o,(B+1)*o,d,C,I)}}}}else{const o=new Map;n.regions.forEach((i,a)=>{const c=o.get(i.contig);c===void 0?o.set(i.contig,[a]):c.push(a)});for(const[,i]of o)for(let a=0;a<i.length;a+=go){t.throwIfCancelled();const c=i.slice(a,a+go),l=await t.sample(e,c.map(f=>n.regions[f]),1),g=new Map;for(const f of l.regions)g.set(`${f.contig}:${f.start}-${f.end}`,f);for(const f of c){const h=n.regions[f],u=g.get(`${h.contig}:${h.start}-${h.end}`);if(u!==void 0)for(let I=0;I<u.values.length;I++){const d=u.values[I];Number.isFinite(d)&&r(f,h.start,h.end,u.starts[I],u.ends[I],d)}}}}for(let o=0;o<A.length;o++)A[o]=s[o]>0?A[o]/s[o]:Number.NaN;return A}function zd(t){const e=t.length===0?0:t[0].length;let n=0;for(let A=0;A<e;A++)if(t.every(s=>!Number.isNaN(s[A])))n++;else for(const s of t)s[A]=Number.NaN;return n}const Xd={motif:Ou,restriction:Jd,peaks:hd,composition:eI,dotplot:CI,oriter:DI,metaplot:wu,trackcorr:qd,frip:Jh,groupsignal:nu,overlap:LI},Vd="0.20.0",Zd="40ec1ec";function jd(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#"))continue;const r=s.split(/\s+/);if(r.length<5)return[];const[o,i,a,c,l]=[r[0],Number(r[1]),Number(r[2]),Number(r[3]),Number(r[4])];if([i,a,c,l].some(f=>!Number.isInteger(f)||f<0))return[];if(c===0||l<c)return[];n.has(o)||(n.add(o),e.push({name:o,length:i,offset:a,lineBases:c,lineWidth:l}))}return e}function tC(t){return t.map(e=>({name:e.name,length:e.length}))}function cn(t,e){const n=Math.floor(e/t.lineBases);return t.offset+n*t.lineWidth+(e-n*t.lineBases)}function eC(t,e,n){const A=Math.max(0,Math.min(t.length,Math.floor(e))),s=Math.max(A,Math.min(t.length,Math.ceil(n)));return s<=A?{from:cn(t,A),to:cn(t,A)}:{from:cn(t,A),to:cn(t,s-1)+1}}function nC(t){let e=0;for(let s=0;s<t.length;s++)t[s]>32&&e++;if(e===t.length)return t;const n=new Uint8Array(e);let A=0;for(let s=0;s<t.length;s++)t[s]>32&&(n[A++]=t[s]);return n}const ma=/\.(fa|fasta|fna|fas)$/i;function AC(t){if(/\.b?gz$/i.test(t))return`${t}.tbi`;if(/\.bam$/i.test(t))return`${t}.bai`;if(ma.test(t))return`${t}.fai`}const JA=18,sC=4,rC=/\.(biginteract|interact)(\.b?gz)?$/i;function oC(t){return t!==void 0&&t!==""&&Number.isFinite(Number(t))}function fo(t){return t==="+"||t==="-"||t==="."||t===""}function wa(t,e=""){const n=rC.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<sC;){let o=t.indexOf(`
|
|
18
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!iC(c,n))return!1;A++}return A>0}function iC(t,e){if(e?t.length<JA:t.length!==JA)return!1;for(const n of[1,2,9,10,14,15])if(!R(t[n]))return!1;return!R(t[4])||!oC(t[5])||!e&&!(fo(t[12])&&fo(t[17]))?!1:e||aC(t)}function aC(t){const e=t[0],n=Number(t[1]),A=Number(t[2]);if(!(A>n))return!1;let s=!1;for(const[r,o,i]of[[8,9,10],[13,14,15]])if(t[r]===e&&(s=!0,Number(t[o])<n||Number(t[i])>A))return!1;return s}function pa(t){const e=new $n;let n=0;if(wt(t,A=>{if(A.length<JA){n++;return}const s=A[9],r=A[10],o=A[14],i=A[15];if(!R(s)||!R(r)||!R(o)||!R(i)){n++;return}const a=Cn(A[11]),c=Cn(A[16]);e.add(A[8]??"",Number(s),Number(r),A[13]??"",Number(o),Number(i),{score:gC(A[5]),name:Cn(A[3])||lC(a,c),detail:cC(A,a,c)})}),e.length===0)throw new Error(`No usable rows: all ${n} lines failed the eighteen-column test an interact file is made of. UCSC writes BED5+13 — chrom, start, end, name, score, value, exp, colour, then the source and target triples and their strands.`);return e.finish()}function cC(t,e,n){const A=[],s=Cn(t[6]);s!==""&&A.push(`exp ${s}`);const r=t[4];r!==void 0&&r!==""&&r!=="0"&&A.push(`score ${r}`),(e!==""||n!=="")&&A.push(`${e||"?"} → ${n||"?"}`);const o=`${ho(t[12])}${ho(t[17])}`;return o!==".."&&A.push(`strands ${o}`),A.join(ct)}function lC(t,e){return t===""&&e===""?"":`${t||"?"}/${e||"?"}`}function Cn(t){return t===void 0||t==="."?"":t}function ho(t){return t==="+"||t==="-"?t:"."}function gC(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}function fC(t){return/\bsourceChrom\b/.test(t)&&/\btargetChrom\b/.test(t)}function hC(t){let e=0;for(let A=0;A<t.length;A++)t.contig1[A]!==t.contig2[A]&&e++;const n=[`${t.length.toLocaleString()} interaction${t.length===1?"":"s"}`];return e>0&&n.push(`${e.toLocaleString()} between sequences`),n.join(" · ")}const ya=/^([^\s:]+):(\d+)-(\d+)(?:,(.+))?$/,uC=4,IC=/\.(longrange|longtabix)(\.(bed|txt))?(\.b?gz)?$/i;function Na(t,e=""){const n=IC.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<uC;){let o=t.indexOf(`
|
|
19
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!n&&c.length!==4||!R(c[1])||!R(c[2])||c[3]===void 0||!ya.test(c[3]))return!1;A++}return A>0}function ka(t){const e=new $n,n=new Set;let A=0,s=0;if(wt(t,o=>{if(o.length<4||!R(o[1])||!R(o[2])){A++;return}const i=ya.exec(o[3]??"");if(i===null){A++;return}const a={contig:o[0]??"",start:Number(o[1]),end:Number(o[2])},c={contig:i[1],start:Number(i[2]),end:Number(i[3])},l=i[4]===void 0||i[4]===""?Number.NaN:Number(i[4]),[g,f]=a.contig<c.contig||a.contig===c.contig&&a.start<=c.start?[a,c]:[c,a],h=`${g.contig}:${g.start}-${g.end}|${f.contig}:${f.start}-${f.end}|${i[4]??""}`;if(n.has(h)){s++;return}n.add(h),e.add(a.contig,a.start,a.end,c.contig,c.start,c.end,{score:l,detail:Number.isFinite(l)?`score ${i[4]}`:""})}),e.length===0)throw new Error(`No usable rows: all ${A} lines failed the "contig, start, end, chrom:start-end,score" test a longrange file is made of.`);const r=e.finish();return ba.set(r,s),r}const ba=new WeakMap;function dC(t){const e=[`${t.length.toLocaleString()} interaction${t.length===1?"":"s"}`],n=ba.get(t)??0;n>0&&e.push(`${n.toLocaleString()} reciprocal lines folded in`);let A=0;for(let s=0;s<t.length;s++)t.contig1[s]!==t.contig2[s]&&A++;return A>0&&e.push(`${A.toLocaleString()} between sequences`),e.join(" · ")}const CC=10,QC=11,hA=10,BC=4,EC=/(\.(genepred|genepredext|refflat)(\.txt)?(\.gz)?|refgene\.txt(\.gz)?)$/i;function Ma(t){for(const e of[0,1,2])if(!(t.length<e+CC)&&mC(t,e))return e;return-1}function mC(t,e){const n=t[e+2];if(n!=="+"&&n!=="-")return!1;for(const l of[3,4,5,6,7])if(!R(t[e+l]))return!1;const A=Number(t[e+3]),s=Number(t[e+4]),r=Number(t[e+5]),o=Number(t[e+6]),i=Number(t[e+7]);if(!(s>A)||i<1||r<A||o>s||o<r)return!1;const a=Ln(t[e+8]),c=Ln(t[e+9]);if(a===null||c===null||a.length!==i||c.length!==i||a[0]!==A||c[i-1]!==s)return!1;for(let l=0;l<i;l++)if(c[l]<a[l]||l>0&&a[l]<c[l-1])return!1;return!0}function Ln(t){if(t===void 0||t==="")return null;const e=t.split(",").filter(A=>A!=="");if(e.length===0)return null;const n=[];for(const A of e){if(!R(A))return null;const s=Number(A);if(s<0)return null;n.push(s)}return n}function Da(t,e=""){const n=EC.test(e);let A=0,s=0;const r=t.length;let o=-1;for(;s<r&&A<BC;){let i=t.indexOf(`
|
|
20
|
+
`,s);i<0&&(i=r);let a=i;a>s&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(s,a);if(s=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=Ma(l);if(g<0||o>=0&&g!==o&&!n)return!1;o=g,A++}return A>0}function Fa(t){const e=new et;let n=0,A=0;if(wt(t,r=>{const o=Ma(r);if(o<0){n++;return}const i=Number(r[o+3]),a=Number(r[o+4]),c=Number(r[o+5]),l=Number(r[o+6]),g=Ln(r[o+8])??[],f=Ln(r[o+9])??[],h=[];for(let d=0;d<g.length;d++)h.push(g[d],f[d]);const u=yC(r[o]),I=wC(r,o);l>c&&A++,e.add(r[o+1]??"",i,a,{strand:r[o+2]==="+"?1:-1,score:o+hA<r.length&&R(r[o+hA])?Number(r[o+hA]):Number.NaN,name:I===""?u:I,id:u,detail:pC(r,o,I,u,g.length),...h.length===0?{}:{exons:h},...l>c?{cds:[c,l]}:{}})}),e.length===0)throw new Error(`No usable rows: all ${n} lines failed the genePred test — a name, a contig, a strand, four coordinates, an exon count and two comma-separated lists of that length.`);const s=e.finish();return Sa.set(s,A),s}function wC(t,e){const n=t[e+QC];if(n!==void 0&&n!==""&&n!==".")return n;if(e===0)return"";const A=t[e-1];return A===void 0||A===""||A==="."||R(A)?"":A}function pC(t,e,n,A,s){const r=[`${s} exon${s===1?"":"s"}`];n!==""&&n!==A&&r.push(`gene ${n}`);const o=t[e+12],i=t[e+13];return o!==void 0&&/^(cmpl|incmpl|none|unk)$/.test(o)&&r.push(`cds ${o}/${i??"?"}`),r.join(ct)}function yC(t){return t===void 0||t==="."?"":t}const Sa=new WeakMap;function NC(t){return/\bcdsStartStat\b/.test(t)&&/\bexonFrames\b/.test(t)}function Ms(t){const e=t.exonStart.length,n=[`${t.length.toLocaleString()} transcript${t.length===1?"":"s"}`,`${e.toLocaleString()} exons`],A=Sa.get(t);return A!==void 0&&A<t.length&&n.push(`${A.toLocaleString()} coding`),n.join(" · ")}const uo=/^(gneg|gpos\d{0,3}|acen|gvar|stalk)$/,OA="stain",kC=8;function Ra(t){return!R(t[1])||!R(t[2])?null:t.length===5&&uo.test(t[4])?{name:t[3],stain:t[4]}:t.length===4&&uo.test(t[3])?{name:"",stain:t[3]}:null}function La(t){let e=0,n=0;const A=t.length;for(;n<A&&e<kC;){let s=t.indexOf(`
|
|
21
|
+
`,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o===""||o.charCodeAt(0)===35||o.startsWith("track ")||o.startsWith("browser "))continue;const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(Ra(i)===null)return!1;e++}return e>0}function bC(t){if(t==="gneg")return 0;if(t.startsWith("gpos")){const e=t.slice(4);if(e==="")return 100;const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):100}return Number.NaN}function MC(t){const e=t.indexOf(`${OA} `);if(e<0)return"";const n=e+OA.length+1,A=t.indexOf(" ",n);return A<0?t.slice(n):t.slice(n,A)}function Ga(t){const e=new et;let n=0;if(wt(t,A=>{const s=Ra(A);if(s===null){n++;return}e.add(A[0],Number(A[1]),Number(A[2]),{name:s.name,score:bC(s.stain),detail:`${OA} ${s.stain}`})}),e.length===0&&n>0)throw new Error(`No usable rows: all ${n} lines failed the "sequence, start, end, band, stain" test a cytoBand is made of.`);return e.finish()}function DC(t){const e=[];for(let n=0;n<t.contigs.length;n++){const A=t.contigAt[n],s=t.contigAt[n+1];if(s<=A)continue;let r=0;for(let o=A;o<s;o++){if(t.start[o]!==r)return null;r=t.end[o]}e.push({name:t.contigs[n],length:r})}return e.length>0?e:null}function xa(t){let e=0,n=0;for(let r=0;r<t.length;r++)MC(t.detail[r])==="acen"&&e++,t.name[r]!==""&&n++;const A=t.contigAt.reduce((r,o,i)=>i<t.contigs.length&&t.contigAt[i+1]>t.contigAt[i]?r+1:r,0),s=[`${x.int(t.length)} band${t.length===1?"":"s"}`,`${x.int(A)} sequence${A===1?"":"s"}`];return n<t.length&&s.push(`${x.int(n)} named`),e>0&&s.push(`${x.int(e)} centromeric`),s.join(" · ")}const FC=["non-canonical","GT/AG","GT/AG","GC/AG","GC/AG","AT/AC","AT/AC"],SC="multi",RC="motif",YA="annotated",LC="overhang",GC="anchors",xC=8;function vC(t){const e=[];let n=!1,A=0;const s=t.length;for(;A<s&&e.length<xC;){let r=t.indexOf(`
|
|
22
|
+
`,A);r<0&&(r=s);let o=r;o>A&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(A,o);if(A=r+1,!(i===""||i.charCodeAt(0)===35)){if(i.startsWith("track ")){/junction/i.test(i)&&(n=!0);continue}i.startsWith("browser ")||e.push(i.includes(" ")?i.split(" "):i.trim().split(/\s+/))}}return{rows:e,declared:n}}function va(t){if(t.length!==9)return!1;for(let s=1;s<9;s++)if(!R(t[s]))return!1;const e=Number(t[3]),n=Number(t[4]),A=Number(t[5]);return Number(t[2])>=Number(t[1])&&e>=0&&e<=2&&n>=0&&n<=6&&(A===0||A===1)}function Ua(t){if(t.length<12||!R(t[1])||!R(t[2])||t[9]!=="2")return null;const e=t[10].split(",").filter(a=>a!==""),n=t[11].split(",").filter(a=>a!=="");if(e.length!==2||n.length!==2||!e.every(R)||!n.every(R))return null;const A=Number(t[1]),s=Number(t[2]),r=Number(e[0]),o=Number(e[1]),i=Number(n[1]);return Number(n[0])!==0||A+i+o!==s||r<=0||o<=0||i<=r?null:[A+r,i-r,o]}function Ta(t){return t.length===6&&R(t[1])&&R(t[2])&&R(t[4])&&(t[5]==="+"||t[5]==="-"||t[5]===".")}function Ds(t,e=""){const{rows:n,declared:A}=vC(t);if(n.length===0)return null;if(n.every(va))return"star";const s=/junc|(^|[._-])sj([._-]|$)/i.test(e.replace(/\.b?gz$/i,"")),r=n.every(o=>/^JUNC/i.test(o[3]??""));return(s||A||r)&&n.every(o=>Ua(o)!==null)?"bed":/\.junc(\.b?gz)?$/i.test(e)&&n.every(Ta)?"junc":null}function Io(t){return t==="+"?1:t==="-"?-1:0}function UC(t){if(t===void 0||t===""||t===".")return Number.NaN;const e=Number(t);return Number.isFinite(e)?e:Number.NaN}function $a(t,e="",n){const A=Ds(t,e);if(A===null)throw new Error("This is not a junction file STAR, regtools or leafcutter wrote.");const s=new et;let r=0;if(wt(t,o=>{if(A==="star"){if(!va(o)){r++;return}const i=Number(o[3]),a=Number(o[4]),c=[`${SC} ${o[7]}`,`${RC} ${FC[a]}`,`${YA} ${o[5]==="1"?"yes":"no"}`,`${LC} ${o[8]}`].join(ct);s.add(o[0],Number(o[1])-1,Number(o[2]),{strand:i===1?1:i===2?-1:0,score:Number(o[6]),detail:c});return}if(A==="bed"){const i=Ua(o);if(i===null){r++;return}const[a,c,l]=i,g=a-Number(o[1]),f=o[3]!==void 0&&o[3]!=="."?o[3]:"";s.add(o[0],a,a+c,{strand:Io(o[5]),score:UC(o[4]),name:f,detail:`${GC} ${g}/${l}`});return}if(!Ta(o)){r++;return}s.add(o[0],Number(o[1]),Number(o[2]),{strand:Io(o[5]),score:Number(o[4]),name:o[3]!=="."?o[3]:""})}),s.length===0&&r>0)throw new Error(`No usable rows: all ${r} lines failed the junction test for this file's shape.`);return s.finish()}function Ja(t){let e=0,n=0,A=!1;for(let r=0;r<t.length;r++){const o=t.score[r];Number.isFinite(o)&&(e+=o);const i=t.detail[r];i.includes(`${YA} `)&&(A=!0,i.includes(`${YA} yes`)&&n++)}const s=[`${x.int(t.length)} junction${t.length===1?"":"s"}`,`${x.int(e)} read${e===1?"":"s"}`];return A&&s.push(`${x.int(n)} annotated`),s.join(ct)}const _A=11,Gn=9,KA=10,TC=4,$C=/\.(bedmethyl|bigmethyl|bed ?methyl)(\.b?gz)?$/i;function Oa(t,e=""){const n=$C.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<TC;){let o=t.indexOf(`
|
|
23
|
+
`,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!JC(c,n))return!1;A++}return A>0}function JC(t,e){if(t.length<_A||!R(t[1])||!R(t[2]))return!1;const n=Number(t[KA]);if(t[KA]===""||!Number.isFinite(n))return!1;if(e)return!0;if(!R(t[Gn])||Number(t[Gn])<0||n<0||n>100)return!1;const A=t[5];return A!=="+"&&A!=="-"&&A!=="."?!1:Number(t[2])-Number(t[1])===1}function Ya(t){const e=new Map;Qo(t,c=>{if(c.length<_A||!R(c[1])||!R(c[2]))return;const l=Co(c[3]);e.set(l,(e.get(l)??0)+1)});const n=[...e.entries()].map(([c,l])=>({code:c,label:Vl(c),rows:l})).sort((c,l)=>l.rows-c.rows||c.code.localeCompare(l.code));if(n.length===0)throw new Error("This looks like a bedMethyl but holds no usable rows.");const A=n[0].code,s=new Map;let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,i=0,a=0;if(Qo(t,c=>{if(c.length<_A||!R(c[1])||!R(c[2])||Co(c[3])!==A)return;const l=Number(c[1]),g=Number(c[2]);if(g<=l)return;const f=Number(c[KA]);if(!Number.isFinite(f))return;const h=R(c[Gn])?Number(c[Gn]):0;if(h<=0)return;const u=c[0]??"";let I=s.get(u);I===void 0&&(I=new Qs(u),s.set(u,I)),I.push(l,g,f),i++,a+=h,f<r&&(r=f),f>o&&(o=f)}),i===0)throw new Error("This looks like a bedMethyl but every row rests on zero reads, so there is no measurement to draw.");return{signal:Bs(s,i,r,o),codes:n,drawn:A,meanCoverage:a/i}}function Co(t){return t===void 0||t===""||t==="."?"?":t}function Qo(t,e){for(const n of t.split(`
|
|
24
|
+
`)){let A=n;A.endsWith("\r")&&(A=A.slice(0,-1)),!(A===""||A.charCodeAt(0)===35)&&(A.startsWith("track ")||A.startsWith("browser ")||e(A.includes(" ")?A.split(" "):A.trim().split(/\s+/)))}}function OC(t){return/\b(percentMod|percentMeth|fractionModified)\b/.test(t)&&/\b(validCov|coverage|Nvalid_cov)\b/.test(t)}function YC(t){const e=t.codes.find(s=>s.code===t.drawn),n=[`${t.signal.length.toLocaleString()} ${e?.label??t.drawn} calls`,`${t.meanCoverage.toFixed(1)}× mean depth`],A=t.codes.filter(s=>s.code!==t.drawn);return A.length>0&&n.push(`not drawn: ${A.map(s=>`${s.label} (${s.rows.toLocaleString()})`).join(", ")}`),n.join(" · ")}const xn=440477507,vn=".2bit",_a=16,_C=new Uint8Array([84,67,65,71]),KC=78;function Ka(t){if(t.length<4)return!1;const e=new DataView(t.buffer,t.byteOffset,4);return e.getUint32(0,!0)===xn||e.getUint32(0,!1)===xn}function qC(t){if(t.length<_a)throw new Error("This file starts like a .2bit and is too short to hold one.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint32(0,!0)===xn;if(!n&&e.getUint32(0,!1)!==xn)throw new Error("This is not a .2bit: its first four bytes are not the format’s signature.");const A=e.getUint32(4,n);if(A!==0)throw new Error(`This is a .2bit of version ${A}. This viewer reads version 0 — the ordinary one, with 32-bit offsets. Version 1 is the “long” variant for files past 4 GB, whose offsets and sizes are 64-bit, and reading one as though it were version 0 would return wrong residues rather than fail. Convert it with \`twoBitToFa\` and \`faToTwoBit\`.`);const s=e.getUint32(8,n);if(s===0)throw new Error("This .2bit declares no sequences.");return{littleEndian:n,version:A,count:s}}function Bo(t,e,n=_a){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=[];let r=n;const o=new TextDecoder;for(;s.length<e.count&&!(r+1>t.length);){const i=t[r];if(r+1+i+4>t.length)break;const a=o.decode(t.subarray(r+1,r+1+i)),c=A.getUint32(r+1+i,e.littleEndian);s.push({name:a,offset:c}),r+=1+i+4}return{entries:s,complete:s.length===e.count,consumed:r}}function Eo(t,e,n,A={}){if(e+8>t.length)return 8;const s=new DataView(t.buffer,t.byteOffset,t.byteLength),r=qa(s,e,n,A),o=e+8+r*8;return o+4>t.length?o+4-e:null}function qa(t,e,n,A){return nt(t.getUint32(e+4,n),{format:vn,field:`N-block count${A.name===void 0?"":` of ${A.name}`}`,ceiling:t.getUint32(e,n),...A.fileLeft===void 0?{}:{available:A.fileLeft-8-4},bytesPerItem:8})}function HC(t,e,n,A,s=0,r){const o=new DataView(e.buffer,e.byteOffset,e.byteLength),i=o.getUint32(n,A),a=qa(o,n,A,{name:t,fileLeft:e.length-n}),c=new Int32Array(a),l=new Int32Array(a),g=n+8,f=g+a*4;for(let d=0;d<a;d++){const C=o.getUint32(g+d*4,A);c[d]=C,l[d]=C+o.getUint32(f+d*4,A)}const h=f+a*4,u=nt(o.getUint32(h,A),{format:vn,field:`mask-block count of ${t}`,ceiling:i,...r===void 0?{}:{available:r-(s+h+4)-4},bytesPerItem:8}),I=s+h+4+u*8+4;return r!==void 0&&rs(I,Math.ceil(i/4),{format:vn,field:`packed bases of ${t}`,size:r}),{name:t,length:i,nStarts:c,nEnds:l,dnaAt:I}}const WC=8192;function PC(t,e,n){const A=Math.max(0,Math.min(e,t.length)),s=Math.max(A,Math.min(n,t.length)),r=Math.floor(A/4),o=Math.ceil(s/4);return{from:t.dnaAt+r,to:t.dnaAt+o,firstBase:r*4}}function zC(t,e,n,A,s){const r=Math.max(0,Math.min(A,n.length)),o=Math.max(r,Math.min(s,n.length)),i=new Uint8Array(o-r);for(let a=r;a<o;a++){const c=a-e,l=t[c>>2];if(l===void 0)break;const g=6-((c&3)<<1);i[a-r]=_C[l>>g&3]}for(let a=0;a<n.nStarts.length;a++){const c=n.nStarts[a];if(c>=o)break;const l=n.nEnds[a];l<=r||i.fill(KC,Math.max(r,c)-r,Math.min(o,l)-r)}return i}function XC(t){return t.map(e=>({name:e.name,length:e.length}))}const mo=65536,wo=1e5;async function VC(t,e){let n=await t(mo,0);const A=qC(n);if(A.count>wo)throw new Error(`This .2bit declares ${A.count.toLocaleString()} sequences, which is past the ${wo.toLocaleString()} this viewer will open one record at a time. A file that says this is far more likely to be truncated than to be an assembly.`);let s=Bo(n,A);for(;!s.complete;){const a=await t(mo,n.length);if(a.length===0)throw new Error(`This .2bit ends part-way through its index: it declares ${A.count.toLocaleString()} sequences and names ${s.entries.length.toLocaleString()}. The file is truncated.`);const c=new Uint8Array(n.length+a.length);c.set(n),c.set(a,n.length),n=c,s=Bo(n,A)}const r=new Map,o=[];let i=0;for(const a of s.entries){e!==void 0&&rs(a.offset,8,{format:vn,field:`index entry for ${a.name}`,size:e});const c={name:a.name,...e===void 0?{}:{fileLeft:e-a.offset}};let l=await t(WC,a.offset),g=Eo(l,0,A.littleEndian,c);for(;g!==null;){const h=await t(g,a.offset);if(h.length<=l.length)throw new Error(`This .2bit ends part-way through the record for ${a.name}.`);l=h,g=Eo(l,0,A.littleEndian,c)}const f=HC(a.name,l,0,A.littleEndian,a.offset,e);r.set(f.name,f),o.push(f),i+=f.length}return{ordered:o,records:r,total:i}}const ZC=2291137574,jC=2273964779,po=[137,72,68,70,13,10,26,10];function tQ(t){return t.length<po.length?!1:po.every((e,n)=>t[n]===e)}function Ha(t){if(t.length<4)return null;const e=new DataView(t.buffer,t.byteOffset,4);for(const n of[!0,!1]){const A=e.getUint32(0,n);if(A===ZC)return"bigwig";if(A===jC)return"bigbed"}return null}function ft(t,e){const n=pe(cl(t),e);for(let A=0;A<n.names.length;A++)t[A]=n.names[A];return n}function Z(t,e,n){const A=pl(t,za(e)),s=eQ(t,e),r=n?.contested??[];return{...A,...s===null?{}:{genomes:s},...r.length===0?{}:{contested:r.slice(0,4).map(o=>`${o.asked} → ${o.name}`)}}}function eQ(t,e){const n=new Set;for(const r of e)r.genome!==void 0&&r.genome!==""&&n.add(r.genome);if(n.size===0)return null;const A=new Set(t),s=new Set;for(const r of e)r.genome===void 0||r.genome===""||A.has(r.name)&&s.add(r.genome);return{matched:s.size,total:n.size,named:[...s].slice(0,4)}}function qn(t,e){const n=t.bases.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.bases.get(t.contigs[A].name)}function Fs(t,e){const n=t.records.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.records.get(t.contigs[A].name)}async function Wa(t,e,n,A,s){const r=Fs(t,e);if(r===void 0)return;const o=Math.max(0,Math.floor(n)),i=Math.min(r.length,Math.ceil(A));if(!(i>o))return new Uint8Array(0);const a=t.held.get(r.name);if(a!==void 0&&a.start<=o&&a.start+a.bases.length>=i)return a.bases.subarray(o-a.start,i-a.start);const c=await Pa(t,r,o,i,s);return t.held.set(r.name,{start:o,bases:c}),c}async function Pa(t,e,n,A,s){const r=s===void 0?{}:{onProgress:s};if(_t(t)){const i=e,a=PC(i,n,A),c=await t.handle.read(a.to-a.from,a.from,r);return zC(c,a.firstBase,i,n,A)}const o=eC(e,n,A);return nC(await t.handle.read(o.to-o.from,o.from,r))}function za(t){return t.map(e=>e.name)}const Ss=new Map,Hn=new Map;function Rs(t){return t.indexed===!0}function _t(t){return t.twobit===!0}function we(t){return Rs(t)||_t(t)}const re=new Map,qA=new Map,Wn=new Map,Un=new Map;function nQ(t,e){return`${tt(t)}|${tt(e)}`}const yo=8<<20,Ls=3e8,HA=64e6,No=4e6;let Dt=null,oe=null;function tt(t){return t.kind==="local"?`${t.name}|${t.file.size}`:t.url}self.onmessage=t=>{sQ(t.data)};const AQ=Mh();setInterval(()=>{const t={type:"busy",fraction:AQ.busy()};self.postMessage(t)},bh);const Pn=new Set,WA=new Set;let PA=0;function zA(t){return Pn.has(t)}async function Gs(t){return await Es(),!Pn.has(t)}function ze(){const t=new Error("cancelled");return t.name="AbortError",t}async function sQ(t){WA.add(t.id);try{const e=await rQ(t);if(zA(t.id))throw ze();const n={type:"result",id:t.id,payload:e};self.postMessage(n,ph(e))}catch(e){const n={type:"error",id:t.id,message:e instanceof Error?e.message:String(e),...e instanceof Error&&e.name==="AbortError"?{cancelled:!0}:{}};self.postMessage(n)}finally{WA.delete(t.id),Pn.delete(t.id),t.id>PA&&(PA=t.id)}}function Qn(t){return(e,n)=>{const A={type:"progress",id:t,done:e,total:n??0};self.postMessage(A)}}async function rQ(t){switch(t.kind){case"load":return hQ(t.entry,t.source,t.mapContigs,Qn(t.id));case"sample":return Ac(t.entry,t.regions,t.basesPerPixel,t.reads,t.id,t.exact===!0);case"register":return qA.set(t.entry,t.vector),null;case"run":return oQ(t);case"bases":return NQ(t.entry,t.regions,Qn(t.id));case"assembly":return iQ(t.source,Qn(t.id));case"reads":return YQ(t.entry,t.regions,t.maxRows,t.basesPerPixel,t.reads,t.id);case"cancel":return(WA.has(t.target)||t.target>PA)&&Pn.add(t.target),null;case"drop":{Ss.delete(t.entry);const e=re.get(t.entry);e!==void 0&&oe?.store===e&&(oe=null),re.delete(t.entry),qA.delete(t.entry),Hn.delete(t.entry),Wn.delete(t.entry);for(const[n,A]of Un)if(A.holders.delete(t.entry)){A.holders.size===0&&Un.delete(n);break}return null}}}async function oQ(t){const e=Xd[t.task];if(e===void 0)throw new Error(`no track analysis runner is registered for the task ${t.task}`);const n=[],A=performance.now(),s={params:t.params,framing:t.framing,inputs:t.inputs,cancelled:()=>zA(t.id),throwIfCancelled:()=>{if(zA(t.id))throw ze()},progress:(o,i,a)=>{const c={type:"progress",id:t.id,done:o,total:i,...a===void 0?{}:{note:a}};self.postMessage(c)},note:o=>{n.push(o)},sample:(o,i,a)=>Ac(o,i,a,void 0,t.id),lengthOf:o=>t.inputs.contigLengths?.[o],residues:o=>{const i=re.get(o);if(i!==void 0)return we(i)?{contigs:i.contigs,bases:()=>{},read:async(a,c,l)=>{const g=Fs(i,a);if(g===void 0)return;const f=Math.max(0,Math.floor(c)),h=Math.min(g.length,Math.ceil(l));return h>f?Pa(i,g,f,h):new Uint8Array(0)},refusal:_t(i)?`This .2bit is read by range rather than held, so its sequences are not here whole to read. A FASTA under ${x.int(HA/1e6)} MB is held whole (\`twoBitToFa\`).`:`This FASTA is read by range from its index rather than held, so its sequences are not here whole to read. A FASTA under ${x.int(HA/1e6)} MB is held whole.`}:{contigs:i.contigs,bases:a=>qn(i,a)}}};return{outputs:await e(s),provenance:{task:t.task,taskVersion:0,params:t.params,framing:t.framing,app:[Vd,Zd].filter(o=>o!=="").join(" "),createdAt:new Date().toISOString()},notes:n,ms:performance.now()-A}}async function iQ(t,e){const n=Gt(t),A=await n.read(64,0);if(tQ(A))return{format:"hdf5",contigs:[],origin:"features",exact:!0};const s=Ha(A);if(s!==null){const h=await(s==="bigwig"?new Jo({filehandle:Gt(t)}):new Yo({filehandle:Gt(t)})).getHeader();return{format:s,contigs:xs(h),origin:s,exact:!0}}if(We(A)){const f=await ke(n,t),h=await sc(n,f??Number.MAX_SAFE_INTEGER);if(h!==null)return{format:"bam",contigs:h.refs.map(u=>({name:u.name,length:u.length})),origin:"bam",exact:!0}}if(kn(A))return{format:"fasta",contigs:(await tc(t,n,e)).contigs,origin:"fasta",exact:!0};if(Ka(A))return{format:"twobit",contigs:(await ec(t,n,e)).contigs,origin:"twobit",exact:!0};const r=await n.readFile({onProgress:e}),o=await gs(r);if(kn(o))return{format:"fasta",contigs:Us(t,o).contigs,origin:"fasta",exact:!0};const i=new TextDecoder().decode(o);if(i.trim()==="")throw new Error("This file is empty.");if(Fh(i,t.name))return Dt={key:tt(t),format:"sizes",features:null},{format:"sizes",contigs:Dh(i),origin:"sizes",exact:!0};if(Ai(i)){const f=ag(i);if(f.length>0)return{format:"vcf",contigs:f,origin:"vcf",exact:!0};const h=oi(i),u=new Map;for(let I=0;I<h.length;I++)lt(u,h.contigs[h.contig[I]],h.end[I]);return{format:"vcf",contigs:It(u),origin:"features",exact:!1}}if(ds(A)){const f=await ja(n),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(yA(i,t.name)||pA(i,t.name)||Bi(i,t.name)){const f=yA(i,t.name)?ki(i,t.name):pA(i,t.name)?wi(i,t.name):pi(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(hi(i,t.name)){const f=di(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"barchart",contigs:It(h),origin:"features",exact:!1}}if(La(i)){const f=Ga(i);Dt={key:tt(t),format:"cytoband",features:f};const h=DC(f);if(h!==null)return{format:"cytoband",contigs:h,origin:"cytoband",exact:!0};const u=new Map;for(let I=0;I<f.length;I++)lt(u,f.contigs[f.contig[I]],f.end[I]);return{format:"cytoband",contigs:It(u),origin:"features",exact:!1}}if(Ds(i,t.name)!==null){const f=$a(i,t.name);Dt={key:tt(t),format:"junctions",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"junctions",contigs:It(h),origin:"features",exact:!1}}if(wa(i,t.name)){const f=pa(i);return{format:"interact",contigs:uA(f),origin:"features",exact:!1}}if(Na(i,t.name)){const f=ka(i);return{format:"longrange",contigs:uA(f),origin:"features",exact:!1}}if(Da(i,t.name)){const f=Fa(i);Dt={key:tt(t),format:"genepred",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"genepred",contigs:It(h),origin:"features",exact:!1}}if(Oa(i,t.name)){const{signal:f}=Ya(i),h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:"bedmethyl",contigs:It(h),origin:"features",exact:!1}}const a=Gi(i);if(a!==null){const f=a==="wig"?vi(i):xi(i);Dt={key:tt(t),format:a,features:null};const h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:a,contigs:It(h),origin:"features",exact:!1}}const c=ii(i,t.name);if(c==="bedpe"){const f=fi(i);return Dt={key:tt(t),format:c,features:null},{format:c,contigs:uA(f),origin:"features",exact:!1}}const l=c==="gtf"?li(i):hs(i,t.name);Dt={key:tt(t),format:c,features:l};const g=new Map;for(let f=0;f<l.length;f++)lt(g,l.contigs[l.contig[f]],l.end[f]);return{format:c,contigs:It(g),origin:"features",exact:!1}}function xs(t){return Object.values(t.refsByNumber).sort((e,n)=>e.id-n.id).map(e=>({name:e.name,length:e.length}))}function lt(t,e,n){const A=t.get(e);(A===void 0||n>A)&&t.set(e,n)}function uA(t){const e=new Map;for(let n=0;n<t.length;n++)lt(e,t.contigs[t.contig1[n]],t.end1[n]),lt(e,t.contigs[t.contig2[n]],t.end2[n]);return It(e)}function It(t){const e=[];for(const[n,A]of t){const s=10**Math.max(0,Math.floor(Math.log10(Math.max(1,A)))-2);e.push({name:n,length:(Math.floor(A/s)+1)*s})}return e}const Zt=new Map,aQ=8;function Gt(t){if(t.kind==="local")return new lc(t.file);const{credential:e,headers:n}=t,A=`${t.url}|${e===void 0?"":JSON.stringify(e)}|${n===void 0?"":JSON.stringify(n)}`,s=Zt.get(A);if(s!==void 0)return Zt.delete(A),Zt.set(A,s),s;const r=e===void 0&&n===void 0?new wr(t.url):new wr(t.url,{fetch:(o,i)=>{const a=typeof o=="string"?o:o.url;return fetch(o,Oi(i,{url:a,...n===void 0?{}:{headers:n},...e===void 0?{}:{credential:e}}))}});for(Zt.set(A,r);Zt.size>aQ;){const o=Zt.keys().next().value;Zt.delete(o)}return r}async function cQ(t,e,n,A){const s=vs(t);if(s===null||!We(n))return null;try{const r=await Yt(await Gt(s).readFile()),o=El(r),i=await ke(e,t);if(i===null)return null;const a=ml(o,wl(o,za(A)),i);if(a.length===0||a.reduce((f,h)=>f+(h.to-h.from),0)>i*.8)return null;const l=[];for(const f of a){const h=await e.read(f.to-f.from,f.from),u=new TextDecoder().decode(await Yt(h,f.lastBlock-f.from));l.push(lQ(u,f.from===0,fQ(h,f,i)))}const g=l.join("");return g===""?null:g}catch{return null}}function lQ(t,e,n){let A=t;if(!e){const s=A.indexOf(`
|
|
25
25
|
`);A=s<0?"":A.slice(s+1)}if(!n&&!A.endsWith(`
|
|
26
26
|
`)){const s=A.lastIndexOf(`
|
|
27
|
-
`);A=s<0?"":A.slice(0,s+1)}return A}const
|
|
28
|
-
`),c=s.autoSql??"";if(vg(c)){const f=Pa(a,e.name,n);return i?{...f,summary:Le(f.summary)}:f}if(iC(c)){const f=Ha(a,n);return i?{...f,summary:Le(f.summary)}:f}if(UC(c)){const f=Wa(t,a,n);return i?{...f,summary:Le(f.summary)}:f}const l=fs(a,e.name);if(EC(c)){const f=ft(l.contigs,n),h={format:"genepred",contigs:l.contigs,overlap:Z(l.contigs,n,f),summary:bs(l),payload:{kind:"features",data:l}};return i?{...h,summary:Le(h.summary)}:h}const g=zA("bigbed",l,n);return{...g,summary:i?Le(g.summary):g.summary}}function Le(t){return`${t} · cut off at ${G.int(XA)}`}async function wQ(t,e,n){const A=new To({filehandle:xt(e)}),s=await A.getHeader(),r=pe(xs(s),n),o=r.names;Fs.set(t,{bigwig:A,refOf:r.sourceOf,refNames:Object.keys(s.refsByName)});const i=s.totalSummary,a=i!==void 0&&Number.isFinite(i.scoreMin)&&Number.isFinite(i.scoreMax)&&i.scoreMax>i.scoreMin;return{format:"bigwig",contigs:o,overlap:Z(o,n,r),summary:vs(o.length)+(a?` · ${ie(i.scoreMin)}–${ie(i.scoreMax)}`:""),...a?{fileExtent:{min:i.scoreMin,max:i.scoreMax}}:{}}}function pQ(t,e,n,A){const s=e==="wig"?Li(n):Ri(n);if(s.length===0)throw new Error(`This looks like a ${e==="wig"?"wig":"bedGraph"} but holds no usable intervals.`);const r=pe(s.contigs.map(g=>({name:g.name})),A);s.contigs.forEach((g,f)=>{g.name=r.names[f]});const o=new xi(s);Hn.set(t,o);const i=o.contigNames,{min:a,max:c}=o.extent,l=Number.isFinite(a)&&Number.isFinite(c)&&c>a;return{format:e,contigs:i,overlap:Z(i,A,r),summary:`${G.int(o.length)} intervals · ${vs(i.length)}`+(l?` · ${ie(a)}–${ie(c)}`:""),...l?{fileExtent:{min:a,max:c}}:{}}}function yQ(t,e,n){const A=[];let s=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(const o of e){if(!t.has(o.contig)||o.end<=o.start)continue;const i=t.samples(o.contig,o.start,o.end,n);if(i!==null){for(const a of i.values)Number.isFinite(a)&&(a<s&&(s=a),a>r&&(r=a));A.push({contig:o.contig,start:o.start,end:o.end,variant:null,...i})}}return{basesPerPixel:n,regions:A,extent:s<=r?{min:s,max:r}:null}}async function ja(t,e,n,A,s,r=!1){const o=Wn.get(t);if(o!==void 0)return RQ(s,o,e,n,A);const i=re.get(t);if(i!==void 0)return QQ(i,e,n,Qn(s));const a=Hn.get(t);if(a!==void 0)return yQ(a,e,n);const c=KA.get(t);if(c!==void 0)return Sh(c,e,n,r);const l=Fs.get(t);if(l===void 0)throw new Error("This track is no longer open. Drop the file again.");const g=C=>{const E=l.refOf.get(C);if(E!==void 0)return E;const B=Kt(l.refNames,C);if(!(B<0))return l.refOf.set(C,l.refNames[B]),l.refNames[B]},f=e.filter(C=>g(C.contig)!==void 0&&C.end>C.start);if(f.length===0)return{basesPerPixel:n,regions:[],extent:null};const h=await l.bigwig.getFeaturesAsArraysMulti(f.map(C=>({refName:g(C.contig)??C.contig,start:Math.max(0,Math.floor(C.start)),end:Math.ceil(C.end)})),{basesPerSpan:Math.max(1,n)}),u=[];let I=Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY;for(let C=0;C<f.length;C++){const E=h.regionOffsets[C],B=h.regionOffsets[C+1],Q=h.scores.slice(E,B);for(let m=0;m<Q.length;m++){const p=Q[m];Number.isFinite(p)&&(p<I&&(I=p),p>d&&(d=p))}u.push({contig:f[C].contig,start:f[C].start,end:f[C].end,starts:h.starts.slice(E,B),ends:h.ends.slice(E,B),values:Q,min:h.isSummary?h.minScores.slice(E,B):null,max:h.isSummary?h.maxScores.slice(E,B):null,variant:null,summary:h.isSummary})}return{basesPerPixel:n,regions:u,extent:I<=d?{min:I,max:d}:null}}const NQ=1<<18,ko=1<<24;async function tc(t,e){const n=Number.isFinite(e)&&e>0?e:Number.MAX_SAFE_INTEGER;let A=NQ;for(;;){let s;try{s=await Ot(await t.read(Math.min(A,n),0))}catch{return null}if(!Vo(s))return null;const r=Dl(s);if(r!==null)return r;if(A>=n||A>=ko)throw new Error("This BAM's header is truncated: its reference table does not end.");A=Math.min(A*4,ko)}}async function kQ(t,e,n,A,s,r,o){if(s.sortOrder==="queryname"||s.sortOrder==="unsorted")throw new Error(`${e.name} is sorted by ${s.sortOrder==="queryname"?"read name":"nothing"}, and reads are drawn by region. Run \`samtools sort -o sorted.bam ${e.name}\` and index the result.`);const i=Gs(e),a=i===null?`${tt(e)}|search`:VC(e,i),c=vn.get(a);let l=null,g=null,f="";if(c!==void 0)l=c.open.index,g=c.open.search,f=c.open.searched;else{if(i===null)f="no index dropped with it";else try{l=await df(await xt(i).readFile({onProgress:o}))}catch(C){const E=C instanceof Error?C.message:String(C);f=i.kind==="remote"?`no ${i.url.split("?")[0].split("/").pop()??"index"} beside it`:`${i.name} could not be read (${E})`}if(l===null){if(!Number.isFinite(r)||r<=0)throw new Error(`${e.name} has ${f}, and its length could not be learnt, so its reads cannot be located by search either. A BAM is read by region: publish its index beside it, or name one with \`${e.kind==="remote"?e.url:e.name}#index=<url of the .bai>\`.`);try{g=await ds.open(n,r,s,C=>o(C,0))}catch(C){if(C instanceof yA)throw new Error(bQ(e.name,s,C));const E=C instanceof Error?C.message:String(C);throw new Error(`${e.name} has ${f} and could not be read by search: ${E}. A BAM is read by region; run \`samtools index ${e.name}\` and publish the index beside it, or name one with \`#index=<url of the .bai>\`.`)}}}const h=pe(s.refs,A),u=h.names,I=new Map;for(let C=0;C<u.length;C++)I.set(u[C],C);for(let C=0;C<s.refs.length;C++)I.has(s.refs[C].name)||I.set(s.refs[C].name,C);const d=c?.open??{handle:n,header:s,index:l,search:g,searched:f,size:r,refIdOf:I,refNames:s.refs.map(C=>C.name)};return c===void 0?vn.set(a,{open:d,holders:new Set([t])}):c.holders.add(t),Wn.set(t,d),{format:"bam",contigs:u,overlap:Z(u,A,h),summary:`${G.int(s.refs.length)} reference${s.refs.length===1?"":"s"} · ${l!==null?l.format.toUpperCase():`${f} — reads located by search`}`}}function bQ(t,e,n){const A=e.sortOrder==="coordinate"?"its header says SO:coordinate, but":"its header has no @HD line to say so, and";return`${t} is not in coordinate order — ${A} the reads at byte ${G.int(n.before.block)} are on ${Ir(n.before,e.refs)} while those at byte ${G.int(n.after.block)}, later in the file, are on ${Ir(n.after,e.refs)}. Reads are drawn by region, which needs the file sorted and indexed: run \`samtools sort -o sorted.bam ${t}\` and \`samtools index sorted.bam\`. The alignment file a Hi-C pipeline writes is in read-pair order for its pairs step and is not made for browsing; its .pairs or its contact map is the file to open.`}const DQ=4e6;function MQ(t,e){if(t.search===null)return null;const n=e.reduce((A,s)=>A+(s.end-s.start),0);return e.length>1||n>DQ?`${FQ(n)} without an index — zoom in`:null}function FQ(t){return t>=1e6?`${ie(t/1e6)} Mb`:`${ie(t/1e3)} kb`}async function ec(t,e,n,A,s){const r=Math.max(0,Math.floor(n.start)),o=Math.ceil(n.end);return t.index!==null?pf(t.index,e,r,o,t.size):t.search===null?[]:t.search.spansFor(e,r,o,async()=>{if(!await Ls(A))throw ze()},s)}function nc(t){return t===void 0?Mi:{exclude:Xo|(t.hideDuplicates?At.DUPLICATE:0),minMapq:t.minMapq}}function SQ(t){const e=nc(t);return t.splits?{...e,exclude:e.exclude&-2049}:e}async function RQ(t,e,n,A,s){const r=I=>{const d=e.refIdOf.get(I);if(d!==void 0)return d;const C=Kt(e.refNames,I);if(!(C<0))return e.refIdOf.set(I,C),C},o=n.filter(I=>r(I.contig)!==void 0&&I.end>I.start);if(o.length===0)return{basesPerPixel:A,regions:[],extent:null};const i=MQ(e,o);if(i!==null)return{basesPerPixel:A,regions:[],extent:null,note:i};const a=[];for(const I of o){const d=r(I.contig);a.push({region:I,refId:d,spans:await ec(e,d,I,t,wo)})}const c=a.reduce((I,d)=>I+bi(d.spans),0);if(c>wo)return{basesPerPixel:A,regions:[],extent:null,note:`${G.bytes(c)} of reads — zoom in`};const l=[];let g=Number.POSITIVE_INFINITY,f=Number.NEGATIVE_INFINITY;const h=s?.modFraction===!0,u=[];for(const I of a){const d=I.region.end-I.region.start,C=Math.max(1,Math.min(4096,Math.round(d/Math.max(1,A)))),E=new Float64Array(C),B=new Map;u.push(B);const Q=A<=JQ?Ac(I.region):void 0,m=Q===void 0?null:new Float64Array(C),p=new Map;for(const D of I.spans){if(!await Ls(t))throw ze();const F=await e.handle.read(D.to-D.from,D.from),R=await Ot(F,D.lastBlock-D.from),v=Jf(R,D.dataFrom,I.refId,Math.floor(I.region.start),Math.ceil(I.region.end),C,nc(s),Q,p,h?{tally:B,threshold:s.modThreshold}:void 0);for(let x=0;x<C;x++)E[x]+=v.depth[x];if(m!==null&&v.variant!==null)for(let x=0;x<C;x++)m[x]+=v.variant[x]}const w=new Int32Array(C),y=new Int32Array(C),N=new Float32Array(C),k=m===null?null:new Float32Array(C),b=d/C;for(let D=0;D<C;D++)w[D]=Math.round(I.region.start+D*b),y[D]=Math.round(I.region.start+(D+1)*b),N[D]=E[D],k!==null&&m!==null&&(k[D]=m[D]),E[D]<g&&(g=E[D]),E[D]>f&&(f=E[D]);l.push({contig:I.region.contig,start:I.region.start,end:I.region.end,starts:w,ends:y,values:N,variant:k,junctions:xQ(p),min:null,max:null,summary:!1})}return h?LQ(A,l,u,s.modCode):{basesPerPixel:A,regions:l,extent:g<=f&&f>0?{min:0,max:f}:null}}function LQ(t,e,n,A){const s=new Map;for(const c of n)for(const[l,g]of c){const f=s.get(l)??[0,0];f[0]+=g.modified.reduce((h,u)=>h+u,0),f[1]+=g.calls.reduce((h,u)=>h+u,0),s.set(l,f)}const r=[...s.entries()].sort((c,l)=>l[1][0]-c[1][0]||l[1][1]-c[1][1]).map(([c])=>c),o=A!==""?A:r[0]??"";let i=!1;const a=e.map((c,l)=>{const g=n[l].get(o),f=new Float32Array(c.values.length).fill(Number.NaN);if(g!==void 0)for(let h=0;h<f.length;h++)g.calls[h]<=0||(f[h]=100*g.modified[h]/g.calls[h],i=!0);return{...c,values:f,variant:null,junctions:void 0}});return{basesPerPixel:t,regions:a,extent:i?{min:0,max:100}:null,mods:{code:o,codes:r},...r.length===0?{note:"no MM/ML modification calls here"}:{}}}function xQ(t){const e=[];for(const[s,r]of t){const[o,i,a]=s.split(":").map(Number);e.push([o,i,a,r])}e.sort((s,r)=>s[0]-r[0]||s[1]-r[1]||s[2]-r[2]);const n=e.length,A={starts:new Int32Array(n),ends:new Int32Array(n),counts:new Float32Array(n),strands:new Int8Array(n)};return e.forEach(([s,r,o,i],a)=>{A.starts[a]=s,A.ends[a]=r,A.strands[a]=o,A.counts[a]=i}),A}const bo=4<<20,GQ=2e5,UQ=40;async function vQ(t,e,n,A,s,r){const o=Wn.get(t);if(o===void 0)throw new Error("This track is no longer open. Drop the file again.");const i={piles:[],total:0,kept:0,capped:!1,rows:0,diffs:"none"},a=m=>{const p=o.refIdOf.get(m);if(p!==void 0)return p;const w=Kt(o.refNames,m);if(!(w<0))return o.refIdOf.set(m,w),w},c=e.filter(m=>a(m.contig)!==void 0&&m.end>m.start);if(c.length===0)return i;const l=c.reduce((m,p)=>m+(p.end-p.start),0);if(l>GQ)return{...i,note:`${ie(l/1e3)} kb — too wide to draw reads`};const g=[];for(const m of c){const p=a(m.contig);g.push({region:m,refId:p,spans:await ec(o,p,m,r,bo)})}const f=g.reduce((m,p)=>m+bi(p.spans),0);if(f>bo)return{...i,note:`${G.bytes(f)} of reads here — zoom in`};const h=[];let u=0,I=0,d=!1,C=0,E=!1,B=!1,Q=!1;for(const m of g){const p=Ac(m.region);p!==void 0&&(Q=!0);for(const w of m.spans){if(!await Ls(r))throw ze();const y=await o.handle.read(w.to-w.from,w.from),N=await Ot(y,w.lastBlock-w.from),k=Hf(N,w.dataFrom,m.region.contig,m.refId,Math.floor(m.region.start),Math.ceil(m.region.end),{filter:SQ(s),maxRows:n,maxReads:TQ,colourBy:s.colourBy,withNames:A<=UQ,refNameOf:b=>o.refNames[b],...p===void 0?{}:{reference:p}});u+=k.total,I+=k.kept,d=d||k.capped,C=Math.max(C,k.rows),E=E||k.usedMd,B=B||k.usedCigar,(k.pile.length>0||h.length===0)&&h.push(k.pile)}}return{piles:h,total:u,kept:I,capped:d,rows:C,diffs:B?"cigar":E?"md":Q?"reference":"none"}}const TQ=2e4,JQ=16;function Ac(t){const e=Math.max(0,Math.floor(t.start));for(const n of re.values()){if(we(n)){const r=Ms(n,t.contig),o=r===void 0?void 0:n.held.get(r.name);if(o===void 0)continue;const i=Math.min(o.start+o.bases.length,Math.ceil(t.end));if(o.start>e||i<=e)continue;return{start:e,bases:o.bases.subarray(e-o.start,i-o.start)}}const A=qn(n,t.contig);if(A===void 0)continue;const s=Math.min(A.length,Math.ceil(t.end));if(!(s<=e))return{start:e,bases:A.subarray(e,s)}}}function vs(t){return`${G.int(t)} sequence${t===1?"":"s"}`}function ie(t){if(!Number.isFinite(t))return"—";const e=Math.abs(t);return e===0?"0":e>=1e3?G.int(Math.round(t)):e>=1?t.toFixed(2).replace(/\.?0+$/,""):t.toPrecision(2)}
|
|
27
|
+
`);A=s<0?"":A.slice(0,s+1)}return A}const gQ=28;function fQ(t,e,n){if(e.to<n)return!1;const A=e.lastBlock-e.from;if(A<0||A>=t.length)return!1;const s=ye(t.subarray(A,Math.min(A+64,t.length)));return s===null||A+s>t.length?!1:t.length-(A+s)<=gQ}function vs(t){return t.kind==="local"?t.index===void 0?null:{kind:"local",file:t.index,name:t.index.name}:t.index===void 0?null:{kind:"remote",url:t.index,name:t.index,...t.credential===void 0?{}:{credential:t.credential},...t.headers===void 0?{}:{headers:t.headers}}}async function ke(t,e){const n=t.stat;if(typeof n=="function")try{const A=(await n.call(t)).size;if(Number.isFinite(A)&&A>0)return A}catch{}if(e===void 0||e.kind!=="remote")return null;try{const{credential:A,headers:s}=e,r=await fetch(e.url,Oi({method:"HEAD",mode:"cors"},{url:e.url,method:"HEAD",...s===void 0?{}:{headers:s},...A===void 0?{}:{credential:A}}));if(!r.ok)return null;const o=Number(r.headers.get("Content-Length")??Number.NaN);return Number.isFinite(o)&&o>0?o:null}catch{return null}}async function hQ(t,e,n,A){const s=Gt(e),r=await s.read(64,0),o=Ha(r);if(o==="bigwig")return bQ(t,e,n);if(o==="bigbed")return kQ(t,e,n);if(We(r)){const I=await ke(s,e),d=await sc(s,I??Number.MAX_SAFE_INTEGER);if(d!==null){if(I===null)throw new Error(`${e.name} cannot be measured — its host states neither Content-Range nor Content-Length to a page — and a BAM is read by byte range.`);return SQ(t,e,s,n,d,I,A)}}if(kn(r))return dA(t,await tc(e,s,A),n);if(Ka(r))return dA(t,await ec(e,s,A),n);if(ds(r))return BQ(s,n);const i=Dt;if(i!==null&&i.key===tt(e)&&i.features!==null)return Dt=null,XA(i.format,i.features,n);const a=await cQ(e,s,r,n),c=a===null?await gs(await s.readFile({onProgress:A})):null;if(c!==null&&kn(c))return dA(t,Us(e,c),n);const l=a??new TextDecoder().decode(c);if(l.trim()==="")throw new Error("This file is empty.");if(Ai(l))return uQ(l,n);if(yA(l,e.name))return IA(l,e.name,n,ki);if(pA(l,e.name))return IA(l,e.name,n);if(Bi(l,e.name))return IA(l,e.name,n,pi);if(hi(l,e.name))return Za(l,e.name,n);if(La(l))return CQ(l,n);if(Ds(l,e.name)!==null)return QQ(l,e.name,n);if(wa(l,e.name))return Xa(l,n);if(Na(l,e.name))return IQ(l,n);if(Da(l,e.name))return dQ(l,n);if(Oa(l,e.name))return Va(t,l,n);const f=Gi(l);if(f!==null)return MQ(t,f,l,n);const h=ii(l,e.name);if(h==="bedpe"){const I=fi(l),d=ft(I.contigs,n);return{format:h,contigs:I.contigs,overlap:Z(I.contigs,n,d),summary:`${x.int(I.length)} pair${I.length===1?"":"s"}`,payload:{kind:"pairs",data:I}}}const u=h==="gtf"?li(l):hs(l,e.name);return XA(h,u,n)}function uQ(t,e){const n=oi(t),A=ft(n.contigs,e),s=og(t);return{format:"vcf",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:`${x.int(n.length)} variant${n.length===1?"":"s"}`+(s===0?"":` · ${x.int(s)} sample${s===1?"":"s"} not drawn`),payload:{kind:"features",data:n}}}function Xa(t,e){const n=pa(t),A=ft(n.contigs,e);return{format:"interact",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:hC(n),payload:{kind:"pairs",data:n}}}function IQ(t,e){const n=ka(t),A=ft(n.contigs,e);return{format:"longrange",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:dC(n),payload:{kind:"pairs",data:n}}}function dQ(t,e){const n=Fa(t),A=ft(n.contigs,e);return{format:"genepred",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:Ms(n),payload:{kind:"features",data:n}}}function Va(t,e,n){const A=Ya(e),s=A.signal,r=pe(s.contigs.map(a=>({name:a.name})),n);s.contigs.forEach((a,c)=>{a.name=r.names[c]});const o=new Ui(s);Hn.set(t,o);const i=o.contigNames;return{format:"bedmethyl",contigs:i,overlap:Z(i,n,r),summary:YC(A),fileExtent:{min:0,max:100}}}function Za(t,e,n){const A=di(t,e),s=ft(A.contigs,n);return{format:"barchart",contigs:A.contigs,overlap:Z(A.contigs,n,s),summary:Og(A),payload:{kind:"features",data:A}}}function CQ(t,e){const n=Ga(t),A=ft(n.contigs,e);return{format:"cytoband",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:xa(n),payload:{kind:"features",data:n}}}function QQ(t,e,n){const A=$a(t,e),s=ft(A.contigs,n);return{format:"junctions",contigs:A.contigs,overlap:Z(A.contigs,n,s),summary:Ja(A),payload:{kind:"features",data:A}}}function IA(t,e,n,A=wi){const s=A(t,e),r=ft(s.contigs,n);return{format:"structure",contigs:s.contigs,overlap:Z(s.contigs,n,r),summary:Ni(s),payload:{kind:"features",data:s}}}async function ja(t){const e=(o,i)=>t.read(o,i),n=await ke(t),A=await sf(e,n??void 0),s=Math.min(...A.resolutions),r=await rf(e,A,s);return Object.assign(r,{header:A})}async function BQ(t,e){const n=await ja(t),A=ft(n.contigs,e),s=n.header.resolutions.filter(o=>o!==n.model?.width),r=[Ni(n),of(n.header),...s.length===0?[]:[`also at ${s.join(", ")} bp`]].join(ct);return{format:"structure",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:r,payload:{kind:"features",data:n}}}function XA(t,e,n){const A=e.exonStart.length,s=ft(e.contigs,n);return{format:t,contigs:e.contigs,overlap:Z(e.contigs,n,s),summary:t==="gtf"?`${x.int(e.length)} transcripts · ${x.int(A)} exons`:t==="genepred"?Ms(e):t==="cytoband"?xa(e):t==="junctions"?Ja(e):`${x.int(e.length)} feature${e.length===1?"":"s"}`,payload:{kind:"features",data:e}}}async function tc(t,e,n){const A=oe;if(A!==null&&A.key===tt(t))return A.store;const s=t.kind==="local"?t.file.size:await ke(e,t),r=s!==null&&s>0;if(r&&s<=HA)return ko(t,e,n);const o=await EQ(t,e);if(o!==null)return oe={key:tt(t),store:o},o;if(r&&s>Ls)throw nc(s,t);return ko(t,e,n)}async function ko(t,e,n){return Us(t,await gs(await e.readFile({onProgress:n})))}async function EQ(t,e){const n=t.index!==void 0?t:t.kind==="remote"&&ma.test(t.url)?{...t,index:AC(t.url)}:null,A=n===null?null:vs(n);if(A===null)return null;try{const s=jd(new TextDecoder().decode(await Gt(A).readFile()));return s.length===0?null:{indexed:!0,contigs:tC(s),records:new Map(s.map(r=>[r.name,r])),handle:e,total:s.reduce((r,o)=>r+o.length,0),held:new Map}}catch{return null}}async function ec(t,e,n){const A=oe;if(A!==null&&A.key===tt(t)&&_t(A.store))return A.store;const s=await ke(e),r=await VC((i,a)=>e.read(i,a,{onProgress:n}),s??void 0),o={twobit:!0,contigs:XC(r.ordered),records:r.records,handle:e,total:r.total,held:new Map};return oe={key:tt(t),store:o},o}function Us(t,e){if(e.length>Ls)throw nc(e.length,t);const n=$f(e);if(n.contigs.length===0)throw new Error("This looks like a FASTA but holds no sequences.");return oe={key:tt(t),store:n},n}function nc(t,e){const n=e.name.replace(/[#?].*$/,"")||"genome.fa";return new Error(`This FASTA is ${x.int(Math.round(t/1e6))} MB and has no index. It would be read whole and held whole — which is what makes panning free — so anything over ${x.int(Ls/1e6)} MB is refused rather than allowed to take the tab with it. Index it (\`samtools faidx ${n}\`) and ${e.kind==="local"?"drop the .fai with it":"publish the .fai beside it, or name it with #index=<url>"}: an indexed FASTA opens at once and is read by range.`)}function dA(t,e,n){const A=wQ(e,n);re.set(t,e);const s=e.contigs.map(r=>r.name);return{format:_t(e)?"twobit":"fasta",contigs:s,overlap:Z(s,n,A),summary:`${Ts(s.length)} · ${x.bp(e.total)}`+(_t(e)?" · read by range, two bits a base":Rs(e)?" · read by range from its index":""),...we(e)?{byRange:{bases:e.total,bytesPerBase:mQ(e)}}:{}}}function mQ(t){if(_t(t))return .25;let e=0,n=0;for(const A of t.records.values())e+=A.length*A.lineWidth/A.lineBases,n+=A.length;return n>0?e/n:1}function wQ(t,e){const n=pe(t.contigs,e);if(n.renamed===0)return n;if(_t(t)||Rs(t))return t.records=bo(t.records,t.contigs,n.names),t.held.clear(),n;const A=new Map;return t.contigs.forEach((s,r)=>{const o=t.bases.get(s.name);s.name=n.names[r],o!==void 0&&A.set(s.name,o)}),t.bases=A,n}function bo(t,e,n){const A=new Map;return e.forEach((s,r)=>{const o=t.get(s.name);s.name=n[r],o!==void 0&&A.set(s.name,{...o,name:s.name})}),A}async function pQ(t,e,n,A){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;if(we(t)&&e.reduce((a,c)=>a+Math.max(0,c.end-c.start),0)>No)return{basesPerPixel:n,regions:[],extent:null,note:`GC under ${x.int(No/1e6)} Mb, letters at base resolution — zoom in`};for(const i of e){if(!(i.end>i.start))continue;let a;if(we(t)){const c=Math.max(0,Math.floor(i.start)),l=await Wa(t,i.contig,c,i.end,A);if(l===void 0||l.length===0)continue;a=Br(l,0,l.length,n);for(let g=0;g<a.starts.length;g++)a.starts[g]+=c,a.ends[g]+=c}else{const c=qn(t,i.contig);if(c===void 0)continue;a=Br(c,i.start,i.end,n)}if(a.values.length!==0){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push({contig:i.contig,start:i.start,end:i.end,starts:a.starts,ends:a.ends,values:a.values,min:null,max:null,variant:null,summary:!0})}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}const yQ=4e5;async function NQ(t,e,n){const A=re.get(t);if(A===void 0)throw new Error("This sequence is no longer open. Drop the file again.");const s=[];let r=yQ;for(const o of e){const i=Math.max(0,Math.floor(o.start));if(we(A)){const l=await Wa(A,o.contig,i,Math.min(Math.ceil(o.end),i+r),n);if(l===void 0||l.length===0)continue;if(r-=l.length,s.push({contig:o.contig,start:i,end:i+l.length,bases:l.slice()}),r<=0)break;continue}const a=qn(A,o.contig);if(a===void 0)continue;const c=Math.min(a.length,Math.ceil(o.end),i+r);if(c>i&&(r-=c-i,s.push({contig:o.contig,start:i,end:c,bases:a.slice(i,c)}),r<=0))break}return{regions:s}}const VA=1e6;async function kQ(t,e,n){const A=new Yo({filehandle:Gt(e)}),s=await A.getHeader(),r=xs(s),o=[];let i=!1;for(const f of r){if(o.length>=VA){i=!0;break}const h=await A.getFeatures(f.name,0,f.length);for(const u of h){if(o.length>=VA){i=!0;break}const I=typeof u.rest=="string"&&u.rest!==""?` ${u.rest}`:"";o.push(`${f.name} ${u.start} ${u.end}${I}`)}}const a=o.join(`
|
|
28
|
+
`),c=s.autoSql??"";if(Jg(c)){const f=Za(a,e.name,n);return i?{...f,summary:Le(f.summary)}:f}if(fC(c)){const f=Xa(a,n);return i?{...f,summary:Le(f.summary)}:f}if(OC(c)){const f=Va(t,a,n);return i?{...f,summary:Le(f.summary)}:f}const l=hs(a,e.name);if(NC(c)){const f=ft(l.contigs,n),h={format:"genepred",contigs:l.contigs,overlap:Z(l.contigs,n,f),summary:Ms(l),payload:{kind:"features",data:l}};return i?{...h,summary:Le(h.summary)}:h}const g=XA("bigbed",l,n);return{...g,summary:i?Le(g.summary):g.summary}}function Le(t){return`${t} · cut off at ${x.int(VA)}`}async function bQ(t,e,n){const A=new Jo({filehandle:Gt(e)}),s=await A.getHeader(),r=pe(xs(s),n),o=r.names;Ss.set(t,{bigwig:A,refOf:r.sourceOf,refNames:Object.keys(s.refsByName)});const i=s.totalSummary,a=i!==void 0&&Number.isFinite(i.scoreMin)&&Number.isFinite(i.scoreMax)&&i.scoreMax>i.scoreMin;return{format:"bigwig",contigs:o,overlap:Z(o,n,r),summary:Ts(o.length)+(a?` · ${ie(i.scoreMin)}–${ie(i.scoreMax)}`:""),...a?{fileExtent:{min:i.scoreMin,max:i.scoreMax}}:{}}}function MQ(t,e,n,A){const s=e==="wig"?vi(n):xi(n);if(s.length===0)throw new Error(`This looks like a ${e==="wig"?"wig":"bedGraph"} but holds no usable intervals.`);const r=pe(s.contigs.map(g=>({name:g.name})),A);s.contigs.forEach((g,f)=>{g.name=r.names[f]});const o=new Ui(s);Hn.set(t,o);const i=o.contigNames,{min:a,max:c}=o.extent,l=Number.isFinite(a)&&Number.isFinite(c)&&c>a;return{format:e,contigs:i,overlap:Z(i,A,r),summary:`${x.int(o.length)} intervals · ${Ts(i.length)}`+(l?` · ${ie(a)}–${ie(c)}`:""),...l?{fileExtent:{min:a,max:c}}:{}}}function DQ(t,e,n){const A=[];let s=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(const o of e){if(!t.has(o.contig)||o.end<=o.start)continue;const i=t.samples(o.contig,o.start,o.end,n);if(i!==null){for(const a of i.values)Number.isFinite(a)&&(a<s&&(s=a),a>r&&(r=a));A.push({contig:o.contig,start:o.start,end:o.end,variant:null,...i})}}return{basesPerPixel:n,regions:A,extent:s<=r?{min:s,max:r}:null}}async function Ac(t,e,n,A,s,r=!1){const o=Wn.get(t);if(o!==void 0)return UQ(s,o,e,n,A);const i=re.get(t);if(i!==void 0)return pQ(i,e,n,Qn(s));const a=Hn.get(t);if(a!==void 0)return DQ(a,e,n);const c=qA.get(t);if(c!==void 0)return Gh(c,e,n,r);const l=Ss.get(t);if(l===void 0)throw new Error("This track is no longer open. Drop the file again.");const g=C=>{const B=l.refOf.get(C);if(B!==void 0)return B;const Q=Kt(l.refNames,C);if(!(Q<0))return l.refOf.set(C,l.refNames[Q]),l.refNames[Q]},f=e.filter(C=>g(C.contig)!==void 0&&C.end>C.start);if(f.length===0)return{basesPerPixel:n,regions:[],extent:null};const h=await l.bigwig.getFeaturesAsArraysMulti(f.map(C=>({refName:g(C.contig)??C.contig,start:Math.max(0,Math.floor(C.start)),end:Math.ceil(C.end)})),{basesPerSpan:Math.max(1,n)}),u=[];let I=Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY;for(let C=0;C<f.length;C++){const B=h.regionOffsets[C],Q=h.regionOffsets[C+1],E=h.scores.slice(B,Q);for(let m=0;m<E.length;m++){const p=E[m];Number.isFinite(p)&&(p<I&&(I=p),p>d&&(d=p))}u.push({contig:f[C].contig,start:f[C].start,end:f[C].end,starts:h.starts.slice(B,Q),ends:h.ends.slice(B,Q),values:E,min:h.isSummary?h.minScores.slice(B,Q):null,max:h.isSummary?h.maxScores.slice(B,Q):null,variant:null,summary:h.isSummary})}return{basesPerPixel:n,regions:u,extent:I<=d?{min:I,max:d}:null}}const FQ=1<<18,Mo=1<<24;async function sc(t,e){const n=Number.isFinite(e)&&e>0?e:Number.MAX_SAFE_INTEGER;let A=FQ;for(;;){let s;try{s=await Yt(await t.read(Math.min(A,n),0))}catch{return null}if(!ti(s))return null;const r=Sl(s);if(r!==null)return r;if(A>=n||A>=Mo)throw new Error("This BAM's header is truncated: its reference table does not end.");A=Math.min(A*4,Mo)}}async function SQ(t,e,n,A,s,r,o){if(s.sortOrder==="queryname"||s.sortOrder==="unsorted")throw new Error(`${e.name} is sorted by ${s.sortOrder==="queryname"?"read name":"nothing"}, and reads are drawn by region. Run \`samtools sort -o sorted.bam ${e.name}\` and index the result.`);const i=vs(e),a=i===null?`${tt(e)}|search`:nQ(e,i),c=Un.get(a);let l=null,g=null,f="";if(c!==void 0)l=c.open.index,g=c.open.search,f=c.open.searched;else{if(i===null)f="no index dropped with it";else try{l=await Bf(await Gt(i).readFile({onProgress:o}))}catch(C){const B=C instanceof Error?C.message:String(C);f=i.kind==="remote"?`no ${i.url.split("?")[0].split("/").pop()??"index"} beside it`:`${i.name} could not be read (${B})`}if(l===null){if(!Number.isFinite(r)||r<=0)throw new Error(`${e.name} has ${f}, and its length could not be learnt, so its reads cannot be located by search either. A BAM is read by region: publish its index beside it, or name one with \`${e.kind==="remote"?e.url:e.name}#index=<url of the .bai>\`.`);try{g=await Cs.open(n,r,s,C=>o(C,0))}catch(C){if(C instanceof NA)throw new Error(RQ(e.name,s,C));const B=C instanceof Error?C.message:String(C);throw new Error(`${e.name} has ${f} and could not be read by search: ${B}. A BAM is read by region; run \`samtools index ${e.name}\` and publish the index beside it, or name one with \`#index=<url of the .bai>\`.`)}}}const h=pe(s.refs,A),u=h.names,I=new Map;for(let C=0;C<u.length;C++)I.set(u[C],C);for(let C=0;C<s.refs.length;C++)I.has(s.refs[C].name)||I.set(s.refs[C].name,C);const d=c?.open??{handle:n,header:s,index:l,search:g,searched:f,size:r,refIdOf:I,refNames:s.refs.map(C=>C.name)};return c===void 0?Un.set(a,{open:d,holders:new Set([t])}):c.holders.add(t),Wn.set(t,d),{format:"bam",contigs:u,overlap:Z(u,A,h),summary:`${x.int(s.refs.length)} reference${s.refs.length===1?"":"s"} · ${l!==null?l.format.toUpperCase():`${f} — reads located by search`}`}}function RQ(t,e,n){const A=e.sortOrder==="coordinate"?"its header says SO:coordinate, but":"its header has no @HD line to say so, and";return`${t} is not in coordinate order — ${A} the reads at byte ${x.int(n.before.block)} are on ${dr(n.before,e.refs)} while those at byte ${x.int(n.after.block)}, later in the file, are on ${dr(n.after,e.refs)}. Reads are drawn by region, which needs the file sorted and indexed: run \`samtools sort -o sorted.bam ${t}\` and \`samtools index sorted.bam\`. The alignment file a Hi-C pipeline writes is in read-pair order for its pairs step and is not made for browsing; its .pairs or its contact map is the file to open.`}const LQ=4e6;function GQ(t,e){if(t.search===null)return null;const n=e.reduce((A,s)=>A+(s.end-s.start),0);return e.length>1||n>LQ?`${xQ(n)} without an index — zoom in`:null}function xQ(t){return t>=1e6?`${ie(t/1e6)} Mb`:`${ie(t/1e3)} kb`}async function rc(t,e,n,A,s){const r=Math.max(0,Math.floor(n.start)),o=Math.ceil(n.end);return t.index!==null?kf(t.index,e,r,o,t.size):t.search===null?[]:t.search.spansFor(e,r,o,async()=>{if(!await Gs(A))throw ze()},s)}function oc(t){return t===void 0?Ri:{exclude:jo|(t.hideDuplicates?At.DUPLICATE:0),minMapq:t.minMapq}}function vQ(t){const e=oc(t);return t.splits?{...e,exclude:e.exclude&-2049}:e}async function UQ(t,e,n,A,s){const r=I=>{const d=e.refIdOf.get(I);if(d!==void 0)return d;const C=Kt(e.refNames,I);if(!(C<0))return e.refIdOf.set(I,C),C},o=n.filter(I=>r(I.contig)!==void 0&&I.end>I.start);if(o.length===0)return{basesPerPixel:A,regions:[],extent:null};const i=GQ(e,o);if(i!==null)return{basesPerPixel:A,regions:[],extent:null,note:i};const a=[];for(const I of o){const d=r(I.contig);a.push({region:I,refId:d,spans:await rc(e,d,I,t,yo)})}const c=a.reduce((I,d)=>I+Fi(d.spans),0);if(c>yo)return{basesPerPixel:A,regions:[],extent:null,note:`${x.bytes(c)} of reads — zoom in`};const l=[];let g=Number.POSITIVE_INFINITY,f=Number.NEGATIVE_INFINITY;const h=s?.modFraction===!0,u=[];for(const I of a){const d=I.region.end-I.region.start,C=Math.max(1,Math.min(4096,Math.round(d/Math.max(1,A)))),B=new Float64Array(C),Q=new Map;u.push(Q);const E=A<=KQ?ic(I.region):void 0,m=E===void 0?null:new Float64Array(C),p=new Map;for(const M of I.spans){if(!await Gs(t))throw ze();const F=await e.handle.read(M.to-M.from,M.from),S=await Yt(F,M.lastBlock-M.from),v=Yf(S,M.dataFrom,I.refId,Math.floor(I.region.start),Math.ceil(I.region.end),C,oc(s),E,p,h?{tally:Q,threshold:s.modThreshold}:void 0);for(let G=0;G<C;G++)B[G]+=v.depth[G];if(m!==null&&v.variant!==null)for(let G=0;G<C;G++)m[G]+=v.variant[G]}const w=new Int32Array(C),y=new Int32Array(C),N=new Float32Array(C),k=m===null?null:new Float32Array(C),b=d/C;for(let M=0;M<C;M++)w[M]=Math.round(I.region.start+M*b),y[M]=Math.round(I.region.start+(M+1)*b),N[M]=B[M],k!==null&&m!==null&&(k[M]=m[M]),B[M]<g&&(g=B[M]),B[M]>f&&(f=B[M]);l.push({contig:I.region.contig,start:I.region.start,end:I.region.end,starts:w,ends:y,values:N,variant:k,junctions:$Q(p),min:null,max:null,summary:!1})}return h?TQ(A,l,u,s.modCode):{basesPerPixel:A,regions:l,extent:g<=f&&f>0?{min:0,max:f}:null}}function TQ(t,e,n,A){const s=new Map;for(const c of n)for(const[l,g]of c){const f=s.get(l)??[0,0];f[0]+=g.modified.reduce((h,u)=>h+u,0),f[1]+=g.calls.reduce((h,u)=>h+u,0),s.set(l,f)}const r=[...s.entries()].sort((c,l)=>l[1][0]-c[1][0]||l[1][1]-c[1][1]).map(([c])=>c),o=A!==""?A:r[0]??"";let i=!1;const a=e.map((c,l)=>{const g=n[l].get(o),f=new Float32Array(c.values.length).fill(Number.NaN);if(g!==void 0)for(let h=0;h<f.length;h++)g.calls[h]<=0||(f[h]=100*g.modified[h]/g.calls[h],i=!0);return{...c,values:f,variant:null,junctions:void 0}});return{basesPerPixel:t,regions:a,extent:i?{min:0,max:100}:null,mods:{code:o,codes:r},...r.length===0?{note:"no MM/ML modification calls here"}:{}}}function $Q(t){const e=[];for(const[s,r]of t){const[o,i,a]=s.split(":").map(Number);e.push([o,i,a,r])}e.sort((s,r)=>s[0]-r[0]||s[1]-r[1]||s[2]-r[2]);const n=e.length,A={starts:new Int32Array(n),ends:new Int32Array(n),counts:new Float32Array(n),strands:new Int8Array(n)};return e.forEach(([s,r,o,i],a)=>{A.starts[a]=s,A.ends[a]=r,A.strands[a]=o,A.counts[a]=i}),A}const Do=4<<20,JQ=2e5,OQ=40;async function YQ(t,e,n,A,s,r){const o=Wn.get(t);if(o===void 0)throw new Error("This track is no longer open. Drop the file again.");const i={piles:[],total:0,kept:0,capped:!1,rows:0,diffs:"none"},a=m=>{const p=o.refIdOf.get(m);if(p!==void 0)return p;const w=Kt(o.refNames,m);if(!(w<0))return o.refIdOf.set(m,w),w},c=e.filter(m=>a(m.contig)!==void 0&&m.end>m.start);if(c.length===0)return i;const l=c.reduce((m,p)=>m+(p.end-p.start),0);if(l>JQ)return{...i,note:`${ie(l/1e3)} kb — too wide to draw reads`};const g=[];for(const m of c){const p=a(m.contig);g.push({region:m,refId:p,spans:await rc(o,p,m,r,Do)})}const f=g.reduce((m,p)=>m+Fi(p.spans),0);if(f>Do)return{...i,note:`${x.bytes(f)} of reads here — zoom in`};const h=[];let u=0,I=0,d=!1,C=0,B=!1,Q=!1,E=!1;for(const m of g){const p=ic(m.region);p!==void 0&&(E=!0);for(const w of m.spans){if(!await Gs(r))throw ze();const y=await o.handle.read(w.to-w.from,w.from),N=await Yt(y,w.lastBlock-w.from),k=zf(N,w.dataFrom,m.region.contig,m.refId,Math.floor(m.region.start),Math.ceil(m.region.end),{filter:vQ(s),maxRows:n,maxReads:_Q,colourBy:s.colourBy,withNames:A<=OQ,refNameOf:b=>o.refNames[b],...p===void 0?{}:{reference:p}});u+=k.total,I+=k.kept,d=d||k.capped,C=Math.max(C,k.rows),B=B||k.usedMd,Q=Q||k.usedCigar,(k.pile.length>0||h.length===0)&&h.push(k.pile)}}return{piles:h,total:u,kept:I,capped:d,rows:C,diffs:Q?"cigar":B?"md":E?"reference":"none"}}const _Q=2e4,KQ=16;function ic(t){const e=Math.max(0,Math.floor(t.start));for(const n of re.values()){if(we(n)){const r=Fs(n,t.contig),o=r===void 0?void 0:n.held.get(r.name);if(o===void 0)continue;const i=Math.min(o.start+o.bases.length,Math.ceil(t.end));if(o.start>e||i<=e)continue;return{start:e,bases:o.bases.subarray(e-o.start,i-o.start)}}const A=qn(n,t.contig);if(A===void 0)continue;const s=Math.min(A.length,Math.ceil(t.end));if(!(s<=e))return{start:e,bases:A.subarray(e,s)}}}function Ts(t){return`${x.int(t)} sequence${t===1?"":"s"}`}function ie(t){if(!Number.isFinite(t))return"—";const e=Math.abs(t);return e===0?"0":e>=1e3?x.int(Math.round(t)):e>=1?t.toFixed(2).replace(/\.?0+$/,""):t.toPrecision(2)}
|