@kymoscope/sdk 0.5.0 → 0.6.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/dist/kymoscope-sdk.js
CHANGED
|
@@ -610,10 +610,10 @@ void main() {
|
|
|
610
610
|
`)??``,[w]),A=o.map(e=>e.name).join(`
|
|
611
611
|
`),j=dt(()=>{let e=a.filter(e=>e.kind!==`memory`).flatMap(e=>bz(e.schema));return e.length?e:null},[a]),M=dt(()=>a.some(e=>e.kind!==`memory`)||!_&&a.some(e=>e.data.rows.length>OX),[a,_]),N=dt(()=>lX(p.connections.filter(e=>i.includes(e.id)),a.length,M,f,s),[M,a,p.connections,i,s,f]),P=dt(()=>{if(!_||a.length===0||M)return null;let e=a.map((e,t)=>{let n=e.data.rows;return{rows:n.length>0&&typeof n[0][f]==`number`?n:O[t]??n,offset:s[e.id]??0}});if(!N)for(let t of p.connections)i.includes(t.id)&&e.push({rows:t.dataset.rows,offset:s[t.id]??0});return LX(e,f)},[_,a,M,O,s,f,p.connections,i,N]),F=C&&`okByPart`in C?C.okByPart:void 0,I=dt(()=>{if(!M)return[];let e=T.map((e,t)=>({live:`live`in e&&!!e.live,source:`live`in e&&e.live?e.live.source:e.source,columnSet:new Set(`live`in e&&e.live?e.data.columnNames:e.schema.map(e=>e.name)),keySuffix:E?`__${t}`:``,xOffset:s[e.id]??0,key:`${e.id}|${E?t:``}`}));return T.forEach((t,n)=>{let r=F?.[n],i=O[n];`live`in t&&t.live||!r?.length||!i||e.push({...e[n],live:!1,source:PX(i,r,f),columnSet:new Set([f,...r]),key:`${e[n].key}|channels`})}),e},[M,T,E,s,F,O,f]),L=dt(()=>{let e=C?.parts??(w?[w]:[]),t=new Set;for(let n of e)for(let e of fX(n.columnNames,n.rows))t.add(e);let n=w?w.columnNames.filter(e=>t.has(e)):[],r=[...new Set(j?[...n,...j]:n)];if(A===``)return r;let i=new Set(r),a=A.split(`
|
|
612
612
|
`).filter(e=>!i.has(e));return a.length?[...r,...a]:r},[k,A,j]),R=dt(()=>{let e=[];for(let t of u){if(t.kind!==`multiband`)continue;let n=d[t.id],r=n&&n.kind===`multiband`?n.series:[];e.push([t.id,[...new Set(r.map(e=>e.column).filter(e=>e!==f))]])}return JSON.stringify(e)},[u,d,f]),z=dt(()=>{let e={};if(!w||M)return e;for(let[t,r]of JSON.parse(R)){let i=[];if(r.length>0)if(!E)i.push(n(w.rows,f,r,OX));else{let e=Math.max(1,Math.floor(OX/T.length));for(let t=0;t<T.length;t++){let a=T[t];if(N&&`live`in a&&a.live)continue;let o=O[t]??a.data.rows;i.push(n(o,f,r,e,`__${t}`,s[a.id]??0))}}e[t]=i}return e},[w,R,f,E,T,s,O,N,M]),B=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`multiband`)continue;let n=d[t.id],r=(n&&n.kind===`multiband`?n.series:[]).filter(e=>e.column!==f),i=n&&n.kind===`multiband`?n.layout:`overlay`,a=e=>IX(e,i),o;if(!E)o=a(r);else{let e=a(r);o=[];for(let t=0;t<T.length;t++){let n=Kz(c,T[t].id,t,l);for(let r of e)o.push({...r,id:`${r.id}__${t}`,column:`${r.column}__${t}`,color:n})}}let u=z[t.id]??[],p=E&&n?.kind===`multiband`&&n.envelope?r.flatMap(e=>{let t=oX(u.flatMap((t,n)=>{let r=t.cols.get(`${e.column}__${n}`);return r?[{x:t.x,y:r}]:[]}),MX);return t?[{seriesId:e.id,color:e.color,...t}]:[]}):void 0,m=T.flatMap((e,t)=>`bands`in e&&e.bands?SX(e,f,r,E?Kz(c,e.id,t,l):void 0,s[e.id]??0):[]),h=[...p??[],...m];e[t.id]={effectiveSeries:o,points:u,envelopes:h.length?h:void 0}}return e},[w,u,d,f,E,T,c,l,s,z]),V=dt(()=>{let e={pts:{},colorMeta:{},datasetColors:{}};if(!w)return e;let t={},n={},i={},a=jX,o=T.map((e,t)=>({id:e.id,rows:O[t]??m[e.id]??e.data.rows,full:a(e)})),s={id:`single`,rows:w.rows,full:T.length===1?a(T[0]):void 0};for(let e of u){if(e.kind!==`xyscatter`)continue;let a=d[e.id];if(!a||a.kind!==`xyscatter`)continue;let{xyXCol:u,xyYCol:p}=a;if(!u||!p){t[e.id]={length:0,x:[],y:[]};continue}if(E){let{cols:n,colors:a}=pW(o,u,p,{xKey:f,viewXRange:r,colorOverrides:c,palette:l});t[e.id]=n,i[e.id]=a;continue}let m=fW(s,u,p,{xKey:f,viewXRange:r,colorCol:a.xyColorCol||void 0});t[e.id]=m?.cols??{length:0,x:[],y:[]},m?.color&&(n[e.id]=m.color)}return{pts:t,colorMeta:n,datasetColors:i}},[w,u,d,r,f,E,T,m,c,l,O]),ee=K(new Map),te=dt(()=>{let e={};if(!w)return e;let t={length:0,x:[],y:[],z:[]},{rows:n}=w,i=D;for(let a of u){if(a.kind!==`xyzmesh`)continue;let o=d[a.id];if(!o||o.kind!==`xyzmesh`)continue;if(o.xyzMode===`matrix`){let r=(o.xyzColumns??[]).flatMap(e=>{let t=oW(n,e,i);return t?[t]:[]}),s=r[0]?.length??0,c=r.length;if(s<2||c<2){e[a.id]={points:t};continue}let l=ee.current.get(a.id);l?.length!==s*c&&ee.current.set(a.id,l=new Float32Array(s*c)),r.forEach((e,t)=>l.set(e.length===s?e:e.subarray(0,s),t*s));let u=oW(n,f,i),d=u&&!(o.xyzColumns??[]).includes(f)&&u.length>=s&&Number.isFinite(u[0])&&Number.isFinite(u[s-1])?[u[0],u[s-1]]:[0,s-1];e[a.id]={points:t,surface:{w:s,h:c,values:l,x:d,y:[0,c-1]}};continue}let{xyzXCol:s,xyzYCol:c,xyzZCol:l}=o,u=s?oW(n,s,i):void 0,p=c?oW(n,c,i):void 0,m=l?oW(n,l,i):void 0;if(!u||!p||!m){e[a.id]={points:t};continue}let h=r?oW(n,f,i):void 0;if(!r||!h){e[a.id]={points:{length:Math.min(u.length,p.length,m.length),x:u,y:p,z:m}};continue}let[g,_]=r,v=0;for(let e=0;e<h.length;e++)h[e]>=g&&h[e]<=_&&v++;let y=new Float64Array(v),b=new Float64Array(v),x=new Float64Array(v);for(let e=0,t=0;e<h.length;e++)h[e]>=g&&h[e]<=_&&(y[t]=u[e],b[t]=p[e],x[t]=m[e],t++);e[a.id]={points:{length:v,x:y,y:b,z:x}}}return e},[w,u,d,r,f,D]),H=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`histogram`)continue;let n=d[t.id];e[t.id]=n?.kind===`histogram`&&n.histColumn&&sW(w.rows,n.histColumn,D)||new Float64Array}return e},[w,u,d,D]),ne=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`polar`)continue;let n=d[t.id],r=n?.kind===`polar`&&n.polarAngleCol?oW(w.rows,n.polarAngleCol,D):void 0,i=n?.kind===`polar`&&n.polarRadiusCol?oW(w.rows,n.polarRadiusCol,D):void 0;e[t.id]=r&&i?{angles:r,radii:i}:{angles:[],radii:[]}}return e},[w,u,d,D]),re=(e,t,n,r)=>{let i=t&&sW(e,t,D)||new Float64Array,a=n?oW(e,n,D):void 0;return{signal:i,rate:a&&lW(a)||parseFloat(r)||1}},ie=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`spectrum`)continue;let n=d[t.id];n?.kind===`spectrum`&&(e[t.id]=re(w.rows,n.specSignalCol,n.specTimeCol,n.specSampleRate))}return e},[w,u,d,D]),U=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`boxplot`)continue;let n=d[t.id];e[t.id]=n?.kind===`boxplot`&&n.boxValueCol?cW(w.rows,n.boxValueCol,n.boxGroupCol||void 0,D):[]}return e},[w,u,d,D]),ae=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`spectrogram`)continue;let n=d[t.id];n?.kind===`spectrogram`&&(e[t.id]=re(w.rows,n.sgSignalCol,n.sgTimeCol,n.sgSampleRate))}return e},[w,u,d,D]),oe=dt(()=>{if(!w)return{};let e={};for(let t of u){if(t.kind!==`heatmap`)continue;let n=d[t.id];if(!n||n.kind!==`heatmap`){e[t.id]={cells:[],xLabels:[],yLabels:[]};continue}if(n.hmMode===`matrix`){let r=w.rows,i=n.hmColumns.flatMap(e=>{let t=oW(r,e,D);return t?[{name:e,v:t}]:[]}),a=i.reduce((e,t)=>Math.min(e,t.v.length),i.length?1/0:0),o=oW(r,f,D),s,c;if(n.hmSpacing===`values`){o&&xq(o.subarray(0,a))&&(s=Float64Array.from(o.subarray(0,a)));let e=i.map(e=>({c:e,v:parseFloat(e.name)})).sort((e,t)=>t.v-e.v);e.length&&xq(e.map(e=>e.v).reverse())&&(i=e.map(e=>e.c),c=Float64Array.from(e,e=>e.v))}let l=i.length,u=new Float32Array(a*l);i.forEach((e,t)=>u.set(e.v.subarray(0,a),t*a));let d=e=>String(o?+o[e].toPrecision(6):e+1);e[t.id]={cells:[],xLabels:[],yLabels:i.map(e=>e.name),grid:{w:a,h:l,values:u,xLabels:d,yLabels:i.map(e=>e.name)},xCentres:s,yCentres:c}}else if(n.hmMode===`correlation`){let r=n.hmColumns.filter(e=>L.includes(e));if(r.length<2){e[t.id]={cells:[],xLabels:r,yLabels:r};continue}let i=r.map(e=>{let t=[];for(let n of w.rows){let r=n[e];typeof r==`number`&&Number.isFinite(r)&&t.push(r)}return t}),a=i.map(e=>e.reduce((e,t)=>e+t,0)/(e.length||1)),o=[];for(let e=0;e<r.length;e++)for(let t=0;t<r.length;t++){let n=i[e],s=i[t],c=a[e],l=a[t],u=Math.min(n.length,s.length),d=0,f=0,p=0;for(let e=0;e<u;e++){let t=n[e]-c,r=s[e]-l;d+=t*r,f+=t*t,p+=r*r}let m=f>0&&p>0?d/Math.sqrt(f*p):+(e===t);o.push({x:r[t],y:r[e],value:m})}e[t.id]={cells:o,xLabels:r,yLabels:r}}else if(n.hmMode===`binned`||n.hmMode===`count`){let{hmXCol:r,hmYCol:i}=n,a=n.hmMode===`count`?``:n.hmValueCol;if(!r||!i||n.hmMode===`binned`&&!a){e[t.id]={cells:[],xLabels:[],yLabels:[]};continue}let o=e=>{let t=parseFloat(e);return Number.isFinite(t)?t:void 0};e[t.id]=TX(w.rows,{xCol:r,yCol:i,valueCol:a,xBins:n.hmXBins,yBins:n.hmYBins,xMin:o(n.hmXMin),xMax:o(n.hmXMax),yMin:o(n.hmYMin),yMax:o(n.hmYMax)})}else{let{hmXCol:r,hmYCol:i,hmValueCol:a}=n;if(!r||!i||!a){e[t.id]={cells:[],xLabels:[],yLabels:[]};continue}let o=new Map,s=new Set,c=new Set;for(let e of w.rows){let t=String(e[r]??``),n=String(e[i]??``),l=e[a];if(typeof l!=`number`||!Number.isFinite(l))continue;s.add(t),c.add(n);let u=`${t}\0${n}`,d=o.get(u)??{sum:0,count:0};o.set(u,{sum:d.sum+l,count:d.count+1})}let l=e=>{let t=[...e];return t.every(e=>e.trim()!==``&&Number.isFinite(Number(e)))?t.sort((e,t)=>Number(e)-Number(t)):t.sort()},u=l(s),d=l(c),f,p;if(n.hmSpacing===`values`){let e=Float64Array.from(u,Number),t=Float64Array.from(d,Number);xq(e)&&(f=e),xq(t)&&(d=[...d].reverse(),p=t.reverse())}let m=[];for(let e of d)for(let t of u){let n=o.get(`${t}\0${e}`);m.push({x:t,y:e,value:n?n.sum/n.count:0})}e[t.id]={cells:m,xLabels:u,yLabels:d,xCentres:f,yCentres:p}}}return e},[w,u,d,L,f,D]),se=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`violin`)continue;let n=d[t.id];e[t.id]=n?.kind===`violin`&&n.vlValueCol?cW(w.rows,n.vlValueCol,n.vlGroupCol||void 0,D):[]}return e},[w,u,d,D]),ce=dt(()=>{let e={};if(!w)return e;let{rows:t}=w;for(let n of u){if(n.kind!==`confusion`)continue;let r=d[n.id];if(!r||r.kind!==`confusion`||!r.cfActualCol||!r.cfPredictedCol){e[n.id]={actual:[],predicted:[]};continue}let{cfActualCol:i,cfPredictedCol:a}=r,o=D?.get(i),s=D?.get(a);if(o&&s){e[n.id]={actual:o,predicted:s};continue}let c=[],l=[];for(let e of t){let t=e[i],n=e[a];t!==void 0&&n!==void 0&&(c.push(t),l.push(n))}e[n.id]={actual:c,predicted:l}}return e},[w,u,d,D]),le=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`roc`)continue;let n=d[t.id],r=n?.kind===`roc`&&n.rocScoreCol?oW(w.rows,n.rocScoreCol,D):void 0,i=n?.kind===`roc`&&n.rocLabelCol?oW(w.rows,n.rocLabelCol,D):void 0;e[t.id]=r&&i?{scores:r,labels:i}:{scores:[],labels:[]}}return e},[w,u,d,D]),ue=dt(()=>{let e={};if(!w)return e;let{rows:t}=w;for(let n of u){if(n.kind!==`losscurve`)continue;let r=d[n.id];if(!r||r.kind!==`losscurve`){e[n.id]={xValues:[],series:[]};continue}let{lcXCol:i,lcLeftCols:a,lcRightCols:o}=r,s=[...a.map(e=>({...e,axis:`left`})),...o.map(e=>({...e,axis:`right`}))].map(({column:e,color:n,axis:r})=>({label:e,color:n,values:oW(t,e,D)??new Float64Array,axis:r})),c=s[0]?.values.length??t.length,l=i&&oW(t,i,D)||Float64Array.from({length:c},(e,t)=>t);e[n.id]={xValues:l,series:s}}return e},[w,u,d,D]),de=dt(()=>{let e={};if(!w)return e;let{rows:t}=w;for(let n of u){if(n.kind!==`controlchart`)continue;let r=d[n.id],i=r?.kind===`controlchart`&&r.ccValueCol?oW(t,r.ccValueCol,D):void 0;if(!r||r.kind!==`controlchart`||!i){e[n.id]={length:0,value:[]};continue}let a=0;for(let e=0;e<i.length;e++)i[e]-i[e]===0&&a++;let o=a===i.length?null:new Uint32Array(a),s=o?new Float64Array(a):i;if(o)for(let e=0,t=0;e<i.length;e++)i[e]-i[e]===0&&(o[t]=e,s[t++]=i[e]);let c=r.ccSubgroupCol,l=c?D?.get(c):void 0,u=e=>o?o[e]:e;e[n.id]={length:a,value:s,subgroup:c?e=>String(l?l[u(e)]:t[u(e)]?.[c]??``):void 0}}return e},[w,u,d,D]),fe=dt(()=>{let e={};if(!w)return e;let{rows:t}=w;for(let n of u){if(n.kind!==`parallelcoords`)continue;let r=d[n.id];if(!r||r.kind!==`parallelcoords`||r.pcColumns.length<2){e[n.id]={length:0,columns:[]};continue}let i=r.pcColumns.map(e=>oW(t,e,D)??new Float64Array),a=Math.min(...i.map(e=>e.length)),o={length:a,columns:i},s=r.pcColorByCol;if(s)if(L.includes(s))o.colorValue=oW(t,s,D);else{let e=new Map,n=new Int32Array(a);for(let r=0;r<a;r++){let i=String(t[r]?.[s]??``),a=e.get(i);a===void 0&&e.set(i,a=e.size),n[r]=a}o.colorIndex=n,o.colorLabels=[...e.keys()]}e[n.id]=o}return e},[w,u,d,L,D]),pe=dt(()=>{let e={};if(!w)return e;let{rows:t}=w,n={length:0,x:[],y:[]};for(let r of u){if(r.kind!==`embedding`)continue;let i=d[r.id];if(!i||i.kind!==`embedding`||!i.emXCol||!i.emYCol){e[r.id]=n;continue}let{emXCol:a,emYCol:o,emColorCol:s,emColorMode:c,emLabelCol:l}=i,u=oW(t,a,D),f=oW(t,o,D);if(!u||!f){e[r.id]=n;continue}let p=Math.min(u.length,f.length),m={length:p,x:u,y:f};if(s)if(c===`numeric`&&L.includes(s))m.colorValue=oW(t,s,D);else{let e=D?.get(s),n=new Map,r=new Int32Array(p);for(let i=0;i<p;i++){let a=String(e?e[i]:t[i]?.[s]??``),o=n.get(a);o===void 0&&n.set(a,o=n.size),r[i]=o}m.colorIndex=r,m.colorLabels=[...n.keys()]}if(l){let e=D?.get(l);m.label=e?t=>String(e[t]):e=>String(t[e]?.[l]??``)}e[r.id]=m}return e},[w,u,d,L,D]),me=dt(()=>{if(!w)return{};let e={};for(let t of u){if(t.kind!==`flamegraph`)continue;let n=d[t.id];if(!n||n.kind!==`flamegraph`||!n.fgNameCol||!n.fgValueCol){e[t.id]=[];continue}let r=[];for(let e of w.rows){let t=String(e[n.fgNameCol]??``),i=n.fgParentCol?String(e[n.fgParentCol]??``):``,a=e[n.fgValueCol];!t||typeof a!=`number`||!Number.isFinite(a)||r.push({name:t,parent:i,value:a})}e[t.id]=r}return e},[w,u,d]),he=dt(()=>{if(!w)return{};let e={};for(let t of u){if(t.kind!==`barchart`)continue;let n=d[t.id];if(!n||n.kind!==`barchart`||n.bcValueCols.length===0){e[t.id]={groups:[],seriesNames:[]};continue}let r=n.bcValueCols;if(n.bcCategoryCol){let i=new Map;for(let e of w.rows){let t=String(e[n.bcCategoryCol]??`(blank)`);i.has(t)||i.set(t,r.map(()=>0));let a=new Map,o=i.get(t);for(let t=0;t<r.length;t++){let n=e[r[t]];typeof n==`number`&&Number.isFinite(n)&&(o[t]+=n),a.set(r[t],(a.get(r[t])??0)+1)}}e[t.id]={groups:Array.from(i.entries()).map(([e,t])=>({label:e,values:t})),seriesNames:r}}else{let n=w.rows,i=r.map(e=>oW(n,e,D)),a=i.reduce((e,t)=>t?Math.min(e,t.length):e,1/0),o=Number.isFinite(a)?a:n.length,s=i.map(e=>e??new Float64Array(o).fill(NaN));e[t.id]={groups:[],columns:{length:o,values:s},seriesNames:r}}}return e},[w,u,d,D]),ge=dt(()=>{let e={};if(!w)return e;let{rows:t}=w;for(let n of u){if(n.kind!==`radar`)continue;let r=d[n.id];if(!r||r.kind!==`radar`||r.rdAxesCols.length<3){e[n.id]={axes:[],series:[]};continue}let i=r.rdAxesCols,a=i.map(e=>oW(t,e,D));if(r.rdGroupCol){let o=r.rdGroupCol,s=D?.get(o),c=s?s.length:t.length,l=new Map;for(let e=0;e<c;e++){let n=s?s[e]===s[e]?String(s[e]):`(blank)`:String(t[e][o]??`(blank)`),r=l.get(n);r||l.set(n,r=i.map(()=>0));for(let t=0;t<i.length;t++){let n=a[t]?.[e]??NaN;n-n===0&&(r[t]+=n)}}e[n.id]={axes:i,series:Array.from(l.entries()).map(([e,t])=>({name:e,values:t}))}}else{let t=a.map(e=>{let t=0,n=0;if(e)for(let r=0;r<e.length;r++)e[r]-e[r]===0&&(t+=e[r],n++);return t/(n||1)});e[n.id]={axes:i,series:[{name:`Series 1`,values:t}]}}}return e},[w,u,d,D]),_e=dt(()=>{if(!w)return{};let e={};for(let t of u){if(t.kind!==`areachart`)continue;let n=d[t.id];if(!n||n.kind!==`areachart`||n.acYCols.length===0){e[t.id]=[];continue}let r=w.rows,i=n.acYCols.map(e=>oW(r,e,D)),a=i[0]?.length??r.length,o=(n.acXCol?oW(r,n.acXCol,D):void 0)??VX(a);e[t.id]=n.acYCols.flatMap((e,t)=>{let n=i[t];return n?[{name:e,x:o,y:n}]:[]})}return e},[w,u,d,D]),ve=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`cdfchart`)continue;let n=d[t.id];if(!n||n.kind!==`cdfchart`){e[t.id]=[];continue}e[t.id]=n.cdValueCols.map(e=>({name:e,values:sW(w.rows,e,D)??new Float64Array}))}return e},[w,u,d,D]),ye=dt(()=>{let e={};if(!w)return e;let{rows:t}=w,n={length:0,x:[],y:[],size:[]};for(let r of u){if(r.kind!==`bubblechart`)continue;let i=d[r.id];if(!i||i.kind!==`bubblechart`||!i.bbXCol||!i.bbYCol||!i.bbSizeCol){e[r.id]=n;continue}let a=oW(t,i.bbXCol,D),o=oW(t,i.bbYCol,D),s=oW(t,i.bbSizeCol,D);if(!a||!o||!s){e[r.id]=n;continue}let c=Math.min(a.length,o.length,s.length),l=new Float64Array(c);for(let e=0;e<c;e++)l[e]=s[e]===s[e]?Math.max(0,s[e]):NaN;let u=new Float64Array(c);for(let e=0;e<c;e++)u[e]=l[e]===l[e]?a[e]:NaN;let f={length:c,x:u,y:o,size:l};if(i.bbColorCol){if(i.bbColorMode===`numeric`)f.colorValue=oW(t,i.bbColorCol,D);else if(i.bbColorMode===`categorical`){let e=D?.get(i.bbColorCol),n=new Map,r=new Int32Array(c);for(let a=0;a<c;a++){let o=String(e?e[a]:t[a]?.[i.bbColorCol]??``),s=n.get(o);s===void 0&&n.set(o,s=n.size),r[a]=s}f.colorIndex=r,f.colorLabels=[...n.keys()]}}e[r.id]=f}return e},[w,u,d,D]),be=dt(()=>{if(!w)return{};let e={};for(let t of u){if(t.kind!==`treemap`)continue;let n=d[t.id];if(!n||n.kind!==`treemap`||!n.tmNameCol||!n.tmValueCol){e[t.id]=[];continue}let r=[];for(let e of w.rows){let t=String(e[n.tmNameCol]??``),i=n.tmParentCol?String(e[n.tmParentCol]??``):``,a=e[n.tmValueCol];!t||typeof a!=`number`||!Number.isFinite(a)||r.push({name:t,parent:i,value:a})}e[t.id]=r}return e},[w,u,d]),xe=dt(()=>{if(!w)return{};let e={};for(let t of u){if(t.kind!==`sankey`)continue;let n=d[t.id];if(!n||n.kind!==`sankey`||!n.skSourceCol||!n.skTargetCol||!n.skValueCol){e[t.id]={nodeNames:[],links:[]};continue}let r=new Set,i=[];for(let e of w.rows){let t=String(e[n.skSourceCol]??``),a=String(e[n.skTargetCol]??``),o=e[n.skValueCol];!t||!a||typeof o!=`number`||!Number.isFinite(o)||(r.add(t),r.add(a),i.push({source:t,target:a,value:o}))}e[t.id]={nodeNames:Array.from(r),links:i}}return e},[w,u,d]),Se=dt(()=>{let e={};if(!w)return e;for(let t of u){if(t.kind!==`calibration`)continue;let n=d[t.id],r=n?.kind===`calibration`&&n.cbScoreCol?oW(w.rows,n.cbScoreCol,D):void 0,i=n?.kind===`calibration`&&n.cbLabelCol?oW(w.rows,n.cbLabelCol,D):void 0;if(!n||n.kind!==`calibration`||!r||!i){e[t.id]=[];continue}let a=Math.max(2,n.cbBins),o=new Float64Array(a),s=new Float64Array(a);for(let e=0;e<Math.min(r.length,i.length);e++){let t=r[e],n=i[e];if(t-t!==0||n-n!==0)continue;let c=Math.max(0,Math.min(a-1,Math.floor(t*a)));o[c]+=n,s[c]++}e[t.id]=Array.from({length:a},(e,t)=>({center:(t+.5)/a,actual:s[t]>0?o[t]/s[t]:0,count:s[t]})).filter(e=>e.count>0)}return e},[w,u,d,D]),Ce=dt(()=>{let e={};if(!w)return e;let t={length:0,theoretical:[],sample:[]},n=e=>{let t=sW(w.rows,e,D);return t?Float64Array.from(t).sort():new Float64Array};for(let r of u){if(r.kind!==`qqplot`)continue;let i=d[r.id];if(!i||i.kind!==`qqplot`||!i.qqValueCol){e[r.id]=t;continue}let a=n(i.qqValueCol),o=a.length;if(o===0){e[r.id]=t;continue}if(i.qqMode===`column`&&i.qqRefCol){let t=n(i.qqRefCol),s=Math.min(o,t.length);e[r.id]={length:s,theoretical:t.subarray(0,s),sample:a.subarray(0,s)}}else{let t=e=>{let t=[2.515517,.802853,.010328],n=[1.432788,.189269,.001308],r=Math.sqrt(-2*Math.log(Math.min(e,1-e))),i=r-(t[0]+t[1]*r+t[2]*r*r)/(1+n[0]*r+n[1]*r*r+n[2]*r*r*r);return e<.5?-i:i},n=new Float64Array(o);for(let e=0;e<o;e++)n[e]=t((e+.5)/o);e[r.id]={length:o,theoretical:n,sample:a}}}return e},[w,u,d,D]),we=dt(()=>{if(!w)return{};let e={};for(let t of u){if(t.kind!==`gantt`)continue;let n=d[t.id];if(!n||n.kind!==`gantt`||!n.gtLabelCol||!n.gtStartCol||!n.gtEndCol){e[t.id]=[];continue}let r=[];for(let e of w.rows){let t=String(e[n.gtLabelCol]??``),i=e[n.gtStartCol],a=e[n.gtEndCol];if(!t||typeof i!=`number`||typeof a!=`number`||!Number.isFinite(i)||!Number.isFinite(a))continue;let o={label:t,start:i,end:a};n.gtGroupCol&&e[n.gtGroupCol]!==void 0&&(o.group=String(e[n.gtGroupCol])),r.push(o)}e[t.id]=r}return e},[w,u,d]),Te=w&&w.columnNames.indexOf(f)>=0?w.units[w.columnNames.indexOf(f)]??``:``,Ee=dt(()=>w?RX(w,E?T.length:0):{},[w,E,T]);return{dataset:b,datasetWithChannels:w,multiDatasetMode:E,numericCols:L,anyDuckDb:M,duckDbLayers:I,liveConn:v,liveOverlays:N,hasLiveSelected:_,staticXRange:P,xUnit:Te,columnUnits:Ee,multibandDataByPanel:B,xyPointsByPanel:V,xyzPointsByPanel:te,histogramDataByPanel:H,polarDataByPanel:ne,spectrumDataByPanel:ie,boxplotDataByPanel:U,spectrogramDataByPanel:ae,heatmapDataByPanel:oe,violinDataByPanel:se,confusionDataByPanel:ce,rocDataByPanel:le,lossCurveDataByPanel:ue,controlChartDataByPanel:de,parallelCoordsDataByPanel:fe,embeddingDataByPanel:pe,flameGraphDataByPanel:me,barChartDataByPanel:he,radarDataByPanel:ge,areaChartDataByPanel:_e,cdfChartDataByPanel:ve,bubbleChartDataByPanel:ye,treemapDataByPanel:be,sankeyDataByPanel:xe,calibrationDataByPanel:Se,qqPlotDataByPanel:Ce,ganttDataByPanel:we,gaugeDataByPanel:dt(()=>{let e={};if(!w)return e;let t=e=>e.trim()!==``&&Number.isFinite(Number(e))?Number(e):void 0;for(let n of u){if(n.kind!==`gauge`)continue;let r=d[n.id];if(r?.kind!==`gauge`){e[n.id]=[];continue}e[n.id]=r.ggGauges.flatMap(e=>{let n=e.column,r=n?oW(w.rows,n,D):void 0;if(!r)return[];let i=1/0,a=-1/0,o=0,s=0,c=NaN;for(let e=0;e<r.length;e++){let t=r[e];t-t===0&&(t<i&&(i=t),t>a&&(a=t),o+=t,s++,c=t)}let l=s===0?NaN:e.value===`mean`?o/s:e.value===`min`?i:e.value===`max`?a:c,[u,d]=UX(s?i:0,s?a:1,t(e.min),t(e.max));return[{name:n,unit:Ee[n]??``,value:l,min:u,max:d,alarm:e.alarm??null,color:e.color,style:e.style,fromZero:e.fill===`zero`,colorMode:e.colorMode,stops:e.stops,stat:e.value}]})}return e},[w,u,d,D,Ee])}}function UX(e,t,n,r){t<=e&&(t=e+1);let i=Cz(t-e,5),a=n??Math.floor(e/i)*i,o=r??Math.ceil(t/i)*i;return o>a?[a,o]:[a,a+1]}var WX=`#fb7185`,GX=2500;function KX(e){let{panel:t,data:n,settings:r}=e;if(t.kind===`camera`)return{status:`ready`,data:null,node:q(eX,{settings:r?.kind===`camera`?r:Hn(),live:e.live??[],selection:e.selection??[],viewXRange:e.viewXRange,xIsTime:e.xKey===qe,xKey:e.xKey,video:e.video,recordings:e.recordings,cursor:e.cursor,onContextMenu:t=>e.onContextMenu(t)})};if(!n.dataset)return{status:`no-data`,node:null,data:null};let i=`${e.background??`theme`}|${e.styleToken}`,a=t=>e.onContextMenu(t),s=(e,t)=>({status:`ready`,node:e,data:t}),l={status:`empty`,node:null,data:null},u=t.id;switch(t.kind){case`multiband`:{let t=n.multibandDataByPanel[u],d=t?.points??[],f=t?.effectiveSeries??[],p=r?.kind===`multiband`?r:null,m=[...new Set((p?.series??[]).map(e=>e.column).filter(t=>t!==e.xKey))],h=e.xKey===`ElapsedTime`&&!n.numericCols.includes(`Time`)?`Time`:e.xKey,g={xLabel:n.xUnit?`${h} (${n.xUnit})`:h,series:f,columnUnits:n.columnUnits,height:e.height,backgroundToken:i,viewXRange:e.viewXRange,onViewXRangeChange:e.onViewXRangeChange,onCursorX:e.onCursorX,liveZoom:e.liveZoom,liveZoomId:u,xAxisLine:p?.xAxisLine,yAxisLine:p?.yAxisLine,gridLine:p?.gridLine,lineWidth:p?.lineWidth,onPlotContextMenu:a,shiftMode:e.shiftMode},_=p?.beacon;if(_?.enabled&&e.beaconLive&&m.length>0){let t=IX((p?.series??[]).filter(t=>t.column!==e.xKey),p?.layout??`overlay`),n=_.reference===`dataset`&&_.datasetId?e.findDataset(_.datasetId):void 0,r=xX(_,!!n),i=r?[...hX(t,r),...t]:t;return s(q(IU,{...g,series:i,points:[],showLatestValues:!0,liveSource:bX(e.beaconLive,e.xKey,m,_,n),envelopes:n?SX(n,e.xKey,t,r??void 0):void 0,liveZoomMode:`free`}),{series:i,points:[]})}if(n.anyDuckDb)return f.length===0?l:s(q(rW,{...g,layers:n.duckDbLayers,xKey:e.xKey,columns:m,maxPoints:GX}),{series:f,columns:m});if(!d.some(e=>e.length>0)&&!n.liveOverlays||f.length===0)return l;let v=n.liveConn,y=null,b=n.liveOverlays,x=!v&&b&&m.length>0?uX(b,e.xKey,m,d,n.staticXRange):void 0,S=!!x&&d.length>0,C=x??(v&&m.length>0?{pull:(t,n,r,i)=>{let a=v.source.version();(!y||y.ver!==a||y.x0!==t||y.x1!==n||y.mp!==r)&&(y={ver:a,x0:t,x1:n,mp:r,pts:v.source.getPointsSync(m,{xKey:e.xKey,x0:t,x1:n},r)});let s=o(y.pts,i);if(e.xKey!==`ElapsedTime`)return[s];let l=c(m,e=>v.source.lastKnownSync(e),t,n,Math.min(v.source.latestTimeSync(),i??1/0));return l?[s,l]:[s]},latestT:()=>v.source.latestTimeSync(),xAtTime:t=>v.source.xAtTimeSync(e.xKey,t),xBounds:()=>{let t=v.source.xBoundsSync(e.xKey);return t.x1>t.x0?[t.x0,t.x1]:null},latestX:()=>{let t=v.source.latestSync(e.xKey);return Number.isFinite(t)?t:null},version:()=>v.source.version(),latestValues:e=>v.source.latestValuesSync(e),...e.xKey===`ElapsedTime`?{}:{spanForSeconds:t=>v.source.xTravelSync(e.xKey,t),bufferedSeconds:()=>{let e=v.source.xBoundsSync(`ElapsedTime`);return e.x1-e.x0}}}:void 0);return s(q(IU,{...g,points:d,envelopes:t?.envelopes,showLatestValues:n.hasLiveSelected,fullXRange:n.staticXRange,liveSource:C,liveWindowSeconds:S?null:e.liveWindowSeconds,onLiveWindowChange:S?void 0:e.onLiveWindowChange,liveZoomMode:S?`free`:`follow`}),{series:f,points:d})}case`xyzmesh`:{let t=r?.kind===`xyzmesh`?r:hn(4),o=n.xyzPointsByPanel[u];if(!o||o.points.length<1&&!o.surface)return l;let c=!!o.surface;return s(q(aK,{ref:e.xyzRef,points:o.points,surface:o.surface,xLabel:c?(t.xyzColumns??[]).includes(e.xKey)?`Row`:e.xKey:t.xyzXCol,yLabel:c?`Column`:t.xyzYCol,zLabel:c?`Value`:t.xyzZCol,height:e.height,backgroundToken:i,xRange:ln(t.xyzXScale.scaleMin,t.xyzXScale.scaleMax),yRange:ln(t.xyzYScale.scaleMin,t.xyzYScale.scaleMax),zRange:ln(t.xyzZScale.scaleMin,t.xyzZScale.scaleMax),viewMode:t.xyzViewMode,pointRadius:t.xyzPointRadius,showMesh:t.showMesh,meshStyle:t.meshStyle,meshOpacity:t.meshOpacity,alarms:[...t.xyzXScale.alarm?[{axis:`x`,...t.xyzXScale.alarm}]:[],...t.xyzYScale.alarm?[{axis:`y`,...t.xyzYScale.alarm}]:[],...t.xyzZScale.alarm?[{axis:`z`,...t.xyzZScale.alarm}]:[]],onPlotContextMenu:a}),o.surface??o.points)}case`xyscatter`:{let t=r?.kind===`xyscatter`?r:mn(WX),o=n.xyPointsByPanel.pts[u]??[];if(o.length===0)return l;let c=n.xyPointsByPanel.colorMeta[u];return s(q(qW,{points:o,xLabel:t.xyXCol,yLabel:t.xyYCol,color:t.xyColor,datasetColors:n.xyPointsByPanel.datasetColors[u],colorLabel:c?.label,colorRange:c?[c.min,c.max]:void 0,pointRadius:t.xyPointRadius,drawMode:t.xyDrawMode,lineWidth:t.xyLineWidth,height:e.height,backgroundToken:i,xAxisLine:t.xyXAxisLine,yAxisLine:t.xyYAxisLine,gridLine:t.xyGridLine,fitSettings:t.xyFit,xScale:t.xyXScale,yScale:t.xyYScale,onPlotContextMenu:a}),o)}case`histogram`:{if(r?.kind!==`histogram`)return l;let t=n.histogramDataByPanel[u]??[];return t.length===0?l:s(q(fK,{values:t,label:r.histColumn,bins:r.histBins,color:r.histColor,showNormal:r.histNormal,logY:r.histLogY,height:e.height,backgroundToken:i,onPlotContextMenu:a}),t)}case`polar`:{if(r?.kind!==`polar`)return l;let t=n.polarDataByPanel[u]??{angles:[],radii:[]};if(t.angles.length===0)return l;let o=parseFloat(r.polarRadiusMin),c=parseFloat(r.polarRadiusMax);return s(q(AK,{angles:t.angles,radii:t.radii,angleLabel:r.polarAngleCol,radiusLabel:r.polarRadiusCol,color:r.polarColor,mode:r.polarMode,radiusMin:Number.isFinite(o)?o:void 0,radiusMax:Number.isFinite(c)?c:void 0,height:e.height,backgroundToken:i,onPlotContextMenu:a}),t)}case`spectrum`:{if(r?.kind!==`spectrum`)return l;let{signal:t,rate:o}=n.spectrumDataByPanel[u]??{signal:[],rate:1};return t.length<4?l:s(q(KK,{signal:t,sampleRate:o,label:r.specSignalCol,xMode:r.specXMode,yMode:r.specYMode,window:r.specWindow,color:r.specColor,logX:r.specLogX,height:e.height,backgroundToken:i,onPlotContextMenu:a}),t)}case`boxplot`:{if(r?.kind!==`boxplot`)return l;let t=n.boxplotDataByPanel[u]??[];return t.length===0?l:s(q(QK,{groups:t,color:r.boxColor,whiskers:r.boxWhiskers,height:e.height,backgroundToken:i,onPlotContextMenu:a}),t)}case`spectrogram`:{if(r?.kind!==`spectrogram`)return l;let{signal:e,rate:t}=n.spectrogramDataByPanel[u]??{signal:[],rate:1};return e.length<r.sgWindowSize?l:r.sgView===`waterfall`?s(q(gq,{signal:e,sampleRate:t,windowSize:r.sgWindowSize,overlap:r.sgOverlap,winFunc:r.sgWinFunc,yMode:r.sgYMode,backgroundToken:i,onPlotContextMenu:a}),e):s(q(dq,{signal:e,sampleRate:t,windowSize:r.sgWindowSize,overlap:r.sgOverlap,winFunc:r.sgWinFunc,yMode:r.sgYMode,logFreq:r.sgLogFreq,backgroundToken:i,onPlotContextMenu:a}),e)}case`heatmap`:{if(r?.kind!==`heatmap`)return l;let e=n.heatmapDataByPanel[u]??{cells:[],xLabels:[],yLabels:[]};if(e.cells.length===0&&!(e.grid&&e.grid.w*e.grid.h>0))return l;let t=e=>e!==void 0&&e.trim()!==``&&Number.isFinite(Number(e))?Number(e):void 0;return s(q(Fq,{cells:e.cells,xLabels:e.xLabels,yLabels:e.yLabels,grid:e.grid,showValues:r.hmShowValues,colorScheme:r.hmColorScheme,xCentres:e.xCentres,yCentres:e.yCentres,contours:r.hmContours??0,vMin:t(r.hmRange?.scaleMin),vMax:t(r.hmRange?.scaleMax),backgroundToken:i,onPlotContextMenu:a}),e)}case`violin`:{if(r?.kind!==`violin`)return l;let e=n.violinDataByPanel[u]??[];return e.some(e=>e.values.length>0)?s(q(Uq,{groups:e,color:r.vlColor,showBox:r.vlShowBox,bandwidth:parseFloat(r.vlBandwidth)||void 0,orientation:r.vlOrientation,backgroundToken:i,onPlotContextMenu:a}),e):l}case`confusion`:{if(r?.kind!==`confusion`)return l;let e=n.confusionDataByPanel[u]??{actual:[],predicted:[]};return e.actual.length===0?l:s(q(Xq,{actual:e.actual,predicted:e.predicted,normalize:r.cfNormalize,backgroundToken:i,onPlotContextMenu:a}),e)}case`roc`:{if(r?.kind!==`roc`)return l;let e=n.rocDataByPanel[u]??{scores:[],labels:[]};return e.scores.length===0?l:s(q(nJ,{scores:e.scores,labels:e.labels,mode:r.rocMode,color:r.rocColor,backgroundToken:i,onPlotContextMenu:a}),e)}case`losscurve`:{if(r?.kind!==`losscurve`)return l;let e=n.lossCurveDataByPanel[u]??{xValues:[],series:[]};return e.series.length===0?l:s(q(iJ,{xValues:e.xValues,series:e.series,xLabel:r.lcXCol||`Step`,backgroundToken:i,onPlotContextMenu:a}),e)}case`controlchart`:{if(r?.kind!==`controlchart`)return l;let e=n.controlChartDataByPanel[u];return!e||e.length<2?l:s(q(uJ,{points:e,sigmaLevel:r.ccSigmaLevel,color:r.ccColor,backgroundToken:i,onPlotContextMenu:a}),e)}case`parallelcoords`:{if(r?.kind!==`parallelcoords`)return l;let e=n.parallelCoordsDataByPanel[u];if(!e||e.length===0||r.pcColumns.length<2)return l;let t=r.pcColorByCol?n.numericCols.includes(r.pcColorByCol):!1;return s(q(gJ,{rows:e,axes:r.pcColumns,color:r.pcColor,colorByNumeric:t,backgroundToken:i,onPlotContextMenu:a}),e)}case`embedding`:{if(r?.kind!==`embedding`)return l;let e=n.embeddingDataByPanel[u];return!e||e.length===0?l:s(q(EJ,{points:e,color:r.emColor,colorByNumeric:r.emColorMode===`numeric`&&!!r.emColorCol,pointSize:r.emPointSize,backgroundToken:i,onPlotContextMenu:a}),e)}case`flamegraph`:{if(r?.kind!==`flamegraph`)return l;let e=n.flameGraphDataByPanel[u]??[];return e.length===0?l:s(q(PJ,{nodes:e,direction:r.fgDirection,backgroundToken:i,onPlotContextMenu:a}),e)}case`barchart`:{if(r?.kind!==`barchart`)return l;let e=n.barChartDataByPanel[u]??{groups:[],seriesNames:[]};if(e.groups.length===0&&!e.columns?.length)return l;let t=e=>e!==void 0&&e.trim()!==``&&Number.isFinite(Number(e))?Number(e):void 0,o=r.bcValueScale?{min:t(r.bcValueScale.scaleMin),max:t(r.bcValueScale.scaleMax)}:void 0;return s(q(BJ,{groups:e.columns?void 0:e.groups,columns:e.columns,seriesNames:e.seriesNames,mode:r.bcMode,horizontal:r.bcHorizontal,valueRange:o,backgroundToken:i,onPlotContextMenu:a}),e)}case`radar`:{if(r?.kind!==`radar`)return l;let e=n.radarDataByPanel[u]??{axes:[],series:[]};return e.axes.length<3?l:s(q(WJ,{axes:e.axes,series:e.series,fill:r.rdFill,color:r.rdColor,backgroundToken:i,onPlotContextMenu:a}),e)}case`areachart`:{if(r?.kind!==`areachart`)return l;let e=n.areaChartDataByPanel[u]??[];if(e.length===0)return l;let t=e=>e!==void 0&&e.trim()!==``&&Number.isFinite(Number(e))?Number(e):void 0,o=r.acYScale?{min:t(r.acYScale.scaleMin),max:t(r.acYScale.scaleMax)}:void 0;return s(q(JJ,{series:e,stacked:r.acStacked,yRange:o,backgroundToken:i,onPlotContextMenu:a}),e)}case`cdfchart`:{if(r?.kind!==`cdfchart`)return l;let e=n.cdfChartDataByPanel[u]??[];return e.length===0?l:s(q(ZJ,{series:e,complement:r.cdComplement,logX:r.cdLogX,backgroundToken:i,onPlotContextMenu:a}),e)}case`bubblechart`:{if(r?.kind!==`bubblechart`)return l;let e=n.bubbleChartDataByPanel[u];return!e||e.length===0?l:s(q(aY,{points:e,color:r.bbColor,colorByNumeric:r.bbColorMode===`numeric`,maxRadius:r.bbMaxRadius,backgroundToken:i,onPlotContextMenu:a}),e)}case`treemap`:{let e=n.treemapDataByPanel[u]??[];return e.length===0?l:s(q(uY,{nodes:e,backgroundToken:i,onPlotContextMenu:a}),e)}case`sankey`:{let e=n.sankeyDataByPanel[u]??{nodeNames:[],links:[]};return e.links.length===0?l:s(q(gY,{nodeNames:e.nodeNames,links:e.links,backgroundToken:i,onPlotContextMenu:a}),e)}case`calibration`:{if(r?.kind!==`calibration`)return l;let e=n.calibrationDataByPanel[u]??[];return e.length===0?l:s(q(vY,{bins:e,color:r.cbColor,backgroundToken:i,onPlotContextMenu:a}),e)}case`qqplot`:{if(r?.kind!==`qqplot`)return l;let e=n.qqPlotDataByPanel[u];return!e||e.length===0?l:s(q(bY,{points:e,color:r.qqColor,backgroundToken:i,onPlotContextMenu:a}),e)}case`gauge`:{if(r?.kind!==`gauge`)return l;let e=n.gaugeDataByPanel[u]??[];if(e.length===0)return l;let t=n.liveConn??(n.liveOverlays?.length===1?n.liveOverlays[0].conn:void 0);return s(q(FY,{gauges:e,live:t?{latestT:()=>t.source.latestTimeSync(),valueAt:(e,n)=>t.source.xAtTimeSync(e,n,!0)}:void 0,backgroundToken:i,onPlotContextMenu:a}),e)}case`gantt`:{let e=n.ganttDataByPanel[u]??[];return e.length===0?l:s(q(TY,{tasks:e,backgroundToken:i,onPlotContextMenu:a}),e)}}return l}var qX=500,JX=1e3;function YX(e){if(Array.isArray(e))return XX(e);if(!e||typeof e!=`object`)return null;let t=-1;for(let n of Object.values(e))Array.isArray(n)&&(t=Math.max(t,XX(n)));return t<0?null:t}function XX(e){let t=e=>!!e&&typeof e==`object`&&e.x instanceof Float64Array;return e.length>0&&t(e[0])?e.reduce((e,n)=>e+(t(n)?n.length:0),0):e.length}function ZX(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e4?`${Math.round(e/1e3)}k`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function QX({stats:e,host:t}){let[n,r]=ft(null);if(W(()=>{let n=t.current?.ownerDocument.defaultView??window,i=0,a=0,o=0,s=-1,c=-1,l=e.renders,u=t.current?xH(t.current):0,d=f=>{c>=0&&f-s>JX&&(c=f,s=f,a=0,o=0,l=e.renders,u=t.current?xH(t.current):0),c<0?(c=f,s=f):f!==s&&(o=Math.max(o,f-s),s=f,a++);let p=f-c;if(p>=qX){let i=t.current,s=0;if(i)for(let e of i.getElementsByTagName(`canvas`))s+=e.width*e.height;let d=n.performance.memory,m=i?xH(i):0;r({fps:a*1e3/p,repaints:(m-u)*1e3/p,worstFrameMs:o,renderMs:e.lastRenderMs,rendersPerSec:(e.renders-l)*1e3/p,points:YX(e.data),domNodes:i?i.getElementsByTagName(`*`).length:0,canvasMp:s/1e6,heapMb:d?d.usedJSHeapSize/1048576:null}),a=0,o=0,c=f,l=e.renders,u=m}i=n.requestAnimationFrame(d)};return i=n.requestAnimationFrame(d),()=>n.cancelAnimationFrame(i)},[e,t]),!n)return null;let i=n.fps<20?`var(--danger, #e5484d)`:n.fps<45?`var(--accent, #f5a524)`:void 0;return q(`dl`,{className:`kymo-perf-hud`,style:$X,children:[[`FPS`,n.fps.toFixed(0),i],[`Repaints/s`,n.repaints.toFixed(0)],[`Slowest frame`,`${n.worstFrameMs.toFixed(1)} ms`],[`Render`,`${n.renderMs.toFixed(1)} ms`],[`Renders/s`,n.rendersPerSec.toFixed(1)],...n.points===null?[]:[[`Points`,ZX(n.points)]],[`DOM nodes`,ZX(n.domNodes)],[`Canvas`,`${n.canvasMp.toFixed(2)} MP`],...n.heapMb===null?[]:[[`JS heap`,`${n.heapMb.toFixed(0)} MB`]]].map(([e,t,n])=>_t(`div`,{style:eZ,children:[q(`dt`,{style:tZ,children:e}),q(`dd`,{style:n?{...nZ,color:n}:nZ,children:t})]},e))})}var $X={position:`absolute`,top:8,right:8,zIndex:60,flex:`none`,pointerEvents:`none`,userSelect:`none`,margin:0,padding:`6px 9px`,minWidth:148,display:`grid`,gap:1,font:`500 10.5px/1.35 var(--font-sans, system-ui)`,fontVariantNumeric:`tabular-nums`,fontFeatureSettings:`"tnum" 1`,color:`var(--text-strong, #f3f5fa)`,background:`color-mix(in oklch, var(--bg-elevated, #1b2130) 86%, transparent)`,border:`1px solid var(--border, #33405a)`,borderRadius:6,boxShadow:`0 4px 14px color-mix(in oklch, black 28%, transparent)`},eZ={display:`flex`,justifyContent:`space-between`,gap:12},tZ={color:`var(--text-muted, #8a93a6)`},nZ={margin:0,fontWeight:600,textAlign:`right`},rZ=[],iZ=3,aZ=`data-kymo-annotation-controls`;function oZ(e,t,n,r){return e.anchor===`x`&&!r?null:e.points.map(([i,a])=>[e.anchor===`x`?zH(r,i):i*t,a*n])}function sZ(e,t,n,r,i){return t.map(([t,a])=>[e.anchor===`x`&&i?BH(i,t):cZ(t/Math.max(1,n)),cZ(a/Math.max(1,r))])}var cZ=e=>Math.round(e*1e4)/1e4,lZ=ot(function({annotations:e,tool:t,plotFrame:n,onChange:r,onToolEnd:i,onSelect:a,marks:o=rZ,onMarkSelect:s}){let c=K(null),l=pt(n.subscribe,n.get),u=l?.x?l:null,[d,f]=ft({w:0,h:0}),[p,m]=ft(null),[h,g]=ft(null),[_,v]=ft(null),y=K({annotations:e,onChange:r,onToolEnd:i,onSelect:a,tool:t,selected:p,editing:h,frame:u,size:d});y.current={annotations:e,onChange:r,onToolEnd:i,onSelect:a,tool:t,selected:p,editing:h,frame:u,size:d};let b=e=>{y.current.selected!==e&&(y.current.selected=e,m(e),y.current.onSelect(e))};G(()=>{let e=c.current;if(!e)return;let t=e.ownerDocument.defaultView??window,n=()=>f({w:e.clientWidth,h:e.clientHeight});n();let r=new t.ResizeObserver(n);return r.observe(e),()=>r.disconnect()},[]),W(()=>{t&&b(null)}),W(()=>{p&&!e.some(e=>e.id===p)&&b(null)}),W(()=>()=>{y.current.selected&&y.current.onSelect(null)},[]),W(()=>{let e=c.current?.ownerDocument;if(!e)return;let t=e=>{let{selected:t,editing:n,tool:r,annotations:i,onChange:a,onToolEnd:o}=y.current;if(!(n||vZ(e.target))){if(e.key===`Escape`&&r){o();return}t&&(e.key===`Delete`||e.key===`Backspace`?(e.preventDefault(),a(i.filter(e=>e.id!==t)),b(null)):e.key===`Escape`&&b(null))}},n=e=>{let t=y.current.selected,n=e.target;t&&!n?.closest?.(`[data-ann-id="${CSS.escape(t)}"], [data-kymo-annotation-controls]`)&&b(null)};return e.addEventListener(`keydown`,t),e.addEventListener(`pointerdown`,n,!0),()=>{e.removeEventListener(`keydown`,t),e.removeEventListener(`pointerdown`,n,!0)}},[]);let{w:x,h:S}=d,C=e=>{let t=c.current.getBoundingClientRect();return[e.clientX-t.left,e.clientY-t.top]},w=(e,t)=>{let n=c.current.ownerDocument,r=t=>e(C(t),t),i=()=>{n.removeEventListener(`pointermove`,r),n.removeEventListener(`pointerup`,i),n.removeEventListener(`pointercancel`,i),t()};n.addEventListener(`pointermove`,r),n.addEventListener(`pointerup`,i),n.addEventListener(`pointercancel`,i)},T=e=>r([...y.current.annotations,e]),E=e=>r(y.current.annotations.map(t=>t.id===e.id?e:t)),D=e=>{if(!t||e.button!==0||h)return;e.preventDefault(),e.stopPropagation();let n=C(e),r={id:crypto.randomUUID(),kind:t.kind,color:t.color,width:t.width,...u?{anchor:`x`}:{}},i=e=>sZ(r,e,x,S,u);if(t.kind===`text`){v({...r,points:i([n]),text:``}),g(r.id);return}let a=t.kind===`brush`?[n]:[n,n],o={...r,points:i(a)};v(o);let s=!1;w((t,n)=>{if(s||=Math.hypot(n.clientX-e.clientX,n.clientY-e.clientY)>iZ,r.kind===`brush`){let e=a[a.length-1];if(Math.hypot(t[0]-e[0],t[1]-e[1])<2)return;a=[...a,t]}else a=[a[0],t];o={...o,points:i(a)},v(o)},()=>{v(null),s&&o.points.length>=2&&T(o)})},O=(e,t,n)=>{let r=oZ(t,x,S,u);if(!r)return;let i=C(e),a=null;w((o,s)=>{if(!a&&Math.hypot(s.clientX-e.clientX,s.clientY-e.clientY)<=iZ)return;let{size:c,frame:l}=y.current;a={...t,points:sZ(t,n(r,[o[0]-i[0],o[1]-i[1]],o),c.w,c.h,l)},v(a)},()=>{v(null),a&&E(a)})},k=(e,n)=>{t||e.button!==0||h===n.id||(e.preventDefault(),e.stopPropagation(),b(n.id),O(e,n,(e,[t,n])=>e.map(([e,r])=>[e+t,r+n])))},A=(e,t,n)=>{e.button===0&&(e.preventDefault(),e.stopPropagation(),O(e,t,(e,r,i)=>{let a=e.map(e=>[...e]);return t.kind===`arrow`?a[n]=i:(a[+(n===1||n===2)][0]=i[0],a[+(n===2||n===3)][1]=i[1]),a}))},j=e=>{t||e.kind!==`text`&&e.kind!==`box`||(b(e.id),g(e.id))},M=e=>{let t=h;g(null);let n=_&&_.id===t?_:null;if(v(null),e===null||!t)return;let i=e.replace(/\s+$/,``),a=y.current.annotations;if(n){i&&T({...n,text:i});return}let o=a.find(e=>e.id===t);o&&(!i&&o.kind===`text`?r(a.filter(e=>e.id!==t)):E(_Z(o,i)))},N=e=>{r(y.current.annotations.filter(t=>t.id!==e)),b(null)},P=(_?e.some(e=>e.id===_.id)?e.map(e=>e.id===_.id?_:e):[...e,_]:e).flatMap(e=>{let t=oZ(e,x,S,u);return t?[{a:e,px:t}]:[]}),F=p?P.find(e=>e.a.id===p):void 0,I=u?o.map(e=>{let t=oZ(Lt(e,u.x.v1),x,S,u);return{m:e,x0:Math.min(t[0][0],t[1][0]),x1:Math.max(t[0][0],t[1][0])}}):[],L=F&&F.a.kind!==`text`?gZ(F.px):null,R=e=>_t(gt,{children:[q(`svg`,{className:`kymo-ann-svg`,width:x,height:S,viewBox:`0 0 ${x} ${S}`,"aria-hidden":`true`,children:e.map(({a:e,px:t})=>e.kind===`text`?null:q(`g`,{"data-ann-id":e.id,className:`kymo-ann kymo-ann--${e.kind}`,onPointerDown:t=>k(t,e),onDoubleClick:()=>j(e),children:q(fZ,{a:e,px:t})},e.id))}),e.map(({a:e,px:t})=>{if(e.kind!==`text`&&e.kind!==`box`)return null;let n=h===e.id;if(!n&&!e.text)return null;let r=e.kind===`text`?{left:t[0][0],top:t[0][1]}:{left:Math.min(t[0][0],t[1][0]),top:Math.min(t[0][1],t[1][1]),transform:`translateY(calc(-100% - 3px))`};return _t(`div`,{"data-ann-id":e.id,className:`kymo-ann-text kymo-ann-text--${e.kind}${p===e.id&&e.kind===`text`?` is-selected`:``}`,style:{...r,color:e.color,fontSize:e.kind===`text`?e.width:12},onPointerDown:t=>k(t,e),onDoubleClick:()=>j(e),children:[n?q(dZ,{initial:e.text??``,onDone:M}):e.text,p===e.id&&e.kind===`text`&&!n?q(uZ,{onDelete:()=>N(e.id),style:{right:-11,top:-11}}):null]},`t-${e.id}`)})]});return q(`div`,{ref:c,className:`kymo-annotations${t?` is-drawing is-tool-${t.kind}`:``}`,onPointerDown:D,onContextMenu:t?e=>e.preventDefault():void 0,children:x>0&&S>0?_t(gt,{children:[u&&I.length?q(`div`,{className:`kymo-ann-clip`,style:{clipPath:`inset(0 ${Math.max(0,x-u.left-u.width)}px 0 ${Math.max(0,u.left)}px)`},children:q(`svg`,{className:`kymo-ann-svg kymo-marks`,width:x,height:S,viewBox:`0 0 ${x} ${S}`,children:I.map(({m:e,x0:t,x1:n})=>_t(`g`,{"data-mark":e.ruleId,role:`img`,"aria-label":`${e.ruleName}, ${e.severity}`,className:`kymo-mark kymo-mark--${e.severity}`,style:{color:It[e.severity]},children:[q(`rect`,{x:t,y:u.top,width:Math.max(1,n-t),height:u.height,fill:`currentColor`,fillOpacity:.12}),q(`rect`,{x:t,y:u.top,width:Math.max(1,n-t),height:2,fill:`currentColor`}),q(`rect`,{className:`kymo-mark-hit`,x:t,y:u.top,width:Math.max(6,n-t),height:8,onPointerDown:t=>{t.stopPropagation(),s?.(e.ruleId)}})]},e.id))})}):null,R(P.filter(e=>e.a.anchor!==`x`)),u?q(`div`,{className:`kymo-ann-clip`,style:{clipPath:`inset(0 ${Math.max(0,x-u.left-u.width)}px 0 ${Math.max(0,u.left)}px)`},children:R(P.filter(e=>e.a.anchor===`x`))}):null,_t(`svg`,{className:`kymo-ann-svg`,width:x,height:S,viewBox:`0 0 ${x} ${S}`,"aria-hidden":`true`,children:[L?q(`rect`,{className:`kymo-ann-selection`,x:L.x-6,y:L.y-6,width:L.w+12,height:L.h+12,rx:4}):null,F&&!h&&(F.a.kind===`box`||F.a.kind===`arrow`)?q(`g`,{"data-ann-id":F.a.id,children:pZ(F.a,F.px).map(([e,t],n)=>q(`rect`,{className:`kymo-ann-handle kymo-ann-handle--${F.a.kind===`arrow`?`end`:n%2?`nesw`:`nwse`}`,x:e-4.5,y:t-4.5,width:9,height:9,rx:2,onPointerDown:e=>A(e,F.a,n)},n))}):null]}),L&&!h?q(uZ,{onDelete:()=>N(F.a.id),id:F.a.id,style:{left:Math.min(x-12,L.x+L.w+6)-10,top:Math.max(10,L.y-6)-10}}):null]}):null})});function uZ({onDelete:e,style:t,id:n}){return q(`button`,{type:`button`,className:`kymo-ann-delete`,style:t,"data-ann-id":n,"aria-label":`Delete annotation`,title:`Delete (Del)`,onPointerDown:e=>e.stopPropagation(),onClick:e,children:q(`svg`,{viewBox:`0 0 10 10`,width:`8`,height:`8`,"aria-hidden":`true`,children:q(`path`,{d:`M2 2l6 6M8 2l-6 6`})})})}function dZ({initial:e,onDone:t}){let n=K(null),r=K(!1),i=e=>{r.current||(r.current=!0,t(e))};return G(()=>{let t=n.current;if(!t)return;t.textContent=e,t.focus();let r=t.ownerDocument.createRange();r.selectNodeContents(t);let i=t.ownerDocument.defaultView?.getSelection();i?.removeAllRanges(),i?.addRange(r)},[]),q(`div`,{ref:n,className:`kymo-ann-editor`,contentEditable:`plaintext-only`,suppressContentEditableWarning:!0,role:`textbox`,"aria-label":`Annotation text`,"aria-multiline":`true`,onPointerDown:e=>e.stopPropagation(),onKeyDown:e=>{e.stopPropagation(),e.key===`Enter`&&!e.shiftKey?(e.preventDefault(),i(n.current?.innerText??``)):e.key===`Escape`&&(e.preventDefault(),i(null))},onBlur:()=>i(n.current?.innerText??``)})}function fZ({a:e,px:t}){let n={stroke:e.color,strokeWidth:e.width,fill:`none`,strokeLinecap:`round`,strokeLinejoin:`round`},r=t=>q(`path`,{className:`kymo-ann-hit`,d:t,strokeWidth:Math.max(12,e.width+10)});switch(e.kind){case`box`:{let[[i,a],[o,s]]=t,c=`M${i} ${a}H${o}V${s}H${i}Z`;return _t(gt,{children:[r(c),q(`path`,{d:c,...n}),q(`path`,{d:c,fill:e.color,fillOpacity:.06,stroke:`none`,pointerEvents:`none`})]})}case`arrow`:{let[[i,a],[o,s]]=t,c=hZ(i,a,o,s,e.width);return _t(gt,{children:[r(`M${i} ${a}L${o} ${s}`),q(`path`,{d:`M${i} ${a}L${c.base[0]} ${c.base[1]}`,...n}),q(`path`,{d:c.d,fill:e.color,stroke:e.color,strokeWidth:1,strokeLinejoin:`round`})]})}case`brush`:{let e=mZ(t);return _t(gt,{children:[r(e),q(`path`,{d:e,...n})]})}}return null}function pZ(e,t){if(e.kind===`arrow`)return t;let[[n,r],[i,a]]=t;return[[n,r],[i,r],[i,a],[n,a]]}function mZ(e){if(e.length===0)return``;if(e.length<3)return`M${e[0][0]} ${e[0][1]}`+e.slice(1).map(([e,t])=>`L${e} ${t}`).join(``);let t=`M${e[0][0]} ${e[0][1]}`;for(let n=1;n<e.length-1;n++){let[r,i]=e[n],[a,o]=e[n+1];t+=`Q${r} ${i} ${(r+a)/2} ${(i+o)/2}`}let[n,r]=e[e.length-1];return t+`L${n} ${r}`}function hZ(e,t,n,r,i){let a=Math.max(9,i*4),o=Math.atan2(r-t,n-e),s=.42,c=[n-a*Math.cos(o-s),r-a*Math.sin(o-s)],l=[n-a*Math.cos(o+s),r-a*Math.sin(o+s)],u=[n-a*.8*Math.cos(o),r-a*.8*Math.sin(o)];return{d:`M${n} ${r}L${c[0]} ${c[1]}L${l[0]} ${l[1]}Z`,base:u,l:c,r:l}}function gZ(e){let t=e.map(e=>e[0]),n=e.map(e=>e[1]),r=Math.min(...t),i=Math.min(...n);return{x:r,y:i,w:Math.max(...t)-r,h:Math.max(...n)-i}}function _Z(e,t){if(t)return{...e,text:t};let{text:n,...r}=e;return r}function vZ(e){let t=e;return!!t&&(t.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName))}function yZ(e,t,n,r,i,a,o){e.save(),e.scale(i,i),e.lineCap=`round`,e.lineJoin=`round`;for(let i of t){let t=oZ(i,n,r,o);t&&(e.save(),i.anchor===`x`&&o&&(e.beginPath(),e.rect(o.left,0,o.width,r),e.clip()),bZ(e,i,t,a),e.restore())}e.restore()}function bZ(e,t,n,r){if(e.strokeStyle=t.color,e.fillStyle=t.color,e.lineWidth=t.width,t.kind===`box`)e.strokeRect(n[0][0],n[0][1],n[1][0]-n[0][0],n[1][1]-n[0][1]);else if(t.kind===`brush`)e.stroke(new Path2D(mZ(n)));else if(t.kind===`arrow`){let r=hZ(n[0][0],n[0][1],n[1][0],n[1][1],t.width);e.beginPath(),e.moveTo(n[0][0],n[0][1]),e.lineTo(r.base[0],r.base[1]),e.stroke(),e.beginPath(),e.moveTo(n[1][0],n[1][1]),e.lineTo(r.l[0],r.l[1]),e.lineTo(r.r[0],r.r[1]),e.closePath(),e.fill()}if(!t.text)return;let i=t.kind===`text`?t.width:12;e.font=`600 ${i}px ${r}`,e.textBaseline=`top`;let a=t.text.split(`
|
|
613
|
-
`),o=i*1.25,s=n[0][0],c=n[0][1];t.kind===`box`&&(s=Math.min(n[0][0],n[1][0]),c=Math.min(n[0][1],n[1][1])-a.length*o-7),a.forEach((t,n)=>e.fillText(t,s+6,c+2+n*o))}var xZ={solid:void 0,dashed:`5 4`,dotted:`1 4`};function SZ(e,t,n){if(!e||!(n===`x`?e.x:e.y))return null;if(n===`x`){let n=zH(e,t.value);return n>=e.left-.5&&n<=e.left+e.width+.5?[n,e.top,n,e.top+e.height]:null}let r=VH(e,t.value);return r>=e.top-.5&&r<=e.top+e.height+.5?[e.left,r,e.left+e.width,r]:null}var CZ=ot(function({frame:e,alarm:t,axis:n}){let r=SZ(pt(e.subscribe,e.get),t,n);if(!r)return null;let i=t.linked?wZ(r,n):null;return _t(`svg`,{className:`kymo-alarm`,"aria-hidden":`true`,children:[q(`line`,{x1:r[0],y1:r[1],x2:r[2],y2:r[3],stroke:t.color,strokeWidth:t.width,strokeDasharray:t.linked===`active`?JH.join(` `):xZ[t.style]}),i?q(`path`,{"data-alert-glyph":``,d:qH,transform:`translate(${i[0]} ${i[1]})`,fill:t.color}):null]})});function wZ(e,t){return t===`y`?[e[2]-10-3,e[1]-10-2]:[e[0]+3,e[1]+2]}function TZ(e,t,n,r,i){let a=SZ(t,n,r);if(a){if(e.save(),e.scale(i,i),e.strokeStyle=n.color,e.lineWidth=n.width,e.setLineDash(n.linked===`active`?JH:xZ[n.style]?.split(` `).map(Number)??[]),e.beginPath(),e.moveTo(a[0],a[1]),e.lineTo(a[2],a[3]),e.stroke(),n.linked){let t=wZ(a,r);XH(e,t[0],t[1],n.color)}e.restore()}}function EZ(e,t,n){return e.handlers?.wsId===n?e.handlers:e.handlers={wsId:n,onViewXRangeChange:r=>{t.view.setXRange(r,n),e.emitter.emit(`viewchange`,r)},onCursorX:e=>{try{t.view.setCursorX(e,n)}catch{}},cursor:{get:()=>{try{return t.view.cursorX(n)}catch{return null}},subscribe:e=>t.on(`cursorchange`,t=>{t.worksheetId===n&&e(t.x)})},onContextMenu:t=>e.emitter.emit(`contextmenu`,t),xyzRef:t=>{e.xyz=t},onAnnotations:n=>t.charts.setAnnotations(e.chartId,n),onAnnotationToolEnd:()=>{e.annotationTool=null,jZ(t).bump(),e.emitter.emit(`annotationtool`,null)},onAnnotationSelect:t=>{e.selectedAnnotation=t,e.emitter.emit(`annotationselect`,t)},onMarkSelect:t=>e.emitter.emit(`markselect`,t)}}var DZ=new WeakMap;function OZ(e){let t=DZ.get(e);return t||DZ.set(e,t=t=>e.view.setLiveWindow(t)),t}var kZ=class{mounts=new Map;version=0;listeners=new Set;root=null;engine;constructor(e){this.engine=e}subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)});getVersion=()=>this.version;bump(){this.version++;for(let e of[...this.listeners])e()}add(e){this.mounts.set(e.key,e),this.root||(this.root=ht(document.createElement(`div`)),this.root.render(q(LZ,{engine:this.engine,registry:this}))),this.bump()}remove(e){this.mounts.delete(e)&&this.bump()}refresh(){this.bump()}dispose(){this.mounts.clear(),this.root?.unmount(),this.root=null}},AZ=new WeakMap;function jZ(e){let t=AZ.get(e);return t||(t=new kZ(e),AZ.set(e,t)),t}function MZ(e,t,n,r={}){e.charts.get(t);let i=jZ(e),a={key:crypto.randomUUID(),chartId:t,element:n,options:r,shiftDatasetId:null,emitter:IV(),xyz:null,annotationTool:null,selectedAnnotation:null,plotFrame:WH(),status:null,data:null};i.add(a);let o=!1;return{chartId:t,status:()=>a.status,data:()=>a.data,on:(e,t)=>a.emitter.on(e,t),exportPng(){let r=Array.from(n.querySelectorAll(`canvas`));if(r.length===0)return Promise.reject(new OE(`export_failed`,{reason:`nothing to export`}));let i=document.createElement(`canvas`);i.width=r[0].width,i.height=r[0].height;let o=i.getContext(`2d`);if(!o)return Promise.reject(new OE(`export_failed`,{reason:`canvas unavailable`}));for(let e of r)o.drawImage(e,0,0);let s=e.charts.get(t),c=qZ(s.settings,K$(e).alertLines()),l=a.plotFrame.get()?.x?a.plotFrame.get():null,u=e.getState(),d=u.worksheets.find(e=>e.charts.some(e=>e.id===t)),f=XZ(s.annotations,d?JZ(u.marks,u.selection,d.xKey):[],l),p=tr(c);return p&&n.clientWidth>0&&TZ(o,a.plotFrame.get(),p.alarm,p.axis,i.width/n.clientWidth),f.length&&n.clientWidth>0&&yZ(o,f,n.clientWidth,n.clientHeight,i.width/n.clientWidth,Q.sans,l),new Promise((e,t)=>i.toBlob(n=>n?e(n):t(new OE(`export_failed`,{reason:`encode failed`})),`image/png`))},autoscale(){a.xyz?.autoscale()},setShiftMode(e){a.shiftDatasetId!==e&&(a.shiftDatasetId=e,i.bump())},setAnnotationTool(e){a.annotationTool=e?{...e}:null,i.bump()},annotationTool:()=>a.annotationTool,selectedAnnotation:()=>a.selectedAnnotation,setOptions(e){a.options={...e},i.bump()},destroy(){o||(o=!0,a.emitter.clear(),i.remove(a.key))}}}function NZ(e){AZ.get(e)?.refresh()}function PZ(e){AZ.get(e)?.dispose(),AZ.delete(e)}function FZ(e){let t=new MutationObserver(e);return t.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-color-scheme`,`class`,`data-theme`]}),()=>t.disconnect()}var IZ=()=>{let e=document.documentElement;return`${e.getAttribute(`data-color-scheme`)??``}|${e.getAttribute(`data-theme`)??``}|${e.className}`};function LZ({engine:e,registry:t}){pt(t.subscribe,t.getVersion);let n=K$(e),r=pt(n.store.subscribe,n.store.get),i=new Map;for(let e of t.mounts.values()){let t=r.worksheets.find(t=>t.panels.some(t=>t.id===e.chartId));if(!t)continue;let n=i.get(t.id)??{worksheet:t,mounts:[]};n.mounts.push(e),i.set(t.id,n)}return q(gt,{children:[...i.values()].map(t=>q(VZ,{engine:e,worksheet:t.worksheet,mounts:t.mounts},t.worksheet.id))})}var RZ=1e3,zZ=.25;function BZ(e,t,n){let[r,i]=ft(0),a=K(0),o=K(0);return W(()=>{a.current&&=(o.current=performance.now()-a.current,0)}),W(()=>{if(!n)return;let r=0,s=-1,c=0,l=n=>{if(r=_H(l),a.current||n<c||SH())return;let u=0;for(let n of e)t.includes(n.id)&&(u+=n.source.version());u!==s&&(s=u,c=n+o.current*(1/zZ-1),a.current=performance.now(),st(()=>i(e=>e+1)))};return r=_H(l),()=>vH(r)},[n,e,t]),dt(()=>n?e.map(e=>t.includes(e.id)?{...e,dataset:e.source.snapshot(RZ)}:e):e,[e,t,n,r])}function VZ({engine:e,worksheet:t,mounts:n}){let r=K$(e),i=pt(r.store.subscribe,r.store.get),a=r.derived(),o=i.xRanges[t.id]??null,s=dt(()=>i.live.filter(e=>e.kind===`data`),[i.live]),c=a.selectedLive.length,l=e=>{let n=t.panelChartSettings[e];return n?.kind===`multiband`&&n.beacon?.enabled===!0},u=c>0&&t.panels.some(e=>e.kind!==`multiband`&&e.kind!==`camera`||c>1&&!l(e.id)),d=BZ(s,i.selection,u),f=r.alertLines(),p=HX({worksheet:GZ(t,f),viewXRange:o,selectedIds:i.selection,selectedDatasets:a.selectedDatasets,liveConnections:d,mathChannels:a.channels,datasetOffsets:i.offsets,datasetColors:i.colors,datasetPalette:i.palette}),m=K(PV()).current,h=pt(FZ,IZ),g=t.id,_=OZ(e),v=i.licensed,y=a.selectedLive[0]??null,b=e=>i.datasets.find(t=>t.id===e)??Object.values(a.laps).flatMap(e=>e.laps).find(t=>t.id===e);return q(gt,{children:n.map(n=>{let r=t.panels.find(e=>e.id===n.chartId);if(!r)return null;let s=n.shiftDatasetId?a.selectedDatasets.find(e=>e.id===n.shiftDatasetId):void 0,c=EZ(n,e,g),l=qZ(t.panelChartSettings[r.id],f);return mt(q(eQ,{mount:n,annotations:t.panelChartSettings[r.id]?.annotations,marks:JZ(i.marks,i.selection,t.xKey),onMarkSelect:c.onMarkSelect,alarm:tr(l),onAnnotations:c.onAnnotations,onAnnotationToolEnd:c.onAnnotationToolEnd,onAnnotationSelect:c.onAnnotationSelect,render:u=>KX({panel:r,settings:l,background:n.options.style?.background??t.panelChartBackgrounds[r.id]??null,styleToken:JSON.stringify([h,n.options.theme,n.options.style,Q]),data:p,xKey:t.xKey,height:u,viewXRange:o,onViewXRangeChange:c.onViewXRangeChange,onCursorX:c.onCursorX,liveZoom:m,liveWindowSeconds:i.liveWindowSeconds,onLiveWindowChange:_,beaconLive:y,findDataset:b,live:i.live,selection:i.selection,cursor:c.cursor,video:e.video.sources(),recordings:ZY(a.selectedDatasets,i.offsets),shiftMode:s?HZ(e,s.id,s.name):void 0,onContextMenu:c.onContextMenu,xyzRef:c.xyzRef}),licensed:v},n.key),n.element,n.key)})})}function HZ(e,t,n){let r=0;return{label:n,onDragStart:()=>{r=e.getState().datasets.find(e=>e.id===t)?.offset??0},onDragOffset:n=>e.datasets.setOffset(t,r+n)}}var UZ=[],WZ=new WeakMap;function GZ(e,t){if(!t.size)return e;let n=WZ.get(e);if(n&&n.lines===t)return n.out;let r=!1,i={};for(let[n,a]of Object.entries(e.panelChartSettings))i[n]=qZ(a,t),i[n]!==a&&(r=!0);let a=r?{...e,panelChartSettings:i}:e;return WZ.set(e,{lines:t,out:a}),a}var KZ=new WeakMap;function qZ(e,t){if(!e||!t.size)return e;let n=KZ.get(e);if(n&&n.lines===t)return n.out;let r=$n(e,t);return KZ.set(e,{lines:t,out:r}),r}var JZ=ZZ((e,t,n)=>{let r=e.filter(e=>e.timeColumn===n&&t.includes(e.targetId));return r.length?r:YZ}),YZ=[];function XZ(e,t,n){return!t.length||!n?.x?e:[...t.map(e=>Lt(e,n.x.v1)),...e]}function ZZ(e){let t=null,n;return(r,i,a)=>t&&t[0]===r&&t[1]===i&&t[2]===a?n:(t=[r,i,a],n=e(r,i,a),n)}function QZ(e,t){e.data=t}function $Z(e,t){e.status!==t&&(e.status=t,e.emitter.emit(`status`,t))}function eQ({mount:e,render:t,licensed:n,annotations:r,marks:i,alarm:a,onAnnotations:o,onAnnotationToolEnd:s,onAnnotationSelect:c,onMarkSelect:l}){let u=K(null),[d,f]=ft(0),p=!!e.options.debug,m=K({renderStart:0,lastRenderMs:0,renders:0,data:null}).current;p&&(m.renderStart=performance.now()),G(()=>{p&&(m.lastRenderMs=performance.now()-m.renderStart,m.renders++)}),G(()=>{let e=u.current;if(!e)return;let t=()=>f(Math.max(120,Math.floor(e.clientHeight)));t();let n=new CH(t);return n.observe(e),()=>n.disconnect()},[]);let{status:h,node:g,data:_}=t(d||400);m.data=_,W(()=>{QZ(e,_)}),W(()=>{$Z(e,h)});let{theme:v,style:y,className:b}=e.options,x={};return y?.background&&(x[`--chart-bg`]=y.background),y?.muted&&(x[`--chart-muted`]=y.muted),y?.grid&&(x[`--chart-grid`]=y.grid),y?.accent&&(x[`--accent`]=y.accent),_t(`div`,{ref:u,onContextMenu:h===`ready`?void 0:t=>{t.preventDefault(),e.emitter.emit(`contextmenu`,{clientX:t.clientX,clientY:t.clientY})},className:b?`kymo-chart ${b}`:`kymo-chart`,"data-color-scheme":v,"data-status":h,style:x,children:[q(GH.Provider,{value:e.plotFrame.set,children:g}),h===`ready`&&a?q(CZ,{frame:e.plotFrame,alarm:a.alarm,axis:a.axis}):null,h===`ready`&&(r?.length||e.annotationTool||i.length)?q(lZ,{annotations:r??UZ,tool:e.annotationTool,plotFrame:e.plotFrame,onChange:o,onToolEnd:s,onSelect:c,marks:i,onMarkSelect:l}):null,p?q(QX,{stats:m,host:u}):null,n===!1?q(FV,{}):null]})}var tQ=new WeakMap;function nQ(e,t,n,r={}){let i=tQ.get(e)??new Map;tQ.set(e,i);let a=i.get(t);if(a&&!a.window.closed)return a.window.focus(),a;let o=e.charts.get(t),s=r.title??(o.title||e.charts.label(o.kind)),c=window.open(``,`kymoscope-chart-${t}`,`popup,width=${r.width??960},height=${r.height??600}`);if(!c)throw new OE(`popup_blocked`,{chartId:t});let l=c.document;l.head.replaceChildren(),l.body.replaceChildren(),l.title=s;for(let e of document.querySelectorAll(`style, link[rel="stylesheet"]`)){let t=e.cloneNode(!0);t instanceof HTMLLinkElement&&(t.href=e.href),l.head.appendChild(t)}let u=()=>{for(let e of[...l.documentElement.attributes])l.documentElement.removeAttribute(e.name);for(let e of document.documentElement.attributes)l.documentElement.setAttribute(e.name,e.value);l.body.className=document.body.className};u();let d=new MutationObserver(u);d.observe(document.documentElement,{attributes:!0}),d.observe(document.body,{attributes:!0,attributeFilter:[`class`]}),Object.assign(l.body.style,{margin:`0`,position:`fixed`,inset:`0`,display:`flex`,flexDirection:`column`,background:getComputedStyle(document.body).backgroundColor});let f=l.createElement(`div`);f.className=`kymo-window-controls`;let p=l.createElement(`div`);p.className=`kymo-window-plot`,Object.assign(p.style,{flex:`1`,minHeight:`0`,position:`relative`}),l.body.append(f,p),fH(c);let m=n(p,r.mount),h=IV(),g=!1,_=()=>{g||(g=!0,i.delete(t),pH(c),d.disconnect(),y(),window.removeEventListener(`pagehide`,v),m.destroy(),h.emit(`close`,void 0),h.clear())},v=()=>b.close(),y=e.subscribe(()=>{try{e.charts.get(t)}catch{b.close()}});c.addEventListener(`pagehide`,_),window.addEventListener(`pagehide`,v);let b={chartId:t,window:c,controls:f,view:m,close(){_(),c.closed||c.close()},on:(e,t)=>h.on(e,t)};return i.set(t,b),b}function rQ(e){for(let t of[...tQ.get(e)?.values()??[]])t.close()}function iQ(e,t,n=!1){let r=0,i=e.length;for(;r<i;){let a=r+i>>>1;(n?e[a]<=t:e[a]<t)?r=a+1:i=a}return r}function aQ(e,t,n){if(n<=t)return null;if(t===0&&n===e.t.length)return e;let r=e=>new Map([...e].map(([e,r])=>[e,r.subarray(t,n)])),i=r(e.lo);return{t:e.t.subarray(t,n),lo:i,hi:e.hi===e.lo?i:r(e.hi),level:e.level}}var oQ=(e,t,n)=>aQ(e,iQ(e.t,t),iQ(e.t,n,!0));function sQ(e,t,n,r){let i=[];for(let t of e){let e=aQ(t,0,iQ(t.t,n)),a=aQ(t,iQ(t.t,r,!0),t.t.length);e&&i.push(e),a&&i.push(a)}return[...i,...t]}var cQ=class{pieces;#e;#t;#n=new Map;#r=new Map;constructor(e,t={}){this.pieces=e.filter(e=>e.t.length>0).sort((e,t)=>e.t[0]-t.t[0]),this.#e=t;for(let e of this.pieces)for(let[t,n]of e.lo){let r=e.hi===e.lo?n:e.hi.get(t);if(!r)continue;let i=this.#n.get(t);i||this.#n.set(t,i=[]),i.push({t:e.t,L:n,H:r})}this.#t=[...this.#n.keys()].sort((e,t)=>e.localeCompare(t))}schemaSync(){return[{name:qe,type:`number`,unit:`s`},...this.#t.map(e=>({name:e,type:`number`,unit:this.#e[e]??``}))]}async getSchema(){return this.schemaSync()}async readColumns(e,t,n){let r=e.filter(e=>e===`ElapsedTime`||this.#n.has(e)),i=this.pieces.reduce((e,t)=>e+t.t.length,0),a=Math.max(0,Math.min(n,i-t)),o=Object.fromEntries(r.map(e=>[e,new Float64Array(a).fill(NaN)])),s=0;for(let e of this.pieces){let n=Math.max(0,t-s),i=Math.min(e.t.length,t+a-s);for(let a of r){let r=a===`ElapsedTime`?e.t:e.lo.get(a);r&&i>n&&o[a].set(r.subarray(n,i),s+n-t)}if(s+=e.t.length,s>=t+a)break}return o}getSeriesMultiSync(e,t,n){let{x0:r,x1:i}=t,a=t.xKey===`ElapsedTime`?e.filter(e=>this.#n.has(e)):[];if(!(i>r)||n<1||a.length===0)return{x0:r,bucket:0,rows:[],columns:a};let o=Math.floor(n),s=(i-r)/n,c=a.map(()=>new Float64Array(o).fill(1/0)),l=a.map(()=>new Float64Array(o).fill(-1/0));for(let e=0;e<a.length;e++){let t=c[e],n=l[e];for(let{t:c,L:l,H:u}of this.#n.get(a[e])){if(c[c.length-1]<r||c[0]>i)continue;let e=iQ(c,i,!0);for(let i=iQ(c,r);i<e;i++){let e=l[i];if(e!==e)continue;let a=Math.floor((c[i]-r)/s);a>=o&&(a=o-1),e<t[a]&&(t[a]=e),u[i]>n[a]&&(n[a]=u[i])}}}let u=[];for(let e=0;e<o;e++){let t=null;for(let n=0;n<a.length;n++)c[n][e]!==1/0&&(t??={b:e},t[`y${n}lo`]=c[n][e],t[`y${n}hi`]=l[n][e]);t&&u.push(t)}return{x0:r,bucket:s,rows:u,columns:a}}async getSeriesMulti(e,t,n){return this.getSeriesMultiSync(e,t,n)}async getSeries(e){let t=this.getSeriesMultiSync([e.column],e.viewport,e.maxPoints),n=t.rows.length,r={x:new Float64Array(n),min:new Float64Array(n),max:new Float64Array(n),first:new Float64Array(n),last:new Float64Array(n)};return t.rows.forEach((e,n)=>{r.x[n]=t.x0+(e.b+.5)*t.bucket,r.min[n]=r.first[n]=e.y0lo,r.max[n]=r.last[n]=e.y0hi}),r}xBoundsSync(e){let t=this.#r.get(e);if(t)return t;let n=1/0,r=-1/0;if(e===`ElapsedTime`)for(let e of this.pieces)n=Math.min(n,e.t[0]),r=Math.max(r,e.t[e.t.length-1]);for(let{L:t,H:i}of this.#n.get(e)??[])for(let e=0;e<t.length;e++)t[e]<n&&(n=t[e]),i[e]>r&&(r=i[e]);return t=n<=r?{x0:n,x1:r}:{x0:0,x1:0},this.#r.set(e,t),t}async xBounds(e){return this.xBoundsSync(e)}sampleRowsSync(e){let t=this.pieces.reduce((e,t)=>e+t.t.length,0),n=Math.max(1,Math.ceil(t/Math.max(1,e))),r=[],i=0,a=0;for(let e of this.pieces){let t=i-a;if(a+=e.t.length,!(t>=e.t.length))for(let a=t;a<e.t.length;a+=n,i+=n){let t={[qe]:e.t[a]};for(let[n,r]of e.lo){let e=r[a];t[n]=e===e?e:null}r.push(t)}}return r.sort((e,t)=>e[qe]-t[qe])}async dispose(){}},lQ=12e3,uQ=100;function dQ(e,t=!1){let n,r=0;if(t&&e instanceof Float64Array){n=e;let t=0,i=0,a=0,o=n.length&-4;for(let e=0;e<o;e+=4)r+=n[e]*0,t+=n[e+1]*0,i+=n[e+2]*0,a+=n[e+3]*0;for(let e=o;e<n.length;e++)r+=n[e]*0;r+=t+i+a}else{n=new Float64Array(e.length);for(let t=0;t<n.length;t++){let i=+e[t];n[t]=i,r+=i*0}}if(r===0)return u.add(n),n;for(let e=0;e<n.length;e++){let t=n[e];t-t!==0&&(n[e]=NaN)}return n}function fQ(e,t){let n=Object.keys(t.columns);if(n.length===0)throw new OE(`no_columns`);let r=t.columns[n[0]].length;if(n.some(e=>t.columns[e].length!==r))throw new OE(`column_length_mismatch`);let i=new Map(n.map(e=>[e,dQ(t.columns[e],t.transfer)])),a=pQ(e,t.name,i,t.units??{});if(t.bands){for(let e of Object.values(t.bands))if(e.lo.length!==r||e.hi.length!==r)throw new OE(`column_length_mismatch`);a.bands=Object.fromEntries(Object.entries(t.bands).map(([e,t])=>[e,{lo:Float64Array.from(t.lo),hi:Float64Array.from(t.hi)}]))}return a}function pQ(e,t,n,r,i,a){let o=[...n.keys()],s=n.get(o[0]).length,c=o.map(e=>r[e]??``),l=o.map((e,t)=>({name:e,type:`number`,unit:c[t]})),u=!!a&&a.schema.length===o.length&&a.schema.every((e,t)=>e.name===o[t]),d,f;if(u)d=a.rawText??``,f=a.parseConfig;else{let e=[o.join(`,`)];for(let t=0;t<Math.min(s,uQ);t++)e.push(o.map(e=>{let r=n.get(e)[t];return r===r?String(r):``}).join(`,`));d=e.join(`
|
|
613
|
+
`),o=i*1.25,s=n[0][0],c=n[0][1];t.kind===`box`&&(s=Math.min(n[0][0],n[1][0]),c=Math.min(n[0][1],n[1][1])-a.length*o-7),a.forEach((t,n)=>e.fillText(t,s+6,c+2+n*o))}var xZ={solid:void 0,dashed:`5 4`,dotted:`1 4`};function SZ(e,t,n){if(!e||!(n===`x`?e.x:e.y))return null;if(n===`x`){let n=zH(e,t.value);return n>=e.left-.5&&n<=e.left+e.width+.5?[n,e.top,n,e.top+e.height]:null}let r=VH(e,t.value);return r>=e.top-.5&&r<=e.top+e.height+.5?[e.left,r,e.left+e.width,r]:null}var CZ=ot(function({frame:e,alarm:t,axis:n}){let r=SZ(pt(e.subscribe,e.get),t,n);if(!r)return null;let i=t.linked?wZ(r,n):null;return _t(`svg`,{className:`kymo-alarm`,"aria-hidden":`true`,children:[q(`line`,{x1:r[0],y1:r[1],x2:r[2],y2:r[3],stroke:t.color,strokeWidth:t.width,strokeDasharray:t.linked===`active`?JH.join(` `):xZ[t.style]}),i?q(`path`,{"data-alert-glyph":``,d:qH,transform:`translate(${i[0]} ${i[1]})`,fill:t.color}):null]})});function wZ(e,t){return t===`y`?[e[2]-10-3,e[1]-10-2]:[e[0]+3,e[1]+2]}function TZ(e,t,n,r,i){let a=SZ(t,n,r);if(a){if(e.save(),e.scale(i,i),e.strokeStyle=n.color,e.lineWidth=n.width,e.setLineDash(n.linked===`active`?JH:xZ[n.style]?.split(` `).map(Number)??[]),e.beginPath(),e.moveTo(a[0],a[1]),e.lineTo(a[2],a[3]),e.stroke(),n.linked){let t=wZ(a,r);XH(e,t[0],t[1],n.color)}e.restore()}}function EZ(e,t,n){return e.handlers?.wsId===n?e.handlers:e.handlers={wsId:n,onViewXRangeChange:r=>{t.view.setXRange(r,n),e.emitter.emit(`viewchange`,r)},onCursorX:e=>{try{t.view.setCursorX(e,n)}catch{}},cursor:{get:()=>{try{return t.view.cursorX(n)}catch{return null}},subscribe:e=>t.on(`cursorchange`,t=>{t.worksheetId===n&&e(t.x)})},onContextMenu:t=>e.emitter.emit(`contextmenu`,t),xyzRef:t=>{e.xyz=t},onAnnotations:n=>t.charts.setAnnotations(e.chartId,n),onAnnotationToolEnd:()=>{e.annotationTool=null,jZ(t).bump(),e.emitter.emit(`annotationtool`,null)},onAnnotationSelect:t=>{e.selectedAnnotation=t,e.emitter.emit(`annotationselect`,t)},onMarkSelect:t=>e.emitter.emit(`markselect`,t)}}var DZ=new WeakMap;function OZ(e){let t=DZ.get(e);return t||DZ.set(e,t=t=>e.view.setLiveWindow(t)),t}var kZ=class{mounts=new Map;version=0;listeners=new Set;root=null;engine;constructor(e){this.engine=e}subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)});getVersion=()=>this.version;bump(){this.version++;for(let e of[...this.listeners])e()}add(e){this.mounts.set(e.key,e),this.root||(this.root=ht(document.createElement(`div`)),this.root.render(q(LZ,{engine:this.engine,registry:this}))),this.bump()}remove(e){this.mounts.delete(e)&&this.bump()}refresh(){this.bump()}dispose(){this.mounts.clear(),this.root?.unmount(),this.root=null}},AZ=new WeakMap;function jZ(e){let t=AZ.get(e);return t||(t=new kZ(e),AZ.set(e,t)),t}function MZ(e,t,n,r={}){e.charts.get(t);let i=jZ(e),a={key:crypto.randomUUID(),chartId:t,element:n,options:r,shiftDatasetId:null,emitter:IV(),xyz:null,annotationTool:null,selectedAnnotation:null,plotFrame:WH(),status:null,data:null};i.add(a);let o=!1;return{chartId:t,status:()=>a.status,data:()=>a.data,on:(e,t)=>a.emitter.on(e,t),exportPng(){let r=Array.from(n.querySelectorAll(`canvas`));if(r.length===0)return Promise.reject(new OE(`export_failed`,{reason:`nothing to export`}));let i=document.createElement(`canvas`);i.width=r[0].width,i.height=r[0].height;let o=i.getContext(`2d`);if(!o)return Promise.reject(new OE(`export_failed`,{reason:`canvas unavailable`}));for(let e of r)o.drawImage(e,0,0);let s=e.charts.get(t),c=qZ(s.settings,Y$(e).alertLines()),l=a.plotFrame.get()?.x?a.plotFrame.get():null,u=e.getState(),d=u.worksheets.find(e=>e.charts.some(e=>e.id===t)),f=XZ(s.annotations,d?JZ(u.marks,u.selection,d.xKey):[],l),p=tr(c);return p&&n.clientWidth>0&&TZ(o,a.plotFrame.get(),p.alarm,p.axis,i.width/n.clientWidth),f.length&&n.clientWidth>0&&yZ(o,f,n.clientWidth,n.clientHeight,i.width/n.clientWidth,Q.sans,l),new Promise((e,t)=>i.toBlob(n=>n?e(n):t(new OE(`export_failed`,{reason:`encode failed`})),`image/png`))},autoscale(){a.xyz?.autoscale()},setShiftMode(e){a.shiftDatasetId!==e&&(a.shiftDatasetId=e,i.bump())},setAnnotationTool(e){a.annotationTool=e?{...e}:null,i.bump()},annotationTool:()=>a.annotationTool,selectedAnnotation:()=>a.selectedAnnotation,setOptions(e){a.options={...e},i.bump()},destroy(){o||(o=!0,a.emitter.clear(),i.remove(a.key))}}}function NZ(e){AZ.get(e)?.refresh()}function PZ(e){AZ.get(e)?.dispose(),AZ.delete(e)}function FZ(e){let t=new MutationObserver(e);return t.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-color-scheme`,`class`,`data-theme`]}),()=>t.disconnect()}var IZ=()=>{let e=document.documentElement;return`${e.getAttribute(`data-color-scheme`)??``}|${e.getAttribute(`data-theme`)??``}|${e.className}`};function LZ({engine:e,registry:t}){pt(t.subscribe,t.getVersion);let n=Y$(e),r=pt(n.store.subscribe,n.store.get),i=new Map;for(let e of t.mounts.values()){let t=r.worksheets.find(t=>t.panels.some(t=>t.id===e.chartId));if(!t)continue;let n=i.get(t.id)??{worksheet:t,mounts:[]};n.mounts.push(e),i.set(t.id,n)}return q(gt,{children:[...i.values()].map(t=>q(VZ,{engine:e,worksheet:t.worksheet,mounts:t.mounts},t.worksheet.id))})}var RZ=1e3,zZ=.25;function BZ(e,t,n){let[r,i]=ft(0),a=K(0),o=K(0);return W(()=>{a.current&&=(o.current=performance.now()-a.current,0)}),W(()=>{if(!n)return;let r=0,s=-1,c=0,l=n=>{if(r=_H(l),a.current||n<c||SH())return;let u=0;for(let n of e)t.includes(n.id)&&(u+=n.source.version());u!==s&&(s=u,c=n+o.current*(1/zZ-1),a.current=performance.now(),st(()=>i(e=>e+1)))};return r=_H(l),()=>vH(r)},[n,e,t]),dt(()=>n?e.map(e=>t.includes(e.id)?{...e,dataset:e.source.snapshot(RZ)}:e):e,[e,t,n,r])}function VZ({engine:e,worksheet:t,mounts:n}){let r=Y$(e),i=pt(r.store.subscribe,r.store.get),a=r.derived(),o=i.xRanges[t.id]??null,s=dt(()=>i.live.filter(e=>e.kind===`data`),[i.live]),c=a.selectedLive.length,l=e=>{let n=t.panelChartSettings[e];return n?.kind===`multiband`&&n.beacon?.enabled===!0},u=c>0&&t.panels.some(e=>e.kind!==`multiband`&&e.kind!==`camera`||c>1&&!l(e.id)),d=BZ(s,i.selection,u),f=r.alertLines(),p=HX({worksheet:GZ(t,f),viewXRange:o,selectedIds:i.selection,selectedDatasets:a.selectedDatasets,liveConnections:d,mathChannels:a.channels,datasetOffsets:i.offsets,datasetColors:i.colors,datasetPalette:i.palette}),m=K(PV()).current,h=pt(FZ,IZ),g=t.id,_=OZ(e),v=i.licensed,y=a.selectedLive[0]??null,b=e=>i.datasets.find(t=>t.id===e)??Object.values(a.laps).flatMap(e=>e.laps).find(t=>t.id===e);return q(gt,{children:n.map(n=>{let r=t.panels.find(e=>e.id===n.chartId);if(!r)return null;let s=n.shiftDatasetId?a.selectedDatasets.find(e=>e.id===n.shiftDatasetId):void 0,c=EZ(n,e,g),l=qZ(t.panelChartSettings[r.id],f);return mt(q(eQ,{mount:n,annotations:t.panelChartSettings[r.id]?.annotations,marks:JZ(i.marks,i.selection,t.xKey),onMarkSelect:c.onMarkSelect,alarm:tr(l),onAnnotations:c.onAnnotations,onAnnotationToolEnd:c.onAnnotationToolEnd,onAnnotationSelect:c.onAnnotationSelect,render:u=>KX({panel:r,settings:l,background:n.options.style?.background??t.panelChartBackgrounds[r.id]??null,styleToken:JSON.stringify([h,n.options.theme,n.options.style,Q]),data:p,xKey:t.xKey,height:u,viewXRange:o,onViewXRangeChange:c.onViewXRangeChange,onCursorX:c.onCursorX,liveZoom:m,liveWindowSeconds:i.liveWindowSeconds,onLiveWindowChange:_,beaconLive:y,findDataset:b,live:i.live,selection:i.selection,cursor:c.cursor,video:e.video.sources(),recordings:ZY(a.selectedDatasets,i.offsets),shiftMode:s?HZ(e,s.id,s.name):void 0,onContextMenu:c.onContextMenu,xyzRef:c.xyzRef}),licensed:v},n.key),n.element,n.key)})})}function HZ(e,t,n){let r=0;return{label:n,onDragStart:()=>{r=e.getState().datasets.find(e=>e.id===t)?.offset??0},onDragOffset:n=>e.datasets.setOffset(t,r+n)}}var UZ=[],WZ=new WeakMap;function GZ(e,t){if(!t.size)return e;let n=WZ.get(e);if(n&&n.lines===t)return n.out;let r=!1,i={};for(let[n,a]of Object.entries(e.panelChartSettings))i[n]=qZ(a,t),i[n]!==a&&(r=!0);let a=r?{...e,panelChartSettings:i}:e;return WZ.set(e,{lines:t,out:a}),a}var KZ=new WeakMap;function qZ(e,t){if(!e||!t.size)return e;let n=KZ.get(e);if(n&&n.lines===t)return n.out;let r=$n(e,t);return KZ.set(e,{lines:t,out:r}),r}var JZ=ZZ((e,t,n)=>{let r=e.filter(e=>e.timeColumn===n&&t.includes(e.targetId));return r.length?r:YZ}),YZ=[];function XZ(e,t,n){return!t.length||!n?.x?e:[...t.map(e=>Lt(e,n.x.v1)),...e]}function ZZ(e){let t=null,n;return(r,i,a)=>t&&t[0]===r&&t[1]===i&&t[2]===a?n:(t=[r,i,a],n=e(r,i,a),n)}function QZ(e,t){e.data=t}function $Z(e,t){e.status!==t&&(e.status=t,e.emitter.emit(`status`,t))}function eQ({mount:e,render:t,licensed:n,annotations:r,marks:i,alarm:a,onAnnotations:o,onAnnotationToolEnd:s,onAnnotationSelect:c,onMarkSelect:l}){let u=K(null),[d,f]=ft(0),p=!!e.options.debug,m=K({renderStart:0,lastRenderMs:0,renders:0,data:null}).current;p&&(m.renderStart=performance.now()),G(()=>{p&&(m.lastRenderMs=performance.now()-m.renderStart,m.renders++)}),G(()=>{let e=u.current;if(!e)return;let t=()=>f(Math.max(120,Math.floor(e.clientHeight)));t();let n=new CH(t);return n.observe(e),()=>n.disconnect()},[]);let{status:h,node:g,data:_}=t(d||400);m.data=_,W(()=>{QZ(e,_)}),W(()=>{$Z(e,h)});let{theme:v,style:y,className:b}=e.options,x={};return y?.background&&(x[`--chart-bg`]=y.background),y?.muted&&(x[`--chart-muted`]=y.muted),y?.grid&&(x[`--chart-grid`]=y.grid),y?.accent&&(x[`--accent`]=y.accent),_t(`div`,{ref:u,onContextMenu:h===`ready`?void 0:t=>{t.preventDefault(),e.emitter.emit(`contextmenu`,{clientX:t.clientX,clientY:t.clientY})},className:b?`kymo-chart ${b}`:`kymo-chart`,"data-color-scheme":v,"data-status":h,style:x,children:[q(GH.Provider,{value:e.plotFrame.set,children:g}),h===`ready`&&a?q(CZ,{frame:e.plotFrame,alarm:a.alarm,axis:a.axis}):null,h===`ready`&&(r?.length||e.annotationTool||i.length)?q(lZ,{annotations:r??UZ,tool:e.annotationTool,plotFrame:e.plotFrame,onChange:o,onToolEnd:s,onSelect:c,marks:i,onMarkSelect:l}):null,p?q(QX,{stats:m,host:u}):null,n===!1?q(FV,{}):null]})}var tQ=new WeakMap;function nQ(e,t,n,r={}){let i=tQ.get(e)??new Map;tQ.set(e,i);let a=i.get(t);if(a&&!a.window.closed)return a.window.focus(),a;let o=e.charts.get(t),s=r.title??(o.title||e.charts.label(o.kind)),c=window.open(``,`kymoscope-chart-${t}`,`popup,width=${r.width??960},height=${r.height??600}`);if(!c)throw new OE(`popup_blocked`,{chartId:t});let l=c.document;l.head.replaceChildren(),l.body.replaceChildren(),l.title=s;for(let e of document.querySelectorAll(`style, link[rel="stylesheet"]`)){let t=e.cloneNode(!0);t instanceof HTMLLinkElement&&(t.href=e.href),l.head.appendChild(t)}let u=()=>{for(let e of[...l.documentElement.attributes])l.documentElement.removeAttribute(e.name);for(let e of document.documentElement.attributes)l.documentElement.setAttribute(e.name,e.value);l.body.className=document.body.className};u();let d=new MutationObserver(u);d.observe(document.documentElement,{attributes:!0}),d.observe(document.body,{attributes:!0,attributeFilter:[`class`]}),Object.assign(l.body.style,{margin:`0`,position:`fixed`,inset:`0`,display:`flex`,flexDirection:`column`,background:getComputedStyle(document.body).backgroundColor});let f=l.createElement(`div`);f.className=`kymo-window-controls`;let p=l.createElement(`div`);p.className=`kymo-window-plot`,Object.assign(p.style,{flex:`1`,minHeight:`0`,position:`relative`}),l.body.append(f,p),fH(c);let m=n(p,r.mount),h=IV(),g=!1,_=()=>{g||(g=!0,i.delete(t),pH(c),d.disconnect(),y(),window.removeEventListener(`pagehide`,v),m.destroy(),h.emit(`close`,void 0),h.clear())},v=()=>b.close(),y=e.subscribe(()=>{try{e.charts.get(t)}catch{b.close()}});c.addEventListener(`pagehide`,_),window.addEventListener(`pagehide`,v);let b={chartId:t,window:c,controls:f,view:m,close(){_(),c.closed||c.close()},on:(e,t)=>h.on(e,t)};return i.set(t,b),b}function rQ(e){for(let t of[...tQ.get(e)?.values()??[]])t.close()}function iQ(e,t,n=!1){let r=0,i=e.length;for(;r<i;){let a=r+i>>>1;(n?e[a]<=t:e[a]<t)?r=a+1:i=a}return r}function aQ(e,t,n){if(n<=t)return null;if(t===0&&n===e.t.length)return e;let r=e=>new Map([...e].map(([e,r])=>[e,r.subarray(t,n)])),i=r(e.lo);return{t:e.t.subarray(t,n),lo:i,hi:e.hi===e.lo?i:r(e.hi),level:e.level}}var oQ=(e,t,n)=>aQ(e,iQ(e.t,t),iQ(e.t,n,!0));function sQ(e,t,n,r){let i=[];for(let t of e){let e=aQ(t,0,iQ(t.t,n)),a=aQ(t,iQ(t.t,r,!0),t.t.length);e&&i.push(e),a&&i.push(a)}return[...i,...t]}var cQ=class{pieces;#e;#t;#n=new Map;#r=new Map;constructor(e,t={}){this.pieces=e.filter(e=>e.t.length>0).sort((e,t)=>e.t[0]-t.t[0]),this.#e=t;for(let e of this.pieces)for(let[t,n]of e.lo){let r=e.hi===e.lo?n:e.hi.get(t);if(!r)continue;let i=this.#n.get(t);i||this.#n.set(t,i=[]),i.push({t:e.t,L:n,H:r})}this.#t=[...this.#n.keys()].sort((e,t)=>e.localeCompare(t))}schemaSync(){return[{name:qe,type:`number`,unit:`s`},...this.#t.map(e=>({name:e,type:`number`,unit:this.#e[e]??``}))]}async getSchema(){return this.schemaSync()}async readColumns(e,t,n){let r=e.filter(e=>e===`ElapsedTime`||this.#n.has(e)),i=this.pieces.reduce((e,t)=>e+t.t.length,0),a=Math.max(0,Math.min(n,i-t)),o=Object.fromEntries(r.map(e=>[e,new Float64Array(a).fill(NaN)])),s=0;for(let e of this.pieces){let n=Math.max(0,t-s),i=Math.min(e.t.length,t+a-s);for(let a of r){let r=a===`ElapsedTime`?e.t:e.lo.get(a);r&&i>n&&o[a].set(r.subarray(n,i),s+n-t)}if(s+=e.t.length,s>=t+a)break}return o}getSeriesMultiSync(e,t,n){let{x0:r,x1:i}=t,a=t.xKey===`ElapsedTime`?e.filter(e=>this.#n.has(e)):[];if(!(i>r)||n<1||a.length===0)return{x0:r,bucket:0,rows:[],columns:a};let o=Math.floor(n),s=(i-r)/n,c=a.map(()=>new Float64Array(o).fill(1/0)),l=a.map(()=>new Float64Array(o).fill(-1/0));for(let e=0;e<a.length;e++){let t=c[e],n=l[e];for(let{t:c,L:l,H:u}of this.#n.get(a[e])){if(c[c.length-1]<r||c[0]>i)continue;let e=iQ(c,i,!0);for(let i=iQ(c,r);i<e;i++){let e=l[i];if(e!==e)continue;let a=Math.floor((c[i]-r)/s);a>=o&&(a=o-1),e<t[a]&&(t[a]=e),u[i]>n[a]&&(n[a]=u[i])}}}let u=[];for(let e=0;e<o;e++){let t=null;for(let n=0;n<a.length;n++)c[n][e]!==1/0&&(t??={b:e},t[`y${n}lo`]=c[n][e],t[`y${n}hi`]=l[n][e]);t&&u.push(t)}return{x0:r,bucket:s,rows:u,columns:a}}async getSeriesMulti(e,t,n){return this.getSeriesMultiSync(e,t,n)}async getSeries(e){let t=this.getSeriesMultiSync([e.column],e.viewport,e.maxPoints),n=t.rows.length,r={x:new Float64Array(n),min:new Float64Array(n),max:new Float64Array(n),first:new Float64Array(n),last:new Float64Array(n)};return t.rows.forEach((e,n)=>{r.x[n]=t.x0+(e.b+.5)*t.bucket,r.min[n]=r.first[n]=e.y0lo,r.max[n]=r.last[n]=e.y0hi}),r}xBoundsSync(e){let t=this.#r.get(e);if(t)return t;let n=1/0,r=-1/0;if(e===`ElapsedTime`)for(let e of this.pieces)n=Math.min(n,e.t[0]),r=Math.max(r,e.t[e.t.length-1]);for(let{L:t,H:i}of this.#n.get(e)??[])for(let e=0;e<t.length;e++)t[e]<n&&(n=t[e]),i[e]>r&&(r=i[e]);return t=n<=r?{x0:n,x1:r}:{x0:0,x1:0},this.#r.set(e,t),t}async xBounds(e){return this.xBoundsSync(e)}sampleRowsSync(e){let t=this.pieces.reduce((e,t)=>e+t.t.length,0),n=Math.max(1,Math.ceil(t/Math.max(1,e))),r=[],i=0,a=0;for(let e of this.pieces){let t=i-a;if(a+=e.t.length,!(t>=e.t.length))for(let a=t;a<e.t.length;a+=n,i+=n){let t={[qe]:e.t[a]};for(let[n,r]of e.lo){let e=r[a];t[n]=e===e?e:null}r.push(t)}}return r.sort((e,t)=>e[qe]-t[qe])}async dispose(){}},lQ=12e3,uQ=100;function dQ(e,t=!1){let n,r=0;if(t&&e instanceof Float64Array){n=e;let t=0,i=0,a=0,o=n.length&-4;for(let e=0;e<o;e+=4)r+=n[e]*0,t+=n[e+1]*0,i+=n[e+2]*0,a+=n[e+3]*0;for(let e=o;e<n.length;e++)r+=n[e]*0;r+=t+i+a}else{n=new Float64Array(e.length);for(let t=0;t<n.length;t++){let i=+e[t];n[t]=i,r+=i*0}}if(r===0)return u.add(n),n;for(let e=0;e<n.length;e++){let t=n[e];t-t!==0&&(n[e]=NaN)}return n}function fQ(e,t){let n=Object.keys(t.columns);if(n.length===0)throw new OE(`no_columns`);let r=t.columns[n[0]].length;if(n.some(e=>t.columns[e].length!==r))throw new OE(`column_length_mismatch`);let i=new Map(n.map(e=>[e,dQ(t.columns[e],t.transfer)])),a=pQ(e,t.name,i,t.units??{});if(t.bands){for(let e of Object.values(t.bands))if(e.lo.length!==r||e.hi.length!==r)throw new OE(`column_length_mismatch`);a.bands=Object.fromEntries(Object.entries(t.bands).map(([e,t])=>[e,{lo:Float64Array.from(t.lo),hi:Float64Array.from(t.hi)}]))}return a}function pQ(e,t,n,r,i,a){let o=[...n.keys()],s=n.get(o[0]).length,c=o.map(e=>r[e]??``),l=o.map((e,t)=>({name:e,type:`number`,unit:c[t]})),u=!!a&&a.schema.length===o.length&&a.schema.every((e,t)=>e.name===o[t]),d,f;if(u)d=a.rawText??``,f=a.parseConfig;else{let e=[o.join(`,`)];for(let t=0;t<Math.min(s,uQ);t++)e.push(o.map(e=>{let r=n.get(e)[t];return r===r?String(r):``}).join(`,`));d=e.join(`
|
|
614
614
|
`),f=y(d)}let p={id:e,name:t,schema:l,rawText:d,parseConfig:f,fromColumns:!0};if(s>1e6){let e=new CX(n,r);return{...p,kind:`columnar`,source:e,data:{meta:``,columnNames:o,units:c,rows:e.sampleRowsSync(lQ)}}}let m={meta:``,columnNames:o,units:c,rows:Me({keys:o,length:s,values:o.map(e=>n.get(e)),text:o.map(()=>null)},i)};return{...p,kind:`memory`,source:new IE(m),data:m}}function mQ(e,t,n){let r=e.fromColumns?hQ(e):null;if(!r)throw new OE(`invalid_argument`,{reason:`only datasets added with addColumns can be written`});let i=r.values().next().value.length,a=e.columnSpares??new Map,o={};for(let e of t){let t=a.get(e);t&&t.length===i&&t!==r.get(e)?(I(t),o[e]=t):o[e]=new Float64Array(i)}n(o,Object.fromEntries(t.map(e=>[e,r.get(e)])));let s=new Map(a);for(let e of t){let t=r.get(e);t?s.set(e,t):s.delete(e)}return{...gQ(e,o,!0),columnSpares:s}}function hQ(e){if(e.source instanceof CX)return new Map(e.source.columnMap);let t=Ue(e.data.rows);return t?new Map(t.keys.map((e,n)=>[e,t.values[n]])):null}function gQ(e,t,n=!1){let r=e.fromColumns?hQ(e):null;if(!r)throw new OE(`invalid_argument`,{reason:`only datasets added with addColumns can be replaced`});let i=r;for(let e of Object.keys(t))i.set(e,dQ(t[e],n));let a=i.values().next().value.length;for(let e of i.values())if(e.length!==a)throw new OE(`column_length_mismatch`);let o=Object.fromEntries(e.schema.map(e=>[e.name,e.unit])),s=pQ(e.id,e.name,i,o,e.kind===`memory`?e.data.rows:void 0,e),c=s.schema.length===e.schema.length&&s.schema.every((t,n)=>t.name===e.schema[n].name);return{...s,schema:c?e.schema:s.schema,beacon:e.beacon,bands:e.bands}}var _Q=new WeakMap;function vQ(e){let t=e.fromColumns?hQ(e):null;if(!t)return e.rawText??``;let n=e.data.rows,r=_Q.get(n);if(r===void 0){let e=[...t.keys()],i=e.map(e=>t.get(e)),a=[e.join(`,`)],o=i[0].length;for(let e=0;e<o;e++)a.push(i.map(t=>t[e]===t[e]?String(t[e]):``).join(`,`));_Q.set(n,r=a.join(`
|
|
615
615
|
`))}return r}function yQ(e,t){let n=new cQ(t.pieces,t.units),r=n.schemaSync();return{id:e,name:t.name,kind:`columnar`,source:n,schema:r,data:{meta:``,columnNames:r.map(e=>e.name),units:r.map(e=>e.unit),rows:n.sampleRowsSync(lQ)}}}function bQ(e){let t=e,n=new Set;return{get:()=>t,set(e){let r=e(t);if(r!==t){t=r;for(let e of[...n])try{e()}catch(e){console.error(`[kymoscope] subscriber failed`,e)}}},subscribe(e){return n.add(e),()=>{n.delete(e)}}}}function xQ(e){let t=null,n;return(...r)=>t&&t.length===r.length&&t.every((e,t)=>e===r[t])?n:(t=r,n=e(...r),n)}function SQ(){let e=xQ(e=>{let t={};for(let n of e){if(n.cut){let e=n.cut.defs.find(e=>e.id===n.cut.cycleId)?.show,r=e&&e.channel!==n.cut.timeKey?VB(e):null;t[n.id]=r?{laps:n.cut.parts,values:n.cut.found.map(e=>e.kpis?.[r]??null),unit:n.schema.find(t=>t.name===e.channel)?.unit??``,isTime:!1}:{laps:n.cut.parts,values:n.cut.found.map(e=>e.tend===null?null:e.tend-e.tstart),unit:`s`,isTime:!0};continue}if(!n.beacon||n.kind!==`memory`)continue;let{channel:e,metric:r,stat:i}=n.beacon,a=gB(n.data.rows,e);if(a.length===0)continue;let o=n.data.units[n.data.columnNames.indexOf(r)]??``;t[n.id]={laps:a.map((e,t)=>{let r={...n.data,rows:n.data.rows.slice(e.start,e.end)};return{...n,id:wB(n.id,t),name:`${n.name} · Cycle ${t+1}`,data:r,source:new IE(r)}}),values:a.map(e=>bB(n.data.rows,e,r,i)),unit:o,isTime:i===`span`&&SB(r,o)}}return t}),t=xQ((e,t,n)=>e.flatMap(e=>t[e.id]?t[e.id].laps.filter(e=>n.includes(e.id)):n.includes(e.id)?[e]:[])),n=xQ((e,t)=>e.filter(e=>e.kind===`data`&&t.includes(e.id))),r=xQ(e=>cX(e.map(e=>e.data))),i=xQ((e,t)=>t.length===0?e:cX(e?[e,...t.map(e=>e.dataset)]:t.map(e=>e.dataset))),a=xQ((e,t,n,r)=>{let i=new Set;if(e)for(let t of n.length>0?n:[e])for(let e of fX(t.columnNames,t.rows))i.add(e);for(let e of r)for(let t of e.dataset.columnNames)(t===`ElapsedTime`||e.source.hasValues(t))&&i.add(t);let a=e?e.columnNames.filter(e=>i.has(e)):[],o=t.filter(e=>e.kind!==`memory`).flatMap(e=>bz(e.schema));return[...new Set([...a,...o])]});return{lapsByDataset:e,selectedDatasets:t,selectedLive:n,staticDataset:r,mergedDataset:i,mergedParts:xQ((e,t)=>[...e.map(e=>e.data),...t.map(e=>e.dataset)]),numericColumns:xQ((e,t,n,r=[],i=[])=>{let o=a(e,t,r,i),s=new Set(o);return[...o,...n.map(e=>e.name).filter(e=>!s.has(e))]}),allColumns:xQ((e,t,n)=>[...new Set([...e?.columnNames??[],...t.filter(e=>e.kind!==`memory`).flatMap(e=>e.schema.map(e=>e.name)),...n.map(e=>e.name)])]),columnUnits:xQ((e,t)=>{let n={};e&&e.columnNames.forEach((t,r)=>{let i=e.units[r]?.trim();i&&(n[t]=i)});for(let e of t)e.units&&(n[e.name]=e.units);return n})}}var CQ=[{kind:`multiband`,label:`Multi-band`},{kind:`xyscatter`,label:`X-Y scatter`},{kind:`xyzmesh`,label:`X-Y-Z mesh`},{kind:`histogram`,label:`Histogram`},{kind:`polar`,label:`Polar`},{kind:`spectrum`,label:`Spectrum`},{kind:`boxplot`,label:`Box Plot`},{kind:`spectrogram`,label:`Spectrogram`},{kind:`heatmap`,label:`Heatmap`},{kind:`violin`,label:`Violin`},{kind:`confusion`,label:`Confusion Matrix`},{kind:`roc`,label:`ROC Curve`},{kind:`losscurve`,label:`Loss Curves`},{kind:`controlchart`,label:`Control Chart`},{kind:`parallelcoords`,label:`Parallel Coords`},{kind:`embedding`,label:`Embedding`},{kind:`flamegraph`,label:`Flame Graph`},{kind:`barchart`,label:`Bar Chart`},{kind:`radar`,label:`Radar`},{kind:`areachart`,label:`Area Chart`},{kind:`cdfchart`,label:`CDF / ECDF`},{kind:`bubblechart`,label:`Bubble Chart`},{kind:`treemap`,label:`Treemap`},{kind:`sankey`,label:`Sankey`},{kind:`calibration`,label:`Calibration Curve`},{kind:`gauge`,label:`Gauges`},{kind:`camera`,label:`Camera`},{kind:`qqplot`,label:`Q-Q Plot`},{kind:`gantt`,label:`Gantt Chart`}],wQ=new Map(CQ.map(e=>[e.kind,e.label]));function TQ(e){return wQ.get(e)??e}var EQ=`kymoscope-live.v1`,DQ=2e3,OQ=3e4,kQ=30,AQ=1e4,jQ=300,MQ=90,NQ=e=>e.startsWith(`eyJ`);function PQ(e){try{let t=e.split(`.`)[1]??``,n=atob(t.replace(/-/g,`+`).replace(/_/g,`/`)+`===`.slice((t.length+3)%4)),r=JSON.parse(n).exp;return typeof r==`number`?r:null}catch{return null}}function FQ(e,t){return`${e.replace(/\/+$/,``)}/v1/streams/${t}/watch`}function IQ(e,t,n,r){let i=null,a=null,o=null,s=!1,c=0,l=()=>{o&&=(clearTimeout(o),null)},u=(n,r)=>{l();let a=PQ(r);if(a===null)return;let c=NQ(r),d=c?Math.min(a,Date.now()/1e3+jQ):a,f=Math.min(Math.max((d-(c?MQ:kQ))*1e3-Date.now(),AQ),2**31-1);o=setTimeout(async()=>{o=null;let r=null;try{r=await e.getToken(t)}catch{r=null}if(!(s||i!==n||!r)){try{n.send(JSON.stringify({type:`auth`,token:r}))}catch{return}u(n,r)}},f)},d=()=>{if(s||a)return;let e=Math.min(OQ,DQ*2**c++)*(.75+Math.random()/2);a=setTimeout(()=>{a=null,f()},e)},f=async()=>{if(s)return;let a=null;try{a=await e.getToken(t)}catch{a=null}if(s)return;if(!a){r?.(`error`),d();return}let o=new WebSocket(FQ(e.url,t),[EQ,`bearer.${a}`]);o.binaryType=`arraybuffer`,i=o;let f=a;o.onopen=()=>{r?.(`subscribed`),u(o,f)},o.onmessage=e=>{c=0,typeof e.data!=`string`&&n(e.data)},o.onclose=()=>{i===o&&(i=null,l(),!s&&(r?.(`error`),d()))}};return f(),()=>{if(s=!0,a&&=(clearTimeout(a),null),l(),i){let e=i;i=null,e.close(1e3)}}}var LQ=960*1024,RQ=24;function zQ(e){let t=e.key&&e.fragIndex===0?new TextEncoder().encode(e.codec):new Uint8Array;if(t.length>255)throw Error(`codec string too long`);let n=e.key&&e.fragIndex===0?1+t.length:0,r=new Uint8Array(RQ+n+e.payload.length),i=new DataView(r.buffer);i.setUint8(0,1),i.setUint8(1,!!e.key|(e.last?2:0)),i.setUint8(2,1),i.setUint8(3,0),i.setFloat64(4,e.t,!0),i.setUint32(12,e.seq>>>0,!0),i.setUint16(16,e.fragIndex,!0),i.setUint16(18,e.fragCount,!0),i.setUint16(20,e.width,!0),i.setUint16(22,e.height,!0);let a=RQ;return n&&(r[a++]=t.length,r.set(t,a),a+=t.length),r.set(e.payload,a),r}function BQ(e){if(e.length<RQ||e[0]!==1||e[2]!==1)return null;let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=(e[1]&1)!=0,r=t.getUint16(16,!0),i=t.getUint16(18,!0);if(i===0||r>=i)return null;let a=RQ,o=``;if(n&&r===0){if(e.length<a+1||e.length<a+1+e[a])return null;o=new TextDecoder().decode(e.subarray(a+1,a+1+e[a])),a+=1+e[a]}return{key:n,last:(e[1]&2)!=0,t:t.getFloat64(4,!0),seq:t.getUint32(12,!0),fragIndex:r,fragCount:i,width:t.getUint16(20,!0),height:t.getUint16(22,!0),codec:o,payload:e.subarray(a)}}function VQ(e){let t=Math.max(1,Math.ceil(e.data.length/LQ)),n=[];for(let r=0;r<t;r++)n.push(zQ({key:e.key,last:r===t-1,t:e.t,seq:e.seq,fragIndex:r,fragCount:t,width:e.width,height:e.height,codec:e.codec,payload:e.data.subarray(r*LQ,Math.min(e.data.length,(r+1)*LQ))}));return n}var HQ=class{samples=[];exact=!1;windowS;constructor(e=30){this.windowS=e}observe(e,t){if(e>1e9){this.samples=[],this.exact=!0;return}this.exact=!1;let n=t-e,r=this.samples[this.samples.length-1];for(r&&Math.abs(n-r.off)>1&&(this.samples=[]),this.samples.push({at:t,off:n});this.samples.length&&this.samples[0].at<t-this.windowS;)this.samples.shift()}quality(){return this.exact?`exact`:this.samples.length?`approx`:`none`}toWall(e,t=0){if(this.exact)return e+t/1e3;if(!this.samples.length)return null;let n=1/0;for(let e of this.samples)n=Math.min(n,e.off);return e+n+t/1e3}toStream(e,t=0){let n=this.toWall(0,t);return n===null?null:e-n}},UQ=class{#e;constructor(e){this.#e=typeof e==`function`?e:()=>e}size(){return this.#e().size}get columnNames(){return this.#e().columnNames}version(){return this.#e().version}columns(){let e=this.#e();return new WQ(new Set(e.columnNames),t=>e.mirrorColumn(t))}hasValues(e){return this.#e().hasValues(e)}snapshot(e){return this.#e().toDataset(e)}async getSchema(){let e=this.#e();return e.columnNames.map(t=>({name:t,type:`number`,unit:e.unitOf(t)}))}async getSeries(e){let t=this.#e();return $e(t.columnValues(e.viewport.xKey),t.columnValues(e.column),e.viewport.x0,e.viewport.x1,e.maxPoints)}async getSeriesMulti(e,t,n){return this.getSeriesMultiSync(e,t,n)}getSeriesMultiSync(e,t,n){return this.#e().decimateColumns(t.xKey,e,t.x0,t.x1,n)}getPointsSync(e,t,n){return this.#e().decimatePoints(t.xKey,e,t.x0,t.x1,n)}async xBounds(e){return this.xBoundsSync(e)}xBoundsSync(e){return this.#e().columnBounds(e)}xTravelSync(e,t){return this.#e().xTravel(e,t)}latestTimeSync(){return this.#e().latestTime()}xAtTimeSync(e,t,n=!1){return this.#e().xAtTime(e,t,n)}latestSync(e){return this.#e().lastValue(e)}latestValuesSync(e){let t=this.#e(),n=new Map;for(let r of e){let e=t.lastValue(r),i=t.lastKnown(r);Number.isFinite(e)?n.set(r,e):i&&n.set(r,i.v)}return n}valueBoundsSync(e){let t=this.#e().valueBounds(e),n=this.#e().lastKnown(e);if(!t&&!n)return null;let r=Math.min(t?.x0??1/0,n?.v??1/0),i=Math.max(t?.x1??-1/0,n?.v??-1/0);if(r!==i)return{min:r,max:i};let a=Math.max(.5,Math.abs(r)*.05);return{min:r-a,max:i+a}}lastKnownSync(e){return this.#e().lastKnown(e)}trackCycles(e){this.#e().trackCycles(e)}cycleSpanSync(e){return this.#e().cycleSpan(e)}decimateCycleSync(e,t,n,r,i){return this.#e().decimateCycle(e,t,n,r.x0,r.x1,i)}cyclePointsSync(e,t,n,r,i){return this.#e().decimateCyclePoints(e,t,n,r.x0,r.x1,i)}async readColumns(e,t,n){let r=this.#e(),i=new Set(r.columnNames),a={};for(let o of e)i.has(o)&&(a[o]=r.columnValues(o).slice(t,t+n));return a}async dispose(){}},WQ=class extends Map{#e;#t;constructor(e,t){super(),this.#e=e,this.#t=t}get(e){if(!super.has(e)&&this.#e.has(e)){let t=this.#t(e);t&&super.set(e,t)}return super.get(e)}has(e){return this.#e.has(e)}},GQ=4096,KQ=5e3,qQ=class{startedAt=Date.now();n=0;capacity=GQ;time=new Float64Array(GQ);cols=new Map;order=[];units=new Map;timeColumn;timeUnit;constructor(e=qe,t=`s`){this.timeColumn=e,this.timeUnit=t}get rows(){return this.n}add(e){this.n===this.capacity&&this.grow();let t=this.n;this.time[t]=e.t;for(let n of e.signals){let e=this.cols.get(n.name);e||(e=new Float64Array(this.capacity).fill(NaN),this.cols.set(n.name,e),this.order.push(n.name)),n.unit&&!this.units.get(n.name)&&this.units.set(n.name,n.unit),e[t]=typeof n.value==`number`?n.value:NaN}this.n++}addColumns(e){let t=se(e,this.timeColumn),n=e.t.length;for(;this.n+n>this.capacity;)this.grow();let r=this.n,i=(e,t)=>{if(t instanceof Float64Array||t instanceof Float32Array)e.set(t,r);else for(let i=0;i<n;i++)e[r+i]=+t[i]};i(this.time,e.t);for(let n of t){let t=this.cols.get(n);t||(t=new Float64Array(this.capacity).fill(NaN),this.cols.set(n,t),this.order.push(n));let r=e.units?.[n];r&&!this.units.get(n)&&this.units.set(n,r),i(t,e.columns[n])}this.n+=n}grow(){let e=this.capacity*2,t=new Float64Array(e);t.set(this.time),this.time=t;for(let[t,n]of this.cols){let r=new Float64Array(e).fill(NaN);r.set(n),this.cols.set(t,r)}this.capacity=e}toCsvParts(){let e=[this.timeColumn,...this.order],t=[this.timeUnit,...this.order.map(e=>this.units.get(e)??``)],n=[`${e.map(JQ).join(`,`)}\n${t.map(JQ).join(`,`)}\n`],r=this.order.map(e=>this.cols.get(e));for(let e=0;e<this.n;e+=KQ){let t=Math.min(this.n,e+KQ),i=``;for(let n=e;n<t;n++){i+=String(this.time[n]);for(let e of r){let t=e[n];i+=Number.isNaN(t)?`,`:`,${t}`}i+=`
|
|
616
|
-
`}n.push(i)}return n}};function JQ(e){let t=/^[=+\-@\t\r]/.test(e)?`'${e}`:e;return/[",\n\r]/.test(t)?`"${t.replace(/"/g,`""`)}"`:t}var YQ=512,XQ=new WeakMap;function ZQ(e,t,n){let r=XQ.get(e);r||XQ.set(e,r=new Map);let i=r.get(t),a={start:n,values:[]};return{carry:{start:e=>{let t=i?.values[e];if(!i||!t)return 0;for(let e=Math.min(n-i.start,t.length-1);e>=0;e--){let n=t[e];if(n!==null&&Number.isFinite(n))return n}return 0},done:(e,t)=>{a.values[e]=t}},keep:()=>{r.set(t,a)}}}function QQ(e,t,n){let r=e.endAbs,i=Math.max(n,e.firstAbs);if(i>=r||t.length===0)return;let a=new Set(e.columnNames);for(let n of t){if(!n.enabled)continue;let o=$T(n.formula);if(!o.ok)continue;let{identifiers:s,functions:c}=eE(o.node);if(!s.every(e=>a.has(e)))continue;let l=c.some(e=>ZT.includes(e)),u=Math.max(e.firstAbs,i-(l?YQ:0)),d=new Map([qe,...s].map(t=>[t,e.range(t,u,r)])),{carry:f,keep:p}=ZQ(e,`${n.id}|${n.formula}`,u),m=oE(n,e=>d.get(e),qe,r-u,t,f);m.status===`ok`&&(e.writeComputed(n.name,n.units,i,m.values.subarray(i-u)),p())}}function $Q(e,t){e.clearComputed(),XQ.delete(e),QQ(e,t,e.firstAbs)}var e$=8e3,t$=131072;function n$(e,t={}){switch(e.kind){case`elapsed`:return{name:`Elapsed`,unit:`s`};case`event`:return{name:`Since ${e.channel} ${e.op} ${e.value}`,unit:`s`};case`clock`:return{name:`Time of day`,unit:`s`};default:{let n=t[e.channel]??``;return e.integral?{name:`∫${e.channel}`,unit:n?`${n}·s`:`s`}:{name:`${e.channel} since start`,unit:n}}}}var r$=new Map;function i$(e,t){let n=`${t}|${Math.floor(e/900)}`,r=r$.get(n);r===void 0&&(r=lB(e,t),r$.size>1e4&&r$.clear(),r$.set(n,r));let i=(e+r)%86400;return i<0?i+86400:i}var a$=class{axis;#e=NaN;#t=NaN;#n=NaN;#r=0;#i=NaN;#a=NaN;constructor(e){this.axis=e}begin(e){this.#e=e,this.#t=NaN,this.#n=NaN,this.#r=0,this.#i=NaN,this.#a=NaN}x(e,t){let n=this.axis;return n.kind===`clock`?i$(e,n.tz):n.kind===`elapsed`?e-this.#e:e<this.#e?NaN:n.kind===`event`?(this.#t!==this.#t&&t===t&&rB(n.op,t,n.value)&&(this.#t=e),e-this.#t):n.integral?(t===t&&(this.#i===this.#i&&(this.#r+=(t+this.#i)/2*(e-this.#a)),this.#i=t,this.#a=e),this.#i===this.#i?this.#r:NaN):(t===t&&(this.#n!==this.#n&&(this.#n=t),this.#i=t),this.#i===this.#i?this.#i-this.#n:NaN)}};function o$(e,t,n,r){let i=`channel`in r?t.get(r.channel):void 0;if(r.kind===`event`){let a=NaN;for(let t=0;t<e.length&&a!==a;t++){let o=i?i[t]:NaN;e[t]>=n&&o===o&&rB(r.op,o,r.value)&&(a=e[t])}return{x:e.map(e=>e-a),t:e,cols:t}}let a=new a$(r);a.begin(n);let o=new Float64Array(e.length);for(let t=0;t<e.length;t++)o[t]=a.x(e[t],i?i[t]:NaN);return{x:o,t:e,cols:t}}function s$(e,t,n){let r=[];for(let n=0;n<e.length;n++)e[n]===e[n]&&t[n]===t[n]&&r.push(n);let i=!0;for(let t=1;t<r.length&&i;t++)i=e[r[t-1]]<=e[r[t]];i||r.sort((t,n)=>e[t]-e[n]);let a=r.length,o=new Float64Array(n.length).fill(NaN);if(a<2)return o;let s=Float64Array.from(r,t=>e[t]),c=Float64Array.from(r,e=>t[e]),l=Float64Array.from({length:a-1},(e,t)=>s[t+1]-s[t]).sort(),u=l[l.length>>1],d=u>0?4*u:1/0,f=0;for(let e=0;e<n.length;e++){let t=n[e];if(!(t>=s[0]&&t<=s[a-1]))continue;for(;f<a-2&&s[f+1]<t;)f++;let r=s[f],i=s[f+1];i-r>d||(o[e]=i===r?c[f]:c[f]+(c[f+1]-c[f])*(t-r)/(i-r))}return o}function c$(e,t,n){let r=e.length;if(r===0||!(n>=e[0]&&n<=e[r-1]))return NaN;if(r===1)return t[0];let i=(n-e[0])/(e[r-1]-e[0])*(r-1),a=Math.min(r-2,Math.floor(i));return t[a]+(t[a+1]-t[a])*(i-a)}function l$(e,t,n){let r=Math.max(2,Math.min(e$,Math.floor(n)));if(r*t.length>131072)throw Error(`too_many_cells`);let i=1/0,a=-1/0;for(let t of e)for(let e of t.x)e===e&&(e<i&&(i=e),e>a&&(a=e));if(!(a>i))throw Error(`empty`);let o=Float64Array.from({length:r},(e,t)=>i+t*(a-i)/(r-1)),s=new Map;for(let n of t){let t=new Uint16Array(r),i=new Float64Array(r),a=new Float64Array(r),c=new Float32Array(r).fill(1/0),l=new Float32Array(r).fill(-1/0);for(let s of e){let e=s.cols.get(n);if(!e)continue;let u=s$(s.x,e,o);for(let e=0;e<r;e++){let n=u[e];if(n!==n)continue;let r=++t[e],o=n-i[e];i[e]+=o/r,a[e]+=o*(n-i[e]),n<c[e]&&(c[e]=n),n>l[e]&&(l[e]=n)}}let u={mean:new Float32Array(r),sd:new Float32Array(r),min:c,max:l,n:t};for(let e=0;e<r;e++){if(t[e]===0){u.mean[e]=u.sd[e]=u.min[e]=u.max[e]=NaN;continue}u.mean[e]=i[e],u.sd[e]=t[e]>1?Math.sqrt(a[e]/(t[e]-1)):0}s.set(n,u)}return{x:o,channels:s}}function u$(e,t,n){return n===`minmax`?{lo:e.min,hi:e.max}:{lo:e.mean.map((n,r)=>n-t*e.sd[r]),hi:e.mean.map((n,r)=>n+t*e.sd[r])}}function d$(e,t,n,r=`sigma`,i=0){let a=[...t.channels.keys()],o=new Map,s=[],c=new Uint8Array(e.t.length),l=a.map(()=>new Uint8Array(e.t.length)),u=t.x.length;a.forEach((i,a)=>{let d=t.channels.get(i),f=e.cols.get(i);if(!f)return;let{lo:p,hi:m}=u$(d,n,r),h=0,g=0,_=0;for(let e of d.mean)if(e===e){h++;let t=e-g;g+=t/h,_+=t*(e-g)}let v=h>1?Math.max(Math.sqrt(_/(h-1)),1e-9):1e-9,y=new Float64Array(e.t.length).fill(NaN),b=0,x=0;for(let n=0;n<e.t.length;n++){let r=f[n],i=e.x[n];if(r!==r||i!==i)continue;let o=c$(t.x,d.mean,i);if(o!==o)continue;y[n]=r-o;let s=Math.round((i-t.x[0])/(t.x[u-1]-t.x[0])*(u-1));b+=Math.abs(r-o)/(d.n[s]>=2?Math.max(d.sd[s],1e-9):v),x++,d.n[s]>=2&&(r<c$(t.x,p,i)||r>c$(t.x,m,i))&&(c[n]=1,l[a][n]=1)}o.set(i,y),s.push({channel:i,z:x?b/x:0})}),s.sort((e,t)=>t.z-e.z);let d=[];for(let t=0;t<c.length;t++){if(!c[t])continue;let n=t;for(;n<c.length&&c[n];)n++;let r=d[d.length-1];r&&e.t[t]-e.t[Math.min(r[1],c.length-1)]<i?r[1]=n:d.push([t,n]),t=n}let f=[];for(let[t,n]of d){let r=e.t[t],o=e.t[Math.min(n,c.length-1)];o-r>=i&&f.push({t0:r,t1:o,channels:a.filter((e,r)=>l[r].subarray(t,n).includes(1))})}return{delta:o,score:s,deviations:f}}function f$(e,t){let n=e.x.length,r=t.length,i=new DataView(new ArrayBuffer(12+8*n+r*n*18));[75,82,66,49].forEach((e,t)=>i.setUint8(t,e)),i.setUint32(4,n,!0),i.setUint32(8,r,!0);let a=12;for(let t=0;t<n;t++,a+=8)i.setFloat64(a,e.x[t],!0);for(let r of t){let t=e.channels.get(r);if(!t)throw Error(`The reference has no channel ${r}`);for(let e of[t.mean,t.sd,t.min,t.max])for(let t=0;t<n;t++,a+=4)i.setFloat32(a,e[t],!0);for(let e=0;e<n;e++,a+=2)i.setUint16(a,t.n[e],!0)}return De(new Uint8Array(i.buffer))}function p$(e,t){let n=le(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(n.length<12||String.fromCharCode(n[0],n[1],n[2],n[3])!==`KRB1`)throw Error(`Not a reference band`);let i=r.getUint32(4,!0),a=r.getUint32(8,!0);if(a!==t.length||n.length!==12+8*i+a*i*18)throw Error(`This reference band does not match its channels`);let o=12,s=new Float64Array(i);for(let e=0;e<i;e++,o+=8)s[e]=r.getFloat64(o,!0);let c=new Map;for(let e of t){let t=()=>{let e=new Float32Array(i);for(let t=0;t<i;t++,o+=4)e[t]=r.getFloat32(o,!0);return e},n=t(),a=t(),s=t(),l=t(),u=new Uint16Array(i);for(let e=0;e<i;e++,o+=2)u[e]=r.getUint16(o,!0);c.set(e,{mean:n,sd:a,min:s,max:l,n:u})}return{x:s,channels:c}}var m$=` Δ`,h$=class{#e;constructor(e){this.#e=new kB(e)}assumeOpen(e){}feed(e,t,n){let r=[];for(let i=0;i<e.length;i++)this.#e.step(e[i],e=>{let n=t(e);return n?n[i]:NaN},r),n?.(i,this.#e.open()?.tstart??null);return r.map(e=>({tstart:e.tstart,tend:e.tend,kpis:{duration:(e.tend??e.tstart)-e.tstart},...e.flags.length?{flags:e.flags}:{}}))}};function g$(e){if(!e.cycle&&!e.rule)throw Error(`a live segment axis needs a rule or a cycle rule`);let t=e.cycle?new h$(e.cycle):new mB(e.rule,e.kpis??[]),n=new a$(e.axis),r=NaN;e.start!=null&&(t.assumeOpen(e.start),n.begin(e.start),r=e.start);let i=e.reference??null,a=i?[...i.channels]:[],o=i?i.grid.length:0,s=`channel`in e.axis?e.axis.channel:null,c=[...new Set([...e.cycle?OB(e.cycle):nB(e.rule),...(e.kpis??[]).map(e=>e.channel),...s?[s]:[],...a.map(([e])=>e)])],l=e.minDeviationS??5,u=NaN,d=NaN,f=NaN,p=new Set,m=!1,h=e=>{m&&e({type:`deviation-end`,t0:u,t1:d,channels:[...p]}),u=d=f=NaN,p=new Set,m=!1};return{feed(g,_,v=!1){let y=Math.max(_,g.firstAbs),b=g.endAbs;if(y>=b)return;let x=t=>{v||e.onEvent?.(t)},S=g.range(qe,y,b),C=new Map(c.map(e=>[e,g.range(e,y,b)])),w=new Float64Array(S.length).fill(NaN),T=a.map(([e,t])=>({name:e,b:t,v:C.get(e),d:new Float64Array(S.length).fill(NaN)})),E=s?C.get(s):null,D=t.feed(S,e=>C.get(e),(e,t)=>{if(t===null)return;t!==r&&(h(x),r=t,n.begin(t),x({type:`open`,tstart:t}));let a=n.x(S[e],E?E[e]:NaN);if(w[e]=a,!i||a!==a)return;let s=o>1?Math.round((a-i.grid[0])/(i.grid[o-1]-i.grid[0])*(o-1)):0,c=!1;for(let t of T){let n=t.v[e],r=c$(i.grid,t.b.mean,a);n!==n||r!==r||(t.d[e]=n-r,t.b.n[s]>=2&&(n<c$(i.grid,t.b.lo,a)||n>c$(i.grid,t.b.hi,a))&&(c=!0,p.add(t.name)))}c?(u!==u&&(u=S[e]),d=S[e],f=NaN,!m&&S[e]-u>=l&&(m=!0,x({type:`deviation`,t0:u,channels:[...p]}))):u===u&&(f!==f&&(f=S[e]),S[e]-f>=l&&h(x))});for(let e of D)x({type:`close`,segment:e});g.writeComputed(e.column,e.unit,y,w);for(let e of T)g.writeComputed(`${e.name} Δ`,g.unitOf(e.name),y,e.d)}}}var _$=1e7,v$=512,y$=400,b$=4e3,x$=1e3,S$=3e3,C$=2,w$=5e3,T$=1e4;function E$(e,t,n=`data`){let r=new Xe(t.capacity??_$,void 0,void 0,(t.maxMemoryMB??v$)*1024*1024);return{meta:e,buffer:r,source:new UQ(()=>r),unsub:()=>{},status:`connecting`,error:null,lastFrameAt:Date.now(),lastColCount:0,lastValued:0,recorder:null,schemas:new Map,video:n===`camera`?new DE:null,clock:n===`camera`?null:new HQ,lagTicks:0,lastRejoinAt:0,rejoin:()=>{},subscribed:!1,releaseTimer:void 0}}function D$(e,t,n=()=>({}),r){let i=new Map,a=e,o=[],s=[],c=``,l=()=>{let e=[];for(let t of i.values())t.lastColCount=t.buffer.columnNames.length,t.lastValued=t.buffer.valuedCount,e.push({...t.meta,kind:t.video?`camera`:`data`,video:t.video,clock:t.clock,dataset:t.buffer.toDataset(y$),source:t.source,rowCount:t.buffer.size,status:t.status,error:t.error,recordingSince:t.recorder?.startedAt??null});o=e,t(o)},u=(e,t)=>{let n=!1,r=e.buffer.endAbs;for(let r of t)r&&typeof r.t==`number`&&Array.isArray(r.signals)&&(e.buffer.push(r),e.recorder?.add(r),n=!0);n&&p(e,r,t[t.length-1]?.t)},d=(e,t)=>{let n=e.buffer.endAbs;e.buffer.pushColumns(t),e.recorder?.addColumns(t),t.t.length>0&&p(e,n,t.t[t.t.length-1])},p=(e,t,n)=>{QQ(e.buffer,s,t),e.segAxis?.tracker.feed(e.buffer,t),r?.rows(e.meta.id,e.buffer,t),typeof n==`number`&&e.clock?.observe(n,Date.now()/1e3),m(e,t===0||e.buffer.columnNames.length!==e.lastColCount||e.buffer.valuedCount!==e.lastValued)},m=(e,t)=>{e.lastFrameAt=Date.now();let n=e.status===`stale`||e.status===`connecting`;n&&(e.status=`live`),(n||t)&&l()},h=e=>{let t=i.get(e);t&&(clearTimeout(t.releaseTimer),t.unsub(),i.delete(e),l())},g=setInterval(()=>{let e=Date.now(),t=!1;for(let n of i.values()){n.status===`live`&&e-n.lastFrameAt>b$&&(n.status=`stale`,t=!0);let i=n.video&&n.subscribed&&n.status===`live`?n.video.info().lagMs:null;n.lagTicks=i!==null&&i>S$?n.lagTicks+1:0,n.video&&n.lagTicks>=C$&&e-n.lastRejoinAt>=w$&&(n.lagTicks=0,n.lastRejoinAt=e,n.video.resync(),n.unsub(),n.rejoin()),n.buffer.size&&r?.tick(n.meta.id,n.buffer,n.lastFrameAt)}t&&l()},x$);return{connections:()=>o,disconnect:h,startRecording(e){let t=i.get(e);!t||t.recorder||(t.recorder=new qQ,l())},stopRecording(e){let t=i.get(e),n=t?.recorder;return!t||!n?null:(t.recorder=null,l(),{csv:n.toCsvParts(),rows:n.rows,name:t.meta.name,startedAt:n.startedAt})},setRelay(e){a=e},setSegmentAxis(e,t){let n=i.get(e);n&&(n.segAxis=t?{cfg:t,tracker:g$(t)}:void 0,t&&n.segAxis.tracker.feed(n.buffer,n.buffer.firstAbs,!t.replay),l())},setMathChannels(e){let t=JSON.stringify(e.map(e=>[e.id,e.name,e.units,e.formula,e.enabled]));if(t!==c){c=t,s=e;for(let t of i.values())t.video||($Q(t.buffer,e),t.segAxis&&(t.segAxis.tracker=g$(t.segAxis.cfg),t.segAxis.tracker.feed(t.buffer,t.buffer.firstAbs,!0)));i.size>0&&l()}},openLocal(e,t){let r=`local:${crypto.randomUUID()}`,a=E$({id:r,name:e,ownerName:`This page`,visibility:`private`,orgName:null,parentId:null,lowOf:null},{...n(),...t});return i.set(r,a),l(),{id:r,push:e=>{i.get(r)===a&&u(a,Array.isArray(e)?e:[e])},pushColumns:e=>{i.get(r)===a&&d(a,e)},close:()=>h(r)}},async connect(e,t,r){if(i.has(e.id))return;let o=a&&e.relay_url?{...a,url:e.relay_url}:a;if(!o)throw new OE(`relay_unavailable`);let s=typeof t==`string`?await f(ue(t).secret??t,e.salt):`keyFor`in t?e=>t.keyFor(e):t;if(typeof s!=`function`&&!await ge(s,e.key_check))throw new OE(`wrong_password`);let c=E$({id:e.id,name:e.name,ownerName:e.owner_name??``,visibility:e.visibility??`private`,orgName:e.org_name??null,projectName:e.project_name??null,parentId:e.parent_stream_id??null,lowOf:e.low_of_stream_id??null},{...n(),...r},e.kind);i.set(e.id,c);let p=Promise.resolve();c.rejoin=()=>{c.unsub=IQ(o,e.id,t=>{let n=ye(s,t).catch(()=>null);p=p.then(async()=>{try{let t=await n;if(!t||i.get(e.id)!==c)return;if(t.kind===6){let e=BQ(t.plaintext);e&&c.video&&(c.video.push(e),m(c,!1));return}if(t.kind===5){let e=de(t.plaintext);c.schemas.set(e.id,e);return}if(t.kind===7){let e=he(t.plaintext,c.schemas);if(!e)return;let n=c.buffer;for(let t of e)n.setLastKnown(t.name,t.unit,t.t,t.v);(n.columnNames.length!==c.lastColCount||n.valuedCount!==c.lastValued)&&l();return}if(t.kind===4){let e=await Ge(t.plaintext,c.schemas);e&&!e.historical&&d(c,e.block);return}if(t.kind===3)return d(c,Ie(t.plaintext));if(t.kind!==2)return;let r=ie(t.plaintext);u(c,Array.isArray(r?.frames)?r.frames:[])}catch{}})},t=>{!c.subscribed||i.get(e.id)!==c||(t===`subscribed`?(c.status=`live`,c.lastFrameAt=Date.now()):t===`error`&&(c.status=`error`,c.error=`connection_error`),l())})};let h=c.video;h?(c.status=`idle`,h.onDemandChange(t=>{i.get(e.id)===c&&(clearTimeout(c.releaseTimer),t?c.subscribed||(c.subscribed=!0,h.resync(),c.status=`connecting`,c.lastFrameAt=Date.now(),c.rejoin(),l()):c.releaseTimer=setTimeout(()=>{c.subscribed=!1,c.unsub(),c.unsub=()=>{},c.status=`idle`,c.error=null,c.lagTicks=0,l()},T$))})):(c.subscribed=!0,c.rejoin()),l()},dispose(){clearInterval(g);for(let e of i.values())clearTimeout(e.releaseTimer),e.unsub();i.clear(),o=[]}}}var O$=500,k$=1<<20;function A$(e){let t=[],n=new Map,r=[],i=``,a=(e,t)=>`${e}|${t}`,o=(e,t)=>{let n=t.kind===`stream`?e.targets?.streams:t.kind===`history`?e.targets?.histories:e.targets?.datasets;return!n||n.includes(t.kind===`dataset`?t.name??t.id:t.id)},s=()=>[...n.values()].map(e=>{let{state:t,missing:n,since:r}=e.state();return{ruleId:e.rule.id,target:e.target,state:t,...n?{missing:n}:{},...r===void 0?{}:{since:r}}}),c=()=>{let t=s(),n=JSON.stringify(t);n!==i&&(i=n,e.setStates(t))};function l(n,i){let a=t.find(e=>e.id===n.ruleId);if(n.kind===`raised`){r=[...r,{id:`${n.ruleId}|${n.target.id}|${n.t}`,ruleId:n.ruleId,ruleName:a?.name??``,severity:a?.severity??`info`,targetId:n.target.id,timeColumn:i,t0:n.t,t1:null}];let e=r.filter(e=>e.targetId===n.target.id);e.length>O$&&(r=r.filter(t=>t!==e[0]))}else{let e=r.find(e=>e.ruleId===n.ruleId&&e.targetId===n.target.id&&e.t1===null);e&&(r=r.map(t=>t===e?{...t,t1:n.t}:t))}e.setMarks(r),e.emit(n)}function u(){let r=new Set;for(let i of e.targets())for(let e of t){if(!o(e,i))continue;let t=a(e.id,i.id);r.add(t);let s=n.get(t),{channels:c,...u}=i;(!s||s.rule!==e)&&(s=et(e,u),n.set(t,s));for(let e of s.bind(c))l(e,i.kind===`stream`?qe:``)}for(let e of n.keys())r.has(e)||n.delete(e);c()}return{setRules(n){let r=[],i=n.filter(e=>{let t=tt(e);return r.push(...t.map(t=>({ruleId:String(e?.id??``),...t}))),!t.length}),a=e.maxRules();a!==null&&i.length>a&&e.limit();let o=new Map(t.map(e=>[e.id,e]));return t=(a===null?i:i.slice(0,a)).map(e=>{let t=o.get(e.id);return t&&t.version===e.version?t:e}),u(),r},rules:()=>t,state:s,async evaluate(n,i){let a=e.targets().find(e=>e.id===n&&e.kind===`dataset`);if(!a)return[];let{channels:s,...c}=a,u=[],d=t.filter(e=>(!i.ruleIds||i.ruleIds.includes(e.id))&&o(e,c)),f=d.map(e=>{let t=et(e,c);return t.bind(s),t}),p=[...new Set(d.flatMap(e=>Object.values(e.signals).map(e=>`formula`in e?e.formula:e.channel)))];for(let t=0;;t+=k$){let r=await e.readDataset(n,[i.timeColumn,...p],t,k$),a=r[i.timeColumn];if(!a||!a.length)break;for(let e of f)u.push(...e.push({t:a,columns:r}));if(a.length<k$)break}r=r.filter(e=>!(e.targetId===n&&(!i.ruleIds||i.ruleIds.includes(e.ruleId)))),e.setMarks(r);for(let e of u)l(e,i.timeColumn);return u},pushLive(e,t){let r=!1;for(let i of n.values()){if(i.target.id!==e)continue;let n=i.push(t);n.length&&(r=!0);for(let e of n)l(e,qe)}r&&c()},tickLive(e,t){let r=!1;for(let i of n.values()){if(i.target.id!==e)continue;let n=i.tick(t);n.length&&(r=!0);for(let e of n)l(e,qe)}r&&c()},liveColumns(e){let t=new Set;for(let r of n.values())if(r.target.id===e)for(let e of Object.values(r.rule.signals))t.add(`formula`in e?e.formula:e.channel);return[...t]},sync:u,clearMarks(t){r=t?r.filter(e=>e.targetId!==t):[],e.setMarks(r)}}}var j$=class{past=[];future=[];current=null;lastAt=-1/0;o;equals;constructor(e){this.o=e,this.equals=e.equals??Object.is}get canUndo(){return this.past.length>0}get canRedo(){return this.future.length>0}observe(e){if(this.current===null)return this.current=e,!1;if(this.equals(e,this.current))return!1;let t=this.o.now();return t-this.lastAt<this.o.mergeMs&&this.past.length>0||(this.past.push(this.current),this.past.length>this.o.limit&&this.past.shift()),this.current=e,this.future=[],this.lastAt=t,!0}rebase(e){this.current=e}undo(){if(this.past.length===0)return null;let e=this.past.pop();return this.future.push(this.current),this.current=e,this.lastAt=-1/0,e}redo(){if(this.future.length===0)return null;let e=this.future.pop();return this.past.push(this.current),this.current=e,this.lastAt=-1/0,e}clear(e){this.past=[],this.future=[],this.current=e,this.lastAt=-1/0}},M$={maxChartsPerWorksheet:null,maxChannelsPerChart:null,maxWorksheets:null,maxMathChannels:null,maxAlertRules:null,canImportExportWorkspaces:!0},N$=[];function P$(e,t){let n=e.found[t];return{definitionId:n.definitionId,rule:e.defs.find(e=>e.id===n.definitionId)?.name??n.definitionId,index:n.index,parentIndex:n.parentIndex??null,tstart:n.tstart,tend:n.tend,flags:n.flags,kpis:n.kpis??{},incomplete:!!n.incomplete}}var F$=[`#a78bfa`,`#38bdf8`,`#fb7185`,`#4ade80`,`#fbbf24`,`#94a3b8`];function I$(e=`ET`){return{id:crypto.randomUUID(),name:`Worksheet`,panels:[],panelChartSettings:{},panelChartBackgrounds:{},xKey:e}}function L$(e,t){let n=e.filter(e=>e.source!==`workbook`),r=new Map,i=[];for(let e of t){let t=n.find(t=>t.name===e.name);if(t&&t.formula===e.formula&&t.units===e.units)continue;let a=t?`${e.name} (workbook)`:e.name;t&&r.set(e.name,a),i.push(sr({...e,name:a,source:`workbook`}))}return{channels:i,rename:r}}function R$(e,t){let n=JSON.stringify({xKey:e.xKey,panelChartSettings:e.panelChartSettings});for(let[e,r]of t)n=n.split(JSON.stringify(e)).join(JSON.stringify(r));return{...e,...JSON.parse(n)}}function z$(e){return typeof e.text==`function`?e.text():new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result??``)),r.onerror=()=>n(r.error),r.readAsText(e)})}function B$(e,t,n){if(!e||!t)return $t();let{min:r,max:i}=xz(e.rows,t);if(!Number.isFinite(r)||!Number.isFinite(i))return $t();let a=Cz(i-r||1,6),o=a>=1?Math.round(a):a,s=o>=1?1:o/10,c=Math.max(0,Math.ceil(-Math.log10(s))),l=e=>String(Number(e.toFixed(c)));return{...n,scaleMin:l(Math.floor(r/s)*s),scaleMax:l(Math.ceil(i/s)*s),majorStep:l(o),minorStep:``}}function V$(e,t){let n=t.includes(e.xKey)?e.xKey:t.includes(`ET`)?`ET`:t.includes(`ElapsedTime`)?qe:t[0],r={...e.panelChartSettings};for(let n of e.panels){let e=r[n.id];if(n.kind===`multiband`){let i=e&&e.kind===`multiband`?e:pn();r[n.id]={...i,kind:`multiband`,addColumn:i.addColumn&&t.includes(i.addColumn)?i.addColumn:t[0]}}else if(n.kind===`xyscatter`){let i=e&&e.kind===`xyscatter`?e:mn(F$[2]),a=t.includes(i.xyXCol)?i.xyXCol:t[0],o=t.includes(i.xyYCol)&&i.xyYCol!==t[0]?i.xyYCol:t.length>1?t[1]:t[0];r[n.id]={...i,kind:`xyscatter`,xyXCol:a,xyYCol:o}}else if(n.kind===`xyzmesh`){let i=e&&e.kind===`xyzmesh`?e:hn(4),a=t.includes(i.xyzXCol)?i.xyzXCol:t[0],o=t.length>1?t[1]:``,s=t.includes(i.xyzYCol)&&i.xyzYCol!==t[0]?i.xyzYCol:t.length>1?t[1]:t[0],c=t.includes(i.xyzZCol)&&i.xyzZCol!==t[0]&&i.xyzZCol!==o?i.xyzZCol:t.length>2?t[2]:t[0];r[n.id]={...i,kind:`xyzmesh`,xyzXCol:a,xyzYCol:s,xyzZCol:c}}}return{...e,xKey:n,panelChartSettings:r}}function H$(e,t){let n=!1,r={...e.panelChartSettings};for(let[i,a]of Object.entries(e.panelChartSettings)){if(a.kind!==`multiband`)continue;let e=a.series.filter(e=>t(e.column));e.length!==a.series.length&&(r[i]={...a,series:e},n=!0)}return n?{...e,panelChartSettings:r}:e}function U$(){return typeof document>`u`?`dark`:Zz(null)}function W$(e={}){let t={...e},n=!1,r=I$(),i=bQ({datasets:[],selection:[],worksheets:[r],activeWorksheetId:r.id,xRanges:{},offsets:{},colors:{},liveWindowSeconds:15,segmentContext:null,cycleRules:[],live:[],video:[],mathChannels:[],limits:{...M$,...t.limits},palette:Jz(t.palette,U$()),importing:0,licensed:null,history:{canUndo:!1,canRedo:!1},marks:[],alerts:[],alertRules:[]}),a=IV(),o=()=>{let e=Jz(t.palette,U$());i.set(t=>t.palette.join()===e.join()?t:{...t,palette:e})},s=typeof document>`u`?()=>{}:Qz(null,o),c=SQ(),l=()=>{if(n)throw new OE(`disposed`)},u=e=>{throw a.emit(`limit`,{reason:e}),new OE(`limit_reached`,{reason:e})},d=()=>i.get(),f=(e,t)=>{let n=d().limits.maxChannelsPerChart,r=Sz(t);n!==null&&r>n&&r>Sz(e)&&u(`channels-per-chart`)},p=xQ((e,t)=>t===null?e:e.slice(0,t)),m=()=>{let e=d(),t=c.lapsByDataset(e.datasets),n=c.selectedDatasets(e.datasets,t,e.selection),r=c.selectedLive(e.live,e.selection),i=c.staticDataset(n),a=c.mergedDataset(i,r),o=p(e.mathChannels,e.limits.maxMathChannels);return{laps:t,selectedDatasets:n,selectedLive:r,staticDataset:i,merged:a,channels:o,numericColumns:c.numericColumns(a,n,o,c.mergedParts(n,r),r),allColumns:c.allColumns(a,n,o),columnUnits:c.columnUnits(a,o)}},h=(e,t)=>({id:t.id,kind:t.kind,title:t.title??null,settings:e.panelChartSettings[t.id],background:e.panelChartBackgrounds[t.id]??null,annotations:e.panelChartSettings[t.id]?.annotations??N$,layout:t.rect}),g=xQ((e,t)=>e.map(e=>({id:e.id,name:e.name,xKey:e.xKey,xRange:t[e.id]??null,charts:e.panels.map(t=>h(e,t))}))),_=xQ((e,t,n,r,i,a,o)=>{let s=(e,t)=>{let n=a.findIndex(t=>t.id===e);return n>=0?n:t};return e.map((e,a)=>{let c=i[e.id],l=c?.laps.map(e=>e.id)??[],u=l.filter(e=>t.includes(e)).length;return{id:e.id,name:e.name,kind:e.kind,columns:e.schema.map(e=>({name:e.name,unit:e.unit??``,numeric:e.type===`number`})),rowCount:e.data.rows.length,color:Kz(n,e.id,s(e.id,a),o),customColor:e.id in n,offset:r[e.id]??0,parseConfig:e.parseConfig??null,fileInfo:e.info??null,beacon:e.beacon??null,cut:e.cut?{cycleId:e.cut.cycleId,timeKey:e.cut.timeKey,defs:e.cut.defs}:null,laps:c?c.laps.map((i,a)=>({id:i.id,name:i.name,value:c.values[a],unit:c.unit,isTime:c.isTime,color:Kz(n,i.id,s(i.id,a),o),offset:r[i.id]??0,selected:t.includes(i.id),...e.cut?{cycle:P$(e.cut,a)}:{}})):null,selected:c?u===0?!1:u===l.length?!0:`partial`:t.includes(e.id)}})}),v=xQ((e,t,n,r,i)=>{let a=e.filter(e=>t.includes(e.id)).map(e=>e.id);return e.map((e,o)=>({id:e.id,name:e.name,ownerName:e.ownerName,visibility:e.visibility,orgName:e.orgName,kind:e.kind,parentId:e.parentId,lowOf:e.lowOf,status:e.status,error:e.error,rowCount:e.rowCount,selected:t.includes(e.id),color:Kz(n,e.id,a.includes(e.id)?r+a.indexOf(e.id):o,i),customColor:e.id in n,recordingSince:e.recordingSince,channels:e.dataset.columnNames}))}),y=xQ(e=>{let t=m();return{datasets:_(e.datasets,e.selection,e.colors,e.offsets,t.laps,t.selectedDatasets,e.palette),selection:e.selection,worksheets:g(e.worksheets,e.xRanges),activeWorksheetId:e.activeWorksheetId,mathChannels:t.channels,live:v(e.live,e.selection,e.colors,t.selectedDatasets.length,e.palette),liveWindowSeconds:e.liveWindowSeconds,segmentContext:e.segmentContext,cycleRules:e.cycleRules,limits:e.limits,palette:e.palette,importing:e.importing,licensed:e.licensed,hasData:t.merged!==null,multiDataset:t.selectedDatasets.length+t.selectedLive.length>1,numericColumns:t.numericColumns,allColumns:t.allColumns,columnUnits:t.columnUnits,history:e.history,marks:e.marks,alerts:e.alerts}}),b=(e,t)=>e===t||e.length===t.length&&e.every((e,n)=>e===t[n]||JSON.stringify(e)===JSON.stringify(t[n])),x=new j$({limit:100,mergeMs:500,now:()=>Date.now(),equals:(e,t)=>e.liveWindowSeconds===t.liveWindowSeconds&&b(e.worksheets,t.worksheets)&&b(e.channels,t.channels)}),S=!0,C=0,w=e=>{C++;try{e()}finally{C--}},T=e=>[e.worksheets,e.mathChannels,e.liveWindowSeconds],E=[],D=()=>{let e=d();return{worksheets:e.worksheets,channels:e.mathChannels.filter(e=>e.source===`workbook`),liveWindowSeconds:e.liveWindowSeconds,activeWorksheetId:e.activeWorksheetId}},O=()=>i.set(e=>e.history.canUndo===x.canUndo&&e.history.canRedo===x.canRedo?e:{...e,history:{canUndo:x.canUndo,canRedo:x.canRedo}}),k=()=>{if(S)return;let e=T(d());e.every((e,t)=>e===E[t])||(E=e,C?x.rebase(D()):x.observe(D()),O())},A=()=>{E=T(d()),x.clear(D()),O()},j=e=>{S=!0;let t;try{t=e()}finally{S=!1}return A(),t},M=()=>y(d());i.subscribe(()=>{k(),a.emit(`change`,M())});let N=e=>{let t=d(),n=t.worksheets.find(n=>n.id===(e??t.activeWorksheetId));if(!n)throw new OE(`not_found`,{worksheetId:e});return n},P=e=>{for(let t of d().worksheets){let n=t.panels.find(t=>t.id===e);if(n)return{ws:t,panel:n}}throw new OE(`not_found`,{chartId:e})},F=(e,t)=>i.set(n=>{let r=!1,i=n.worksheets.map(n=>{if(n.id!==e)return n;let i=t(n);return i!==n&&(r=!0),i});return r?{...n,worksheets:i}:n}),I=(e,t)=>{let{ws:n}=P(e);F(n.id,n=>({...n,panelChartSettings:{...n.panelChartSettings,[e]:t(n.panelChartSettings[e])}}))},L=e=>i.set(t=>e.length===t.selection.length&&e.every((e,n)=>e===t.selection[n])?t:{...t,selection:e,xRanges:{}}),R=new Set,z=D$(t.live?.relay,e=>{let t=e.map(e=>e.id),n=e.filter(e=>e.kind===`data`&&!R.has(e.id)).map(e=>e.id),r=[...R].filter(e=>!t.includes(e));if(R=new Set(t),i.set(t=>({...t,live:e})),r.length&&L(d().selection.filter(e=>!r.includes(e))),n.length){let e=d().selection,t=n.filter(t=>!e.includes(t));t.length&&L([...e,...t])}let a=m();if(a.selectedLive.length&&a.merged){let e=a.merged.columnNames;if(e.includes(`ElapsedTime`))for(let t of d().worksheets)e.includes(t.xKey)||w(()=>F(t.id,e=>({...e,xKey:qe})))}},()=>({capacity:t.live?.capacity,maxMemoryMB:t.live?.maxMemoryMB}),{rows:(e,t,n)=>{if(!ce.rules().length)return;t.columnNames.length!==V.get(e)&&(V.set(e,t.columnNames.length),ce.sync());let r=ce.liveColumns(e);if(!r.length)return;let i=t.endAbs,a=Math.max(n,t.firstAbs);if(i<=a)return;let o={};for(let e of r)o[e]=t.range(e,a,i);ce.pushLive(e,{t:t.range(qe,a,i),columns:o,scan:new Map})},tick:(e,t,n)=>{if(!ce.rules().length)return;let r=t.range(qe,t.endAbs-1,t.endAbs)[0];r===r&&ce.tickLive(e,r+(Date.now()-n)/1e3)}}),V=new Map,te=xQ((e,t)=>e.filter(e=>t.some(t=>xE([e],t.panelChartSettings,t.xKey).length>0))),ne=()=>z.setMathChannels(te(p(d().mathChannels,d().limits.maxMathChannels),d().worksheets));ne(),i.subscribe(ne);let re=e=>{i.set(t=>({...t,datasets:[...t.datasets,e]})),L([...d().selection,e.id]);let t=bz(e.schema);t.length&&w(()=>i.set(e=>({...e,worksheets:e.worksheets.map(e=>V$(e,t))})))},ie=Promise.resolve(),U=async(e,r={})=>{l();let o=e.map(e=>e instanceof File?e:e.file);if(o.length===0)return{ids:[],errors:[]};if(await t.beforeImport?.()===!1)throw new OE(`import_vetoed`);let{signal:s}=r;i.set(e=>({...e,importing:e.importing+o.length}));let c=ie.then(async()=>{let e={ids:[],errors:[]},t=o.length,c=e=>{t-=e,i.set(t=>({...t,importing:Math.max(0,t.importing-e)}))};try{let{items:t,errors:i}=await ER(o);c(o.length-t.length);for(let{file:t,error:n}of i)e.errors.push({file:t,error:n}),a.emit(`import`,{file:t,phase:`error`,error:n}),a.emit(`error`,{error:n,context:`import`});for(let i of t){if(n)break;if(s?.aborted){e.cancelled=!0;break}let t=i.main;await new Promise(e=>setTimeout(e,0)),a.emit(`import`,{file:t.name,phase:`start`});try{let o=i.format?await yz({main:t,companions:i.companions,format:i.format.id},{priorInMemoryValues:vR(d().datasets),signal:s,onProgress:e=>a.emit(`import`,{file:t.name,phase:`progress`,fraction:e}),chooseChannels:r.chooseChannels,pickChannels:r.pickChannels}):[await _R(crypto.randomUUID(),t,d().datasets)??await hR(crypto.randomUUID(),t,z$,void 0,vR(d().datasets),s)];if(n){for(let e of o)e.source.dispose();break}if(s?.aborted){for(let e of o)e.source.dispose();throw new OE(`cancelled`)}for(let t of o)re(t),e.ids.push(t.id);a.emit(`import`,{file:t.name,phase:`done`,datasetId:o[0].id,datasetIds:o.map(e=>e.id)})}catch(n){let r=n instanceof Error?n:Error(String(n));a.emit(`import`,{file:t.name,phase:`error`,error:r}),r instanceof OE&&r.code===`cancelled`?e.cancelled=!0:(e.errors.push({file:t.name,error:r}),a.emit(`error`,{error:r,context:`import`}))}finally{c(1)}if(e.cancelled)break}}finally{t>0&&c(t)}return e});return ie=c.catch(()=>void 0),c},ae=()=>setTimeout(()=>{n||NZ(tt)},0),oe=e=>{let t=t=>e.some(e=>t===e||t.startsWith(`${e}::`)),n=d().datasets.filter(t=>e.includes(t.id));for(let e of n)e.source.dispose().catch(()=>void 0);i.set(n=>{let r={...n.offsets},i={...n.colors};for(let e of Object.keys(r))t(e)&&delete r[e];for(let e of Object.keys(i))t(e)&&delete i[e];return{...n,datasets:n.datasets.filter(t=>!e.includes(t.id)),offsets:r,colors:i}}),L(d().selection.filter(e=>!t(e))),n.length>0&&ae()},se=async(e,t,n={})=>{let[r,...i]=await yz({main:new File(e.chunks,`${e.name}.krc`),companions:[],format:`krc`,keys:e.keys},{priorInMemoryValues:t,...n});for(let e of i)e.source.dispose();return{...r,file:void 0,name:e.name,info:r.info&&{...r.info,startTime:e.startTime??r.info.startTime,meta:{...r.info.meta,recordingId:e.recordingId}}}},ce=A$({targets:()=>[...d().datasets.map(e=>({kind:`dataset`,id:e.id,name:e.name,channels:e.schema.map(e=>e.name)})),...d().live.filter(e=>e.kind===`data`).map(e=>({kind:`stream`,id:e.id,name:e.name,channels:e.source.columnNames}))],maxRules:()=>d().limits.maxAlertRules,emit:e=>a.emit(`alert`,e),limit:()=>a.emit(`limit`,{reason:`alert-rules`}),setMarks:e=>i.set(t=>({...t,marks:e})),setStates:e=>i.set(t=>({...t,alerts:e})),readDataset:(e,t,n,r)=>{let i=d().datasets.find(t=>t.id===e);return i?i.source.readColumns(t,n,r):Promise.resolve({})}}),le=xQ((e,t)=>{let n=new Map;for(let r of e){let e=rt(r);e!==null&&n.set(r.id,{value:e,active:t.some(e=>e.ruleId===r.id&&(e.state===`active`||e.state===`clearing`))})}return n}),ue=null;i.subscribe(()=>{let e=d();ue&&ue[0]===e.datasets&&ue[1]===e.live||(ue=[e.datasets,e.live],ce.rules().length&&ce.sync())});let de={importFiles:U,warmImport(e={}){l(),sz(!!e.formats?.some(e=>e===`hdf5`||e===`mat`))},async splitByRate(e){l();let t=d().datasets.find(t=>t.id===e);if(!t)throw new OE(`not_found`,{datasetId:e});if(!t.info?.combined||!(t.file instanceof File))throw new OE(`invalid_argument`,{reason:`only a combined multi-rate import can be split`});let n=await yz({main:t.file,companions:t.companions??[],format:t.info.importer},{priorInMemoryValues:vR(d().datasets.filter(t=>t.id!==e)),selection:t.info.selection,split:!0});oe([e]);for(let e of n)re(e);return n.map(e=>e.id)},async chooseChannels(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});if(!n.info||!(n.file instanceof File))throw new OE(`invalid_argument`,{reason:`only binary imports have channels to choose`});try{let r=await yz({main:n.file,companions:n.companions??[],format:n.info.importer},{priorInMemoryValues:vR(d().datasets.filter(t=>t.id!==e)),initial:n.info.selection,chooseChannels:t,pickChannels:!0});oe([e]);for(let e of r)re(e);return r.map(e=>e.id)}catch(e){if(e instanceof OE&&e.code===`cancelled`)return null;throw e}},async combine(e){l();let t=d().datasets.find(t=>t.id===e);if(!t)throw new OE(`not_found`,{datasetId:e});let n=t.info?.splitKey;if(!n||!(t.file instanceof File))throw new OE(`invalid_argument`,{reason:`only datasets split from one file can be combined`});let r=d().datasets.filter(e=>e.info?.splitKey===n),i=await yz({main:t.file,companions:t.companions??[],format:t.info.importer},{priorInMemoryValues:vR(d().datasets.filter(e=>!r.includes(e))),selection:r.flatMap(e=>e.info.selection)});if(i.length!==1){for(let e of i)e.source.dispose();throw new OE(`invalid_argument`,{reason:`these groups have no common time base`})}return oe(r.map(e=>e.id)),re(i[0]),i[0].id},async openRecording(e,t={}){l();let n=await se(e,vR(d().datasets),t);return re(n),n.id},async reopenRecording(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});let r=await se(t,vR(d().datasets.filter(t=>t.id!==e)));i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...r,id:e,beacon:n.beacon}:t)})),n.source.dispose().catch(()=>void 0),ae()},openHistoryRange(e){l();let t=yQ(crypto.randomUUID(),e);return re(t),t.id},updateHistoryRange(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});if(!(n.source instanceof cQ)){let t=`dataset ${e} is not a history range: only datasets opened with openHistoryRange can be updated`;throw Object.assign(new OE(`invalid_argument`,{datasetId:e,reason:t}),{message:t})}let r=yQ(e,t);i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...r,beacon:n.beacon}:t)})),ae()},addColumns(e){l();let t=fQ(crypto.randomUUID(),e);return re(t),t.id},replaceColumns(e,t,n={}){l();let r=d().datasets.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{datasetId:e});let a=gQ(r,t,n.transfer);i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?a:t)}))},writeColumns(e,t,n){l();let r=d().datasets.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{datasetId:e});let a=mQ(r,t,n);i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?a:t)}))},async addText(e,t=`dataset.csv`){l();let n=await fR(crypto.randomUUID(),t,e);return re(n),n.id},async findCycles(e,t,n){l();let r=d().datasets.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{datasetId:e});let i=await RB(r.source,n,BB(t)),a=new Map(t.filter(e=>e.kpis?.length).map(e=>[e.id,e.kpis]));return zB(i,t).map(e=>a.has(e.definitionId)?{...e,kpis:HB(i,e,a.get(e.definitionId))}:e)},async addCycles(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});let r=n.schema.filter(e=>e.type===`number`&&e.name!==t.timeKey).map(e=>e.name),i=await RB(n.source,t.timeKey,r),a={...Object.fromEntries(n.schema.map(e=>[e.name,e.unit])),[IB]:`s`},o=e=>t.defs.find(t=>t.id===e)?.name??e,s=[];for(let e of t.pick){let r=t.found.find(t=>t.definitionId===e.definitionId&&t.index===e.index&&t.parentIndex===e.parentIndex);if(!r)throw new OE(`not_found`,{reason:`no ${o(e.definitionId)} ${e.index} in the cycles found`});let c=r.parentIndex?`${o(t.cycleId)} ${r.parentIndex} · ${o(r.definitionId)}`:`${o(r.definitionId)} ${r.index}`;s.push(de.addColumns({name:`${n.name} · ${c}`,columns:WB(i,t.timeKey,r),units:a}))}if(t.tables!==!1){let e=KB(t.found,t.cycleId,t.defs,i);s.push(await de.addText(qB(e.cycles),`${n.name} · ${o(t.cycleId)}s.csv`)),e.phases.length&&s.push(await de.addText(qB(e.phases),`${n.name} · Phases.csv`))}return s},async cut(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});let r;if(t){if(!t.defs.some(e=>e.id===t.cycleId))throw new OE(`invalid_argument`,{reason:`cycleId is not one of defs`});let i=n.schema.filter(e=>e.type===`number`&&e.name!==t.timeKey).map(e=>e.name),a=await RB(n.source,t.timeKey,i),o=t.defs.find(e=>e.id===t.cycleId)?.show,s=e=>[...e.kpis??[],...o&&o.channel!==t.timeKey?[o]:[]],c=new Map(t.defs.filter(e=>s(e).length).map(e=>[e.id,s(e)])),l=zB(a,t.defs).sort((e,t)=>e.tstart-t.tstart||!!e.parentIndex-+!!t.parentIndex).map(e=>c.has(e.definitionId)?{...e,kpis:HB(a,e,c.get(e.definitionId))}:e),u={...Object.fromEntries(n.schema.map(e=>[e.name,e.unit])),[IB]:`s`},d=e=>t.defs.find(t=>t.id===e)?.name??e,f=l.map(r=>fQ(`${e}::${r.definitionId}:${r.parentIndex??0}:${r.index}`,{name:r.parentIndex?`${n.name} · ${d(t.cycleId)} ${r.parentIndex} · ${d(r.definitionId)}`:`${n.name} · ${d(r.definitionId)} ${r.index}`,columns:WB(a,t.timeKey,r),units:u})),p=a.t.length?a.t[a.t.length-1]:NaN,m=l.map(e=>e.tend===null&&p===p?{...e,tend:p,incomplete:!0}:e);r={defs:t.defs,cycleId:t.cycleId,timeKey:t.timeKey,found:m,parts:f}}else if(!n.cut)return 0;if(!d().datasets.some(t=>t.id===e))return 0;i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...t,cut:r}:t)}));let a=d().selection,o=a.some(t=>t===e||t.startsWith(`${e}::`)),s=a.filter(t=>t!==e&&!t.startsWith(`${e}::`)),c=r?r.parts.filter((e,t)=>!r.found[t].parentIndex).map(e=>e.id):[];return L(o?c.length>0?[...s,...c]:[...s,e]:s),c.length},remove(e){l(),oe([e])},clear(){l(),oe(d().datasets.map(e=>e.id))},async configure(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});if(t.parseConfig&&(n.kind!==`memory`||!n.parseConfig))throw new OE(`invalid_argument`,{reason:n.parseConfig?`out-of-core datasets cannot be re-parsed`:`binary files have no text parse settings`});if(t.beacon!==void 0&&t.beacon!==null&&n.kind!==`memory`)throw new OE(`invalid_argument`,{reason:`laps need an in-memory dataset`});if(t.beacon!==void 0&&JSON.stringify(t.beacon)!==JSON.stringify(n.beacon??null)){let r=t.beacon??void 0;i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...t,beacon:r}:t)}));let a=d().selection,o=a.some(t=>t===e||t.startsWith(`${e}::`)),s=a.filter(t=>t!==e&&!t.startsWith(`${e}::`)),c=r?gB(n.data.rows,r.channel):[],l=r&&t.selectCycles===`best`?xB(c.map(e=>bB(n.data.rows,e,r.metric,r.stat))):null,u=l===null?c.map((t,n)=>wB(e,n)):[wB(e,l)];L(o?c.length>0?[...s,...u]:[...s,e]:s)}let r=t.parseConfig;if(!r)return;let a=(()=>{try{let e=H(ze(n.rawText??``),r.headerRow);return n.data.columnNames.length===e.length&&n.data.columnNames.every((t,n)=>t===e[n])}catch{return!1}})();if(ee(r,n.parseConfig)&&a)return;let o=n.fromColumns?vQ(n):n.rawText??``,s=await NE(n.file?{file:n.file,config:r}:{rawText:o,config:r}),c=new IE(s),u=await c.getSchema(),f=n.fromColumns?{rawText:o,fromColumns:!1}:{};i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...t,...f,data:s,source:c,schema:u,parseConfig:r}:t)})),n.source.dispose().catch(()=>void 0),ae(),n.cut&&await de.cut(e,n.cut);let p=m().selectedDatasets,h=new Set(p.flatMap(e=>e.data.columnNames)),g=s.columnNames.filter(e=>B(s.rows,e)),_=g.find(e=>e===`ET`)??g[0];w(()=>i.set(e=>({...e,worksheets:e.worksheets.map(e=>H$(!h.has(e.xKey)&&_?{...e,xKey:_}:e,e=>h.has(e)))})))},setColor(e,t){l(),i.set(n=>{let r={...n.colors};return t===null?delete r[e]:r[e]=t,{...n,colors:r}})},setOffset(e,t){l(),i.set(n=>({...n,offsets:{...n.offsets,[e]:t}}))},resetOffsets(){l(),i.set(e=>Object.keys(e.offsets).length?{...e,offsets:{}}:e)},select(e){l(),L([...e])},toggle(e){l();let t=d().selection,n=m().laps[e];if(n){let e=n.laps.map(e=>e.id);L(e.every(e=>t.includes(e))?t.filter(t=>!e.includes(t)):[...t,...e.filter(e=>!t.includes(e))]);return}L(t.includes(e)?t.filter(t=>t!==e):[...t,e])},selectAll(){l();let e=m().laps,t=d().live.filter(e=>d().selection.includes(e.id)).map(e=>e.id);L([...d().datasets.flatMap(t=>e[t.id]?e[t.id].laps.map(e=>e.id):[t.id]),...t])},deselectAll(){l(),L([])},raw(e){let t=d().datasets.find(t=>t.id===e);if(!t)throw new OE(`not_found`,{datasetId:e});return{get rawText(){return t.kind===`memory`&&t.fromColumns?vQ(t):t.rawText??``},data:t.data,parseConfig:t.parseConfig??null,kind:t.kind,beacon:t.beacon??null}},async columnBounds(e){l();let t=m(),n=t.selectedDatasets.find(t=>t.schema.some(t=>t.name===e));if(n&&n.kind===`memory`){let t=xz(n.data.rows,e);if(Number.isFinite(t.min)&&Number.isFinite(t.max))return t}else if(n){let t=await n.source.xBounds(e).catch(()=>null);if(t&&Number.isFinite(t.x0)&&Number.isFinite(t.x1)&&t.x1>=t.x0)return{min:t.x0,max:t.x1}}let r=t.selectedLive.find(t=>t.dataset.columnNames.includes(e));if(r){let t=r.source.valueBoundsSync(e);if(t)return t}let i=fe(e);if(!i)return null;let a=xz(i.rows,e);return Number.isFinite(a.min)&&Number.isFinite(a.max)?a:null}},fe=(e,t=N().xKey)=>{let n=m();if(!n.merged)return null;if(!n.channels.find(t=>t.name===e))return n.merged;let r=bE(n.merged,n.channels,t);return{...n.merged,columnNames:[...n.merged.columnNames,...r.ok.map(e=>e.name)],rows:r.rows}},pe=(e,t,n)=>m().selectedLive.length>0?{...n,scaleMin:``,scaleMax:``,majorStep:``,minorStep:``}:B$(fe(e,t),e,n),me={fromFileList:e=>wV(Array.from(e)),async fromDataTransfer(e){return TV(Array.from(e.items??[]).map(e=>e.webkitGetAsEntry?.()).filter(e=>!!e))},canPick:EV,pick:DV,tree:(e,t)=>CV(e,t),isImportable:SV},he={add(e=`Worksheet`){l();let t=d(),n=t.limits.maxWorksheets;n!==null&&t.worksheets.length>=n&&u(`worksheets`);let r={...I$(N().xKey||`ET`),name:e};return i.set(e=>({...e,worksheets:[...e.worksheets,r],activeWorksheetId:r.id})),r.id},rename(e,t){l(),N(e),F(e,e=>e.name===t?e:{...e,name:t})},remove(e){l();let t=d();if(N(e),t.worksheets.length<=1)throw new OE(`invalid_argument`,{reason:`the last worksheet cannot be removed`});let n=t.worksheets.findIndex(t=>t.id===e),r=t.worksheets.filter(t=>t.id!==e);i.set(t=>({...t,worksheets:r,activeWorksheetId:t.activeWorksheetId===e?r[Math.max(0,n-1)].id:t.activeWorksheetId}))},reorder(e,t){l(),i.set(n=>{if(e===t||e<0||t<0||e>=n.worksheets.length||t>=n.worksheets.length)return n;let r=[...n.worksheets],[i]=r.splice(e,1);return r.splice(t,0,i),{...n,worksheets:r}})},activate(e){l(),N(e),i.set(t=>t.activeWorksheetId===e?t:{...t,activeWorksheetId:e,xRanges:{...t.xRanges,[e]:null}})},setXKey(e,t){l(),N(e),F(e,e=>H$({...e,xKey:t},e=>e!==t)),i.set(t=>({...t,xRanges:{...t.xRanges,[e]:null},offsets:{}}))}},ge={mount(e,t,n){return l(),MZ(tt,e,t,n)},openWindow(e,t){return l(),P(e),nQ(tt,e,(t,n)=>MZ(tt,e,t,n),t)},setFonts(e){e.sans&&(Q.sans=e.sans),e.mono&&(Q.mono=e.mono),NZ(tt)},kinds:()=>CQ,label:TQ,add(e,t={}){if(l(),!CQ.some(t=>t.kind===e))throw new OE(`invalid_argument`,{kind:e});let n=N(t.worksheetId),r=d().limits.maxChartsPerWorksheet;r!==null&&n.panels.length>=r&&u(`charts-per-worksheet`);let i={...Xt(e,n.panels),...t.title?{title:t.title}:{}};t.layout&&(i.rect={...t.layout});let a=ir([i],{},F$[2],4)[i.id],o=a,s=m().numericColumns;if(s.length&&(o.kind===`multiband`||o.kind===`xyscatter`||o.kind===`xyzmesh`)&&(o=V$({...n,panels:[i],panelChartSettings:{[i.id]:o}},s).panelChartSettings[i.id],o.kind===`multiband`&&(o={...o,addColumn:s.find(e=>e!==n.xKey)??s[0]})),t.settings&&(o={...o,...t.settings,kind:o.kind}),s.length&&o.kind===`xyscatter`){let e=t.settings??{};o={...o,xyXScale:e.xyXScale??pe(o.xyXCol,n.xKey,o.xyXScale),xyYScale:e.xyYScale??pe(o.xyYCol,n.xKey,o.xyYScale)}}return f(a,o),F(n.id,e=>({...e,panels:t.layout?[...e.panels,i]:Qt([...e.panels,i]),panelChartSettings:{...e.panelChartSettings,[i.id]:o}})),i.id},remove(e){l();let{ws:t}=P(e);F(t.id,t=>{let n={...t.panelChartSettings},r={...t.panelChartBackgrounds};return delete n[e],delete r[e],{...t,panels:Qt(t.panels.filter(t=>t.id!==e)),panelChartSettings:n,panelChartBackgrounds:r}})},rename(e,t){l();let{ws:n}=P(e),r=t?.trim()||void 0;F(n.id,t=>({...t,panels:t.panels.map(t=>{if(t.id!==e)return t;let{title:n,...i}=t;return r?{...i,title:r}:i})}))},update(e,t){l();let{ws:n}=P(e),r=n.panelChartSettings[e],i={...r,...t,kind:r.kind};if(r.kind===`xyscatter`&&i.kind===`xyscatter`){let e=t;typeof e.xyXCol==`string`&&e.xyXCol!==r.xyXCol&&!(`xyXScale`in e)&&(i={...i,xyXScale:pe(e.xyXCol,n.xKey,r.xyXScale)}),typeof e.xyYCol==`string`&&e.xyYCol!==r.xyYCol&&!(`xyYScale`in e)&&(i={...i,xyYScale:pe(e.xyYCol,n.xKey,r.xyYScale)})}f(r,i),I(e,()=>i)},replaceSettings(e,t){l();let{ws:n,panel:r}=P(e);if(t.kind!==r.kind)throw new OE(`invalid_argument`,{reason:`settings kind mismatch`});f(n.panelChartSettings[e],t),I(e,()=>t)},setBackground(e,t){l();let{ws:n}=P(e);F(n.id,n=>({...n,panelChartBackgrounds:{...n.panelChartBackgrounds,[e]:t}}))},addAnnotation(e,t){l(),P(e);let n=Nt({...t,id:t.id||crypto.randomUUID()});if(!n)throw new OE(`invalid_argument`,{reason:`not a valid annotation`});return I(e,e=>({...e,annotations:[...(e.annotations??[]).filter(e=>e.id!==n.id),n]})),n.id},updateAnnotation(e,t,n){l();let r=(P(e).ws.panelChartSettings[e]?.annotations??[]).find(e=>e.id===t);if(!r)throw new OE(`not_found`,{annotationId:t});let i=Nt({...r,...n,id:r.id,kind:r.kind});if(!i)throw new OE(`invalid_argument`,{reason:`not a valid annotation`});I(e,e=>({...e,annotations:(e.annotations??[]).map(e=>e.id===i.id?i:e)}))},removeAnnotation(e,t){l(),P(e),I(e,e=>({...e,annotations:(e.annotations??[]).filter(e=>e.id!==t)}))},setAnnotations(e,t){l(),P(e);let n=Pt(t)??[];I(e,e=>({...e,annotations:n}))},setLayout(e,t){l();let{ws:n}=P(e);F(n.id,n=>({...n,panels:n.panels.map(n=>n.id===e?{...n,rect:{...t}}:n)}))},setLayouts(e,t){l(),F(e,e=>({...e,panels:e.panels.map(e=>t[e.id]?{...e,rect:{...t[e.id]}}:e)}))},autoLayout(e){l(),F(N(e).id,e=>({...e,panels:Qt(e.panels)}))},get(e){let{ws:t,panel:n}=P(e);return h(t,n)},list(e){let t=N(e);return t.panels.map(e=>h(t,e))},async addSeries(e,t){l();let{ws:n}=P(e),r=n.panelChartSettings[e];if(!r||r.kind!==`multiband`)throw new OE(`invalid_argument`,{reason:`not a multiband chart`});let i=d().limits.maxChannelsPerChart;i!==null&&Sz(r)>=i&&u(`channels-per-chart`);let a=m().numericColumns,o=new Set(r.series.map(e=>e.column)),s=t??a.find(e=>e!==n.xKey&&!o.has(e))??a.find(e=>e!==n.xKey)??``;if(!s)return null;let c=or(),f={id:c,column:s,color:F$[r.series.length%F$.length],bandFromPct:0,bandToPct:100,scaleMin:0,scaleMax:1,yMajorStep:0,yMinorStep:0};return I(e,e=>e.kind===`multiband`?{...e,series:[...e.series,f]}:e),await ge.autoScaleSeries(e,c),c},async updateSeries(e,t,n){l();let{ws:r}=P(e),i=r.panelChartSettings[e],a=i&&i.kind===`multiband`?i.series.find(e=>e.id===t):void 0;if(!a)throw new OE(`not_found`,{seriesId:t});I(e,e=>e.kind===`multiband`?{...e,series:e.series.map(e=>e.id===t?{...e,...n,id:e.id}:e)}:e),n.column&&n.column!==a.column&&n.scaleMin===void 0&&n.scaleMax===void 0&&await ge.autoScaleSeries(e,t)},removeSeries(e,t){l(),I(e,e=>e.kind===`multiband`?{...e,series:e.series.filter(e=>e.id!==t)}:e)},reorderSeries(e,t){l(),I(e,e=>{if(e.kind!==`multiband`)return e;let n=new Map(e.series.map(e=>[e.id,e])),r=t.map(e=>n.get(e)).filter(e=>!!e),i=e.series.filter(e=>!t.includes(e.id));return{...e,series:[...r,...i]}})},async autoScaleSeries(e,t){l();let{ws:r}=P(e),i=r.panelChartSettings[e],a=i&&i.kind===`multiband`?i.series.find(e=>e.id===t):void 0;if(!a)return;let o=await de.columnBounds(a.column);!o||n||I(e,e=>e.kind===`multiband`?{...e,series:e.series.map(e=>e.id===t?{...e,scaleMin:o.min,scaleMax:o.max}:e)}:e)}},_e=new Map,ve={setXRange(e,t){l();let n=N(t).id;i.set(t=>{let r=t.xRanges[n]??null;return r===e||r&&e&&r[0]===e[0]&&r[1]===e[1]?t:{...t,xRanges:{...t.xRanges,[n]:e}}})},resetZoom(e){ve.setXRange(null,e)},setCursorX(e,t){l();let n=N(t).id;(_e.get(n)??null)!==e&&(_e.set(n,e),a.emit(`cursorchange`,{worksheetId:n,x:e}))},cursorX(e){return _e.get(N(e).id)??null},setLiveWindow(e){l(),i.set(t=>t.liveWindowSeconds===e?t:{...t,liveWindowSeconds:e})},setSegmentContext(e){l(),i.set(t=>JSON.stringify(t.segmentContext)===JSON.stringify(e)?t:{...t,segmentContext:e})}},ye={save(e){l();let t=e.id??crypto.randomUUID(),[n]=FB([{...e,id:t,parentId:e.parentId??null}].concat(d().cycleRules.filter(e=>e.id!==t))).filter(e=>e.id===t);if(!n)throw new OE(`invalid_argument`,{reason:`not a valid cycle rule (or its parent is missing)`});return i.set(e=>({...e,cycleRules:e.cycleRules.some(e=>e.id===t)?e.cycleRules.map(e=>e.id===t?n:e):[...e.cycleRules,n]})),t},remove(e){l();let t=new Set([e]);for(let e=!0;e;){e=!1;for(let n of d().cycleRules)n.parentId&&t.has(n.parentId)&&!t.has(n.id)&&(t.add(n.id),e=!0)}i.set(e=>({...e,cycleRules:e.cycleRules.filter(e=>!t.has(e.id))}))}},be={create(e){l();let n=d(),r=n.limits.maxMathChannels;r!==null&&n.mathChannels.length>=r&&u(`math-channels`);let o=sr(e);return i.set(e=>({...e,mathChannels:[...e.mathChannels,o]})),Promise.resolve(t.mathChannels?.create(o)).catch(e=>a.emit(`error`,{error:e,context:`mathChannels.create`})),o},update(e,n){l();let r=d().mathChannels.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{channelId:e});i.set(t=>({...t,mathChannels:t.mathChannels.map(t=>t.id===e?{...t,...n,updatedAt:Date.now()}:t)})),r.source!==`workbook`&&Promise.resolve(t.mathChannels?.update(e,n)).catch(e=>a.emit(`error`,{error:e,context:`mathChannels.update`}))},remove(e){l();let n=d().mathChannels.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{channelId:e});i.set(t=>({...t,mathChannels:t.mathChannels.filter(t=>t.id!==e)})),n.source!==`workbook`&&Promise.resolve(t.mathChannels?.remove(e)).catch(e=>a.emit(`error`,{error:e,context:`mathChannels.remove`}))},async importFile(e){l();let{channels:n,errors:r}=await wE(e),a=d(),o=a.limits.maxMathChannels===null?n.length:Math.max(0,a.limits.maxMathChannels-a.mathChannels.length);n.length>0&&o===0&&u(`math-channels`);let s=n.slice(0,o);return i.set(e=>({...e,mathChannels:[...e.mathChannels,...s]})),await t.mathChannels?.importMany(s),{channels:s,errors:r}},async importMany(e){l();let n=d(),r=n.limits.maxMathChannels===null?e.length:Math.max(0,n.limits.maxMathChannels-n.mathChannels.length);e.length>0&&r===0&&u(`math-channels`);let a=e.slice(0,r);return i.set(e=>({...e,mathChannels:[...e.mathChannels,...a]})),await t.mathChannels?.importMany(a),a},exportBlob:()=>SE(d().mathChannels),preview(e,t){let n=m();return n.merged?nE(e,n.merged,N(t).xKey,n.channels.filter(t=>t.id!==e.id)):null},sync(e){l(),i.set(t=>{let n=t.mathChannels.filter(e=>e.source===`workbook`),r=n.length?[...e,...n]:e;return t.mathChannels===r?t:{...t,mathChannels:r}})}},xe=xQ((e,t)=>[...e.flatMap(e=>e.kind===`camera`&&e.video?[EE({...e,video:e.video})]:[]),...t]),Se=``;i.subscribe(()=>{let e=xe(d().live,d().video),t=e.map(e=>`${e.kind}:${e.id}:${e.recordingId??``}:${e.name}`).join(`|`);t!==Se&&(Se=t,a.emit(`videochange`,{sources:e}))});let Ce=(e,t,n)=>e.id===t&&(n===void 0||(e.recordingId??null)===n),we={sources:()=>xe(d().live,d().video),register(e){l(),i.set(t=>({...t,video:[...t.video.filter(t=>!Ce(t,e.id,e.recordingId??null)),e]}))},unregister(e,t){l(),i.set(n=>n.video.some(n=>Ce(n,e,t))?{...n,video:n.video.filter(n=>!Ce(n,e,t))}:n)}},Te={openLocal(e,t){return l(),z.openLocal(e,t)},async connect(e,t,n){l(),await z.connect(e,t,n)},startRecording(e){l(),z.startRecording(e)},stopRecording(e){return l(),z.stopRecording(e)},setSegmentAxis(e,t){l(),z.setSegmentAxis(e,t)},rowCount(e){return z.connections().find(t=>t.id===e)?.source.size()??0},disconnect(e){l(),z.disconnect(e),L(d().selection.filter(t=>t!==e))}},Ee=()=>{d().limits.canImportExportWorkspaces||u(`workspaces-io`)},De=async e=>{if(e instanceof Blob)try{return JSON.parse(await e.text())}catch{throw new OE(`bad_file`)}if(typeof e==`string`)try{return JSON.parse(e)}catch{throw new OE(`bad_file`)}return e},Oe=async e=>e instanceof File?e:new File([JSON.stringify(await De(e))],`import.json`,{type:`application/json`}),ke=e=>e.replace(/[^\w.-]+/g,`_`),Ae=e=>new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),je=e=>{let t=rr(e.panelChartSettings,F$[2],4),n={};for(let r of e.panels)t[r.id]?.kind===r.kind&&(n[r.id]=t[r.id]);return{...e,panelChartSettings:ir(e.panels,n,F$[2],4)}},Me=e=>{let t=m().numericColumns;return t.length?V$(e,t):e},Ne=(e,t=0)=>{let n=d().limits.maxWorksheets,r=(n===null?e:e.slice(0,Math.max(1,n))).map(e=>Me(je(e))),a=r[Math.min(t,r.length-1)];i.set(e=>({...e,worksheets:r,activeWorksheetId:a.id,xRanges:{}}))},Pe=(e,t)=>{let n=N(t),r=d().limits.maxChartsPerWorksheet;r!==null&&n.panels.length>=r&&u(`charts-per-worksheet`);let i=d().limits.maxChannelsPerChart;i!==null&&Sz(e.settings)>i&&u(`channels-per-chart`);let a=crypto.randomUUID(),o={id:a,kind:e.kind,rect:{x:0,y:0,w:6,h:24},...e.title?{title:e.title}:{}};return F(n.id,t=>({...t,panels:Qt([...t.panels,o]),panelChartSettings:{...t.panelChartSettings,[a]:e.settings},panelChartBackgrounds:e.background===null?t.panelChartBackgrounds:{...t.panelChartBackgrounds,[a]:e.background}})),a},Fe=()=>{let e=d();return oV({worksheets:e.worksheets,activeWorksheetId:e.activeWorksheetId,channels:te(p(e.mathChannels,e.limits.maxMathChannels),e.worksheets),liveWindowSeconds:e.liveWindowSeconds,laps:e.datasets.find(e=>e.beacon)?.beacon??null,segments:e.segmentContext,cycles:e.cycleRules})},Ie=e=>{if(e.worksheets.length===0)throw new OE(`bad_workspace`,{errors:e.errors});let{channels:t,rename:n}=L$(d().mathChannels,e.mathChannels);Ne(n.size?e.worksheets.map(e=>R$(e,n)):e.worksheets,e.activeIndex),i.set(n=>({...n,mathChannels:[...n.mathChannels.filter(e=>e.source!==`workbook`),...t],liveWindowSeconds:e.liveWindowSeconds===void 0?n.liveWindowSeconds:e.liveWindowSeconds,segmentContext:e.segments??null,cycleRules:e.cycles}));let r=e.laps;if(r)for(let e of d().datasets)e.kind!==`memory`||e.beacon||!e.data.columnNames.includes(r.channel)||de.configure(e.id,{beacon:r}).catch(e=>a.emit(`error`,{error:e,context:`io.openWorkbook`}));return{worksheets:e.worksheets.length,errors:e.errors}},Le=e=>{if(e===null)return;let t=e.worksheets.map(Me);S=!0;try{i.set(n=>{let r=t=>e.worksheets.some(e=>e.id===t);return{...n,worksheets:t,activeWorksheetId:r(n.activeWorksheetId)?n.activeWorksheetId:r(e.activeWorksheetId)?e.activeWorksheetId:e.worksheets[0].id,xRanges:Object.fromEntries(Object.entries(n.xRanges).filter(([e])=>r(e))),mathChannels:[...n.mathChannels.filter(e=>e.source!==`workbook`),...e.channels],liveWindowSeconds:e.liveWindowSeconds}})}finally{S=!1}E=T(d()),x.rebase(D()),O()},Re={undo(){l(),Le(x.undo())},redo(){l(),Le(x.redo())},clear(){l(),A()}},Be={hasWork:()=>_V(d().worksheets),exportWorksheet(e){l(),Ee();let t=N(e),n=sV(t);return{json:n,blob:Ae(n),filename:`${ke(t.name||`worksheet`)}.json`}},exportChart(e){l(),Ee();let{ws:t,panel:n}=P(e),r=cV(n,t.panelChartSettings[e],t.panelChartBackgrounds[e]??null);return{json:r,blob:Ae(r),filename:`${ke(n.title?.trim()||n.kind)}.json`}},parseFile:e=>bV(e),exportWorkspace(){l(),Ee();let e=Fe();return{json:e,blob:Ae(e),filename:`kymoscope-workspace-${new Date().toISOString().slice(0,10)}.json`}},async exportWorkspaceEncrypted(e){l(),Ee();let t=typeof e==`string`?await XB(Fe(),e):await ZB(Fe(),e);return{json:t,blob:Ae(t),filename:`kymoscope-workbook-${new Date().toISOString().slice(0,10)}.kymo`}},async importWorkspace(e,t={}){l(),Ee();let n=await De(e);return QB(n)&&(n=await tV(n,t)),j(()=>Ie(gV(n)))},toWorkbook:Fe,openWorkbook(e){return l(),j(()=>Ie(gV(e)))},async importWorksheet(e){l(),Ee();let t=d();t.limits.maxWorksheets!==null&&t.worksheets.length>=t.limits.maxWorksheets&&u(`worksheets`);let n=await bV(await Oe(e));if(n.type!==`worksheet`)throw new OE(`bad_file`,{found:n.type});let r=Me(je(n.worksheet));return i.set(e=>({...e,worksheets:[...e.worksheets,r],activeWorksheetId:r.id})),r.id},async importChart(e,t){l(),Ee();let n=await bV(await Oe(e));if(n.type!==`chart`)throw new OE(`bad_file`,{found:n.type});return Pe(n.chart,t)},snapshot(){let e=d();return{datasets:e.datasets,worksheets:e.worksheets,activeWorksheetId:e.activeWorksheetId,selection:e.selection}},restore(e){l();let t=new Set(e.datasets);for(let e of d().datasets)t.has(e)||e.source.dispose().catch(()=>void 0);let n=e.worksheets.length?e.worksheets.map(je):[I$()];j(()=>i.set(t=>({...t,datasets:e.datasets,worksheets:n,activeWorksheetId:n.some(t=>t.id===e.activeWorksheetId)?e.activeWorksheetId:n[0].id,selection:e.selection,xRanges:{},offsets:{},colors:{}})))},reset(){l(),j(()=>{oe(d().datasets.map(e=>e.id));let e=I$();i.set(t=>({...t,worksheets:[e],activeWorksheetId:e.id,xRanges:{},offsets:{},colors:{},mathChannels:t.mathChannels.filter(e=>e.source!==`workbook`)}))})}},Ve={merged(e){let t=m();if(!t.merged||t.channels.length===0)return t.merged;let n=bE(t.merged,t.channels,N(e).xKey);return{...t.merged,columnNames:[...t.merged.columnNames,...n.ok.map(e=>e.name)],units:[...t.merged.units,...n.ok.map(e=>e.units)],rows:n.rows}},plotted(){return m().merged}},He=typeof location<`u`?location.hostname:``,Ue=t.license,We=t.licenseKey,Ge=!1,Ke={},Je=e=>{n||i.set(t=>({...t,licensed:e}))},Ye=(e,t,n)=>{clearTimeout(Ke[e]);let r=Math.max(0,t-Date.now()),i=r>2**31-1;Ke[e]=setTimeout(()=>{i?Ye(e,t,n):n()},i?2**31-1:r)},Xe=e=>Ye(`renew`,e,()=>void Qe()),Ze=e=>Ye(`expiry`,e*1e3+1e3,()=>{NV(We,He).then(e=>{n||Je(e.ok)})});async function Qe(){let e=36e5,t,r=null,i;try{t=await Promise.race([Ue.get(),new Promise((e,t)=>{i=setTimeout(()=>t(Error(`timeout`)),3e4)})]),r=await NV(t,He)}catch{}finally{clearTimeout(i)}if(n)return!1;if(r?.ok)return We=t,Ge=!0,Je(!0),Ze(r.exp),Xe(Math.max(r.exp*1e3-168*e,Date.now()+e)),!0;console.warn(`[kymoscope] license renewal failed (${r?r.reason:`license.get failed or timed out`}): keeping the current key`);let a=await NV(We,He);return n?!1:(Je(a.ok),Xe(Date.now()+e),a.ok)}let $e=!Ue||t.licenseKey?NV(t.licenseKey,He).then(e=>(e.ok||console.warn(`[kymoscope] license ${e.reason}: showing attribution`),!Ge&&!n&&(Je(e.ok),e.ok&&Ue&&Ze(e.exp)),e.ok)):null,et=Ue?Qe():$e;S=!1,A();let tt={getState:M,subscribe(e){return i.subscribe(e)},on:a.on,licensed:et,isLicensed:()=>d().licensed,setOptions(e){if(l(),t={...t,...e},e.live&&z.setRelay(e.live.relay),e.palette&&o(),e.limits){let t={...d().limits,...e.limits};i.set(e=>{let n=t.maxWorksheets===null?e.worksheets:e.worksheets.slice(0,Math.max(1,t.maxWorksheets)),r=n.some(t=>t.id===e.activeWorksheetId)?e.activeWorksheetId:n[0].id;return{...e,limits:t,activeWorksheetId:r}})}},datasets:de,folders:me,worksheets:he,charts:ge,view:ve,mathChannels:be,cycles:ye,live:Te,video:we,io:Be,history:Re,data:Ve,alerts:{setRules:e=>{l();let t=ce.setRules(e);return i.set(e=>({...e,alertRules:ce.rules()})),t},rules:ce.rules,state:ce.state,evaluate:(e,t)=>(l(),ce.evaluate(e,t)),clearMarks:ce.clearMarks},marks:{list:()=>d().marks},dispose(){if(!n){n=!0,clearTimeout(Ke.renew),clearTimeout(Ke.expiry),s(),rQ(tt),PZ(tt),z.dispose();for(let e of d().datasets)e.source.dispose().catch(()=>void 0);a.emit(`dispose`,void 0),a.clear()}}};return G$.set(tt,{store:i,derived:m,live:z,alertLines:()=>le(d().alertRules,d().alerts)}),tt}var G$=new WeakMap;function K$(e){let t=G$.get(e);if(!t)throw new OE(`invalid_argument`,{reason:`not a Kymoscope engine`});return t}var q$=2e3,J$=3;function Y$(e){let t=e[0].v.fragCount,n=new Map;for(let r of e)r.v.fragCount===t&&!n.has(r.v.fragIndex)&&n.set(r.v.fragIndex,r);let r=[];for(let e=0;e<t;e++){let t=n.get(e);if(!t)return null;r.push(t.v.payload)}let i=n.get(0),a=r[0];if(t>1){a=new Uint8Array(r.reduce((e,t)=>e+t.length,0));for(let e=0,n=0;e<t;e++)a.set(r[e],n),n+=r[e].length}return{t:i.v.t,seq:i.v.seq,key:i.v.key,data:a,arrivedAt:i.at}}function X$(e){let t=[],n=0;for(;n<e.length&&e[n].v.fragIndex>0&&e[n].v.seq===e[0].v.seq;)t.push(e[n++]);let r=[],i=[],a=[];for(;n<=e.length;n++){let t=e[n];if(a.length&&(!t||t.v.seq!==a[0].v.seq)){let e=Y$(a);e?r.push(e):t||(i=a),a=[]}t&&a.push(t)}return{head:t,units:r,tail:i}}var Z$=class{kind=`recorded`;id;name;parentId;parentName;recordingId;chunks;fetch;open;maxBytes;cache=new Map;sizes=new Map;bytes=0;width=0;height=0;codec=``;waiting=null;constructor(e){this.id=e.id,this.name=e.name,this.parentId=e.parentId,this.parentName=e.parentName??null,this.recordingId=e.recordingId,this.chunks=[...e.chunks].sort((e,t)=>e.seq-t.seq),this.fetch=e.fetchChunk,this.open=e.open,this.maxBytes=e.maxBytes??256*1024*1024}async parse(e){let t=new Uint8Array(await this.fetch(this.chunks[e].seq)),n=[];for(let e of ae(t).messages){let t=null;try{t=await ye(this.open,e.bytes.slice().buffer)}catch{}if(t?.kind!==6)continue;let r=BQ(t.plaintext);r&&(r.key&&r.fragIndex===0&&!this.codec&&(this.codec=r.codec,this.width=r.width,this.height=r.height),n.push({v:r,at:e.at}))}let r=X$(n),i=e=>e.reduce((e,t)=>e+t.v.payload.length,0);return{...r,bytes:r.units.reduce((e,t)=>e+t.data.length,0)+i(r.head)+i(r.tail)}}parsed(e){let t=this.cache.get(e);if(t)return this.cache.delete(e),this.cache.set(e,t),t;let n=this.parse(e);return this.cache.set(e,n),n.then(t=>{this.cache.get(e)===n&&(this.sizes.set(e,[t.bytes,t.units.length]),this.bytes+=t.bytes,this.evict(e))},()=>{this.cache.get(e)===n&&this.cache.delete(e)}),n}evict(e){for(let t of this.cache.keys()){if(this.bytes<=this.maxBytes)return;let n=this.sizes.get(t);t===e||!n||(this.bytes-=n[0],this.sizes.delete(t),this.cache.delete(t))}}async units(e){let t;try{t=await this.parsed(e)}catch{return[]}if(t.full)return t.full;if(!t.tail.length||e+1>=this.chunks.length)return t.full=t.units;let n=await this.parsed(e+1).catch(()=>null);if(!n)return t.units;let r=null;try{r=Y$([...t.tail,...n.head.filter(e=>e.v.seq===t.tail[0].v.seq)])}catch{}return t.full=r?[...t.units,r]:t.units}async seekPlan(e){let t=this.chunks.length;if(!t)return[];let n=e*1e3,r=0;for(;r+1<t&&this.chunks[r+1].t0<=n;)r++;let i=r,a=r+1<t&&this.chunks[r+1].t0-n<q$?r+1:r,o=(await Promise.all(Array.from({length:a-i+1},(e,t)=>this.units(i+t)))).flat(),s=()=>{let t=o.length-1;for(;t>=0&&o[t].t>e;)t--;let n=t;for(;n>=0&&!o[n].key;)n--;return[n,t]},[c,l]=s();for(let e=0;c<0&&i>0&&e<J$;e++)o=[...await this.units(--i),...o],[c,l]=s();return a+1<t&&this.units(a+1),c<0?[]:o.slice(c,l+1)}ready(){return this.waiting??=(async()=>{for(let e=0;e<Math.min(this.chunks.length,J$+1)&&!this.codec;e++)await this.units(e);this.codec||(this.waiting=null)})()}info(){let e=0;for(let[,t]of this.sizes.values())e+=t;return{width:this.width,height:this.height,codec:this.codec,latestT:this.range()?.[1]??null,lagMs:null,units:e,bytes:this.bytes}}range(){let e=this.chunks.length;return e?[this.chunks[0].t0/1e3,this.chunks[e-1].t1/1e3]:null}},Q$=1e4,$$=72e4,e1=3e5,t1=3e4,n1=1e4,r1=1e4,i1=64*1024,a1=50,o1=class extends Error{status;code;detail;constructor(e,t,n){super(`${n} (${t})`),this.status=e,this.code=t,this.detail=n}},s1=e=>Uint8Array.from(atob(e),e=>e.charCodeAt(0)),c1=class{opts;deps;auth;secret;password;token=``;ticket=``;ticketRec=!1;authRec=!1;relayUrl=null;apiKeyId=null;projectId=null;e2ee=!1;sid=null;salt=``;key=null;raw=null;epoch=0;haveKey=!1;sealed=null;device=null;senderDeviceId=null;deviceRetried=!1;maxBytesPerSec=0;maxMessageBytes=i1;ws=null;open=!1;everOpen=!1;connectedAt=0;authAt=0;delay=1e3;lastToken=0;viewerCount=0;busy=!1;stopped=!1;refusal=null;heartbeatTimer=null;pingTimer=null;retryTimer=null;statusFns=new Set;viewerFns=new Set;lastStatus=``;constructor(e,t){let{auth:n,secret:r}=ue(e.apiKey);if(!r)throw Error(`This API key has no encryption secret (created before keys carried one). Create a new API key in Kymoscope.`);if(e.kind===`camera`&&!e.parentStreamId)throw Error(`A camera is added to one of your live streams: choose its stream (parentStreamId).`);if(!!e.layer!=!!e.lowOf)throw Error(`A low layer needs both layer: 'low' and lowOf (its high camera's stream id).`);if(e.layer&&e.kind!==`camera`)throw Error(`Only a camera has a low layer.`);if(e.visibility===`open`&&e.password)throw Error(`An open stream has no password: anyone may watch it. Remove the password, or use visibility 'private'.`);this.opts=e,this.deps=t,this.auth=n,this.secret=r,this.password=e.visibility===`open`?Ce:e.password||r}get streamId(){return this.sid}get viewers(){return this.viewerCount}get limits(){return{maxBytesPerSec:this.maxBytesPerSec,maxMessageBytes:this.maxMessageBytes}}onStatus(e){return this.statusFns.add(e),()=>{this.statusFns.delete(e)}}onViewers(e){return this.viewerFns.add(e),()=>{this.viewerFns.delete(e)}}async start(){this.emit();try{let e=await this.deps.store.load();this.salt=e?.salt??L();let t=await this.mint();this.token=t.token,this.relayUrl=t.relayUrl??null,this.maxBytesPerSec=t.maxBytesPerSec||0,this.maxMessageBytes=t.maxMessageBytes||i1,this.apiKeyId=t.apiKeyId??null;let n=t.project;this.e2ee=!!n?.e2ee;let r={};if(this.e2ee){this.projectId=n?.id??null;let t=e?.apiKeyId===this.apiKeyId;this.device=t&&e?.device||await Qe(),t&&e?.streamKey?{key:this.key,epoch:this.epoch,sealed:this.sealed}=e.streamKey:this.key=await z(O()),r.sender_device=await this.senderDevice()}else this.raw=s1(await _(this.password,this.salt)),this.key=await z(this.raw);let i=await this.register(e?.streamId??null,r);if(this.sid=i.stream.id,this.ticket=i.ticket,this.ticketRec=!!i.recording,this.e2ee?(this.senderDeviceId=i.sender_device_id??null,this.projectId=i.project?.id??this.projectId,await this.save(),await this.applyProject(i.project)):(await this.save(),await this.wrapFor(i.devices)),!this.relayUrl)throw Error(`stream-token returned no relayUrl`)}catch(e){throw e instanceof o1&&e.status>=400&&e.status<500&&this.refuse(e),e}this.stopped||(this.lastToken=this.deps.now(),this.connect(),this.heartbeatTimer=setInterval(()=>{this.housekeeping()},Q$),this.emit())}async send(e,t){let n=this.key,r=this.e2ee?this.epoch&255:void 0;if(this.stopped||!this.open||!n||this.e2ee&&!this.haveKey)return!1;let i=await _e(n,e,t,r),a=this.ws;if(!this.open||!a)return!1;try{return a.send(i),!0}catch{return!1}}stop(){this.stopped=!0,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.retryTimer&&clearTimeout(this.retryTimer),this.heartbeatTimer=this.retryTimer=null;let e=this.ws;if(this.disconnect(),e){e.onopen=e.onmessage=e.onclose=null;try{e.close(1e3)}catch{}}}async post(e,t,n){let r;try{r=await this.deps.fetch(`${this.opts.supabaseUrl.replace(/\/+$/,``)}/functions/v1/${e}`,{method:`POST`,headers:t,body:n===void 0?void 0:JSON.stringify(n)})}catch(e){throw new o1(0,`network`,e?.message??String(e))}let i=await r.text(),a=null;try{a=JSON.parse(i)}catch{}if(r.status!==200)throw new o1(r.status,a?.error??`error`,a?.message??a?.error??i);return a}mint(){return this.post(`stream-token`,{"x-api-key":this.auth})}call(e){return this.post(`stream-publisher`,{Authorization:`Bearer ${this.token}`,"Content-Type":`application/json`},e)}async register(e,t){let n={action:`register`,name:this.opts.name,salt:this.salt,key_check:await p(this.key),visibility:this.opts.visibility??`private`,kind:this.opts.kind,...t};return this.opts.kind===`camera`&&(n.parent_stream_id=this.opts.parentStreamId),this.opts.layer&&(n.layer=this.opts.layer,n.low_of=this.opts.lowOf),e&&(n.stream_id=e),this.call(n)}async senderDevice(){let e=this.device.publicKey;return{public_key:e,binding:await He(await Fe(this.secret),this.apiKeyId??``,e)}}async housekeeping(){if(!(this.busy||this.stopped)){this.busy=!0;try{let e=this.deps.now();if(e-this.lastToken>=$$){this.lastToken=e;try{this.token=(await this.mint()).token}catch{return}}if(this.e2ee){let e=await this.call({action:`heartbeat`,stream_id:this.sid,sender_device_id:this.senderDeviceId,epoch:this.haveKey?this.epoch:0});this.setTicket(e.ticket,!!e.recording),await this.applyProject(e.project)}else{let e=await this.call({action:`heartbeat`,stream_id:this.sid});this.setTicket(e.ticket,!!e.recording),await this.wrapFor(e.devices)}}catch(e){e instanceof o1&&(e.status===401||e.status===403)&&this.refuse(e)}finally{this.busy=!1}}}async wrapFor(e){let t=[];for(let n of e??[])try{t.push({device_id:n.id,wrapped:await ve(n.public_key,this.raw,`${this.sid}|${n.id}`)})}catch{}if(t.length)try{await this.call({action:`wrap_keys`,stream_id:this.sid,keys:t.slice(0,a1)})}catch{}}async applyProject(e){if(!this.e2ee||!e)return;let t=e.key;if(!t){this.emit();return}let n=Number(t.epoch);if(this.haveKey&&n<=this.epoch)return;let r;try{r=await Ke(this.device.privateKey,t.wrapped,ne(this.projectId,n,this.senderDeviceId))}catch{if(this.deviceRetried)return;this.deviceRetried=!0,this.device=await Qe(),await this.reregister();return}let i=Oe(this.sid,this.projectId,n),a=this.key,o=n===this.epoch?this.sealed:null;if(o)try{await b(r,o,i)}catch{o=null}if(!o){let e=O();a=await z(e),o=await Ve(r,e,i),e.fill(0)}try{await this.call({action:`wrap_keys`,stream_id:this.sid,sender_device_id:this.senderDeviceId,project_wrap:{epoch:n,iv:o.iv,ct:o.ct}})}catch{return}this.stopped||(this.key=a,this.sealed=o,this.epoch=n,this.haveKey=!0,await this.save(),this.emit())}async reregister(){let e;try{e=await this.register(this.sid,{sender_device:await this.senderDevice()})}catch{return}this.ticket=e.ticket,this.ticketRec=!!e.recording,this.senderDeviceId=e.sender_device_id??null,await this.save(),await this.applyProject(e.project),this.deviceRetried=!1}async save(){try{await this.deps.store.save({apiKeyId:this.apiKeyId,streamId:this.sid,salt:this.salt,device:this.e2ee?this.device:null,streamKey:this.e2ee&&this.haveKey?{epoch:this.epoch,key:this.key,sealed:this.sealed}:null})}catch{}}connect(){if(this.retryTimer=null,this.stopped)return;let e=this.relayUrl.replace(/\/+$/,``).replace(/^http(s?):\/\//,`ws$1://`),t;try{t=new this.deps.WebSocket(`${e}/v1/streams/${this.sid}/publish`,[EQ,`bearer.${this.ticket}`])}catch{this.dropped();return}t.binaryType=`arraybuffer`,this.ws=t,t.onopen=()=>{t===this.ws&&(this.open=this.everOpen=!0,this.connectedAt=this.authAt=this.deps.now(),this.authRec=this.ticketRec,this.pingTimer=setInterval(()=>{try{t.send(`ping`)}catch{}},t1),this.emit())},t.onmessage=e=>{if(!(t!==this.ws||typeof e.data!=`string`||!e.data.startsWith(`{`)))try{let t=JSON.parse(e.data);t?.type===`viewers`&&this.setViewers(Number(t.count)||0)}catch{}},t.onclose=()=>{t===this.ws&&this.dropped()}}disconnect(){this.ws=null,this.open=!1,this.pingTimer&&clearInterval(this.pingTimer),this.pingTimer=null,this.setViewers(0)}dropped(){let e=this.open&&this.deps.now()-this.connectedAt>=r1;if(this.disconnect(),this.stopped)return;let t=0;e?this.delay=1e3:(t=this.delay,this.delay=Math.min(this.delay*2,n1)),this.retryTimer=setTimeout(()=>this.connect(),t),this.emit()}setTicket(e,t){this.ticket=e,this.ticketRec=t;let n=this.deps.now();if(t||(this.authRec=!1),!(!this.open||!this.ws)&&!(n-this.authAt<e1&&!(t&&!this.authRec)))try{this.ws.send(JSON.stringify({type:`auth`,token:e})),this.authAt=n,this.authRec=t}catch{}}setViewers(e){if(e!==this.viewerCount){this.viewerCount=e;for(let t of this.viewerFns)t(e);this.emit()}}refuse(e){this.refusal={code:e.code,message:e.detail},this.emit(),this.stop()}status(){return this.refusal?{phase:`refused`,...this.refusal}:this.sid?this.e2ee&&!this.haveKey?{phase:`waiting_approval`}:this.open?{phase:`live`,viewers:this.viewerCount}:this.everOpen?{phase:`reconnecting`}:{phase:`registering`}:{phase:`registering`}}emit(){let e=this.status(),t=JSON.stringify(e);if(t!==this.lastStatus){this.lastStatus=t;for(let t of this.statusFns)t(e)}}},l1={"720p30":{width:1280,height:720,fps:30,kbps:2e3},"1080p30":{width:1920,height:1080,fps:30,kbps:4e3}},u1={width:640,height:360,fps:15,kbps:400},d1=[`avc1.640028`,`avc1.4d0028`,`avc1.42e028`],f1=[`avc1.64001f`,`avc1.4d001f`,`avc1.42e01f`],p1=2,m1=1e3,h1=1e3;async function*g1(e){if(typeof MediaStreamTrackProcessor<`u`){let t=new MediaStreamTrackProcessor({track:e}).readable.getReader();try{for(;;){let{value:e,done:n}=await t.read();if(n)return;yield e}}finally{t.cancel().catch(()=>{})}}let t=document.createElement(`video`);t.muted=!0,t.playsInline=!0,t.srcObject=new MediaStream([e]),await t.play();try{for(;e.readyState===`live`;)await new Promise(e=>t.requestVideoFrameCallback(()=>e())),yield new VideoFrame(t,{timestamp:Math.round(performance.now()*1e3)})}finally{t.pause(),t.srcObject=null}}function _1(){let e=null;return(t,n,r)=>(e??=new OffscreenCanvas(n,r).getContext(`2d`),e.drawImage(t,0,0,n,r),new VideoFrame(e.canvas,{timestamp:t.timestamp}))}var v1=class{encoder=null;codec=``;error=null;unsubscribe=null;lastKey=-1/0;keyPending=!1;resume=!0;lastViewers=0;encoding=!1;dropped=0;seq=0;times=new Map;window=[];sending=Promise.resolve();publisher;preset;keyframeMs;Encoder;now;constructor(e,t,n,r,i){this.publisher=e,this.preset=t,this.keyframeMs=n,this.Encoder=r,this.now=i}async configure(){let{width:e,height:t,fps:n,kbps:r}=this.preset,i=this.publisher.limits.maxBytesPerSec,a=i>0?Math.min(r*1e3,i*8/1.25):r*1e3,o=null;for(let r of t>720?d1:f1){let i={codec:r,width:e,height:t,bitrate:a,framerate:n,avc:{format:`annexb`},latencyMode:`realtime`,bitrateMode:`constant`};if((await this.Encoder.isConfigSupported(i)).supported===!0){o=i;break}}return o?(this.codec=o.codec,this.encoder=new this.Encoder({output:e=>this.onChunk(e),error:e=>{this.error=e.message||String(e),this.closeEncoder()}}),this.encoder.configure(o),this.lastViewers=this.publisher.viewers,this.unsubscribe=this.publisher.onViewers(e=>{e>this.lastViewers&&(this.keyPending=!0),this.lastViewers=e}),!0):!1}ready(){let e=this.encoder;return this.encoding=!!e&&!this.error&&this.publisher.viewers>0,!e||!this.encoding?(this.resume=!0,!1):e.encodeQueueSize>p1?(this.dropped++,!1):!0}encode(e){let t=this.now(),n=t-this.lastKey,r=this.resume||n>=this.keyframeMs||this.keyPending&&n>=m1;r&&(this.lastKey=t,this.keyPending=this.resume=!1);let i=(performance.timeOrigin+e.timestamp/1e3)/1e3;Math.abs(i-Date.now()/1e3)>60&&(i=Date.now()/1e3),this.times.set(e.timestamp,i),this.encoder.encode(e,{keyFrame:r})}onChunk(e){let t=new Uint8Array(e.byteLength);e.copyTo(t);let n=this.times.get(e.timestamp)??Date.now()/1e3;this.times.delete(e.timestamp);let{width:r,height:i}=this.preset,a=VQ({key:e.type===`key`,t:n,seq:this.seq++,width:r,height:i,codec:this.codec,data:t});for(let e of a)this.sending=this.sending.then(()=>this.publisher.send(6,e)).catch(()=>!1);this.window.push({at:this.now(),bytes:t.length})}get queue(){return this.encoder?.state===`configured`?this.encoder.encodeQueueSize:0}stats(){let e=this.now();for(;this.window.length&&e-this.window[0].at>=h1;)this.window.shift();let t=this.window.reduce((e,t)=>e+t.bytes,0);return{fps:this.window.length,kbps:t*8/1e3,viewers:this.publisher.viewers,encoding:this.encoding}}stop(){this.encoding=!1,this.closeEncoder(),this.unsubscribe?.(),this.unsubscribe=null}closeEncoder(){this.encoder&&this.encoder.state!==`closed`&&this.encoder.close()}},y1=class{high;lowOpt;low=null;lowAt=-1/0;keyframeMs;Encoder;now;frames;scale;stopped=!1;statsFns=new Set;lastStats=-1/0;constructor(e,t,n={}){this.keyframeMs=(t.keyframeS??2)*1e3,this.Encoder=n.VideoEncoder??VideoEncoder,this.now=n.now??Date.now,this.frames=n.frames??g1,this.scale=n.scale??_1(),this.high=new v1(e,t.preset,this.keyframeMs,this.Encoder,this.now),this.lowOpt=t.low?{publisher:t.low.publisher,preset:t.low.preset??u1}:null}async start(e){if(!await this.high.configure())throw new OE(`camera_codec_unsupported`);if(this.lowOpt){let e=new v1(this.lowOpt.publisher,this.lowOpt.preset,this.keyframeMs,this.Encoder,this.now);await e.configure()&&(this.low=e)}this.loop(e)}async loop(e){for await(let t of this.frames(e)){if(this.stopped){t.close();break}try{this.onFrame(t)}finally{t.close()}this.emitStats()}}onFrame(e){this.high.ready()&&this.high.encode(e);let t=this.low;if(!t)return;let n=this.now();if(n-this.lowAt<750/t.preset.fps||!t.ready())return;this.lowAt=n;let r=this.scale(e,t.preset.width,t.preset.height);try{t.encode(r)}finally{r.close()}}stats(){return{...this.high.stats(),dropped:this.high.dropped,queue:this.high.queue,error:this.high.error,low:this.low?this.low.stats():null}}onStats(e){return this.statsFns.add(e),()=>{this.statsFns.delete(e)}}emitStats(){let e=this.now();if(e-this.lastStats<h1||!this.statsFns.size)return;this.lastStats=e;let t=this.stats();for(let e of this.statsFns)e(t)}stop(){this.stopped=!0,this.high.stop(),this.low?.stop()}},b1=class{#e;constructor(e){this.#e=e}head(){let e=this.#e;return`${e.map(e=>JQ(e.name)).join(`,`)}\n${e.map(e=>JQ(e.unit)).join(`,`)}\n`}append(e){let t=e.columns,n=``;for(let r=0;r<e.length;r++){for(let e=0;e<t.length;e++){let i=t[e][r];n+=(e?`,`:``)+(Number.isNaN(i)?``:String(i))}n+=`
|
|
617
|
-
`}return n}end(){}},x1=new TextEncoder,S1=e=>e+7&-8,C1=104,w1=64,T1=104,E1=160,D1=4;function O1(e,t,n){let r=24+t.length*8+n.length,i=new Uint8Array(S1(r)),a=new DataView(i.buffer);return i.set(x1.encode(e),0),a.setBigUint64(8,BigInt(r),!0),a.setBigUint64(16,BigInt(t.length),!0),t.forEach((e,t)=>a.setBigUint64(24+t*8,BigInt(e),!0)),i.set(n,24+t.length*8),i}var k1=(e,t)=>O1(e,[],x1.encode(`${t}\0`)),A1=e=>BigInt(Math.round(e))*1000000n,j1=class{#e;#t;#n;#r=0;constructor(e,t,n){this.#e=e,this.#t=t?Date.parse(t):Date.now(),this.#n=n}append(e){let t=e.columns,n=t.length,r=new Float64Array(e.length*n);for(let i=0;i<e.length;i++)for(let e=0;e<n;e++)r[i*n+e]=t[e][i];return this.#r+=e.length,new Uint8Array(r.buffer)}end(){if(this.#r!==this.#n)throw Error(`The recording changed while it was exported (${this.#r} of ${this.#n} rows).`)}head(){let e=this.#e.length,t=[],n=64+C1,r=e=>{let r=n;return t.push(e),n+=e.length,r},i=r(k1(`##MD`,`<FHcomment><TX>Kymoscope cloud recording</TX><tool_id>Kymoscope</tool_id><tool_vendor>Kymoscope</tool_vendor><tool_version>1</tool_version></FHcomment>`)),a=new Uint8Array(16);new DataView(a.buffer).setBigUint64(0,A1(this.#t),!0);let o=r(O1(`##FH`,[0,i],a)),s=this.#e.map(e=>r(k1(`##TX`,e.name))),c=this.#e.map(e=>e.unit?r(k1(`##TX`,e.unit)):0),l=n,u=l+w1,d=this.#e.map((e,t)=>u+T1+t*E1),f=O1(`##DG`,[0,u,u+T1+e*E1,0],new Uint8Array(8)),p=new Uint8Array(32),m=new DataView(p.buffer);m.setBigUint64(8,BigInt(this.#n),!0),m.setUint32(24,e*8,!0);let h=O1(`##CG`,[0,d[0],0,0,0,0],p),g=this.#e.map((t,n)=>{let r=new Uint8Array(72),i=new DataView(r.buffer);return i.setUint8(0,n===0?2:0),i.setUint8(1,+(n===0)),i.setUint8(2,D1),i.setUint32(4,n*8,!0),i.setUint32(8,64,!0),i.setUint8(20,255),O1(`##CN`,[n+1<e?d[n+1]:0,0,s[n],0,0,0,c[n],0],r)}),_=new Uint8Array(24);_.set(x1.encode(`##DT`),0),new DataView(_.buffer).setBigUint64(8,BigInt(24+this.#n*e*8),!0);let v=new Uint8Array(64);v.set(x1.encode(`MDF 4.10 Kymoscop`),0),new DataView(v.buffer).setUint16(28,410,!0);let y=new Uint8Array(32);new DataView(y.buffer).setBigUint64(0,A1(this.#t),!0);let b=[v,O1(`##HD`,[l,o,0,0,0,0],y),...t,f,h,...g,_],x=new Uint8Array(b.reduce((e,t)=>e+t.length,0));return b.reduce((e,t)=>(x.set(t,e),e+t.length),0),x}},M1={csv:`text/csv`,mf4:`application/octet-stream`,parquet:`application/vnd.apache.parquet`};async function N1(e,t,n,r={}){let i=lz(`krc`,{main:new File(e.chunks,`${e.name}.krc`),companions:[],keys:e.keys},r.signal,r.createWorker);try{let e=await i.plan(),a=[{group:0,channels:e.groups[0].channels.map((e,t)=>t)}],o=t===`csv`?new b1(ZR(e,a)):new j1(ZR(e,a),e.startTime,e.groups[0].samples);await n(o.head()),await i.read(a,`stream`,{chunk:async e=>{await n(o.append(e))},progress:r.onProgress}),o.end()}finally{i.close()}}async function P1(e,t,n={}){let r=[];return await N1(e,t,e=>{r.push(e)},n),new Blob(r,{type:M1[t]})}var F1=(e,t)=>`khd1|${e.stream}|${e.day}|${e.kind}|${e.level}|${t}`;function I1(e){if(e.length<9)throw Error(`Not a Kymoscope day file (too short)`);let t=e.subarray(e.length-9);if(String.fromCharCode(t[5],t[6],t[7],t[8])!==`KHD1`)throw Error(`Not a Kymoscope day file`);if(t[4]!==1)throw Error(`Unknown Kymoscope day file format ${t[4]}`);return new DataView(t.buffer,t.byteOffset,4).getUint32(0,!0)}var L1=new TextEncoder;async function R1(e,t,n,r){let i=await crypto.subtle.decrypt({name:`AES-GCM`,iv:t.subarray(0,12),additionalData:L1.encode(F1(n,r))},e,t.subarray(12));return new Uint8Array(i)}async function z1(e,t,n){let r=JSON.parse(new TextDecoder().decode(le(await R1(e,t,n,`footer`))));if(r.format!==1||r.stream!==n.stream||r.day!==n.day||r.kind!==n.kind||r.level!==n.level)throw Error(`This day file belongs to another history or day`);return r}var B1=0;async function V1(e,t){let n=await RL(),r=e.map(()=>`khd_${++B1}.parquet`),i=[];try{for(let t=0;t<e.length;t++)await n.registerFileBuffer(r[t],e[t]),i.push(r[t]);let a=await n.connect();try{return await t(r,e=>a.query(e))}finally{await a.close()}}finally{for(let e of i)await n.dropFile(e).catch(()=>void 0)}}var H1=(e,t)=>e.getChild(t).toArray();function U1(){V1([],async(e,t)=>{await t(`COPY (SELECT 1::BIGINT AS t) TO 'khd_warm.parquet' (FORMAT parquet)`),await t(`SELECT t FROM read_parquet('khd_warm.parquet')`)}).catch(()=>void 0)}async function W1(e,t){return V1([e],async([e],n)=>{let r=await n(`SELECT (t::DOUBLE / 1e6) AS t${t.map(e=>`, coalesce("c${e}", 'NaN'::FLOAT) AS "c${e}"`).join(``)} FROM read_parquet('${e}') ORDER BY t`);return{t:Float64Array.from(H1(r,`t`)),cols:t.map(e=>Float32Array.from(H1(r,`c${e}`)))}})}async function G1(e){return e.some(e=>e.channels.length)?V1(e.map(e=>e.bytes),async(t,n)=>{let r=await n(`SELECT k, (t::DOUBLE / 1e6) AS t, ch, "min", "max" FROM (${t.flatMap((t,n)=>e[n].channels.length?[`SELECT ${n} AS k, t, ch, "min", "max" FROM read_parquet('${t}') WHERE ch IN (${e[n].channels.join(`,`)})`]:[]).join(` UNION ALL `)}) ORDER BY k, ch, t`),i=H1(r,`k`),a=H1(r,`t`),o=H1(r,`ch`),s=H1(r,`min`),c=H1(r,`max`),l=[];for(let t=0,n=0;t<e.length;t++){let e=n;for(;e<i.length&&i[e]===t;)e++;l.push({t:Float64Array.from({length:e-n},(e,t)=>a[n+t]),ch:Int32Array.from({length:e-n},(e,t)=>o[n+t]),min:Float32Array.from({length:e-n},(e,t)=>s[n+t]),max:Float32Array.from({length:e-n},(e,t)=>c[n+t])}),n=e}return l}):e.map(()=>({t:new Float64Array,ch:new Int32Array,min:new Float32Array,max:new Float32Array}))}var K1=2*1024**3;async function q1(){try{return await(await navigator.storage.getDirectory()).getDirectoryHandle(`kymoscope-history`,{create:!0})}catch{return null}}async function J1(){try{let e=(await navigator.storage.estimate()).quota??0;return e>0?Math.min(K1,e*.2):K1}catch{return K1}}function Y1(e=q1,t=J1){let n=null,r=null,i=0,a=()=>n??=e().catch(()=>null),o=e=>e.replace(/[^A-Za-z0-9._-]/g,`_`),s=()=>r??=(async()=>{let e=new Map,t=await a();if(i=0,t)for await(let[n,r]of t.entries()){if(r.kind!==`file`||!r.getFile)continue;let t=await r.getFile();e.set(n,{size:t.size,at:t.lastModified}),i+=t.size}return e})().catch(e=>{throw r=null,e});return{async get(e){try{let t=await a();return t?new Uint8Array(await(await(await t.getFileHandle(o(e))).getFile()).arrayBuffer()):null}catch{return null}},async put(e,n){try{let r=await a();if(!r)return;let c=await s(),l=o(e),u=await(await r.getFileHandle(l,{create:!0})).createWritable();try{await u.write(n),await u.close()}catch(e){throw await u.abort?.().catch(()=>void 0),e}i+=n.length-(c.get(l)?.size??0),c.set(l,{size:n.length,at:Date.now()});let d=await t();if(i<=d)return;for(let[e,t]of[...c].sort((e,t)=>e[1].at-t[1].at)){if(i<=d*.9)break;try{await r.removeEntry(e)}catch{continue}c.delete(e),i-=t.size}}catch{}}}}var X1=16,Z1=2e3,Q1=512*1024,$1=64*1024,e0=64*1024,t0=8*1024*1024;function n0(e,t=Z1){for(let n of[3600,60])if(e/n>=t/2)return n;return 0}var r0={0:[0,60,3600],60:[60,3600,0],3600:[3600,60,0]};function i0(e,t){let n=new Map;for(let t of e)n.set(t.day,[...n.get(t.day)??[],t]);let r=[];for(let[,e]of[...n].sort((e,t)=>e[0].localeCompare(t[0]))){let n=r0[t].map(t=>e.find(e=>e.level===t)).find(Boolean);n&&r.push(n)}return r}async function a0(e,t,n){let r=Array(e.length),i=0;return await Promise.all(Array.from({length:Math.min(t,e.length)},async()=>{for(;i<e.length;){let t=i++;r[t]=await n(e[t])}})),r}function o0(e){let t=[];for(let n of[...e].sort((e,t)=>e.off-t.off)){let e=t[t.length-1];e&&n.off-e.end<=e0&&n.off+n.len-e.start<=t0?e.end=Math.max(e.end,n.off+n.len):t.push({start:n.off,end:n.off+n.len})}return t}var s0=(e,t)=>({stream:e.historyStreamId,day:t.day,kind:t.kind,level:t.level}),c0=(e,t)=>async(n,r,i)=>{let a=t.get(n.id);return a?a.subarray(r,i):(e.signal?.throwIfAborted(),e.fetchRange(n.id,r,i,e.signal))};async function l0(e,t,n=new Map){let r=e.footers?.get(t.id);if(r)return r;let i=await e.cache?.get(`${t.id}/footer`)??null;if(!i){t.bytes<=Q1&&n.set(t.id,await e.fetchRange(t.id,0,t.bytes,e.signal));let r=c0(e,n),a=await r(t,Math.max(0,t.bytes-$1),t.bytes),o=I1(a);i=o+9<=a.length?a.slice(a.length-9-o,a.length-9):(await r(t,t.bytes-9-o,t.bytes-9)).slice(),await e.cache?.put(`${t.id}/footer`,i)}let a=await z1(await e.key(t.keyId),i,s0(e,t));return e.footers?.set(t.id,a),a}var u0=e=>e?.code===`missing`;async function d0(e){let t=async()=>{let t=i0(e.segments,e.level).map(e=>e.id).join(),n=await e.relist();return i0(n,e.level).map(e=>e.id).join()===t?null:n},n,r;try{n=await f0(e)}catch(n){if(!e.relist||e.signal?.aborted||!(r=await t()))throw n;return f0({...e,segments:r})}return!n.missingDays.length||!e.relist||e.signal?.aborted||!(r=await t())?n:f0({...e,segments:r})}async function f0(e){let t=i0(e.segments,e.level),n=new Set(e.channels),r=new Map,i=c0(e,r),a=new Set,o=async(t,n)=>{try{return await n()}catch(n){if(e.onMissing!==`gap`||!u0(n))throw n;return a.add(t.id),null}},s=await a0(t,16,t=>o(t,()=>l0(e,t,r))),c={},l={},u=[];t.forEach((t,r)=>{let i=s[r];if(i){l[t.day]=t.level;for(let e of i.channels)n.has(e.n)&&e.u&&!c[e.n]&&(c[e.n]=e.u);i.blocks.forEach((r,a)=>{if(r.t1<e.t0||r.t0>e.t1)return;let o=r.ch.filter(e=>n.has(i.channels[e].n));o.length&&u.push({s:t,f:i,i:a,chs:o})})}});let d=new Map;await a0(u,16,async t=>{let n=await e.cache?.get(`${t.s.id}/${t.i}`);n&&d.set(t,n)});let f=new Map;for(let e of u)d.has(e)||f.set(e.s.id,[...f.get(e.s.id)??[],e]);await a0([...f.values()].flatMap(e=>o0(e.map(e=>e.f.blocks[e.i])).map(t=>({js:e,r:t}))),16,async({js:t,r:n})=>{let r=await o(t[0].s,()=>i(t[0].s,n.start,n.end));if(r)for(let i of t){let t=i.f.blocks[i.i];if(t.off<n.start||t.off+t.len>n.end)continue;let a=r.slice(t.off-n.start,t.off-n.start+t.len);d.set(i,a),e.cacheWrite!==!1&&await e.cache?.put(`${i.s.id}/${i.i}`,a)}});let p=[],m=[];return await a0(u.filter(e=>!a.has(e.s.id)),16,async t=>{let n=await R1(await e.key(t.s.keyId),d.get(t),s0(e,t.s),t.i);if(t.s.kind===`rollup`){m.push({j:t,plain:n});return}let r=await W1(n,t.chs),i=new Map(t.chs.map((e,n)=>[t.f.channels[e].n,r.cols[n]])),a=oQ({t:r.t,lo:i,hi:i,level:0},e.t0,e.t1);a&&p.push(a)}),(await G1(m.map(e=>({bytes:e.plain,channels:e.j.chs})))).forEach((t,n)=>{let{j:r}=m[n],i=r.s.level/2;for(let n=0;n<t.ch.length;){let a=n;for(;a<t.ch.length&&t.ch[a]===t.ch[n];)a++;let o=r.f.channels[t.ch[n]].n,s=oQ({t:t.t.slice(n,a).map(e=>e+i),lo:new Map([[o,t.min.slice(n,a)]]),hi:new Map([[o,t.max.slice(n,a)]]),level:r.s.level},e.t0,e.t1);s&&p.push(s),n=a}}),{pieces:p.sort((e,t)=>e.t[0]-t.t[0]),units:c,levels:l,missingDays:t.filter(e=>a.has(e.id)).map(e=>e.day)}}var p0=25e6,m0=3e7,h0=1<<20,g0=8192,_0=65536;function v0(e){for(let t=1;t<10;t++){let n=+e.toPrecision(t);if(Math.fround(n)===e)return String(n)}return String(e)}function y0(e){let t=Math.round(e*1e6),n=Math.floor(t/1e6);return`${new Date(n*1e3).toISOString().slice(0,19)}.${String(t-n*1e6).padStart(6,`0`)}Z`}function b0(e,t){let n=e.filter(e=>t.some(t=>e.lo.has(t))).map(e=>e.t),r=new Float64Array(n.reduce((e,t)=>e+t.length,0)),i=0;for(let e of n)r.set(e,i),i+=e.length;r.sort();let a=0;for(let e=0;e<r.length;e++)(a===0||r[e]!==r[a-1])&&(r[a++]=r[e]);let o=r.slice(0,a);if(o.length*t.length>25e6)throw Error(`too_wide`);let s=t.map(()=>new Float32Array(o.length).fill(NaN));for(let n of e)t.forEach((e,t)=>{let r=n.lo.get(e);if(r){for(let e=0,i=iQ(o,n.t[0]);e<n.t.length;e++)if(r[e]===r[e]){for(;o[i]<n.t[e];)i++;s[t][i]=r[e]}}});return{t:o,cols:s}}async function x0(e,t,n,r={}){if(!e.channels.length)throw Error(`Pick at least one channel to export.`);let i=[...new Set(e.segments.map(e=>e.day))].sort(),a=i.map(t=>e.segments.find(e=>e.day===t&&e.kind===`raw`)).filter(e=>!!e),o=i.filter(e=>!a.some(t=>t.day===e)),s=new Set,c=()=>({skippedDays:[...o,...s].sort(),missingDays:[...s].sort()}),l=async t=>{let n=await d0({...e,segments:[t],level:0,cacheWrite:!1,relist:e.relist&&(async()=>(await e.relist()).filter(e=>e.day===t.day&&e.kind===`raw`))});for(let e of n.missingDays)s.add(e);return n},u=e=>r.onProgress?.((e+1)/a.length);if(t===`parquet`)return await C0(a,l,e.channels,n,u),c();if(t===`csv`){let t=!1;for(let[r,i]of a.entries()){let a=await l(i);!t&&!a.missingDays.length&&(await n(`time,${e.channels.map(JQ).join(`,`)}\nUTC,${e.channels.map(e=>JQ(a.units[e]??``)).join(`,`)}\n`),t=!0);let o=b0(a.pieces,e.channels);for(let e=0;e<o.t.length;e+=g0){let t=``;for(let n=e;n<Math.min(o.t.length,e+g0);n++){t+=y0(o.t[n]);for(let e of o.cols)t+=e[n]===e[n]?`,${v0(e[n])}`:`,`;t+=`
|
|
618
|
-
`}await n(t)}u(r)}return t||await n(`time,${e.channels.map(JQ).join(`,`)}\n`),c()}let d=0,f=NaN,p={};for(let t of a){let n=await l(t),r=
|
|
619
|
-
ORDER BY v.time, n.channel) TO '${d}' (FORMAT parquet, COMPRESSION zstd)`),await r(await o.copyFileToBuffer(d))}finally{await s.query(`DROP TABLE IF EXISTS ${l}; DROP TABLE IF EXISTS ${u}`).catch(()=>void 0),await s.close(),await o.dropFile(d).catch(()=>void 0)}}export{aZ as ANNOTATION_CONTROLS_ATTR,Ot as ANNOTATION_KINDS,a$ as AxisState,hB as BEACON_STATS,
|
|
616
|
+
`}n.push(i)}return n}};function JQ(e){let t=/^[=+\-@\t\r]/.test(e)?`'${e}`:e;return/[",\n\r]/.test(t)?`"${t.replace(/"/g,`""`)}"`:t}var YQ=512,XQ=new WeakMap;function ZQ(e,t,n){let r=XQ.get(e);r||XQ.set(e,r=new Map);let i=r.get(t),a={start:n,values:[]};return{carry:{start:e=>{let t=i?.values[e];if(!i||!t)return 0;for(let e=Math.min(n-i.start,t.length-1);e>=0;e--){let n=t[e];if(n!==null&&Number.isFinite(n))return n}return 0},done:(e,t)=>{a.values[e]=t}},keep:()=>{r.set(t,a)}}}function QQ(e,t,n){let r=e.endAbs,i=Math.max(n,e.firstAbs);if(i>=r||t.length===0)return;let a=new Set(e.columnNames);for(let n of t){if(!n.enabled)continue;let o=$T(n.formula);if(!o.ok)continue;let{identifiers:s,functions:c}=eE(o.node);if(!s.every(e=>a.has(e)))continue;let l=c.some(e=>ZT.includes(e)),u=Math.max(e.firstAbs,i-(l?YQ:0)),d=new Map([qe,...s].map(t=>[t,e.range(t,u,r)])),{carry:f,keep:p}=ZQ(e,`${n.id}|${n.formula}`,u),m=oE(n,e=>d.get(e),qe,r-u,t,f);m.status===`ok`&&(e.writeComputed(n.name,n.units,i,m.values.subarray(i-u)),p())}}function $Q(e,t){e.clearComputed(),XQ.delete(e),QQ(e,t,e.firstAbs)}var e$=8e3,t$=131072;function n$(e,t={}){switch(e.kind){case`elapsed`:return{name:`Elapsed`,unit:`s`};case`event`:return{name:`Since ${e.channel} ${e.op} ${e.value}`,unit:`s`};case`clock`:return{name:`Time of day`,unit:`s`};default:{let n=t[e.channel]??``;return e.integral?{name:`∫${e.channel}`,unit:n?`${n}·s`:`s`}:{name:`${e.channel} since start`,unit:n}}}}var r$=new Map;function i$(e,t){let n=`${t}|${Math.floor(e/900)}`,r=r$.get(n);r===void 0&&(r=lB(e,t),r$.size>1e4&&r$.clear(),r$.set(n,r));let i=(e+r)%86400;return i<0?i+86400:i}var a$=class{axis;#e=NaN;#t=NaN;#n=NaN;#r=0;#i=NaN;#a=NaN;constructor(e){this.axis=e}begin(e){this.#e=e,this.#t=NaN,this.#n=NaN,this.#r=0,this.#i=NaN,this.#a=NaN}x(e,t){let n=this.axis;return n.kind===`clock`?i$(e,n.tz):n.kind===`elapsed`?e-this.#e:e<this.#e?NaN:n.kind===`event`?(this.#t!==this.#t&&t===t&&rB(n.op,t,n.value)&&(this.#t=e),e-this.#t):n.integral?(t===t&&(this.#i===this.#i&&(this.#r+=(t+this.#i)/2*(e-this.#a)),this.#i=t,this.#a=e),this.#i===this.#i?this.#r:NaN):(t===t&&(this.#n!==this.#n&&(this.#n=t),this.#i=t),this.#i===this.#i?this.#i-this.#n:NaN)}};function o$(e,t,n,r){let i=`channel`in r?t.get(r.channel):void 0;if(r.kind===`event`){let a=NaN;for(let t=0;t<e.length&&a!==a;t++){let o=i?i[t]:NaN;e[t]>=n&&o===o&&rB(r.op,o,r.value)&&(a=e[t])}return{x:e.map(e=>e-a),t:e,cols:t}}let a=new a$(r);a.begin(n);let o=new Float64Array(e.length);for(let t=0;t<e.length;t++)o[t]=a.x(e[t],i?i[t]:NaN);return{x:o,t:e,cols:t}}function s$(e,t,n){let r=[];for(let n=0;n<e.length;n++)e[n]===e[n]&&t[n]===t[n]&&r.push(n);let i=!0;for(let t=1;t<r.length&&i;t++)i=e[r[t-1]]<=e[r[t]];i||r.sort((t,n)=>e[t]-e[n]);let a=r.length,o=new Float64Array(n.length).fill(NaN);if(a<2)return o;let s=Float64Array.from(r,t=>e[t]),c=Float64Array.from(r,e=>t[e]),l=Float64Array.from({length:a-1},(e,t)=>s[t+1]-s[t]).sort(),u=l[l.length>>1],d=u>0?4*u:1/0,f=0;for(let e=0;e<n.length;e++){let t=n[e];if(!(t>=s[0]&&t<=s[a-1]))continue;for(;f<a-2&&s[f+1]<t;)f++;let r=s[f],i=s[f+1];i-r>d||(o[e]=i===r?c[f]:c[f]+(c[f+1]-c[f])*(t-r)/(i-r))}return o}function c$(e,t,n){let r=e.length;if(r===0||!(n>=e[0]&&n<=e[r-1]))return NaN;if(r===1)return t[0];let i=(n-e[0])/(e[r-1]-e[0])*(r-1),a=Math.min(r-2,Math.floor(i));return t[a]+(t[a+1]-t[a])*(i-a)}function l$(e,t,n){let r=Math.max(2,Math.min(e$,Math.floor(n)));if(r*t.length>131072)throw Error(`too_many_cells`);let i=1/0,a=-1/0;for(let t of e)for(let e of t.x)e===e&&(e<i&&(i=e),e>a&&(a=e));if(!(a>i))throw Error(`empty`);let o=Float64Array.from({length:r},(e,t)=>i+t*(a-i)/(r-1)),s=new Map;for(let n of t){let t=new Uint16Array(r),i=new Float64Array(r),a=new Float64Array(r),c=new Float32Array(r).fill(1/0),l=new Float32Array(r).fill(-1/0);for(let s of e){let e=s.cols.get(n);if(!e)continue;let u=s$(s.x,e,o);for(let e=0;e<r;e++){let n=u[e];if(n!==n)continue;let r=++t[e],o=n-i[e];i[e]+=o/r,a[e]+=o*(n-i[e]),n<c[e]&&(c[e]=n),n>l[e]&&(l[e]=n)}}let u={mean:new Float32Array(r),sd:new Float32Array(r),min:c,max:l,n:t};for(let e=0;e<r;e++){if(t[e]===0){u.mean[e]=u.sd[e]=u.min[e]=u.max[e]=NaN;continue}u.mean[e]=i[e],u.sd[e]=t[e]>1?Math.sqrt(a[e]/(t[e]-1)):0}s.set(n,u)}return{x:o,channels:s}}function u$(e,t){if(e.unit===`abs`)return e.tolerance;let n=1/0,r=-1/0;for(let e of t.mean)e===e&&(e<n&&(n=e),e>r&&(r=e));return r>=n?Math.max(r-n,Math.abs(r),Math.abs(n))*e.tolerance/100:0}var d$=new WeakMap;function f$(e){let t=d$.get(e);if(t)return t;let n=e.sd.length,r=Math.max(2,Math.round(n/100));t=new Float32Array(n).fill(NaN);for(let i=0;i<n;i++){if(e.n[i]<2)continue;let a=0,o=0;for(let t=Math.max(0,i-r);t<=Math.min(n-1,i+r);t++)e.n[t]>=2&&e.sd[t]===e.sd[t]&&(a+=e.sd[t]**2,o++);t[i]=o?Math.sqrt(a/o):NaN}return d$.set(e,t),t}function p$(e,t,n){if(n===`minmax`)return{lo:e.min,hi:e.max};if(n===`sigma`){let n=f$(e);return{lo:e.mean.map((e,r)=>e-t*n[r]),hi:e.mean.map((e,r)=>e+t*n[r])}}let r=u$(n,e);return{lo:e.mean.map(e=>e-r),hi:e.mean.map(e=>e+r)}}function m$(e,t,n,r=`sigma`,i=0){let a=typeof r==`function`?r:()=>({band:r,k:n}),o=[...t.channels.keys()],s=new Map,c=new Map,l=[],u=new Uint8Array(e.t.length),d=o.map(()=>new Uint8Array(e.t.length)),f=t.x.length;o.forEach((n,r)=>{let i=t.channels.get(n),o=e.cols.get(n);if(!o)return;let{band:p,k:m}=a(n),h=typeof p==`object`?p:null,{lo:g,hi:_}=p$(i,m,p),v=0,y=0,b=0;for(let e of i.mean)if(e===e){v++;let t=e-y;y+=t/v,b+=t*(e-y)}let x=v>1?Math.max(Math.sqrt(b/(v-1)),1e-9):1e-9,S=h?Math.max(u$(h,i),1e-9):0,C=f$(i),w=new Float64Array(e.t.length).fill(NaN),T=new Float64Array(e.t.length).fill(NaN),E=0,D=0;for(let n=0;n<e.t.length;n++){let a=o[n],s=e.x[n];if(a!==a||s!==s)continue;let c=c$(t.x,i.mean,s);if(c!==c)continue;w[n]=a-c;let l=Math.round((s-t.x[0])/(t.x[f-1]-t.x[0])*(f-1));T[n]=Math.abs(a-c)/(h?S:i.n[l]>=2&&C[l]===C[l]?Math.max(C[l],1e-9):x),E+=T[n],D++,(h||i.n[l]>=2)&&(a<c$(t.x,g,s)||a>c$(t.x,_,s))&&(u[n]=1,d[r][n]=1)}s.set(n,w),c.set(n,T),l.push({channel:n,z:D?E/D:0})}),l.sort((e,t)=>t.z-e.z);let p=[];for(let t=0;t<u.length;t++){if(!u[t])continue;let n=t;for(;n<u.length&&u[n];)n++;let r=p[p.length-1];r&&e.t[t]-e.t[Math.min(r[1],u.length-1)]<i?r[1]=n:p.push([t,n]),t=n}let m=[];for(let[t,n]of p){let r=e.t[t],a=e.t[Math.min(n,u.length-1)];a-r>=i&&m.push({t0:r,t1:a,channels:o.filter((e,r)=>d[r].subarray(t,n).includes(1))})}return{delta:s,score:l,deviations:m,z:c}}function h$(e,t){let n=e.x.length,r=t.length,i=new DataView(new ArrayBuffer(12+8*n+r*n*18));[75,82,66,49].forEach((e,t)=>i.setUint8(t,e)),i.setUint32(4,n,!0),i.setUint32(8,r,!0);let a=12;for(let t=0;t<n;t++,a+=8)i.setFloat64(a,e.x[t],!0);for(let r of t){let t=e.channels.get(r);if(!t)throw Error(`The reference has no channel ${r}`);for(let e of[t.mean,t.sd,t.min,t.max])for(let t=0;t<n;t++,a+=4)i.setFloat32(a,e[t],!0);for(let e=0;e<n;e++,a+=2)i.setUint16(a,t.n[e],!0)}return De(new Uint8Array(i.buffer))}function g$(e,t){let n=le(e),r=new DataView(n.buffer,n.byteOffset,n.byteLength);if(n.length<12||String.fromCharCode(n[0],n[1],n[2],n[3])!==`KRB1`)throw Error(`Not a reference band`);let i=r.getUint32(4,!0),a=r.getUint32(8,!0);if(a!==t.length||n.length!==12+8*i+a*i*18)throw Error(`This reference band does not match its channels`);let o=12,s=new Float64Array(i);for(let e=0;e<i;e++,o+=8)s[e]=r.getFloat64(o,!0);let c=new Map;for(let e of t){let t=()=>{let e=new Float32Array(i);for(let t=0;t<i;t++,o+=4)e[t]=r.getFloat32(o,!0);return e},n=t(),a=t(),s=t(),l=t(),u=new Uint16Array(i);for(let e=0;e<i;e++,o+=2)u[e]=r.getUint16(o,!0);c.set(e,{mean:n,sd:a,min:s,max:l,n:u})}return{x:s,channels:c}}var _$=` Δ`,v$=class{#e;constructor(e){this.#e=new kB(e)}assumeOpen(e){}feed(e,t,n){let r=[];for(let i=0;i<e.length;i++)this.#e.step(e[i],e=>{let n=t(e);return n?n[i]:NaN},r),n?.(i,this.#e.open()?.tstart??null);return r.map(e=>({tstart:e.tstart,tend:e.tend,kpis:{duration:(e.tend??e.tstart)-e.tstart},...e.flags.length?{flags:e.flags}:{}}))}};function y$(e){if(!e.cycle&&!e.rule)throw Error(`a live segment axis needs a rule or a cycle rule`);let t=e.cycle?new v$(e.cycle):new mB(e.rule,e.kpis??[]),n=new a$(e.axis),r=NaN;e.start!=null&&(t.assumeOpen(e.start),n.begin(e.start),r=e.start);let i=e.reference??null,a=i?[...i.channels]:[],o=i?i.grid.length:0,s=`channel`in e.axis?e.axis.channel:null,c=[...new Set([...e.cycle?OB(e.cycle):nB(e.rule),...(e.kpis??[]).map(e=>e.channel),...s?[s]:[],...a.map(([e])=>e)])],l=e.minDeviationS??5,u=NaN,d=NaN,f=NaN,p=new Set,m=!1,h=e=>{m&&e({type:`deviation-end`,t0:u,t1:d,channels:[...p]}),u=d=f=NaN,p=new Set,m=!1};return{feed(g,_,v=!1){let y=Math.max(_,g.firstAbs),b=g.endAbs;if(y>=b)return;let x=t=>{v||e.onEvent?.(t)},S=g.range(qe,y,b),C=new Map(c.map(e=>[e,g.range(e,y,b)])),w=new Float64Array(S.length).fill(NaN),T=a.map(([e,t])=>({name:e,b:t,v:C.get(e),d:new Float64Array(S.length).fill(NaN)})),E=s?C.get(s):null,D=t.feed(S,e=>C.get(e),(e,t)=>{if(t===null)return;t!==r&&(h(x),r=t,n.begin(t),x({type:`open`,tstart:t}));let a=n.x(S[e],E?E[e]:NaN);if(w[e]=a,!i||a!==a)return;let s=o>1?Math.round((a-i.grid[0])/(i.grid[o-1]-i.grid[0])*(o-1)):0,c=!1;for(let t of T){let n=t.v[e],r=c$(i.grid,t.b.mean,a);n!==n||r!==r||(t.d[e]=n-r,t.b.n[s]>=2&&(n<c$(i.grid,t.b.lo,a)||n>c$(i.grid,t.b.hi,a))&&(c=!0,p.add(t.name)))}c?(u!==u&&(u=S[e]),d=S[e],f=NaN,!m&&S[e]-u>=l&&(m=!0,x({type:`deviation`,t0:u,channels:[...p]}))):u===u&&(f!==f&&(f=S[e]),S[e]-f>=l&&h(x))});for(let e of D)x({type:`close`,segment:e});g.writeComputed(e.column,e.unit,y,w);for(let e of T)g.writeComputed(`${e.name} Δ`,g.unitOf(e.name),y,e.d)}}}var b$=1e7,x$=512,S$=400,C$=4e3,w$=1e3,T$=3e3,E$=2,D$=5e3,O$=1e4;function k$(e,t,n=`data`){let r=new Xe(t.capacity??b$,void 0,void 0,(t.maxMemoryMB??x$)*1024*1024);return{meta:e,buffer:r,source:new UQ(()=>r),unsub:()=>{},status:`connecting`,error:null,lastFrameAt:Date.now(),lastColCount:0,lastValued:0,recorder:null,schemas:new Map,video:n===`camera`?new DE:null,clock:n===`camera`?null:new HQ,lagTicks:0,lastRejoinAt:0,rejoin:()=>{},subscribed:!1,releaseTimer:void 0}}function A$(e,t,n=()=>({}),r){let i=new Map,a=e,o=[],s=[],c=``,l=()=>{let e=[];for(let t of i.values())t.lastColCount=t.buffer.columnNames.length,t.lastValued=t.buffer.valuedCount,e.push({...t.meta,kind:t.video?`camera`:`data`,video:t.video,clock:t.clock,dataset:t.buffer.toDataset(S$),source:t.source,rowCount:t.buffer.size,status:t.status,error:t.error,recordingSince:t.recorder?.startedAt??null});o=e,t(o)},u=(e,t)=>{let n=!1,r=e.buffer.endAbs;for(let r of t)r&&typeof r.t==`number`&&Array.isArray(r.signals)&&(e.buffer.push(r),e.recorder?.add(r),n=!0);n&&p(e,r,t[t.length-1]?.t)},d=(e,t)=>{let n=e.buffer.endAbs;e.buffer.pushColumns(t),e.recorder?.addColumns(t),t.t.length>0&&p(e,n,t.t[t.t.length-1])},p=(e,t,n)=>{QQ(e.buffer,s,t),e.segAxis?.tracker.feed(e.buffer,t),r?.rows(e.meta.id,e.buffer,t),typeof n==`number`&&e.clock?.observe(n,Date.now()/1e3),m(e,t===0||e.buffer.columnNames.length!==e.lastColCount||e.buffer.valuedCount!==e.lastValued)},m=(e,t)=>{e.lastFrameAt=Date.now();let n=e.status===`stale`||e.status===`connecting`;n&&(e.status=`live`),(n||t)&&l()},h=e=>{let t=i.get(e);t&&(clearTimeout(t.releaseTimer),t.unsub(),i.delete(e),l())},g=setInterval(()=>{let e=Date.now(),t=!1;for(let n of i.values()){n.status===`live`&&e-n.lastFrameAt>C$&&(n.status=`stale`,t=!0);let i=n.video&&n.subscribed&&n.status===`live`?n.video.info().lagMs:null;n.lagTicks=i!==null&&i>T$?n.lagTicks+1:0,n.video&&n.lagTicks>=E$&&e-n.lastRejoinAt>=D$&&(n.lagTicks=0,n.lastRejoinAt=e,n.video.resync(),n.unsub(),n.rejoin()),n.buffer.size&&r?.tick(n.meta.id,n.buffer,n.lastFrameAt)}t&&l()},w$);return{connections:()=>o,disconnect:h,startRecording(e){let t=i.get(e);!t||t.recorder||(t.recorder=new qQ,l())},stopRecording(e){let t=i.get(e),n=t?.recorder;return!t||!n?null:(t.recorder=null,l(),{csv:n.toCsvParts(),rows:n.rows,name:t.meta.name,startedAt:n.startedAt})},setRelay(e){a=e},setSegmentAxis(e,t){let n=i.get(e);n&&(n.segAxis=t?{cfg:t,tracker:y$(t)}:void 0,t&&n.segAxis.tracker.feed(n.buffer,n.buffer.firstAbs,!t.replay),l())},setMathChannels(e){let t=JSON.stringify(e.map(e=>[e.id,e.name,e.units,e.formula,e.enabled]));if(t!==c){c=t,s=e;for(let t of i.values())t.video||($Q(t.buffer,e),t.segAxis&&(t.segAxis.tracker=y$(t.segAxis.cfg),t.segAxis.tracker.feed(t.buffer,t.buffer.firstAbs,!0)));i.size>0&&l()}},openLocal(e,t){let r=`local:${crypto.randomUUID()}`,a=k$({id:r,name:e,ownerName:`This page`,visibility:`private`,orgName:null,parentId:null,lowOf:null},{...n(),...t});return i.set(r,a),l(),{id:r,push:e=>{i.get(r)===a&&u(a,Array.isArray(e)?e:[e])},pushColumns:e=>{i.get(r)===a&&d(a,e)},close:()=>h(r)}},async connect(e,t,r){if(i.has(e.id))return;let o=a&&e.relay_url?{...a,url:e.relay_url}:a;if(!o)throw new OE(`relay_unavailable`);let s=typeof t==`string`?await f(ue(t).secret??t,e.salt):`keyFor`in t?e=>t.keyFor(e):t;if(typeof s!=`function`&&!await ge(s,e.key_check))throw new OE(`wrong_password`);let c=k$({id:e.id,name:e.name,ownerName:e.owner_name??``,visibility:e.visibility??`private`,orgName:e.org_name??null,projectName:e.project_name??null,parentId:e.parent_stream_id??null,lowOf:e.low_of_stream_id??null},{...n(),...r},e.kind);i.set(e.id,c);let p=Promise.resolve();c.rejoin=()=>{c.unsub=IQ(o,e.id,t=>{let n=ye(s,t).catch(()=>null);p=p.then(async()=>{try{let t=await n;if(!t||i.get(e.id)!==c)return;if(t.kind===6){let e=BQ(t.plaintext);e&&c.video&&(c.video.push(e),m(c,!1));return}if(t.kind===5){let e=de(t.plaintext);c.schemas.set(e.id,e);return}if(t.kind===7){let e=he(t.plaintext,c.schemas);if(!e)return;let n=c.buffer;for(let t of e)n.setLastKnown(t.name,t.unit,t.t,t.v);(n.columnNames.length!==c.lastColCount||n.valuedCount!==c.lastValued)&&l();return}if(t.kind===4){let e=await Ge(t.plaintext,c.schemas);e&&!e.historical&&d(c,e.block);return}if(t.kind===3)return d(c,Ie(t.plaintext));if(t.kind!==2)return;let r=ie(t.plaintext);u(c,Array.isArray(r?.frames)?r.frames:[])}catch{}})},t=>{!c.subscribed||i.get(e.id)!==c||(t===`subscribed`?(c.status=`live`,c.lastFrameAt=Date.now()):t===`error`&&(c.status=`error`,c.error=`connection_error`),l())})};let h=c.video;h?(c.status=`idle`,h.onDemandChange(t=>{i.get(e.id)===c&&(clearTimeout(c.releaseTimer),t?c.subscribed||(c.subscribed=!0,h.resync(),c.status=`connecting`,c.lastFrameAt=Date.now(),c.rejoin(),l()):c.releaseTimer=setTimeout(()=>{c.subscribed=!1,c.unsub(),c.unsub=()=>{},c.status=`idle`,c.error=null,c.lagTicks=0,l()},O$))})):(c.subscribed=!0,c.rejoin()),l()},dispose(){clearInterval(g);for(let e of i.values())clearTimeout(e.releaseTimer),e.unsub();i.clear(),o=[]}}}var j$=500,M$=1<<20;function N$(e){let t=[],n=new Map,r=[],i=``,a=(e,t)=>`${e}|${t}`,o=(e,t)=>{let n=t.kind===`stream`?e.targets?.streams:t.kind===`history`?e.targets?.histories:e.targets?.datasets;return!n||n.includes(t.kind===`dataset`?t.name??t.id:t.id)},s=()=>[...n.values()].map(e=>{let{state:t,missing:n,since:r}=e.state();return{ruleId:e.rule.id,target:e.target,state:t,...n?{missing:n}:{},...r===void 0?{}:{since:r}}}),c=()=>{let t=s(),n=JSON.stringify(t);n!==i&&(i=n,e.setStates(t))};function l(n,i){let a=t.find(e=>e.id===n.ruleId);if(n.kind===`raised`){r=[...r,{id:`${n.ruleId}|${n.target.id}|${n.t}`,ruleId:n.ruleId,ruleName:a?.name??``,severity:a?.severity??`info`,targetId:n.target.id,timeColumn:i,t0:n.t,t1:null}];let e=r.filter(e=>e.targetId===n.target.id);e.length>j$&&(r=r.filter(t=>t!==e[0]))}else{let e=r.find(e=>e.ruleId===n.ruleId&&e.targetId===n.target.id&&e.t1===null);e&&(r=r.map(t=>t===e?{...t,t1:n.t}:t))}e.setMarks(r),e.emit(n)}function u(){let r=new Set;for(let i of e.targets())for(let e of t){if(!o(e,i))continue;let t=a(e.id,i.id);r.add(t);let s=n.get(t),{channels:c,...u}=i;(!s||s.rule!==e)&&(s=et(e,u),n.set(t,s));for(let e of s.bind(c))l(e,i.kind===`stream`?qe:``)}for(let e of n.keys())r.has(e)||n.delete(e);c()}return{setRules(n){let r=[],i=n.filter(e=>{let t=tt(e);return r.push(...t.map(t=>({ruleId:String(e?.id??``),...t}))),!t.length}),a=e.maxRules();a!==null&&i.length>a&&e.limit();let o=new Map(t.map(e=>[e.id,e]));return t=(a===null?i:i.slice(0,a)).map(e=>{let t=o.get(e.id);return t&&t.version===e.version?t:e}),u(),r},rules:()=>t,state:s,async evaluate(n,i){let a=e.targets().find(e=>e.id===n&&e.kind===`dataset`);if(!a)return[];let{channels:s,...c}=a,u=[],d=t.filter(e=>(!i.ruleIds||i.ruleIds.includes(e.id))&&o(e,c)),f=d.map(e=>{let t=et(e,c);return t.bind(s),t}),p=[...new Set(d.flatMap(e=>Object.values(e.signals).map(e=>`formula`in e?e.formula:e.channel)))];for(let t=0;;t+=M$){let r=await e.readDataset(n,[i.timeColumn,...p],t,M$),a=r[i.timeColumn];if(!a||!a.length)break;for(let e of f)u.push(...e.push({t:a,columns:r}));if(a.length<M$)break}r=r.filter(e=>!(e.targetId===n&&(!i.ruleIds||i.ruleIds.includes(e.ruleId)))),e.setMarks(r);for(let e of u)l(e,i.timeColumn);return u},pushLive(e,t){let r=!1;for(let i of n.values()){if(i.target.id!==e)continue;let n=i.push(t);n.length&&(r=!0);for(let e of n)l(e,qe)}r&&c()},tickLive(e,t){let r=!1;for(let i of n.values()){if(i.target.id!==e)continue;let n=i.tick(t);n.length&&(r=!0);for(let e of n)l(e,qe)}r&&c()},liveColumns(e){let t=new Set;for(let r of n.values())if(r.target.id===e)for(let e of Object.values(r.rule.signals))t.add(`formula`in e?e.formula:e.channel);return[...t]},sync:u,clearMarks(t){r=t?r.filter(e=>e.targetId!==t):[],e.setMarks(r)}}}var P$=class{past=[];future=[];current=null;lastAt=-1/0;o;equals;constructor(e){this.o=e,this.equals=e.equals??Object.is}get canUndo(){return this.past.length>0}get canRedo(){return this.future.length>0}observe(e){if(this.current===null)return this.current=e,!1;if(this.equals(e,this.current))return!1;let t=this.o.now();return t-this.lastAt<this.o.mergeMs&&this.past.length>0||(this.past.push(this.current),this.past.length>this.o.limit&&this.past.shift()),this.current=e,this.future=[],this.lastAt=t,!0}rebase(e){this.current=e}undo(){if(this.past.length===0)return null;let e=this.past.pop();return this.future.push(this.current),this.current=e,this.lastAt=-1/0,e}redo(){if(this.future.length===0)return null;let e=this.future.pop();return this.past.push(this.current),this.current=e,this.lastAt=-1/0,e}clear(e){this.past=[],this.future=[],this.current=e,this.lastAt=-1/0}},F$={maxChartsPerWorksheet:null,maxChannelsPerChart:null,maxWorksheets:null,maxMathChannels:null,maxAlertRules:null,canImportExportWorkspaces:!0},I$=[];function L$(e,t){let n=e.found[t];return{definitionId:n.definitionId,rule:e.defs.find(e=>e.id===n.definitionId)?.name??n.definitionId,index:n.index,parentIndex:n.parentIndex??null,tstart:n.tstart,tend:n.tend,flags:n.flags,kpis:n.kpis??{},incomplete:!!n.incomplete}}var R$=[`#a78bfa`,`#38bdf8`,`#fb7185`,`#4ade80`,`#fbbf24`,`#94a3b8`];function z$(e=`ET`){return{id:crypto.randomUUID(),name:`Worksheet`,panels:[],panelChartSettings:{},panelChartBackgrounds:{},xKey:e}}function B$(e,t){let n=e.filter(e=>e.source!==`workbook`),r=new Map,i=[];for(let e of t){let t=n.find(t=>t.name===e.name);if(t&&t.formula===e.formula&&t.units===e.units)continue;let a=t?`${e.name} (workbook)`:e.name;t&&r.set(e.name,a),i.push(sr({...e,name:a,source:`workbook`}))}return{channels:i,rename:r}}function V$(e,t){let n=JSON.stringify({xKey:e.xKey,panelChartSettings:e.panelChartSettings});for(let[e,r]of t)n=n.split(JSON.stringify(e)).join(JSON.stringify(r));return{...e,...JSON.parse(n)}}function H$(e){return typeof e.text==`function`?e.text():new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result??``)),r.onerror=()=>n(r.error),r.readAsText(e)})}function U$(e,t,n){if(!e||!t)return $t();let{min:r,max:i}=xz(e.rows,t);if(!Number.isFinite(r)||!Number.isFinite(i))return $t();let a=Cz(i-r||1,6),o=a>=1?Math.round(a):a,s=o>=1?1:o/10,c=Math.max(0,Math.ceil(-Math.log10(s))),l=e=>String(Number(e.toFixed(c)));return{...n,scaleMin:l(Math.floor(r/s)*s),scaleMax:l(Math.ceil(i/s)*s),majorStep:l(o),minorStep:``}}function W$(e,t){let n=t.includes(e.xKey)?e.xKey:t.includes(`ET`)?`ET`:t.includes(`ElapsedTime`)?qe:t[0],r={...e.panelChartSettings};for(let n of e.panels){let e=r[n.id];if(n.kind===`multiband`){let i=e&&e.kind===`multiband`?e:pn();r[n.id]={...i,kind:`multiband`,addColumn:i.addColumn&&t.includes(i.addColumn)?i.addColumn:t[0]}}else if(n.kind===`xyscatter`){let i=e&&e.kind===`xyscatter`?e:mn(R$[2]),a=t.includes(i.xyXCol)?i.xyXCol:t[0],o=t.includes(i.xyYCol)&&i.xyYCol!==t[0]?i.xyYCol:t.length>1?t[1]:t[0];r[n.id]={...i,kind:`xyscatter`,xyXCol:a,xyYCol:o}}else if(n.kind===`xyzmesh`){let i=e&&e.kind===`xyzmesh`?e:hn(4),a=t.includes(i.xyzXCol)?i.xyzXCol:t[0],o=t.length>1?t[1]:``,s=t.includes(i.xyzYCol)&&i.xyzYCol!==t[0]?i.xyzYCol:t.length>1?t[1]:t[0],c=t.includes(i.xyzZCol)&&i.xyzZCol!==t[0]&&i.xyzZCol!==o?i.xyzZCol:t.length>2?t[2]:t[0];r[n.id]={...i,kind:`xyzmesh`,xyzXCol:a,xyzYCol:s,xyzZCol:c}}}return{...e,xKey:n,panelChartSettings:r}}function G$(e,t){let n=!1,r={...e.panelChartSettings};for(let[i,a]of Object.entries(e.panelChartSettings)){if(a.kind!==`multiband`)continue;let e=a.series.filter(e=>t(e.column));e.length!==a.series.length&&(r[i]={...a,series:e},n=!0)}return n?{...e,panelChartSettings:r}:e}function K$(){return typeof document>`u`?`dark`:Zz(null)}function q$(e={}){let t={...e},n=!1,r=z$(),i=bQ({datasets:[],selection:[],worksheets:[r],activeWorksheetId:r.id,xRanges:{},offsets:{},colors:{},liveWindowSeconds:15,segmentContext:null,cycleRules:[],live:[],video:[],mathChannels:[],limits:{...F$,...t.limits},palette:Jz(t.palette,K$()),importing:0,licensed:null,history:{canUndo:!1,canRedo:!1},marks:[],alerts:[],alertRules:[]}),a=IV(),o=()=>{let e=Jz(t.palette,K$());i.set(t=>t.palette.join()===e.join()?t:{...t,palette:e})},s=typeof document>`u`?()=>{}:Qz(null,o),c=SQ(),l=()=>{if(n)throw new OE(`disposed`)},u=e=>{throw a.emit(`limit`,{reason:e}),new OE(`limit_reached`,{reason:e})},d=()=>i.get(),f=(e,t)=>{let n=d().limits.maxChannelsPerChart,r=Sz(t);n!==null&&r>n&&r>Sz(e)&&u(`channels-per-chart`)},p=xQ((e,t)=>t===null?e:e.slice(0,t)),m=()=>{let e=d(),t=c.lapsByDataset(e.datasets),n=c.selectedDatasets(e.datasets,t,e.selection),r=c.selectedLive(e.live,e.selection),i=c.staticDataset(n),a=c.mergedDataset(i,r),o=p(e.mathChannels,e.limits.maxMathChannels);return{laps:t,selectedDatasets:n,selectedLive:r,staticDataset:i,merged:a,channels:o,numericColumns:c.numericColumns(a,n,o,c.mergedParts(n,r),r),allColumns:c.allColumns(a,n,o),columnUnits:c.columnUnits(a,o)}},h=(e,t)=>({id:t.id,kind:t.kind,title:t.title??null,settings:e.panelChartSettings[t.id],background:e.panelChartBackgrounds[t.id]??null,annotations:e.panelChartSettings[t.id]?.annotations??I$,layout:t.rect}),g=xQ((e,t)=>e.map(e=>({id:e.id,name:e.name,xKey:e.xKey,xRange:t[e.id]??null,charts:e.panels.map(t=>h(e,t))}))),_=xQ((e,t,n,r,i,a,o)=>{let s=(e,t)=>{let n=a.findIndex(t=>t.id===e);return n>=0?n:t};return e.map((e,a)=>{let c=i[e.id],l=c?.laps.map(e=>e.id)??[],u=l.filter(e=>t.includes(e)).length;return{id:e.id,name:e.name,kind:e.kind,columns:e.schema.map(e=>({name:e.name,unit:e.unit??``,numeric:e.type===`number`})),rowCount:e.data.rows.length,color:Kz(n,e.id,s(e.id,a),o),customColor:e.id in n,offset:r[e.id]??0,parseConfig:e.parseConfig??null,fileInfo:e.info??null,beacon:e.beacon??null,cut:e.cut?{cycleId:e.cut.cycleId,timeKey:e.cut.timeKey,defs:e.cut.defs}:null,laps:c?c.laps.map((i,a)=>({id:i.id,name:i.name,value:c.values[a],unit:c.unit,isTime:c.isTime,color:Kz(n,i.id,s(i.id,a),o),offset:r[i.id]??0,selected:t.includes(i.id),...e.cut?{cycle:L$(e.cut,a)}:{}})):null,selected:c?u===0?!1:u===l.length?!0:`partial`:t.includes(e.id)}})}),v=xQ((e,t,n,r,i)=>{let a=e.filter(e=>t.includes(e.id)).map(e=>e.id);return e.map((e,o)=>({id:e.id,name:e.name,ownerName:e.ownerName,visibility:e.visibility,orgName:e.orgName,kind:e.kind,parentId:e.parentId,lowOf:e.lowOf,status:e.status,error:e.error,rowCount:e.rowCount,selected:t.includes(e.id),color:Kz(n,e.id,a.includes(e.id)?r+a.indexOf(e.id):o,i),customColor:e.id in n,recordingSince:e.recordingSince,channels:e.dataset.columnNames}))}),y=xQ(e=>{let t=m();return{datasets:_(e.datasets,e.selection,e.colors,e.offsets,t.laps,t.selectedDatasets,e.palette),selection:e.selection,worksheets:g(e.worksheets,e.xRanges),activeWorksheetId:e.activeWorksheetId,mathChannels:t.channels,live:v(e.live,e.selection,e.colors,t.selectedDatasets.length,e.palette),liveWindowSeconds:e.liveWindowSeconds,segmentContext:e.segmentContext,cycleRules:e.cycleRules,limits:e.limits,palette:e.palette,importing:e.importing,licensed:e.licensed,hasData:t.merged!==null,multiDataset:t.selectedDatasets.length+t.selectedLive.length>1,numericColumns:t.numericColumns,allColumns:t.allColumns,columnUnits:t.columnUnits,history:e.history,marks:e.marks,alerts:e.alerts}}),b=(e,t)=>e===t||e.length===t.length&&e.every((e,n)=>e===t[n]||JSON.stringify(e)===JSON.stringify(t[n])),x=new P$({limit:100,mergeMs:500,now:()=>Date.now(),equals:(e,t)=>e.liveWindowSeconds===t.liveWindowSeconds&&b(e.worksheets,t.worksheets)&&b(e.channels,t.channels)}),S=!0,C=0,w=e=>{C++;try{e()}finally{C--}},T=e=>[e.worksheets,e.mathChannels,e.liveWindowSeconds],E=[],D=()=>{let e=d();return{worksheets:e.worksheets,channels:e.mathChannels.filter(e=>e.source===`workbook`),liveWindowSeconds:e.liveWindowSeconds,activeWorksheetId:e.activeWorksheetId}},O=()=>i.set(e=>e.history.canUndo===x.canUndo&&e.history.canRedo===x.canRedo?e:{...e,history:{canUndo:x.canUndo,canRedo:x.canRedo}}),k=()=>{if(S)return;let e=T(d());e.every((e,t)=>e===E[t])||(E=e,C?x.rebase(D()):x.observe(D()),O())},A=()=>{E=T(d()),x.clear(D()),O()},j=e=>{S=!0;let t;try{t=e()}finally{S=!1}return A(),t},M=()=>y(d());i.subscribe(()=>{k(),a.emit(`change`,M())});let N=e=>{let t=d(),n=t.worksheets.find(n=>n.id===(e??t.activeWorksheetId));if(!n)throw new OE(`not_found`,{worksheetId:e});return n},P=e=>{for(let t of d().worksheets){let n=t.panels.find(t=>t.id===e);if(n)return{ws:t,panel:n}}throw new OE(`not_found`,{chartId:e})},F=(e,t)=>i.set(n=>{let r=!1,i=n.worksheets.map(n=>{if(n.id!==e)return n;let i=t(n);return i!==n&&(r=!0),i});return r?{...n,worksheets:i}:n}),I=(e,t)=>{let{ws:n}=P(e);F(n.id,n=>({...n,panelChartSettings:{...n.panelChartSettings,[e]:t(n.panelChartSettings[e])}}))},L=e=>i.set(t=>e.length===t.selection.length&&e.every((e,n)=>e===t.selection[n])?t:{...t,selection:e,xRanges:{}}),R=new Set,z=A$(t.live?.relay,e=>{let t=e.map(e=>e.id),n=e.filter(e=>e.kind===`data`&&!R.has(e.id)).map(e=>e.id),r=[...R].filter(e=>!t.includes(e));if(R=new Set(t),i.set(t=>({...t,live:e})),r.length&&L(d().selection.filter(e=>!r.includes(e))),n.length){let e=d().selection,t=n.filter(t=>!e.includes(t));t.length&&L([...e,...t])}let a=m();if(a.selectedLive.length&&a.merged){let e=a.merged.columnNames;if(e.includes(`ElapsedTime`))for(let t of d().worksheets)e.includes(t.xKey)||w(()=>F(t.id,e=>({...e,xKey:qe})))}},()=>({capacity:t.live?.capacity,maxMemoryMB:t.live?.maxMemoryMB}),{rows:(e,t,n)=>{if(!ce.rules().length)return;t.columnNames.length!==V.get(e)&&(V.set(e,t.columnNames.length),ce.sync());let r=ce.liveColumns(e);if(!r.length)return;let i=t.endAbs,a=Math.max(n,t.firstAbs);if(i<=a)return;let o={};for(let e of r)o[e]=t.range(e,a,i);ce.pushLive(e,{t:t.range(qe,a,i),columns:o,scan:new Map})},tick:(e,t,n)=>{if(!ce.rules().length)return;let r=t.range(qe,t.endAbs-1,t.endAbs)[0];r===r&&ce.tickLive(e,r+(Date.now()-n)/1e3)}}),V=new Map,te=xQ((e,t)=>e.filter(e=>t.some(t=>xE([e],t.panelChartSettings,t.xKey).length>0))),ne=()=>z.setMathChannels(te(p(d().mathChannels,d().limits.maxMathChannels),d().worksheets));ne(),i.subscribe(ne);let re=e=>{i.set(t=>({...t,datasets:[...t.datasets,e]})),L([...d().selection,e.id]);let t=bz(e.schema);t.length&&w(()=>i.set(e=>({...e,worksheets:e.worksheets.map(e=>W$(e,t))})))},ie=Promise.resolve(),U=async(e,r={})=>{l();let o=e.map(e=>e instanceof File?e:e.file);if(o.length===0)return{ids:[],errors:[]};if(await t.beforeImport?.()===!1)throw new OE(`import_vetoed`);let{signal:s}=r;i.set(e=>({...e,importing:e.importing+o.length}));let c=ie.then(async()=>{let e={ids:[],errors:[]},t=o.length,c=e=>{t-=e,i.set(t=>({...t,importing:Math.max(0,t.importing-e)}))};try{let{items:t,errors:i}=await ER(o);c(o.length-t.length);for(let{file:t,error:n}of i)e.errors.push({file:t,error:n}),a.emit(`import`,{file:t,phase:`error`,error:n}),a.emit(`error`,{error:n,context:`import`});for(let i of t){if(n)break;if(s?.aborted){e.cancelled=!0;break}let t=i.main;await new Promise(e=>setTimeout(e,0)),a.emit(`import`,{file:t.name,phase:`start`});try{let o=i.format?await yz({main:t,companions:i.companions,format:i.format.id},{priorInMemoryValues:vR(d().datasets),signal:s,onProgress:e=>a.emit(`import`,{file:t.name,phase:`progress`,fraction:e}),chooseChannels:r.chooseChannels,pickChannels:r.pickChannels}):[await _R(crypto.randomUUID(),t,d().datasets)??await hR(crypto.randomUUID(),t,H$,void 0,vR(d().datasets),s)];if(n){for(let e of o)e.source.dispose();break}if(s?.aborted){for(let e of o)e.source.dispose();throw new OE(`cancelled`)}for(let t of o)re(t),e.ids.push(t.id);a.emit(`import`,{file:t.name,phase:`done`,datasetId:o[0].id,datasetIds:o.map(e=>e.id)})}catch(n){let r=n instanceof Error?n:Error(String(n));a.emit(`import`,{file:t.name,phase:`error`,error:r}),r instanceof OE&&r.code===`cancelled`?e.cancelled=!0:(e.errors.push({file:t.name,error:r}),a.emit(`error`,{error:r,context:`import`}))}finally{c(1)}if(e.cancelled)break}}finally{t>0&&c(t)}return e});return ie=c.catch(()=>void 0),c},ae=()=>setTimeout(()=>{n||NZ(tt)},0),oe=e=>{let t=t=>e.some(e=>t===e||t.startsWith(`${e}::`)),n=d().datasets.filter(t=>e.includes(t.id));for(let e of n)e.source.dispose().catch(()=>void 0);i.set(n=>{let r={...n.offsets},i={...n.colors};for(let e of Object.keys(r))t(e)&&delete r[e];for(let e of Object.keys(i))t(e)&&delete i[e];return{...n,datasets:n.datasets.filter(t=>!e.includes(t.id)),offsets:r,colors:i}}),L(d().selection.filter(e=>!t(e))),n.length>0&&ae()},se=async(e,t,n={})=>{let[r,...i]=await yz({main:new File(e.chunks,`${e.name}.krc`),companions:[],format:`krc`,keys:e.keys},{priorInMemoryValues:t,...n});for(let e of i)e.source.dispose();return{...r,file:void 0,name:e.name,info:r.info&&{...r.info,startTime:e.startTime??r.info.startTime,meta:{...r.info.meta,recordingId:e.recordingId}}}},ce=N$({targets:()=>[...d().datasets.map(e=>({kind:`dataset`,id:e.id,name:e.name,channels:e.schema.map(e=>e.name)})),...d().live.filter(e=>e.kind===`data`).map(e=>({kind:`stream`,id:e.id,name:e.name,channels:e.source.columnNames}))],maxRules:()=>d().limits.maxAlertRules,emit:e=>a.emit(`alert`,e),limit:()=>a.emit(`limit`,{reason:`alert-rules`}),setMarks:e=>i.set(t=>({...t,marks:e})),setStates:e=>i.set(t=>({...t,alerts:e})),readDataset:(e,t,n,r)=>{let i=d().datasets.find(t=>t.id===e);return i?i.source.readColumns(t,n,r):Promise.resolve({})}}),le=xQ((e,t)=>{let n=new Map;for(let r of e){let e=rt(r);e!==null&&n.set(r.id,{value:e,active:t.some(e=>e.ruleId===r.id&&(e.state===`active`||e.state===`clearing`))})}return n}),ue=null;i.subscribe(()=>{let e=d();ue&&ue[0]===e.datasets&&ue[1]===e.live||(ue=[e.datasets,e.live],ce.rules().length&&ce.sync())});let de={importFiles:U,warmImport(e={}){l(),sz(!!e.formats?.some(e=>e===`hdf5`||e===`mat`))},async splitByRate(e){l();let t=d().datasets.find(t=>t.id===e);if(!t)throw new OE(`not_found`,{datasetId:e});if(!t.info?.combined||!(t.file instanceof File))throw new OE(`invalid_argument`,{reason:`only a combined multi-rate import can be split`});let n=await yz({main:t.file,companions:t.companions??[],format:t.info.importer},{priorInMemoryValues:vR(d().datasets.filter(t=>t.id!==e)),selection:t.info.selection,split:!0});oe([e]);for(let e of n)re(e);return n.map(e=>e.id)},async chooseChannels(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});if(!n.info||!(n.file instanceof File))throw new OE(`invalid_argument`,{reason:`only binary imports have channels to choose`});try{let r=await yz({main:n.file,companions:n.companions??[],format:n.info.importer},{priorInMemoryValues:vR(d().datasets.filter(t=>t.id!==e)),initial:n.info.selection,chooseChannels:t,pickChannels:!0});oe([e]);for(let e of r)re(e);return r.map(e=>e.id)}catch(e){if(e instanceof OE&&e.code===`cancelled`)return null;throw e}},async combine(e){l();let t=d().datasets.find(t=>t.id===e);if(!t)throw new OE(`not_found`,{datasetId:e});let n=t.info?.splitKey;if(!n||!(t.file instanceof File))throw new OE(`invalid_argument`,{reason:`only datasets split from one file can be combined`});let r=d().datasets.filter(e=>e.info?.splitKey===n),i=await yz({main:t.file,companions:t.companions??[],format:t.info.importer},{priorInMemoryValues:vR(d().datasets.filter(e=>!r.includes(e))),selection:r.flatMap(e=>e.info.selection)});if(i.length!==1){for(let e of i)e.source.dispose();throw new OE(`invalid_argument`,{reason:`these groups have no common time base`})}return oe(r.map(e=>e.id)),re(i[0]),i[0].id},async openRecording(e,t={}){l();let n=await se(e,vR(d().datasets),t);return re(n),n.id},async reopenRecording(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});let r=await se(t,vR(d().datasets.filter(t=>t.id!==e)));i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...r,id:e,beacon:n.beacon}:t)})),n.source.dispose().catch(()=>void 0),ae()},openHistoryRange(e){l();let t=yQ(crypto.randomUUID(),e);return re(t),t.id},updateHistoryRange(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});if(!(n.source instanceof cQ)){let t=`dataset ${e} is not a history range: only datasets opened with openHistoryRange can be updated`;throw Object.assign(new OE(`invalid_argument`,{datasetId:e,reason:t}),{message:t})}let r=yQ(e,t);i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...r,beacon:n.beacon}:t)})),ae()},addColumns(e){l();let t=fQ(crypto.randomUUID(),e);return re(t),t.id},replaceColumns(e,t,n={}){l();let r=d().datasets.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{datasetId:e});let a=gQ(r,t,n.transfer);i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?a:t)}))},writeColumns(e,t,n){l();let r=d().datasets.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{datasetId:e});let a=mQ(r,t,n);i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?a:t)}))},async addText(e,t=`dataset.csv`){l();let n=await fR(crypto.randomUUID(),t,e);return re(n),n.id},async findCycles(e,t,n){l();let r=d().datasets.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{datasetId:e});let i=await RB(r.source,n,BB(t)),a=new Map(t.filter(e=>e.kpis?.length).map(e=>[e.id,e.kpis]));return zB(i,t).map(e=>a.has(e.definitionId)?{...e,kpis:HB(i,e,a.get(e.definitionId))}:e)},async addCycles(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});let r=n.schema.filter(e=>e.type===`number`&&e.name!==t.timeKey).map(e=>e.name),i=await RB(n.source,t.timeKey,r),a={...Object.fromEntries(n.schema.map(e=>[e.name,e.unit])),[IB]:`s`},o=e=>t.defs.find(t=>t.id===e)?.name??e,s=[];for(let e of t.pick){let r=t.found.find(t=>t.definitionId===e.definitionId&&t.index===e.index&&t.parentIndex===e.parentIndex);if(!r)throw new OE(`not_found`,{reason:`no ${o(e.definitionId)} ${e.index} in the cycles found`});let c=r.parentIndex?`${o(t.cycleId)} ${r.parentIndex} · ${o(r.definitionId)}`:`${o(r.definitionId)} ${r.index}`;s.push(de.addColumns({name:`${n.name} · ${c}`,columns:WB(i,t.timeKey,r),units:a}))}if(t.tables!==!1){let e=KB(t.found,t.cycleId,t.defs,i);s.push(await de.addText(qB(e.cycles),`${n.name} · ${o(t.cycleId)}s.csv`)),e.phases.length&&s.push(await de.addText(qB(e.phases),`${n.name} · Phases.csv`))}return s},async cut(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});let r;if(t){if(!t.defs.some(e=>e.id===t.cycleId))throw new OE(`invalid_argument`,{reason:`cycleId is not one of defs`});let i=n.schema.filter(e=>e.type===`number`&&e.name!==t.timeKey).map(e=>e.name),a=await RB(n.source,t.timeKey,i),o=t.defs.find(e=>e.id===t.cycleId)?.show,s=e=>[...e.kpis??[],...o&&o.channel!==t.timeKey?[o]:[]],c=new Map(t.defs.filter(e=>s(e).length).map(e=>[e.id,s(e)])),l=zB(a,t.defs).sort((e,t)=>e.tstart-t.tstart||!!e.parentIndex-+!!t.parentIndex).map(e=>c.has(e.definitionId)?{...e,kpis:HB(a,e,c.get(e.definitionId))}:e),u={...Object.fromEntries(n.schema.map(e=>[e.name,e.unit])),[IB]:`s`},d=e=>t.defs.find(t=>t.id===e)?.name??e,f=l.map(r=>fQ(`${e}::${r.definitionId}:${r.parentIndex??0}:${r.index}`,{name:r.parentIndex?`${n.name} · ${d(t.cycleId)} ${r.parentIndex} · ${d(r.definitionId)}`:`${n.name} · ${d(r.definitionId)} ${r.index}`,columns:WB(a,t.timeKey,r),units:u})),p=a.t.length?a.t[a.t.length-1]:NaN,m=l.map(e=>e.tend===null&&p===p?{...e,tend:p,incomplete:!0}:e);r={defs:t.defs,cycleId:t.cycleId,timeKey:t.timeKey,found:m,parts:f}}else if(!n.cut)return 0;if(!d().datasets.some(t=>t.id===e))return 0;i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...t,cut:r}:t)}));let a=d().selection,o=a.some(t=>t===e||t.startsWith(`${e}::`)),s=a.filter(t=>t!==e&&!t.startsWith(`${e}::`)),c=r?r.parts.filter((e,t)=>!r.found[t].parentIndex).map(e=>e.id):[];return L(o?c.length>0?[...s,...c]:[...s,e]:s),c.length},remove(e){l(),oe([e])},clear(){l(),oe(d().datasets.map(e=>e.id))},async configure(e,t){l();let n=d().datasets.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{datasetId:e});if(t.parseConfig&&(n.kind!==`memory`||!n.parseConfig))throw new OE(`invalid_argument`,{reason:n.parseConfig?`out-of-core datasets cannot be re-parsed`:`binary files have no text parse settings`});if(t.beacon!==void 0&&t.beacon!==null&&n.kind!==`memory`)throw new OE(`invalid_argument`,{reason:`laps need an in-memory dataset`});if(t.beacon!==void 0&&JSON.stringify(t.beacon)!==JSON.stringify(n.beacon??null)){let r=t.beacon??void 0;i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...t,beacon:r}:t)}));let a=d().selection,o=a.some(t=>t===e||t.startsWith(`${e}::`)),s=a.filter(t=>t!==e&&!t.startsWith(`${e}::`)),c=r?gB(n.data.rows,r.channel):[],l=r&&t.selectCycles===`best`?xB(c.map(e=>bB(n.data.rows,e,r.metric,r.stat))):null,u=l===null?c.map((t,n)=>wB(e,n)):[wB(e,l)];L(o?c.length>0?[...s,...u]:[...s,e]:s)}let r=t.parseConfig;if(!r)return;let a=(()=>{try{let e=H(ze(n.rawText??``),r.headerRow);return n.data.columnNames.length===e.length&&n.data.columnNames.every((t,n)=>t===e[n])}catch{return!1}})();if(ee(r,n.parseConfig)&&a)return;let o=n.fromColumns?vQ(n):n.rawText??``,s=await NE(n.file?{file:n.file,config:r}:{rawText:o,config:r}),c=new IE(s),u=await c.getSchema(),f=n.fromColumns?{rawText:o,fromColumns:!1}:{};i.set(t=>({...t,datasets:t.datasets.map(t=>t.id===e?{...t,...f,data:s,source:c,schema:u,parseConfig:r}:t)})),n.source.dispose().catch(()=>void 0),ae(),n.cut&&await de.cut(e,n.cut);let p=m().selectedDatasets,h=new Set(p.flatMap(e=>e.data.columnNames)),g=s.columnNames.filter(e=>B(s.rows,e)),_=g.find(e=>e===`ET`)??g[0];w(()=>i.set(e=>({...e,worksheets:e.worksheets.map(e=>G$(!h.has(e.xKey)&&_?{...e,xKey:_}:e,e=>h.has(e)))})))},setColor(e,t){l(),i.set(n=>{let r={...n.colors};return t===null?delete r[e]:r[e]=t,{...n,colors:r}})},setOffset(e,t){l(),i.set(n=>({...n,offsets:{...n.offsets,[e]:t}}))},resetOffsets(){l(),i.set(e=>Object.keys(e.offsets).length?{...e,offsets:{}}:e)},select(e){l(),L([...e])},toggle(e){l();let t=d().selection,n=m().laps[e];if(n){let e=n.laps.map(e=>e.id);L(e.every(e=>t.includes(e))?t.filter(t=>!e.includes(t)):[...t,...e.filter(e=>!t.includes(e))]);return}L(t.includes(e)?t.filter(t=>t!==e):[...t,e])},selectAll(){l();let e=m().laps,t=d().live.filter(e=>d().selection.includes(e.id)).map(e=>e.id);L([...d().datasets.flatMap(t=>e[t.id]?e[t.id].laps.map(e=>e.id):[t.id]),...t])},deselectAll(){l(),L([])},raw(e){let t=d().datasets.find(t=>t.id===e);if(!t)throw new OE(`not_found`,{datasetId:e});return{get rawText(){return t.kind===`memory`&&t.fromColumns?vQ(t):t.rawText??``},data:t.data,parseConfig:t.parseConfig??null,kind:t.kind,beacon:t.beacon??null}},async columnBounds(e){l();let t=m(),n=t.selectedDatasets.find(t=>t.schema.some(t=>t.name===e));if(n&&n.kind===`memory`){let t=xz(n.data.rows,e);if(Number.isFinite(t.min)&&Number.isFinite(t.max))return t}else if(n){let t=await n.source.xBounds(e).catch(()=>null);if(t&&Number.isFinite(t.x0)&&Number.isFinite(t.x1)&&t.x1>=t.x0)return{min:t.x0,max:t.x1}}let r=t.selectedLive.find(t=>t.dataset.columnNames.includes(e));if(r){let t=r.source.valueBoundsSync(e);if(t)return t}let i=fe(e);if(!i)return null;let a=xz(i.rows,e);return Number.isFinite(a.min)&&Number.isFinite(a.max)?a:null}},fe=(e,t=N().xKey)=>{let n=m();if(!n.merged)return null;if(!n.channels.find(t=>t.name===e))return n.merged;let r=bE(n.merged,n.channels,t);return{...n.merged,columnNames:[...n.merged.columnNames,...r.ok.map(e=>e.name)],rows:r.rows}},pe=(e,t,n)=>m().selectedLive.length>0?{...n,scaleMin:``,scaleMax:``,majorStep:``,minorStep:``}:U$(fe(e,t),e,n),me={fromFileList:e=>wV(Array.from(e)),async fromDataTransfer(e){return TV(Array.from(e.items??[]).map(e=>e.webkitGetAsEntry?.()).filter(e=>!!e))},canPick:EV,pick:DV,tree:(e,t)=>CV(e,t),isImportable:SV},he={add(e=`Worksheet`){l();let t=d(),n=t.limits.maxWorksheets;n!==null&&t.worksheets.length>=n&&u(`worksheets`);let r={...z$(N().xKey||`ET`),name:e};return i.set(e=>({...e,worksheets:[...e.worksheets,r],activeWorksheetId:r.id})),r.id},rename(e,t){l(),N(e),F(e,e=>e.name===t?e:{...e,name:t})},remove(e){l();let t=d();if(N(e),t.worksheets.length<=1)throw new OE(`invalid_argument`,{reason:`the last worksheet cannot be removed`});let n=t.worksheets.findIndex(t=>t.id===e),r=t.worksheets.filter(t=>t.id!==e);i.set(t=>({...t,worksheets:r,activeWorksheetId:t.activeWorksheetId===e?r[Math.max(0,n-1)].id:t.activeWorksheetId}))},reorder(e,t){l(),i.set(n=>{if(e===t||e<0||t<0||e>=n.worksheets.length||t>=n.worksheets.length)return n;let r=[...n.worksheets],[i]=r.splice(e,1);return r.splice(t,0,i),{...n,worksheets:r}})},activate(e){l(),N(e),i.set(t=>t.activeWorksheetId===e?t:{...t,activeWorksheetId:e,xRanges:{...t.xRanges,[e]:null}})},setXKey(e,t){l(),N(e),F(e,e=>G$({...e,xKey:t},e=>e!==t)),i.set(t=>({...t,xRanges:{...t.xRanges,[e]:null},offsets:{}}))}},ge={mount(e,t,n){return l(),MZ(tt,e,t,n)},openWindow(e,t){return l(),P(e),nQ(tt,e,(t,n)=>MZ(tt,e,t,n),t)},setFonts(e){e.sans&&(Q.sans=e.sans),e.mono&&(Q.mono=e.mono),NZ(tt)},kinds:()=>CQ,label:TQ,add(e,t={}){if(l(),!CQ.some(t=>t.kind===e))throw new OE(`invalid_argument`,{kind:e});let n=N(t.worksheetId),r=d().limits.maxChartsPerWorksheet;r!==null&&n.panels.length>=r&&u(`charts-per-worksheet`);let i={...Xt(e,n.panels),...t.title?{title:t.title}:{}};t.layout&&(i.rect={...t.layout});let a=ir([i],{},R$[2],4)[i.id],o=a,s=m().numericColumns;if(s.length&&(o.kind===`multiband`||o.kind===`xyscatter`||o.kind===`xyzmesh`)&&(o=W$({...n,panels:[i],panelChartSettings:{[i.id]:o}},s).panelChartSettings[i.id],o.kind===`multiband`&&(o={...o,addColumn:s.find(e=>e!==n.xKey)??s[0]})),t.settings&&(o={...o,...t.settings,kind:o.kind}),s.length&&o.kind===`xyscatter`){let e=t.settings??{};o={...o,xyXScale:e.xyXScale??pe(o.xyXCol,n.xKey,o.xyXScale),xyYScale:e.xyYScale??pe(o.xyYCol,n.xKey,o.xyYScale)}}return f(a,o),F(n.id,e=>({...e,panels:t.layout?[...e.panels,i]:Qt([...e.panels,i]),panelChartSettings:{...e.panelChartSettings,[i.id]:o}})),i.id},remove(e){l();let{ws:t}=P(e);F(t.id,t=>{let n={...t.panelChartSettings},r={...t.panelChartBackgrounds};return delete n[e],delete r[e],{...t,panels:Qt(t.panels.filter(t=>t.id!==e)),panelChartSettings:n,panelChartBackgrounds:r}})},rename(e,t){l();let{ws:n}=P(e),r=t?.trim()||void 0;F(n.id,t=>({...t,panels:t.panels.map(t=>{if(t.id!==e)return t;let{title:n,...i}=t;return r?{...i,title:r}:i})}))},update(e,t){l();let{ws:n}=P(e),r=n.panelChartSettings[e],i={...r,...t,kind:r.kind};if(r.kind===`xyscatter`&&i.kind===`xyscatter`){let e=t;typeof e.xyXCol==`string`&&e.xyXCol!==r.xyXCol&&!(`xyXScale`in e)&&(i={...i,xyXScale:pe(e.xyXCol,n.xKey,r.xyXScale)}),typeof e.xyYCol==`string`&&e.xyYCol!==r.xyYCol&&!(`xyYScale`in e)&&(i={...i,xyYScale:pe(e.xyYCol,n.xKey,r.xyYScale)})}f(r,i),I(e,()=>i)},replaceSettings(e,t){l();let{ws:n,panel:r}=P(e);if(t.kind!==r.kind)throw new OE(`invalid_argument`,{reason:`settings kind mismatch`});f(n.panelChartSettings[e],t),I(e,()=>t)},setBackground(e,t){l();let{ws:n}=P(e);F(n.id,n=>({...n,panelChartBackgrounds:{...n.panelChartBackgrounds,[e]:t}}))},addAnnotation(e,t){l(),P(e);let n=Nt({...t,id:t.id||crypto.randomUUID()});if(!n)throw new OE(`invalid_argument`,{reason:`not a valid annotation`});return I(e,e=>({...e,annotations:[...(e.annotations??[]).filter(e=>e.id!==n.id),n]})),n.id},updateAnnotation(e,t,n){l();let r=(P(e).ws.panelChartSettings[e]?.annotations??[]).find(e=>e.id===t);if(!r)throw new OE(`not_found`,{annotationId:t});let i=Nt({...r,...n,id:r.id,kind:r.kind});if(!i)throw new OE(`invalid_argument`,{reason:`not a valid annotation`});I(e,e=>({...e,annotations:(e.annotations??[]).map(e=>e.id===i.id?i:e)}))},removeAnnotation(e,t){l(),P(e),I(e,e=>({...e,annotations:(e.annotations??[]).filter(e=>e.id!==t)}))},setAnnotations(e,t){l(),P(e);let n=Pt(t)??[];I(e,e=>({...e,annotations:n}))},setLayout(e,t){l();let{ws:n}=P(e);F(n.id,n=>({...n,panels:n.panels.map(n=>n.id===e?{...n,rect:{...t}}:n)}))},setLayouts(e,t){l(),F(e,e=>({...e,panels:e.panels.map(e=>t[e.id]?{...e,rect:{...t[e.id]}}:e)}))},autoLayout(e){l(),F(N(e).id,e=>({...e,panels:Qt(e.panels)}))},get(e){let{ws:t,panel:n}=P(e);return h(t,n)},list(e){let t=N(e);return t.panels.map(e=>h(t,e))},async addSeries(e,t){l();let{ws:n}=P(e),r=n.panelChartSettings[e];if(!r||r.kind!==`multiband`)throw new OE(`invalid_argument`,{reason:`not a multiband chart`});let i=d().limits.maxChannelsPerChart;i!==null&&Sz(r)>=i&&u(`channels-per-chart`);let a=m().numericColumns,o=new Set(r.series.map(e=>e.column)),s=t??a.find(e=>e!==n.xKey&&!o.has(e))??a.find(e=>e!==n.xKey)??``;if(!s)return null;let c=or(),f={id:c,column:s,color:R$[r.series.length%R$.length],bandFromPct:0,bandToPct:100,scaleMin:0,scaleMax:1,yMajorStep:0,yMinorStep:0};return I(e,e=>e.kind===`multiband`?{...e,series:[...e.series,f]}:e),await ge.autoScaleSeries(e,c),c},async updateSeries(e,t,n){l();let{ws:r}=P(e),i=r.panelChartSettings[e],a=i&&i.kind===`multiband`?i.series.find(e=>e.id===t):void 0;if(!a)throw new OE(`not_found`,{seriesId:t});I(e,e=>e.kind===`multiband`?{...e,series:e.series.map(e=>e.id===t?{...e,...n,id:e.id}:e)}:e),n.column&&n.column!==a.column&&n.scaleMin===void 0&&n.scaleMax===void 0&&await ge.autoScaleSeries(e,t)},removeSeries(e,t){l(),I(e,e=>e.kind===`multiband`?{...e,series:e.series.filter(e=>e.id!==t)}:e)},reorderSeries(e,t){l(),I(e,e=>{if(e.kind!==`multiband`)return e;let n=new Map(e.series.map(e=>[e.id,e])),r=t.map(e=>n.get(e)).filter(e=>!!e),i=e.series.filter(e=>!t.includes(e.id));return{...e,series:[...r,...i]}})},async autoScaleSeries(e,t){l();let{ws:r}=P(e),i=r.panelChartSettings[e],a=i&&i.kind===`multiband`?i.series.find(e=>e.id===t):void 0;if(!a)return;let o=await de.columnBounds(a.column);!o||n||I(e,e=>e.kind===`multiband`?{...e,series:e.series.map(e=>e.id===t?{...e,scaleMin:o.min,scaleMax:o.max}:e)}:e)}},_e=new Map,ve={setXRange(e,t){l();let n=N(t).id;i.set(t=>{let r=t.xRanges[n]??null;return r===e||r&&e&&r[0]===e[0]&&r[1]===e[1]?t:{...t,xRanges:{...t.xRanges,[n]:e}}})},resetZoom(e){ve.setXRange(null,e)},setCursorX(e,t){l();let n=N(t).id;(_e.get(n)??null)!==e&&(_e.set(n,e),a.emit(`cursorchange`,{worksheetId:n,x:e}))},cursorX(e){return _e.get(N(e).id)??null},setLiveWindow(e){l(),i.set(t=>t.liveWindowSeconds===e?t:{...t,liveWindowSeconds:e})},setSegmentContext(e){l(),i.set(t=>JSON.stringify(t.segmentContext)===JSON.stringify(e)?t:{...t,segmentContext:e})}},ye={save(e){l();let t=e.id??crypto.randomUUID(),[n]=FB([{...e,id:t,parentId:e.parentId??null}].concat(d().cycleRules.filter(e=>e.id!==t))).filter(e=>e.id===t);if(!n)throw new OE(`invalid_argument`,{reason:`not a valid cycle rule (or its parent is missing)`});return i.set(e=>({...e,cycleRules:e.cycleRules.some(e=>e.id===t)?e.cycleRules.map(e=>e.id===t?n:e):[...e.cycleRules,n]})),t},remove(e){l();let t=new Set([e]);for(let e=!0;e;){e=!1;for(let n of d().cycleRules)n.parentId&&t.has(n.parentId)&&!t.has(n.id)&&(t.add(n.id),e=!0)}i.set(e=>({...e,cycleRules:e.cycleRules.filter(e=>!t.has(e.id))}))}},be={create(e){l();let n=d(),r=n.limits.maxMathChannels;r!==null&&n.mathChannels.length>=r&&u(`math-channels`);let o=sr(e);return i.set(e=>({...e,mathChannels:[...e.mathChannels,o]})),Promise.resolve(t.mathChannels?.create(o)).catch(e=>a.emit(`error`,{error:e,context:`mathChannels.create`})),o},update(e,n){l();let r=d().mathChannels.find(t=>t.id===e);if(!r)throw new OE(`not_found`,{channelId:e});i.set(t=>({...t,mathChannels:t.mathChannels.map(t=>t.id===e?{...t,...n,updatedAt:Date.now()}:t)})),r.source!==`workbook`&&Promise.resolve(t.mathChannels?.update(e,n)).catch(e=>a.emit(`error`,{error:e,context:`mathChannels.update`}))},remove(e){l();let n=d().mathChannels.find(t=>t.id===e);if(!n)throw new OE(`not_found`,{channelId:e});i.set(t=>({...t,mathChannels:t.mathChannels.filter(t=>t.id!==e)})),n.source!==`workbook`&&Promise.resolve(t.mathChannels?.remove(e)).catch(e=>a.emit(`error`,{error:e,context:`mathChannels.remove`}))},async importFile(e){l();let{channels:n,errors:r}=await wE(e),a=d(),o=a.limits.maxMathChannels===null?n.length:Math.max(0,a.limits.maxMathChannels-a.mathChannels.length);n.length>0&&o===0&&u(`math-channels`);let s=n.slice(0,o);return i.set(e=>({...e,mathChannels:[...e.mathChannels,...s]})),await t.mathChannels?.importMany(s),{channels:s,errors:r}},async importMany(e){l();let n=d(),r=n.limits.maxMathChannels===null?e.length:Math.max(0,n.limits.maxMathChannels-n.mathChannels.length);e.length>0&&r===0&&u(`math-channels`);let a=e.slice(0,r);return i.set(e=>({...e,mathChannels:[...e.mathChannels,...a]})),await t.mathChannels?.importMany(a),a},exportBlob:()=>SE(d().mathChannels),preview(e,t){let n=m();return n.merged?nE(e,n.merged,N(t).xKey,n.channels.filter(t=>t.id!==e.id)):null},sync(e){l(),i.set(t=>{let n=t.mathChannels.filter(e=>e.source===`workbook`),r=n.length?[...e,...n]:e;return t.mathChannels===r?t:{...t,mathChannels:r}})}},xe=xQ((e,t)=>[...e.flatMap(e=>e.kind===`camera`&&e.video?[EE({...e,video:e.video})]:[]),...t]),Se=``;i.subscribe(()=>{let e=xe(d().live,d().video),t=e.map(e=>`${e.kind}:${e.id}:${e.recordingId??``}:${e.name}`).join(`|`);t!==Se&&(Se=t,a.emit(`videochange`,{sources:e}))});let Ce=(e,t,n)=>e.id===t&&(n===void 0||(e.recordingId??null)===n),we={sources:()=>xe(d().live,d().video),register(e){l(),i.set(t=>({...t,video:[...t.video.filter(t=>!Ce(t,e.id,e.recordingId??null)),e]}))},unregister(e,t){l(),i.set(n=>n.video.some(n=>Ce(n,e,t))?{...n,video:n.video.filter(n=>!Ce(n,e,t))}:n)}},Te={openLocal(e,t){return l(),z.openLocal(e,t)},async connect(e,t,n){l(),await z.connect(e,t,n)},startRecording(e){l(),z.startRecording(e)},stopRecording(e){return l(),z.stopRecording(e)},setSegmentAxis(e,t){l(),z.setSegmentAxis(e,t)},rowCount(e){return z.connections().find(t=>t.id===e)?.source.size()??0},disconnect(e){l(),z.disconnect(e),L(d().selection.filter(t=>t!==e))}},Ee=()=>{d().limits.canImportExportWorkspaces||u(`workspaces-io`)},De=async e=>{if(e instanceof Blob)try{return JSON.parse(await e.text())}catch{throw new OE(`bad_file`)}if(typeof e==`string`)try{return JSON.parse(e)}catch{throw new OE(`bad_file`)}return e},Oe=async e=>e instanceof File?e:new File([JSON.stringify(await De(e))],`import.json`,{type:`application/json`}),ke=e=>e.replace(/[^\w.-]+/g,`_`),Ae=e=>new Blob([JSON.stringify(e,null,2)],{type:`application/json`}),je=e=>{let t=rr(e.panelChartSettings,R$[2],4),n={};for(let r of e.panels)t[r.id]?.kind===r.kind&&(n[r.id]=t[r.id]);return{...e,panelChartSettings:ir(e.panels,n,R$[2],4)}},Me=e=>{let t=m().numericColumns;return t.length?W$(e,t):e},Ne=(e,t=0)=>{let n=d().limits.maxWorksheets,r=(n===null?e:e.slice(0,Math.max(1,n))).map(e=>Me(je(e))),a=r[Math.min(t,r.length-1)];i.set(e=>({...e,worksheets:r,activeWorksheetId:a.id,xRanges:{}}))},Pe=(e,t)=>{let n=N(t),r=d().limits.maxChartsPerWorksheet;r!==null&&n.panels.length>=r&&u(`charts-per-worksheet`);let i=d().limits.maxChannelsPerChart;i!==null&&Sz(e.settings)>i&&u(`channels-per-chart`);let a=crypto.randomUUID(),o={id:a,kind:e.kind,rect:{x:0,y:0,w:6,h:24},...e.title?{title:e.title}:{}};return F(n.id,t=>({...t,panels:Qt([...t.panels,o]),panelChartSettings:{...t.panelChartSettings,[a]:e.settings},panelChartBackgrounds:e.background===null?t.panelChartBackgrounds:{...t.panelChartBackgrounds,[a]:e.background}})),a},Fe=()=>{let e=d();return oV({worksheets:e.worksheets,activeWorksheetId:e.activeWorksheetId,channels:te(p(e.mathChannels,e.limits.maxMathChannels),e.worksheets),liveWindowSeconds:e.liveWindowSeconds,laps:e.datasets.find(e=>e.beacon)?.beacon??null,segments:e.segmentContext,cycles:e.cycleRules})},Ie=e=>{if(e.worksheets.length===0)throw new OE(`bad_workspace`,{errors:e.errors});let{channels:t,rename:n}=B$(d().mathChannels,e.mathChannels);Ne(n.size?e.worksheets.map(e=>V$(e,n)):e.worksheets,e.activeIndex),i.set(n=>({...n,mathChannels:[...n.mathChannels.filter(e=>e.source!==`workbook`),...t],liveWindowSeconds:e.liveWindowSeconds===void 0?n.liveWindowSeconds:e.liveWindowSeconds,segmentContext:e.segments??null,cycleRules:e.cycles}));let r=e.laps;if(r)for(let e of d().datasets)e.kind!==`memory`||e.beacon||!e.data.columnNames.includes(r.channel)||de.configure(e.id,{beacon:r}).catch(e=>a.emit(`error`,{error:e,context:`io.openWorkbook`}));return{worksheets:e.worksheets.length,errors:e.errors}},Le=e=>{if(e===null)return;let t=e.worksheets.map(Me);S=!0;try{i.set(n=>{let r=t=>e.worksheets.some(e=>e.id===t);return{...n,worksheets:t,activeWorksheetId:r(n.activeWorksheetId)?n.activeWorksheetId:r(e.activeWorksheetId)?e.activeWorksheetId:e.worksheets[0].id,xRanges:Object.fromEntries(Object.entries(n.xRanges).filter(([e])=>r(e))),mathChannels:[...n.mathChannels.filter(e=>e.source!==`workbook`),...e.channels],liveWindowSeconds:e.liveWindowSeconds}})}finally{S=!1}E=T(d()),x.rebase(D()),O()},Re={undo(){l(),Le(x.undo())},redo(){l(),Le(x.redo())},clear(){l(),A()}},Be={hasWork:()=>_V(d().worksheets),exportWorksheet(e){l(),Ee();let t=N(e),n=sV(t);return{json:n,blob:Ae(n),filename:`${ke(t.name||`worksheet`)}.json`}},exportChart(e){l(),Ee();let{ws:t,panel:n}=P(e),r=cV(n,t.panelChartSettings[e],t.panelChartBackgrounds[e]??null);return{json:r,blob:Ae(r),filename:`${ke(n.title?.trim()||n.kind)}.json`}},parseFile:e=>bV(e),exportWorkspace(){l(),Ee();let e=Fe();return{json:e,blob:Ae(e),filename:`kymoscope-workspace-${new Date().toISOString().slice(0,10)}.json`}},async exportWorkspaceEncrypted(e){l(),Ee();let t=typeof e==`string`?await XB(Fe(),e):await ZB(Fe(),e);return{json:t,blob:Ae(t),filename:`kymoscope-workbook-${new Date().toISOString().slice(0,10)}.kymo`}},async importWorkspace(e,t={}){l(),Ee();let n=await De(e);return QB(n)&&(n=await tV(n,t)),j(()=>Ie(gV(n)))},toWorkbook:Fe,openWorkbook(e){return l(),j(()=>Ie(gV(e)))},async importWorksheet(e){l(),Ee();let t=d();t.limits.maxWorksheets!==null&&t.worksheets.length>=t.limits.maxWorksheets&&u(`worksheets`);let n=await bV(await Oe(e));if(n.type!==`worksheet`)throw new OE(`bad_file`,{found:n.type});let r=Me(je(n.worksheet));return i.set(e=>({...e,worksheets:[...e.worksheets,r],activeWorksheetId:r.id})),r.id},async importChart(e,t){l(),Ee();let n=await bV(await Oe(e));if(n.type!==`chart`)throw new OE(`bad_file`,{found:n.type});return Pe(n.chart,t)},snapshot(){let e=d();return{datasets:e.datasets,worksheets:e.worksheets,activeWorksheetId:e.activeWorksheetId,selection:e.selection}},restore(e){l();let t=new Set(e.datasets);for(let e of d().datasets)t.has(e)||e.source.dispose().catch(()=>void 0);let n=e.worksheets.length?e.worksheets.map(je):[z$()];j(()=>i.set(t=>({...t,datasets:e.datasets,worksheets:n,activeWorksheetId:n.some(t=>t.id===e.activeWorksheetId)?e.activeWorksheetId:n[0].id,selection:e.selection,xRanges:{},offsets:{},colors:{}})))},reset(){l(),j(()=>{oe(d().datasets.map(e=>e.id));let e=z$();i.set(t=>({...t,worksheets:[e],activeWorksheetId:e.id,xRanges:{},offsets:{},colors:{},mathChannels:t.mathChannels.filter(e=>e.source!==`workbook`)}))})}},Ve={merged(e){let t=m();if(!t.merged||t.channels.length===0)return t.merged;let n=bE(t.merged,t.channels,N(e).xKey);return{...t.merged,columnNames:[...t.merged.columnNames,...n.ok.map(e=>e.name)],units:[...t.merged.units,...n.ok.map(e=>e.units)],rows:n.rows}},plotted(){return m().merged}},He=typeof location<`u`?location.hostname:``,Ue=t.license,We=t.licenseKey,Ge=!1,Ke={},Je=e=>{n||i.set(t=>({...t,licensed:e}))},Ye=(e,t,n)=>{clearTimeout(Ke[e]);let r=Math.max(0,t-Date.now()),i=r>2**31-1;Ke[e]=setTimeout(()=>{i?Ye(e,t,n):n()},i?2**31-1:r)},Xe=e=>Ye(`renew`,e,()=>void Qe()),Ze=e=>Ye(`expiry`,e*1e3+1e3,()=>{NV(We,He).then(e=>{n||Je(e.ok)})});async function Qe(){let e=36e5,t,r=null,i;try{t=await Promise.race([Ue.get(),new Promise((e,t)=>{i=setTimeout(()=>t(Error(`timeout`)),3e4)})]),r=await NV(t,He)}catch{}finally{clearTimeout(i)}if(n)return!1;if(r?.ok)return We=t,Ge=!0,Je(!0),Ze(r.exp),Xe(Math.max(r.exp*1e3-168*e,Date.now()+e)),!0;console.warn(`[kymoscope] license renewal failed (${r?r.reason:`license.get failed or timed out`}): keeping the current key`);let a=await NV(We,He);return n?!1:(Je(a.ok),Xe(Date.now()+e),a.ok)}let $e=!Ue||t.licenseKey?NV(t.licenseKey,He).then(e=>(e.ok||console.warn(`[kymoscope] license ${e.reason}: showing attribution`),!Ge&&!n&&(Je(e.ok),e.ok&&Ue&&Ze(e.exp)),e.ok)):null,et=Ue?Qe():$e;S=!1,A();let tt={getState:M,subscribe(e){return i.subscribe(e)},on:a.on,licensed:et,isLicensed:()=>d().licensed,setOptions(e){if(l(),t={...t,...e},e.live&&z.setRelay(e.live.relay),e.palette&&o(),e.limits){let t={...d().limits,...e.limits};i.set(e=>{let n=t.maxWorksheets===null?e.worksheets:e.worksheets.slice(0,Math.max(1,t.maxWorksheets)),r=n.some(t=>t.id===e.activeWorksheetId)?e.activeWorksheetId:n[0].id;return{...e,limits:t,activeWorksheetId:r}})}},datasets:de,folders:me,worksheets:he,charts:ge,view:ve,mathChannels:be,cycles:ye,live:Te,video:we,io:Be,history:Re,data:Ve,alerts:{setRules:e=>{l();let t=ce.setRules(e);return i.set(e=>({...e,alertRules:ce.rules()})),t},rules:ce.rules,state:ce.state,evaluate:(e,t)=>(l(),ce.evaluate(e,t)),clearMarks:ce.clearMarks},marks:{list:()=>d().marks},dispose(){if(!n){n=!0,clearTimeout(Ke.renew),clearTimeout(Ke.expiry),s(),rQ(tt),PZ(tt),z.dispose();for(let e of d().datasets)e.source.dispose().catch(()=>void 0);a.emit(`dispose`,void 0),a.clear()}}};return J$.set(tt,{store:i,derived:m,live:z,alertLines:()=>le(d().alertRules,d().alerts)}),tt}var J$=new WeakMap;function Y$(e){let t=J$.get(e);if(!t)throw new OE(`invalid_argument`,{reason:`not a Kymoscope engine`});return t}var X$=2e3,Z$=3;function Q$(e){let t=e[0].v.fragCount,n=new Map;for(let r of e)r.v.fragCount===t&&!n.has(r.v.fragIndex)&&n.set(r.v.fragIndex,r);let r=[];for(let e=0;e<t;e++){let t=n.get(e);if(!t)return null;r.push(t.v.payload)}let i=n.get(0),a=r[0];if(t>1){a=new Uint8Array(r.reduce((e,t)=>e+t.length,0));for(let e=0,n=0;e<t;e++)a.set(r[e],n),n+=r[e].length}return{t:i.v.t,seq:i.v.seq,key:i.v.key,data:a,arrivedAt:i.at}}function $$(e){let t=[],n=0;for(;n<e.length&&e[n].v.fragIndex>0&&e[n].v.seq===e[0].v.seq;)t.push(e[n++]);let r=[],i=[],a=[];for(;n<=e.length;n++){let t=e[n];if(a.length&&(!t||t.v.seq!==a[0].v.seq)){let e=Q$(a);e?r.push(e):t||(i=a),a=[]}t&&a.push(t)}return{head:t,units:r,tail:i}}var e1=class{kind=`recorded`;id;name;parentId;parentName;recordingId;chunks;fetch;open;maxBytes;cache=new Map;sizes=new Map;bytes=0;width=0;height=0;codec=``;waiting=null;constructor(e){this.id=e.id,this.name=e.name,this.parentId=e.parentId,this.parentName=e.parentName??null,this.recordingId=e.recordingId,this.chunks=[...e.chunks].sort((e,t)=>e.seq-t.seq),this.fetch=e.fetchChunk,this.open=e.open,this.maxBytes=e.maxBytes??256*1024*1024}async parse(e){let t=new Uint8Array(await this.fetch(this.chunks[e].seq)),n=[];for(let e of ae(t).messages){let t=null;try{t=await ye(this.open,e.bytes.slice().buffer)}catch{}if(t?.kind!==6)continue;let r=BQ(t.plaintext);r&&(r.key&&r.fragIndex===0&&!this.codec&&(this.codec=r.codec,this.width=r.width,this.height=r.height),n.push({v:r,at:e.at}))}let r=$$(n),i=e=>e.reduce((e,t)=>e+t.v.payload.length,0);return{...r,bytes:r.units.reduce((e,t)=>e+t.data.length,0)+i(r.head)+i(r.tail)}}parsed(e){let t=this.cache.get(e);if(t)return this.cache.delete(e),this.cache.set(e,t),t;let n=this.parse(e);return this.cache.set(e,n),n.then(t=>{this.cache.get(e)===n&&(this.sizes.set(e,[t.bytes,t.units.length]),this.bytes+=t.bytes,this.evict(e))},()=>{this.cache.get(e)===n&&this.cache.delete(e)}),n}evict(e){for(let t of this.cache.keys()){if(this.bytes<=this.maxBytes)return;let n=this.sizes.get(t);t===e||!n||(this.bytes-=n[0],this.sizes.delete(t),this.cache.delete(t))}}async units(e){let t;try{t=await this.parsed(e)}catch{return[]}if(t.full)return t.full;if(!t.tail.length||e+1>=this.chunks.length)return t.full=t.units;let n=await this.parsed(e+1).catch(()=>null);if(!n)return t.units;let r=null;try{r=Q$([...t.tail,...n.head.filter(e=>e.v.seq===t.tail[0].v.seq)])}catch{}return t.full=r?[...t.units,r]:t.units}async seekPlan(e){let t=this.chunks.length;if(!t)return[];let n=e*1e3,r=0;for(;r+1<t&&this.chunks[r+1].t0<=n;)r++;let i=r,a=r+1<t&&this.chunks[r+1].t0-n<X$?r+1:r,o=(await Promise.all(Array.from({length:a-i+1},(e,t)=>this.units(i+t)))).flat(),s=()=>{let t=o.length-1;for(;t>=0&&o[t].t>e;)t--;let n=t;for(;n>=0&&!o[n].key;)n--;return[n,t]},[c,l]=s();for(let e=0;c<0&&i>0&&e<Z$;e++)o=[...await this.units(--i),...o],[c,l]=s();return a+1<t&&this.units(a+1),c<0?[]:o.slice(c,l+1)}ready(){return this.waiting??=(async()=>{for(let e=0;e<Math.min(this.chunks.length,Z$+1)&&!this.codec;e++)await this.units(e);this.codec||(this.waiting=null)})()}info(){let e=0;for(let[,t]of this.sizes.values())e+=t;return{width:this.width,height:this.height,codec:this.codec,latestT:this.range()?.[1]??null,lagMs:null,units:e,bytes:this.bytes}}range(){let e=this.chunks.length;return e?[this.chunks[0].t0/1e3,this.chunks[e-1].t1/1e3]:null}},t1=1e4,n1=72e4,r1=3e5,i1=3e4,a1=1e4,o1=1e4,s1=64*1024,c1=50,l1=class extends Error{status;code;detail;constructor(e,t,n){super(`${n} (${t})`),this.status=e,this.code=t,this.detail=n}},u1=e=>Uint8Array.from(atob(e),e=>e.charCodeAt(0)),d1=class{opts;deps;auth;secret;password;token=``;ticket=``;ticketRec=!1;authRec=!1;relayUrl=null;apiKeyId=null;projectId=null;e2ee=!1;sid=null;salt=``;key=null;raw=null;epoch=0;haveKey=!1;sealed=null;device=null;senderDeviceId=null;deviceRetried=!1;maxBytesPerSec=0;maxMessageBytes=s1;ws=null;open=!1;everOpen=!1;connectedAt=0;authAt=0;delay=1e3;lastToken=0;viewerCount=0;busy=!1;stopped=!1;refusal=null;heartbeatTimer=null;pingTimer=null;retryTimer=null;statusFns=new Set;viewerFns=new Set;lastStatus=``;constructor(e,t){let{auth:n,secret:r}=ue(e.apiKey);if(!r)throw Error(`This API key has no encryption secret (created before keys carried one). Create a new API key in Kymoscope.`);if(e.kind===`camera`&&!e.parentStreamId)throw Error(`A camera is added to one of your live streams: choose its stream (parentStreamId).`);if(!!e.layer!=!!e.lowOf)throw Error(`A low layer needs both layer: 'low' and lowOf (its high camera's stream id).`);if(e.layer&&e.kind!==`camera`)throw Error(`Only a camera has a low layer.`);if(e.visibility===`open`&&e.password)throw Error(`An open stream has no password: anyone may watch it. Remove the password, or use visibility 'private'.`);this.opts=e,this.deps=t,this.auth=n,this.secret=r,this.password=e.visibility===`open`?Ce:e.password||r}get streamId(){return this.sid}get viewers(){return this.viewerCount}get limits(){return{maxBytesPerSec:this.maxBytesPerSec,maxMessageBytes:this.maxMessageBytes}}onStatus(e){return this.statusFns.add(e),()=>{this.statusFns.delete(e)}}onViewers(e){return this.viewerFns.add(e),()=>{this.viewerFns.delete(e)}}async start(){this.emit();try{let e=await this.deps.store.load();this.salt=e?.salt??L();let t=await this.mint();this.token=t.token,this.relayUrl=t.relayUrl??null,this.maxBytesPerSec=t.maxBytesPerSec||0,this.maxMessageBytes=t.maxMessageBytes||s1,this.apiKeyId=t.apiKeyId??null;let n=t.project;this.e2ee=!!n?.e2ee;let r={};if(this.e2ee){this.projectId=n?.id??null;let t=e?.apiKeyId===this.apiKeyId;this.device=t&&e?.device||await Qe(),t&&e?.streamKey?{key:this.key,epoch:this.epoch,sealed:this.sealed}=e.streamKey:this.key=await z(O()),r.sender_device=await this.senderDevice()}else this.raw=u1(await _(this.password,this.salt)),this.key=await z(this.raw);let i=await this.register(e?.streamId??null,r);if(this.sid=i.stream.id,this.ticket=i.ticket,this.ticketRec=!!i.recording,this.e2ee?(this.senderDeviceId=i.sender_device_id??null,this.projectId=i.project?.id??this.projectId,await this.save(),await this.applyProject(i.project)):(await this.save(),await this.wrapFor(i.devices)),!this.relayUrl)throw Error(`stream-token returned no relayUrl`)}catch(e){throw e instanceof l1&&e.status>=400&&e.status<500&&this.refuse(e),e}this.stopped||(this.lastToken=this.deps.now(),this.connect(),this.heartbeatTimer=setInterval(()=>{this.housekeeping()},t1),this.emit())}async send(e,t){let n=this.key,r=this.e2ee?this.epoch&255:void 0;if(this.stopped||!this.open||!n||this.e2ee&&!this.haveKey)return!1;let i=await _e(n,e,t,r),a=this.ws;if(!this.open||!a)return!1;try{return a.send(i),!0}catch{return!1}}stop(){this.stopped=!0,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.retryTimer&&clearTimeout(this.retryTimer),this.heartbeatTimer=this.retryTimer=null;let e=this.ws;if(this.disconnect(),e){e.onopen=e.onmessage=e.onclose=null;try{e.close(1e3)}catch{}}}async post(e,t,n){let r;try{r=await this.deps.fetch(`${this.opts.supabaseUrl.replace(/\/+$/,``)}/functions/v1/${e}`,{method:`POST`,headers:t,body:n===void 0?void 0:JSON.stringify(n)})}catch(e){throw new l1(0,`network`,e?.message??String(e))}let i=await r.text(),a=null;try{a=JSON.parse(i)}catch{}if(r.status!==200)throw new l1(r.status,a?.error??`error`,a?.message??a?.error??i);return a}mint(){return this.post(`stream-token`,{"x-api-key":this.auth})}call(e){return this.post(`stream-publisher`,{Authorization:`Bearer ${this.token}`,"Content-Type":`application/json`},e)}async register(e,t){let n={action:`register`,name:this.opts.name,salt:this.salt,key_check:await p(this.key),visibility:this.opts.visibility??`private`,kind:this.opts.kind,...t};return this.opts.kind===`camera`&&(n.parent_stream_id=this.opts.parentStreamId),this.opts.layer&&(n.layer=this.opts.layer,n.low_of=this.opts.lowOf),e&&(n.stream_id=e),this.call(n)}async senderDevice(){let e=this.device.publicKey;return{public_key:e,binding:await He(await Fe(this.secret),this.apiKeyId??``,e)}}async housekeeping(){if(!(this.busy||this.stopped)){this.busy=!0;try{let e=this.deps.now();if(e-this.lastToken>=n1){this.lastToken=e;try{this.token=(await this.mint()).token}catch{return}}if(this.e2ee){let e=await this.call({action:`heartbeat`,stream_id:this.sid,sender_device_id:this.senderDeviceId,epoch:this.haveKey?this.epoch:0});this.setTicket(e.ticket,!!e.recording),await this.applyProject(e.project)}else{let e=await this.call({action:`heartbeat`,stream_id:this.sid});this.setTicket(e.ticket,!!e.recording),await this.wrapFor(e.devices)}}catch(e){e instanceof l1&&(e.status===401||e.status===403)&&this.refuse(e)}finally{this.busy=!1}}}async wrapFor(e){let t=[];for(let n of e??[])try{t.push({device_id:n.id,wrapped:await ve(n.public_key,this.raw,`${this.sid}|${n.id}`)})}catch{}if(t.length)try{await this.call({action:`wrap_keys`,stream_id:this.sid,keys:t.slice(0,c1)})}catch{}}async applyProject(e){if(!this.e2ee||!e)return;let t=e.key;if(!t){this.emit();return}let n=Number(t.epoch);if(this.haveKey&&n<=this.epoch)return;let r;try{r=await Ke(this.device.privateKey,t.wrapped,ne(this.projectId,n,this.senderDeviceId))}catch{if(this.deviceRetried)return;this.deviceRetried=!0,this.device=await Qe(),await this.reregister();return}let i=Oe(this.sid,this.projectId,n),a=this.key,o=n===this.epoch?this.sealed:null;if(o)try{await b(r,o,i)}catch{o=null}if(!o){let e=O();a=await z(e),o=await Ve(r,e,i),e.fill(0)}try{await this.call({action:`wrap_keys`,stream_id:this.sid,sender_device_id:this.senderDeviceId,project_wrap:{epoch:n,iv:o.iv,ct:o.ct}})}catch{return}this.stopped||(this.key=a,this.sealed=o,this.epoch=n,this.haveKey=!0,await this.save(),this.emit())}async reregister(){let e;try{e=await this.register(this.sid,{sender_device:await this.senderDevice()})}catch{return}this.ticket=e.ticket,this.ticketRec=!!e.recording,this.senderDeviceId=e.sender_device_id??null,await this.save(),await this.applyProject(e.project),this.deviceRetried=!1}async save(){try{await this.deps.store.save({apiKeyId:this.apiKeyId,streamId:this.sid,salt:this.salt,device:this.e2ee?this.device:null,streamKey:this.e2ee&&this.haveKey?{epoch:this.epoch,key:this.key,sealed:this.sealed}:null})}catch{}}connect(){if(this.retryTimer=null,this.stopped)return;let e=this.relayUrl.replace(/\/+$/,``).replace(/^http(s?):\/\//,`ws$1://`),t;try{t=new this.deps.WebSocket(`${e}/v1/streams/${this.sid}/publish`,[EQ,`bearer.${this.ticket}`])}catch{this.dropped();return}t.binaryType=`arraybuffer`,this.ws=t,t.onopen=()=>{t===this.ws&&(this.open=this.everOpen=!0,this.connectedAt=this.authAt=this.deps.now(),this.authRec=this.ticketRec,this.pingTimer=setInterval(()=>{try{t.send(`ping`)}catch{}},i1),this.emit())},t.onmessage=e=>{if(!(t!==this.ws||typeof e.data!=`string`||!e.data.startsWith(`{`)))try{let t=JSON.parse(e.data);t?.type===`viewers`&&this.setViewers(Number(t.count)||0)}catch{}},t.onclose=()=>{t===this.ws&&this.dropped()}}disconnect(){this.ws=null,this.open=!1,this.pingTimer&&clearInterval(this.pingTimer),this.pingTimer=null,this.setViewers(0)}dropped(){let e=this.open&&this.deps.now()-this.connectedAt>=o1;if(this.disconnect(),this.stopped)return;let t=0;e?this.delay=1e3:(t=this.delay,this.delay=Math.min(this.delay*2,a1)),this.retryTimer=setTimeout(()=>this.connect(),t),this.emit()}setTicket(e,t){this.ticket=e,this.ticketRec=t;let n=this.deps.now();if(t||(this.authRec=!1),!(!this.open||!this.ws)&&!(n-this.authAt<r1&&!(t&&!this.authRec)))try{this.ws.send(JSON.stringify({type:`auth`,token:e})),this.authAt=n,this.authRec=t}catch{}}setViewers(e){if(e!==this.viewerCount){this.viewerCount=e;for(let t of this.viewerFns)t(e);this.emit()}}refuse(e){this.refusal={code:e.code,message:e.detail},this.emit(),this.stop()}status(){return this.refusal?{phase:`refused`,...this.refusal}:this.sid?this.e2ee&&!this.haveKey?{phase:`waiting_approval`}:this.open?{phase:`live`,viewers:this.viewerCount}:this.everOpen?{phase:`reconnecting`}:{phase:`registering`}:{phase:`registering`}}emit(){let e=this.status(),t=JSON.stringify(e);if(t!==this.lastStatus){this.lastStatus=t;for(let t of this.statusFns)t(e)}}},f1={"720p30":{width:1280,height:720,fps:30,kbps:2e3},"1080p30":{width:1920,height:1080,fps:30,kbps:4e3}},p1={width:640,height:360,fps:15,kbps:400},m1=[`avc1.640028`,`avc1.4d0028`,`avc1.42e028`],h1=[`avc1.64001f`,`avc1.4d001f`,`avc1.42e01f`],g1=2,_1=1e3,v1=1e3;async function*y1(e){if(typeof MediaStreamTrackProcessor<`u`){let t=new MediaStreamTrackProcessor({track:e}).readable.getReader();try{for(;;){let{value:e,done:n}=await t.read();if(n)return;yield e}}finally{t.cancel().catch(()=>{})}}let t=document.createElement(`video`);t.muted=!0,t.playsInline=!0,t.srcObject=new MediaStream([e]),await t.play();try{for(;e.readyState===`live`;)await new Promise(e=>t.requestVideoFrameCallback(()=>e())),yield new VideoFrame(t,{timestamp:Math.round(performance.now()*1e3)})}finally{t.pause(),t.srcObject=null}}function b1(){let e=null;return(t,n,r)=>(e??=new OffscreenCanvas(n,r).getContext(`2d`),e.drawImage(t,0,0,n,r),new VideoFrame(e.canvas,{timestamp:t.timestamp}))}var x1=class{encoder=null;codec=``;error=null;unsubscribe=null;lastKey=-1/0;keyPending=!1;resume=!0;lastViewers=0;encoding=!1;dropped=0;seq=0;times=new Map;window=[];sending=Promise.resolve();publisher;preset;keyframeMs;Encoder;now;constructor(e,t,n,r,i){this.publisher=e,this.preset=t,this.keyframeMs=n,this.Encoder=r,this.now=i}async configure(){let{width:e,height:t,fps:n,kbps:r}=this.preset,i=this.publisher.limits.maxBytesPerSec,a=i>0?Math.min(r*1e3,i*8/1.25):r*1e3,o=null;for(let r of t>720?m1:h1){let i={codec:r,width:e,height:t,bitrate:a,framerate:n,avc:{format:`annexb`},latencyMode:`realtime`,bitrateMode:`constant`};if((await this.Encoder.isConfigSupported(i)).supported===!0){o=i;break}}return o?(this.codec=o.codec,this.encoder=new this.Encoder({output:e=>this.onChunk(e),error:e=>{this.error=e.message||String(e),this.closeEncoder()}}),this.encoder.configure(o),this.lastViewers=this.publisher.viewers,this.unsubscribe=this.publisher.onViewers(e=>{e>this.lastViewers&&(this.keyPending=!0),this.lastViewers=e}),!0):!1}ready(){let e=this.encoder;return this.encoding=!!e&&!this.error&&this.publisher.viewers>0,!e||!this.encoding?(this.resume=!0,!1):e.encodeQueueSize>g1?(this.dropped++,!1):!0}encode(e){let t=this.now(),n=t-this.lastKey,r=this.resume||n>=this.keyframeMs||this.keyPending&&n>=_1;r&&(this.lastKey=t,this.keyPending=this.resume=!1);let i=(performance.timeOrigin+e.timestamp/1e3)/1e3;Math.abs(i-Date.now()/1e3)>60&&(i=Date.now()/1e3),this.times.set(e.timestamp,i),this.encoder.encode(e,{keyFrame:r})}onChunk(e){let t=new Uint8Array(e.byteLength);e.copyTo(t);let n=this.times.get(e.timestamp)??Date.now()/1e3;this.times.delete(e.timestamp);let{width:r,height:i}=this.preset,a=VQ({key:e.type===`key`,t:n,seq:this.seq++,width:r,height:i,codec:this.codec,data:t});for(let e of a)this.sending=this.sending.then(()=>this.publisher.send(6,e)).catch(()=>!1);this.window.push({at:this.now(),bytes:t.length})}get queue(){return this.encoder?.state===`configured`?this.encoder.encodeQueueSize:0}stats(){let e=this.now();for(;this.window.length&&e-this.window[0].at>=v1;)this.window.shift();let t=this.window.reduce((e,t)=>e+t.bytes,0);return{fps:this.window.length,kbps:t*8/1e3,viewers:this.publisher.viewers,encoding:this.encoding}}stop(){this.encoding=!1,this.closeEncoder(),this.unsubscribe?.(),this.unsubscribe=null}closeEncoder(){this.encoder&&this.encoder.state!==`closed`&&this.encoder.close()}},S1=class{high;lowOpt;low=null;lowAt=-1/0;keyframeMs;Encoder;now;frames;scale;stopped=!1;statsFns=new Set;lastStats=-1/0;constructor(e,t,n={}){this.keyframeMs=(t.keyframeS??2)*1e3,this.Encoder=n.VideoEncoder??VideoEncoder,this.now=n.now??Date.now,this.frames=n.frames??y1,this.scale=n.scale??b1(),this.high=new x1(e,t.preset,this.keyframeMs,this.Encoder,this.now),this.lowOpt=t.low?{publisher:t.low.publisher,preset:t.low.preset??p1}:null}async start(e){if(!await this.high.configure())throw new OE(`camera_codec_unsupported`);if(this.lowOpt){let e=new x1(this.lowOpt.publisher,this.lowOpt.preset,this.keyframeMs,this.Encoder,this.now);await e.configure()&&(this.low=e)}this.loop(e)}async loop(e){for await(let t of this.frames(e)){if(this.stopped){t.close();break}try{this.onFrame(t)}finally{t.close()}this.emitStats()}}onFrame(e){this.high.ready()&&this.high.encode(e);let t=this.low;if(!t)return;let n=this.now();if(n-this.lowAt<750/t.preset.fps||!t.ready())return;this.lowAt=n;let r=this.scale(e,t.preset.width,t.preset.height);try{t.encode(r)}finally{r.close()}}stats(){return{...this.high.stats(),dropped:this.high.dropped,queue:this.high.queue,error:this.high.error,low:this.low?this.low.stats():null}}onStats(e){return this.statsFns.add(e),()=>{this.statsFns.delete(e)}}emitStats(){let e=this.now();if(e-this.lastStats<v1||!this.statsFns.size)return;this.lastStats=e;let t=this.stats();for(let e of this.statsFns)e(t)}stop(){this.stopped=!0,this.high.stop(),this.low?.stop()}},C1=class{#e;constructor(e){this.#e=e}head(){let e=this.#e;return`${e.map(e=>JQ(e.name)).join(`,`)}\n${e.map(e=>JQ(e.unit)).join(`,`)}\n`}append(e){let t=e.columns,n=``;for(let r=0;r<e.length;r++){for(let e=0;e<t.length;e++){let i=t[e][r];n+=(e?`,`:``)+(Number.isNaN(i)?``:String(i))}n+=`
|
|
617
|
+
`}return n}end(){}},w1=new TextEncoder,T1=e=>e+7&-8,E1=104,D1=64,O1=104,k1=160,A1=4;function j1(e,t,n){let r=24+t.length*8+n.length,i=new Uint8Array(T1(r)),a=new DataView(i.buffer);return i.set(w1.encode(e),0),a.setBigUint64(8,BigInt(r),!0),a.setBigUint64(16,BigInt(t.length),!0),t.forEach((e,t)=>a.setBigUint64(24+t*8,BigInt(e),!0)),i.set(n,24+t.length*8),i}var M1=(e,t)=>j1(e,[],w1.encode(`${t}\0`)),N1=e=>BigInt(Math.round(e))*1000000n,P1=class{#e;#t;#n;#r=0;constructor(e,t,n){this.#e=e,this.#t=t?Date.parse(t):Date.now(),this.#n=n}append(e){let t=e.columns,n=t.length,r=new Float64Array(e.length*n);for(let i=0;i<e.length;i++)for(let e=0;e<n;e++)r[i*n+e]=t[e][i];return this.#r+=e.length,new Uint8Array(r.buffer)}end(){if(this.#r!==this.#n)throw Error(`The recording changed while it was exported (${this.#r} of ${this.#n} rows).`)}head(){let e=this.#e.length,t=[],n=64+E1,r=e=>{let r=n;return t.push(e),n+=e.length,r},i=r(M1(`##MD`,`<FHcomment><TX>Kymoscope cloud recording</TX><tool_id>Kymoscope</tool_id><tool_vendor>Kymoscope</tool_vendor><tool_version>1</tool_version></FHcomment>`)),a=new Uint8Array(16);new DataView(a.buffer).setBigUint64(0,N1(this.#t),!0);let o=r(j1(`##FH`,[0,i],a)),s=this.#e.map(e=>r(M1(`##TX`,e.name))),c=this.#e.map(e=>e.unit?r(M1(`##TX`,e.unit)):0),l=n,u=l+D1,d=this.#e.map((e,t)=>u+O1+t*k1),f=j1(`##DG`,[0,u,u+O1+e*k1,0],new Uint8Array(8)),p=new Uint8Array(32),m=new DataView(p.buffer);m.setBigUint64(8,BigInt(this.#n),!0),m.setUint32(24,e*8,!0);let h=j1(`##CG`,[0,d[0],0,0,0,0],p),g=this.#e.map((t,n)=>{let r=new Uint8Array(72),i=new DataView(r.buffer);return i.setUint8(0,n===0?2:0),i.setUint8(1,+(n===0)),i.setUint8(2,A1),i.setUint32(4,n*8,!0),i.setUint32(8,64,!0),i.setUint8(20,255),j1(`##CN`,[n+1<e?d[n+1]:0,0,s[n],0,0,0,c[n],0],r)}),_=new Uint8Array(24);_.set(w1.encode(`##DT`),0),new DataView(_.buffer).setBigUint64(8,BigInt(24+this.#n*e*8),!0);let v=new Uint8Array(64);v.set(w1.encode(`MDF 4.10 Kymoscop`),0),new DataView(v.buffer).setUint16(28,410,!0);let y=new Uint8Array(32);new DataView(y.buffer).setBigUint64(0,N1(this.#t),!0);let b=[v,j1(`##HD`,[l,o,0,0,0,0],y),...t,f,h,...g,_],x=new Uint8Array(b.reduce((e,t)=>e+t.length,0));return b.reduce((e,t)=>(x.set(t,e),e+t.length),0),x}},F1={csv:`text/csv`,mf4:`application/octet-stream`,parquet:`application/vnd.apache.parquet`};async function I1(e,t,n,r={}){let i=lz(`krc`,{main:new File(e.chunks,`${e.name}.krc`),companions:[],keys:e.keys},r.signal,r.createWorker);try{let e=await i.plan(),a=[{group:0,channels:e.groups[0].channels.map((e,t)=>t)}],o=t===`csv`?new C1(ZR(e,a)):new P1(ZR(e,a),e.startTime,e.groups[0].samples);await n(o.head()),await i.read(a,`stream`,{chunk:async e=>{await n(o.append(e))},progress:r.onProgress}),o.end()}finally{i.close()}}async function L1(e,t,n={}){let r=[];return await I1(e,t,e=>{r.push(e)},n),new Blob(r,{type:F1[t]})}var R1=(e,t)=>`khd1|${e.stream}|${e.day}|${e.kind}|${e.level}|${t}`;function z1(e){if(e.length<9)throw Error(`Not a Kymoscope day file (too short)`);let t=e.subarray(e.length-9);if(String.fromCharCode(t[5],t[6],t[7],t[8])!==`KHD1`)throw Error(`Not a Kymoscope day file`);if(t[4]!==1)throw Error(`Unknown Kymoscope day file format ${t[4]}`);return new DataView(t.buffer,t.byteOffset,4).getUint32(0,!0)}var B1=new TextEncoder;async function V1(e,t,n,r){let i=await crypto.subtle.decrypt({name:`AES-GCM`,iv:t.subarray(0,12),additionalData:B1.encode(R1(n,r))},e,t.subarray(12));return new Uint8Array(i)}async function H1(e,t,n){let r=JSON.parse(new TextDecoder().decode(le(await V1(e,t,n,`footer`))));if(r.format!==1||r.stream!==n.stream||r.day!==n.day||r.kind!==n.kind||r.level!==n.level)throw Error(`This day file belongs to another history or day`);return r}var U1=0;async function W1(e,t){let n=await RL(),r=e.map(()=>`khd_${++U1}.parquet`),i=[];try{for(let t=0;t<e.length;t++)await n.registerFileBuffer(r[t],e[t]),i.push(r[t]);let a=await n.connect();try{return await t(r,e=>a.query(e))}finally{await a.close()}}finally{for(let e of i)await n.dropFile(e).catch(()=>void 0)}}var G1=(e,t)=>e.getChild(t).toArray();function K1(){W1([],async(e,t)=>{await t(`COPY (SELECT 1::BIGINT AS t) TO 'khd_warm.parquet' (FORMAT parquet)`),await t(`SELECT t FROM read_parquet('khd_warm.parquet')`)}).catch(()=>void 0)}async function q1(e,t){return W1([e],async([e],n)=>{let r=await n(`SELECT (t::DOUBLE / 1e6) AS t${t.map(e=>`, coalesce("c${e}", 'NaN'::FLOAT) AS "c${e}"`).join(``)} FROM read_parquet('${e}') ORDER BY t`);return{t:Float64Array.from(G1(r,`t`)),cols:t.map(e=>Float32Array.from(G1(r,`c${e}`)))}})}async function J1(e){return e.some(e=>e.channels.length)?W1(e.map(e=>e.bytes),async(t,n)=>{let r=await n(`SELECT k, (t::DOUBLE / 1e6) AS t, ch, "min", "max" FROM (${t.flatMap((t,n)=>e[n].channels.length?[`SELECT ${n} AS k, t, ch, "min", "max" FROM read_parquet('${t}') WHERE ch IN (${e[n].channels.join(`,`)})`]:[]).join(` UNION ALL `)}) ORDER BY k, ch, t`),i=G1(r,`k`),a=G1(r,`t`),o=G1(r,`ch`),s=G1(r,`min`),c=G1(r,`max`),l=[];for(let t=0,n=0;t<e.length;t++){let e=n;for(;e<i.length&&i[e]===t;)e++;l.push({t:Float64Array.from({length:e-n},(e,t)=>a[n+t]),ch:Int32Array.from({length:e-n},(e,t)=>o[n+t]),min:Float32Array.from({length:e-n},(e,t)=>s[n+t]),max:Float32Array.from({length:e-n},(e,t)=>c[n+t])}),n=e}return l}):e.map(()=>({t:new Float64Array,ch:new Int32Array,min:new Float32Array,max:new Float32Array}))}var Y1=2*1024**3;async function X1(){try{return await(await navigator.storage.getDirectory()).getDirectoryHandle(`kymoscope-history`,{create:!0})}catch{return null}}async function Z1(){try{let e=(await navigator.storage.estimate()).quota??0;return e>0?Math.min(Y1,e*.2):Y1}catch{return Y1}}function Q1(e=X1,t=Z1){let n=null,r=null,i=0,a=()=>n??=e().catch(()=>null),o=e=>e.replace(/[^A-Za-z0-9._-]/g,`_`),s=()=>r??=(async()=>{let e=new Map,t=await a();if(i=0,t)for await(let[n,r]of t.entries()){if(r.kind!==`file`||!r.getFile)continue;let t=await r.getFile();e.set(n,{size:t.size,at:t.lastModified}),i+=t.size}return e})().catch(e=>{throw r=null,e});return{async get(e){try{let t=await a();return t?new Uint8Array(await(await(await t.getFileHandle(o(e))).getFile()).arrayBuffer()):null}catch{return null}},async put(e,n){try{let r=await a();if(!r)return;let c=await s(),l=o(e),u=await(await r.getFileHandle(l,{create:!0})).createWritable();try{await u.write(n),await u.close()}catch(e){throw await u.abort?.().catch(()=>void 0),e}i+=n.length-(c.get(l)?.size??0),c.set(l,{size:n.length,at:Date.now()});let d=await t();if(i<=d)return;for(let[e,t]of[...c].sort((e,t)=>e[1].at-t[1].at)){if(i<=d*.9)break;try{await r.removeEntry(e)}catch{continue}c.delete(e),i-=t.size}}catch{}}}}var $1=16,e0=2e3,t0=512*1024,n0=64*1024,r0=64*1024,i0=8*1024*1024;function a0(e,t=e0){for(let n of[3600,60])if(e/n>=t/2)return n;return 0}var o0={0:[0,60,3600],60:[60,3600,0],3600:[3600,60,0]};function s0(e,t){let n=new Map;for(let t of e)n.set(t.day,[...n.get(t.day)??[],t]);let r=[];for(let[,e]of[...n].sort((e,t)=>e[0].localeCompare(t[0]))){let n=o0[t].map(t=>e.find(e=>e.level===t)).find(Boolean);n&&r.push(n)}return r}async function c0(e,t,n){let r=Array(e.length),i=0;return await Promise.all(Array.from({length:Math.min(t,e.length)},async()=>{for(;i<e.length;){let t=i++;r[t]=await n(e[t])}})),r}function l0(e){let t=[];for(let n of[...e].sort((e,t)=>e.off-t.off)){let e=t[t.length-1];e&&n.off-e.end<=r0&&n.off+n.len-e.start<=i0?e.end=Math.max(e.end,n.off+n.len):t.push({start:n.off,end:n.off+n.len})}return t}var u0=(e,t)=>({stream:e.historyStreamId,day:t.day,kind:t.kind,level:t.level}),d0=(e,t)=>async(n,r,i)=>{let a=t.get(n.id);return a?a.subarray(r,i):(e.signal?.throwIfAborted(),e.fetchRange(n.id,r,i,e.signal))};async function f0(e,t,n=new Map){let r=e.footers?.get(t.id);if(r)return r;let i=await e.cache?.get(`${t.id}/footer`)??null;if(!i){t.bytes<=t0&&n.set(t.id,await e.fetchRange(t.id,0,t.bytes,e.signal));let r=d0(e,n),a=await r(t,Math.max(0,t.bytes-n0),t.bytes),o=z1(a);i=o+9<=a.length?a.slice(a.length-9-o,a.length-9):(await r(t,t.bytes-9-o,t.bytes-9)).slice(),await e.cache?.put(`${t.id}/footer`,i)}let a=await H1(await e.key(t.keyId),i,u0(e,t));return e.footers?.set(t.id,a),a}var p0=e=>e?.code===`missing`;async function m0(e){let t=async()=>{let t=s0(e.segments,e.level).map(e=>e.id).join(),n=await e.relist();return s0(n,e.level).map(e=>e.id).join()===t?null:n},n,r;try{n=await h0(e)}catch(n){if(!e.relist||e.signal?.aborted||!(r=await t()))throw n;return h0({...e,segments:r})}return!n.missingDays.length||!e.relist||e.signal?.aborted||!(r=await t())?n:h0({...e,segments:r})}async function h0(e){let t=s0(e.segments,e.level),n=new Set(e.channels),r=new Map,i=d0(e,r),a=new Set,o=async(t,n)=>{try{return await n()}catch(n){if(e.onMissing!==`gap`||!p0(n))throw n;return a.add(t.id),null}},s=await c0(t,16,t=>o(t,()=>f0(e,t,r))),c={},l={},u=[];t.forEach((t,r)=>{let i=s[r];if(i){l[t.day]=t.level;for(let e of i.channels)n.has(e.n)&&e.u&&!c[e.n]&&(c[e.n]=e.u);i.blocks.forEach((r,a)=>{if(r.t1<e.t0||r.t0>e.t1)return;let o=r.ch.filter(e=>n.has(i.channels[e].n));o.length&&u.push({s:t,f:i,i:a,chs:o})})}});let d=new Map;await c0(u,16,async t=>{let n=await e.cache?.get(`${t.s.id}/${t.i}`);n&&d.set(t,n)});let f=new Map;for(let e of u)d.has(e)||f.set(e.s.id,[...f.get(e.s.id)??[],e]);await c0([...f.values()].flatMap(e=>l0(e.map(e=>e.f.blocks[e.i])).map(t=>({js:e,r:t}))),16,async({js:t,r:n})=>{let r=await o(t[0].s,()=>i(t[0].s,n.start,n.end));if(r)for(let i of t){let t=i.f.blocks[i.i];if(t.off<n.start||t.off+t.len>n.end)continue;let a=r.slice(t.off-n.start,t.off-n.start+t.len);d.set(i,a),e.cacheWrite!==!1&&await e.cache?.put(`${i.s.id}/${i.i}`,a)}});let p=[],m=[];return await c0(u.filter(e=>!a.has(e.s.id)),16,async t=>{let n=await V1(await e.key(t.s.keyId),d.get(t),u0(e,t.s),t.i);if(t.s.kind===`rollup`){m.push({j:t,plain:n});return}let r=await q1(n,t.chs),i=new Map(t.chs.map((e,n)=>[t.f.channels[e].n,r.cols[n]])),a=oQ({t:r.t,lo:i,hi:i,level:0},e.t0,e.t1);a&&p.push(a)}),(await J1(m.map(e=>({bytes:e.plain,channels:e.j.chs})))).forEach((t,n)=>{let{j:r}=m[n],i=r.s.level/2;for(let n=0;n<t.ch.length;){let a=n;for(;a<t.ch.length&&t.ch[a]===t.ch[n];)a++;let o=r.f.channels[t.ch[n]].n,s=oQ({t:t.t.slice(n,a).map(e=>e+i),lo:new Map([[o,t.min.slice(n,a)]]),hi:new Map([[o,t.max.slice(n,a)]]),level:r.s.level},e.t0,e.t1);s&&p.push(s),n=a}}),{pieces:p.sort((e,t)=>e.t[0]-t.t[0]),units:c,levels:l,missingDays:t.filter(e=>a.has(e.id)).map(e=>e.day)}}var g0=25e6,_0=3e7,v0=1<<20,y0=8192,b0=65536;function x0(e){for(let t=1;t<10;t++){let n=+e.toPrecision(t);if(Math.fround(n)===e)return String(n)}return String(e)}function S0(e){let t=Math.round(e*1e6),n=Math.floor(t/1e6);return`${new Date(n*1e3).toISOString().slice(0,19)}.${String(t-n*1e6).padStart(6,`0`)}Z`}function C0(e,t){let n=e.filter(e=>t.some(t=>e.lo.has(t))).map(e=>e.t),r=new Float64Array(n.reduce((e,t)=>e+t.length,0)),i=0;for(let e of n)r.set(e,i),i+=e.length;r.sort();let a=0;for(let e=0;e<r.length;e++)(a===0||r[e]!==r[a-1])&&(r[a++]=r[e]);let o=r.slice(0,a);if(o.length*t.length>25e6)throw Error(`too_wide`);let s=t.map(()=>new Float32Array(o.length).fill(NaN));for(let n of e)t.forEach((e,t)=>{let r=n.lo.get(e);if(r){for(let e=0,i=iQ(o,n.t[0]);e<n.t.length;e++)if(r[e]===r[e]){for(;o[i]<n.t[e];)i++;s[t][i]=r[e]}}});return{t:o,cols:s}}async function w0(e,t,n,r={}){if(!e.channels.length)throw Error(`Pick at least one channel to export.`);let i=[...new Set(e.segments.map(e=>e.day))].sort(),a=i.map(t=>e.segments.find(e=>e.day===t&&e.kind===`raw`)).filter(e=>!!e),o=i.filter(e=>!a.some(t=>t.day===e)),s=new Set,c=()=>({skippedDays:[...o,...s].sort(),missingDays:[...s].sort()}),l=async t=>{let n=await m0({...e,segments:[t],level:0,cacheWrite:!1,relist:e.relist&&(async()=>(await e.relist()).filter(e=>e.day===t.day&&e.kind===`raw`))});for(let e of n.missingDays)s.add(e);return n},u=e=>r.onProgress?.((e+1)/a.length);if(t===`parquet`)return await E0(a,l,e.channels,n,u),c();if(t===`csv`){let t=!1;for(let[r,i]of a.entries()){let a=await l(i);!t&&!a.missingDays.length&&(await n(`time,${e.channels.map(JQ).join(`,`)}\nUTC,${e.channels.map(e=>JQ(a.units[e]??``)).join(`,`)}\n`),t=!0);let o=C0(a.pieces,e.channels);for(let e=0;e<o.t.length;e+=y0){let t=``;for(let n=e;n<Math.min(o.t.length,e+y0);n++){t+=S0(o.t[n]);for(let e of o.cols)t+=e[n]===e[n]?`,${x0(e[n])}`:`,`;t+=`
|
|
618
|
+
`}await n(t)}u(r)}return t||await n(`time,${e.channels.map(JQ).join(`,`)}\n`),c()}let d=0,f=NaN,p={};for(let t of a){let n=await l(t),r=C0(n.pieces,e.channels);d+=r.t.length,Number.isNaN(f)&&r.t.length&&(f=r.t[0]),p={...n.units,...p}}let m=new P1([{name:`time`,unit:`s`,text:!1},...e.channels.map(e=>({name:e,unit:p[e]??``,text:!1}))],Number.isNaN(f)?null:new Date(f*1e3).toISOString(),d);await n(m.head());for(let[t,r]of a.entries()){let i=C0((await l(r)).pieces,e.channels),a=i.t.map(e=>e-f);for(let e=0;e<i.t.length;e+=b0){let t=Math.min(i.t.length,e+b0);await n(m.append({length:t-e,columns:[a.subarray(e,t),...i.cols.map(n=>Float64Array.from(n.subarray(e,t)))]}))}u(t)}return m.end(),c()}var T0=0;async function E0(e,t,n,r,i,a={max:_0,chunk:v0}){let o=await RL(),s=await o.connect(),c=++T0,l=`khd_values_${c}`,u=`khd_names_${c}`,d=`khd_export_${c}.parquet`,f=new Float64Array(a.chunk),p=new Int32Array(a.chunk),m=new Float32Array(a.chunk),h=0,g=0,_=async()=>{h&&await s.insertArrowTable(uF({time:f.slice(0,h),ch:p.slice(0,h),value:m.slice(0,h)}),{name:l,create:!1}),h=0};try{await s.query(`CREATE TABLE ${u} (ch INTEGER, channel VARCHAR)`),await s.query(`INSERT INTO ${u} VALUES ${n.map((e,t)=>`(${t}, '${e.replace(/'/g,`''`)}')`).join(`, `)}`),await s.query(`CREATE TABLE ${l} (time DOUBLE, ch INTEGER, value FLOAT)`);for(let[r,o]of e.entries()){for(let e of(await t(o)).pieces)for(let[t,r]of n.entries()){let n=e.lo.get(r);if(n){for(let r=0;r<n.length;r++)if(n[r]===n[r]){if(++g>a.max)throw Object.assign(Error(`This export has more than ${(a.max/1e6).toLocaleString(`en-US`)} million values, too many for Parquet in the browser: export a shorter range or fewer channels.`),{code:`too_large`});f[h]=e.t[r],p[h]=t,m[h]=n[r],++h===a.chunk&&await _()}}}await _(),i(r)}await o.registerEmptyFileBuffer(d),await s.query(`COPY (SELECT to_timestamp(v.time) AS time, n.channel, v.value FROM ${l} v JOIN ${u} n USING (ch)
|
|
619
|
+
ORDER BY v.time, n.channel) TO '${d}' (FORMAT parquet, COMPRESSION zstd)`),await r(await o.copyFileToBuffer(d))}finally{await s.query(`DROP TABLE IF EXISTS ${l}; DROP TABLE IF EXISTS ${u}`).catch(()=>void 0),await s.close(),await o.dropFile(d).catch(()=>void 0)}}export{aZ as ANNOTATION_CONTROLS_ATTR,Ot as ANNOTATION_KINDS,a$ as AxisState,hB as BEACON_STATS,f1 as CAMERA_PRESETS,er as CHART_ALARM_FIELDS,CQ as CHART_KINDS,IB as CYCLE_TIME,S1 as CameraSender,kB as CycleRunner,AB as CycleSet,Rt as DASHBOARD_GRID_COLS,Bt as DASHBOARD_GRID_GAP_PX,zt as DASHBOARD_GRID_ROWS,Gz as DATASET_PALETTE,kt as DEFAULT_ANNOTATION_WIDTH,en as DEFAULT_AXIS_LINE,nn as DEFAULT_BEACON,tn as DEFAULT_GRID_LINE,fn as DEFAULT_TRACE_WIDTH,dn as DEFAULT_XYZ_POINT_RADIUS,un as DEFAULT_XY_POINT_RADIUS,_$ as DELTA_SUFFIX,F1 as EXPORT_TYPES,xT as FUNCTION_REFERENCE,e0 as HISTORY_PIXELS,cQ as HistoryDataSource,xV as IMPORTABLE_EXT,ke as KIND_VIDEO,eB as KPI_STATS,xe as KRC_HEADER_BYTES,pB as KpiAcc,OE as KymoscopeError,nt as LEAF_KEYS,qe as LIVE_TIME_COLUMN,p1 as LOW_PRESET,d1 as LivePublisher,t$ as MAX_BAND_CELLS,e$ as MAX_GRID,Un as MAX_PANEL_CAMERAS,_0 as MAX_PARQUET_VALUES,g0 as MAX_WIDE_CELLS,Wt as MIN_PANEL_H,Ut as MIN_PANEL_W,Ce as OPEN_STREAM_PASSWORD,$1 as RANGE_PARALLEL,e1 as RecordedVideoSource,mB as RuleRunner,Ft as SEVERITY_HEX,F$ as UNLIMITED,LQ as VIDEO_MAX_FRAGMENT,ZT as WINDOW_FN_NAMES,C as WORKBOOK_EXPORT_AAD,w as alertRuleAad,o$ as alignSegment,Qt as arrangeAutoLayout,n$ as axisColumn,p$ as bandEdges,xB as bestCycleIndex,D as bindKeyAad,R1 as blockAad,Q1 as blockCache,bW as buildEquation,SE as buildMathChannelsBlob,l$ as buildReference,CV as buildTree,Vn as cameraLabel,tr as chartAlarm,Sz as chartChannelCount,TQ as chartLabel,a0 as chooseLevel,ar as clampPct,Kt as clampRectForKind,oQ as clipPiece,l0 as coalesce,Zn as coerceAlarmLine,Nt as coerceAnnotation,kY as colorAt,Kz as colorForDataset,Zz as colorSchemeOf,MY as colorsCss,B as columnIsNumeric,rB as compareOp,m$ as compareToReference,_W as computePolyFit,vW as computeR2,q$ as createEngine,et as createRuleEvaluator,WB as cutCycle,OB as cycleRuleChannels,KB as cycleTables,_B as cyclicChannels,g$ as decodeBand,BQ as decodeVideo,DX as decorateColumnLabel,Mn as defaultAreaChartPanelSettings,An as defaultBarChartPanelSettings,yn as defaultBoxPlotPanelSettings,Pn as defaultBubbleChartPanelSettings,Rn as defaultCalibrationPanelSettings,Hn as defaultCameraPanelSettings,Nn as defaultCdfChartPanelSettings,Cn as defaultConfusionPanelSettings,En as defaultControlChartPanelSettings,qz as defaultDatasetPalette,On as defaultEmbeddingPanelSettings,kn as defaultFlameGraphPanelSettings,Bn as defaultGanttPanelSettings,Ln as defaultGaugePanelSettings,xn as defaultHeatmapPanelSettings,gn as defaultHistogramPanelSettings,Tn as defaultLossCurvePanelSettings,pn as defaultMultibandPanelSettings,Dn as defaultParallelCoordsPanelSettings,_n as defaultPolarPanelSettings,zn as defaultQQPlotPanelSettings,jn as defaultRadarPanelSettings,wn as defaultRocPanelSettings,In as defaultSankeyPanelSettings,bn as defaultSpectrogramPanelSettings,vn as defaultSpectrumPanelSettings,Fn as defaultTreemapPanelSettings,Sn as defaultViolinPanelSettings,$t as defaultXyAxisScaleSettings,mn as defaultXyPanelSettings,hn as defaultXyzPanelSettings,BB as definitionChannels,f as deriveKey,_ as deriveRawKeyBase64,S as deviceFingerprint,qt as dragLayout,h$ as encodeBand,zQ as encodeVideo,ZB as encryptWorkbookFile,ir as ensurePanelSettingsForPanels,nE as evalChannel,$z as eventWithin,w0 as exportHistoryTo,L1 as exportRecording,I1 as exportRecordingTo,eE as extractFreeIdentifiers,x0 as f32text,zB as findCycles,z1 as footerLength,Uz as formatClockTick,Wz as formatClockValue,CB as formatLapValue,VQ as fragmentVideo,A as generateApiToken,Qe as generateDeviceKeyPair,i as generateRecoveryKeyPair,L as generateSalt,Vz as getClockTimeZone,ze as getRawNonEmptyLines,c$ as gridAt,vB as guessBeaconChannel,h as hashToken,F as historyKeyAad,z as importStreamKey,y as inferParseConfig,Pz as isClockAxis,SV as isImportable,EX as isMathChannelName,S0 as isoMicros,VB as kpiColumn,tB as kpiKey,HB as kpisOf,y$ as liveSegmentTracker,uB as localDay,i$ as localSeconds,p as makeKeyCheck,Lt as markToAnnotation,sn as newGaugeItem,sr as newMathChannel,Xt as newPanel,aB as newResetState,or as newSeriesId,Cz as niceMajorStep,Qz as observeColorScheme,fR as openDatasetFromText,H1 as openFooter,ye as openMessage,V1 as openSealed,b as openUnderProjectKey,Re as openWithKey,v as openWithPassword,Wn as panelCameras,H as parseColumnNames,ee as parseConfigsEqual,FB as parseCycleDefinitions,k as parseDatasetWithConfig,$T as parseFormula,ae as parseKrc,Pe as parseKrcHeader,wE as parseMathChannelsFile,ln as parseOptionalAxisRange,rr as parsePanelChartSettingsMap,te as parseRecoveryCode,s0 as pickSegments,c0 as pool,f$ as pooledSd,jY as presetStops,V as projectConfigKeyAad,ne as projectWrapAad,O as randomKey,f0 as readFooter,m0 as readHistoryRange,RB as readSource,je as recordingKeyAad,Be as recordingKeySealAad,e as recoveryAttestationAad,me as recoveryCode,We as recoveryKeyAad,Ne as recoveryPrivateKey,SX as referenceBands,s$ as resample,oB as resetStep,$n as resolveLinkedAlarms,qB as rowsCsv,nB as ruleChannels,_e as sealMessage,Ve as sealUnderProjectKey,Se as sealWithKey,oe as sealWithPassword,Fe as senderBindKey,He as senderBinding,Bz as setClockTimeZone,fB as shiftDay,aQ as slicePiece,sQ as splicePieces,ue as splitApiKey,gB as splitLaps,Oe as streamKeyAad,t as subsampleIndices,Hz as subscribeClockTimeZone,yB as suggestBeacon,rt as thresholdOf,lB as tzOffsetS,Ke as unwrapForDevice,fe as unwrapStreamKey,tt as validateRule,ge as verifyKeyCheck,NV as verifyLicense,Le as verifySenderBinding,K1 as warmHistoryDecoder,C0 as wideDay,Ae as workbookBodyAad,JB as workbookExportAad,$B as workbookFileInfo,be as workbookKeyAad,ve as wrapForDevice,dB as zonedInstant};
|
package/dist/styles/tokens.css
CHANGED
|
@@ -52,6 +52,9 @@
|
|
|
52
52
|
--danger: oklch(0.66 0.2 25);
|
|
53
53
|
--danger-bg: color-mix(in oklch, var(--danger) 16%, transparent);
|
|
54
54
|
--warn: oklch(0.82 0.14 85);
|
|
55
|
+
/* The golden cycle (Reports & analysis, user 2026-11-01): the one gold in the app, always with ★ */
|
|
56
|
+
--gold: oklch(0.85 0.15 95);
|
|
57
|
+
--gold-soft: color-mix(in oklch, var(--gold) 14%, transparent);
|
|
55
58
|
|
|
56
59
|
--chart-bg: oklch(0.13 0.022 255);
|
|
57
60
|
--chart-fg: oklch(0.93 0.01 255);
|
|
@@ -105,6 +108,8 @@
|
|
|
105
108
|
--danger: oklch(0.5 0.2 25);
|
|
106
109
|
--danger-bg: color-mix(in oklch, var(--danger) 11%, transparent);
|
|
107
110
|
--warn: oklch(0.42 0.12 75);
|
|
111
|
+
--gold: oklch(0.6 0.13 90);
|
|
112
|
+
--gold-soft: color-mix(in oklch, var(--gold) 16%, transparent);
|
|
108
113
|
|
|
109
114
|
--chart-bg: oklch(0.995 0 0);
|
|
110
115
|
--chart-fg: oklch(0.2 0.035 255);
|
package/dist/types/index.d.ts
CHANGED
|
@@ -91,5 +91,5 @@ export { CYCLE_TIME, readSource, findCycles, cutCycle, cycleTables, definitionCh
|
|
|
91
91
|
export { RuleRunner, KpiAcc, resetStep, newResetState, compareOp, kpiKey, ruleChannels, localDay, zonedInstant, shiftDay, tzOffsetS, KPI_STATS, type SegmentRule, type CompareOp, type EdgeOn, type KpiStat, type KpiSpec, type Kpis, type DetectedSegment, type ResetState } from './lib/segments/rules';
|
|
92
92
|
export type { SegmentContext } from './engine/types';
|
|
93
93
|
export { referenceBands } from './charts/beacon';
|
|
94
|
-
export { alignSegment, AxisState, axisColumn, localSeconds, resample, gridAt, buildReference, bandEdges, compareToReference, encodeBand, decodeBand, MAX_GRID, MAX_BAND_CELLS, type AlignAxis, type AlignedSegment, type ReferenceCurve, type ReferenceChannel, type Comparison } from './lib/segments/align';
|
|
94
|
+
export { alignSegment, AxisState, axisColumn, localSeconds, resample, gridAt, buildReference, bandEdges, pooledSd, compareToReference, encodeBand, decodeBand, MAX_GRID, MAX_BAND_CELLS, type AlignAxis, type AlignedSegment, type Band, type BandFor, type ReferenceCurve, type ReferenceChannel, type Comparison } from './lib/segments/align';
|
|
95
95
|
export { liveSegmentTracker, DELTA_SUFFIX, type LiveSegmentAxis, type LiveSegmentEvent, type LiveReference } from './lib/segments/liveAxis';
|
|
@@ -45,6 +45,9 @@ export interface Comparison {
|
|
|
45
45
|
t1: number;
|
|
46
46
|
channels: string[];
|
|
47
47
|
}>;
|
|
48
|
+
/** Per sample: |delta| in the band's unit (σ at that point, or the tolerance), NaN where either is missing: the
|
|
49
|
+
* score of any stretch (a phase) is the mean over its samples. */
|
|
50
|
+
z: Map<string, Float64Array>;
|
|
48
51
|
}
|
|
49
52
|
export declare const MAX_GRID = 8000;
|
|
50
53
|
/** ponytail: channels × grid points of one reference (2.4 MB raw); split references by channel group if a customer needs more. */
|
|
@@ -75,11 +78,25 @@ export declare function gridAt(grid: Float64Array, a: ArrayLike<number>, x: numb
|
|
|
75
78
|
/** The reference of `segs` on a uniform grid of `points` over their X range (one segment: σ 0, n 1). */
|
|
76
79
|
export declare function buildReference(segs: AlignedSegment[], channels: string[], points: number): ReferenceCurve;
|
|
77
80
|
/** A channel's band edges: mean ± k·σ, or min..max. */
|
|
78
|
-
|
|
81
|
+
/** A reference's band: mean ± k·σ, min..max over its sources, or a fixed tolerance around the mean (a golden cycle):
|
|
82
|
+
* in the channel's units, or in % of the channel's scale in the reference: the larger of its range and its largest
|
|
83
|
+
* magnitude (the nearest to an instrument's full scale the data gives: a % of the value vanishes near zero, a % of
|
|
84
|
+
* the range on a flat channel). */
|
|
85
|
+
export type Band = 'sigma' | 'minmax' | {
|
|
86
|
+
tolerance: number;
|
|
87
|
+
unit: 'abs' | 'pct';
|
|
88
|
+
};
|
|
89
|
+
export declare function pooledSd(c: ReferenceChannel): Float32Array;
|
|
90
|
+
export declare function bandEdges(c: ReferenceChannel, k: number, band: Band): {
|
|
79
91
|
lo: Float32Array;
|
|
80
92
|
hi: Float32Array;
|
|
81
93
|
};
|
|
82
|
-
|
|
94
|
+
/** A band for each channel (a Reference may set one per channel, falling back to its own band and k). */
|
|
95
|
+
export type BandFor = (channel: string) => {
|
|
96
|
+
band: Band;
|
|
97
|
+
k: number;
|
|
98
|
+
};
|
|
99
|
+
export declare function compareToReference(seg: AlignedSegment, ref: ReferenceCurve, k: number, bands?: Band | BandFor, minS?: number): Comparison;
|
|
83
100
|
/** A reference curve as bytes (plan Formats "Reference band", zlib). */
|
|
84
101
|
export declare function encodeBand(ref: ReferenceCurve, channels: string[]): Uint8Array;
|
|
85
102
|
export declare function decodeBand(bytes: Uint8Array, channels: string[]): ReferenceCurve;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kymoscope/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "The Kymoscope data engine and charts for the browser: import large measurement files, plot them, stream live data end-to-end encrypted.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"homepage": "https://kymoscope.com/docs/introduction",
|