@dtour/scatter 0.4.0 → 0.4.2
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/detect.d.ts +17 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/scatter.js +120 -112
- package/package.json +1 -1
package/dist/scatter.js
CHANGED
|
@@ -2606,11 +2606,19 @@ var e = new Float32Array(16), t = [
|
|
|
2606
2606
|
253,
|
|
2607
2607
|
191
|
|
2608
2608
|
]
|
|
2609
|
-
], u = "const e=new Float32Array(16),t={schumann:0,bremm:1,steiger:2,ziegler:3,teulingfig2:4,cubediagonal:5,oklab_polar:6},n=[{r_x:[-0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.4877,-14.9075,-16.3272,-17.747,-19.1668,-20.5865,-22.0063],r_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],g_x:[-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953],g_y:[-.076,-.0709,-.0661,-.061,-.0561,-.051,-.0462,-.041,-.0359,-.0308,-.0257,-.0205,-.0154,-.0103,-.0051,0],b_x:[-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581],b_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442]},{r_x:[-15.2067,-15.095,-14.9554,-14.7857,-14.5812,-14.3334,-14.0291,-13.6663,-13.2288,-12.7355,-12.1699,-11.5268,-10.802,-9.9949,-9.1075,-8.1425],r_y:[-.0066,-.0112,-.0161,-.021,-.026,-.031,-.036,-.0408,-.0449,-.0486,-.0521,-.0554,-.0586,-.0617,-.0647,-.0676],g_x:[-10.7187,-10.7357,-10.755,-10.7798,-10.8079,-10.8405,-10.8775,-10.92,-10.9701,-11.0227,-11.0828,-11.147,-11.2183,-11.2958,-11.3803,-11.4703],g_y:[-.054,-.0531,-.0521,-.0511,-.0499,-.0487,-.0473,-.0459,-.0442,-.0425,-.0405,-.0383,-.0359,-.0331,-.0298,-.0259],b_x:[-2.3509,-4.0466,-5.3978,-6.6213,-7.7862,-8.9196,-10.0363,-11.1469,-12.2854,-13.3981,-14.5092,-15.6231,-16.7524,-17.8862,-19.025,-20.1748],b_y:[-.0437,-.0438,-.0438,-.0439,-.0439,-.044,-.0441,-.0441,-.0442,-.0443,-.0444,-.0444,-.0445,-.0446,-.0447,-.0448]},{r_x:[-21.9278,-21.3484,-20.7628,-20.1344,-19.4757,-18.7856,-18.0477,-17.2595,-16.3843,-15.4484,-14.4257,-13.2751,-11.9456,-10.3735,-8.3553,-5.2147],r_y:[-.0407,-.0417,-.0426,-.0433,-.0439,-.0443,-.0447,-.045,-.0451,-.0452,-.0452,-.0451,-.045,-.0447,-.0444,-.044],g_x:[-13.0812,-13.0665,-13.0508,-13.0388,-13.0293,-13.0203,-13.0133,-13.0087,-13.0068,-13.0092,-13.0125,-13.0162,-13.0269,-13.0372,-13.0532,-13.0708],g_y:[-.0665,-.0634,-.0603,-.0572,-.054,-.0508,-.0476,-.0443,-.0408,-.0373,-.0337,-.0299,-.0258,-.0211,-.0155,-.006],b_x:[-7.2789,-8.4407,-9.4718,-10.4471,-11.3919,-12.3169,-13.2284,-14.1319,-15.0565,-15.9516,-16.8449,-17.7392,-18.6339,-19.5305,-20.4287,-21.3308],b_y:[-.0372,-.0384,-.0395,-.0405,-.0415,-.0424,-.0432,-.044,-.0448,-.0455,-.0462,-.0469,-.0476,-.0482,-.0488,-.0494]},{r_x:[-22.5873,-21.9563,-21.3711,-20.7867,-19.9754,-18.4599,-16.9442,-15.4282,-13.4591,-11.1479,-8.8297,-6.5275,-5.1161,-3.9946,-2.8733,-1.7523],r_y:[-.0419,-.0427,-.0435,-.0443,-.0452,-.0461,-.0471,-.0481,-.0478,-.0462,-.0446,-.0431,-.0419,-.0408,-.0397,-.0387],g_x:[-13.1499,-13.6389,-14.1283,-14.6177,-15.0304,-15.2028,-15.3755,-15.5483,-15.5483,-15.3755,-15.2028,-15.0304,-14.6177,-14.1283,-13.6389,-13.1499],g_y:[-.0679,-.0663,-.0649,-.0634,-.061,-.0553,-.0497,-.0441,-.0373,-.0299,-.0224,-.015,-.0104,-.0069,-.0035,0],b_x:[0,-1.1629,-2.4025,-3.6427,-5.0938,-7.0911,-9.0872,-11.0838,-12.4271,-13.0415,-13.651,-14.263,-13.9595,-13.3667,-12.7641,-12.1687],b_y:[0,-.0049,-.0102,-.0154,-.0216,-.0301,-.0385,-.047,-.0527,-.0553,-.0579,-.0605,-.0592,-.0567,-.0541,-.0516],b_x2:[0,.1737,.3579,.5429,.7486,1.01,1.2709,1.5314,1.3563,.758,.152,-.4504,-.9129,-1.327,-1.7466,-2.1664],b_y2:[0,.0073,.015,.0227,.0314,.0423,.0533,.0642,.0568,.0318,.0064,-.0189,-.0383,-.0556,-.0732,-.0908]},{r_x:[-9.3217,-9.7119,-10.1026,-10.4928,-10.8832,-11.2736,-11.6641,-12.0545,-12.4564,-12.8467,-13.2372,-13.6275,-14.0181,-14.4083,-14.7989,-15.1894],r_y:[-.0121,-.0159,-.0198,-.0236,-.0274,-.0313,-.0351,-.039,-.0429,-.0467,-.0506,-.0544,-.0582,-.0621,-.0659,-.0698],g_x:[-17.2405,-16.5128,-15.7853,-15.0578,-14.3304,-13.6031,-12.8759,-12.1487,-11.4004,-10.6733,-9.9465,-9.2196,-8.4931,-7.7664,-7.04,-6.3134],g_y:[-.0229,-.0255,-.0282,-.0308,-.0334,-.0361,-.0387,-.0413,-.044,-.0467,-.0493,-.0519,-.0546,-.0572,-.0599,-.0625],b_x:[-19.5271,-18.4535,-17.3793,-16.3057,-15.2322,-14.1586,-13.0846,-12.0108,-10.9055,-9.8317,-8.7578,-7.6841,-6.6107,-5.537,-4.4628,-3.3892],b_y:[-.0543,-.0529,-.0515,-.0501,-.0487,-.0473,-.0459,-.0445,-.0431,-.0417,-.0403,-.0389,-.0375,-.0361,-.0347,-.0333]},{r_x:[-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767],r_y:[-.0765,-.0714,-.0663,-.0612,-.0561,-.051,-.0459,-.0408,-.0357,-.0306,-.0255,-.0204,-.0153,-.0102,-.0051,0],g_x:[0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.5765,-15.0849,-16.5934,-18.1019,-19.6104,-21.1189,-22.6274],g_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],b_x:[13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767],b_y:[0,.0051,.0102,.0153,.0204,.0255,.0306,.0357,.0408,.0459,.051,.0561,.0612,.0663,.0714,.0765]}],r=t=>{if(t>=n.length)return null;let r=n[t],i=new Float32Array(128);return i.set(r.r_x,0),i.set(r.r_y,16),i.set(r.g_x,32),i.set(r.g_y,48),i.set(r.b_x,64),i.set(r.b_y,80),i.set(r.b_x2??e,96),i.set(r.b_y2??e,112),i},i=[[0,114,178],[230,159,0],[0,158,115],[204,121,167],[86,180,233],[213,94,0],[240,228,66]],a=[[215,0,0],[0,151,0],[0,0,255],[255,186,0],[0,208,255],[255,0,186],[143,90,0],[0,255,151],[169,0,255],[129,129,129],[255,129,97],[0,107,79],[109,109,255],[255,0,57],[137,171,0],[176,106,255],[0,168,168],[255,131,222],[104,70,43],[175,185,143],[163,0,96],[93,136,200],[230,215,127],[0,64,36],[62,53,91],[199,186,255],[127,0,18],[85,233,188],[70,80,0],[255,195,182],[106,50,89],[0,107,140],[238,114,0],[168,161,195],[148,85,115],[0,172,95],[199,0,171],[135,141,113],[27,36,65],[185,111,84],[113,109,60],[0,232,87],[162,55,0],[0,157,218],[231,164,255],[96,131,120],[96,76,255],[192,155,103],[207,0,116],[36,65,103],[157,205,255],[182,97,176],[89,186,138],[255,78,147],[81,113,0],[255,168,105],[75,0,48],[117,217,0],[0,90,179],[214,194,0],[0,74,56],[237,237,220],[90,12,0],[147,161,236]],o=[[214,0,0],[1,135,0],[181,0,255],[5,172,198],[151,255,0],[255,165,47],[255,142,200],[121,82,94],[0,253,207],[175,165,255],[147,172,131],[154,105,0],[54,105,98],[211,0,140],[253,244,144],[200,110,102],[158,226,255],[0,200,70],[168,119,172],[184,186,1],[244,191,177],[255,40,253],[242,205,255],[0,158,124],[255,98,0],[86,100,42],[149,63,31],[144,49,142],[255,52,100],[160,228,145],[140,154,177],[130,144,38],[174,8,63],[119,198,186],[188,145,87],[228,142,255],[114,184,255],[198,165,193],[255,144,112],[211,195,124],[188,237,219],[107,133,103],[145,110,86],[249,255,0],[186,193,223],[172,86,124],[255,205,3],[255,73,177],[193,86,3],[93,140,144],[193,68,188],[0,117,63],[186,110,253],[0,212,147],[0,255,117],[73,161,80],[204,151,144],[0,235,237],[219,126,1],[247,117,137],[184,149,0],[200,66,72],[0,207,249],[117,87,38],[133,212,1],[235,255,212],[167,123,135],[219,114,200],[202,226,86],[138,191,93],[161,33,107],[133,91,137],[137,186,207],[255,186,214],[182,207,170],[151,65,77],[103,170,0],[253,225,177],[255,54,40],[128,121,61],[214,232,255],[167,149,198],[126,165,154],[209,130,163],[84,130,59],[230,168,114],[156,255,255],[218,84,128],[5,179,170],[255,170,246],[209,175,239],[218,1,93],[172,26,19],[96,179,133],[212,66,253],[172,170,89],[251,156,167],[179,114,59],[242,105,82],[174,209,212],[154,255,195],[219,179,51],[235,1,195],[153,0,196],[207,255,158],[165,89,73],[59,109,1],[0,133,121],[149,145,103],[137,219,179],[109,116,0],[170,93,202],[7,239,0],[128,79,61],[216,128,82],[255,200,98],[184,0,158],[153,172,221],[144,79,0],[140,68,112],[79,110,82],[255,135,52],[198,142,205],[212,226,158],[177,130,109],[156,251,117],[86,221,119],[249,0,135],[161,205,255],[19,202,209],[17,142,84],[209,84,165],[0,223,195],[163,131,47],[119,151,91],[186,170,128],[112,163,175],[214,251,255],[232,1,58],[216,70,33],[255,130,237],[182,56,98],[182,205,114],[151,98,107],[137,116,144],[0,163,22],[0,244,161],[191,144,242],[137,228,216],[163,77,149],[110,93,0],[140,198,142],[149,170,42],[198,114,221],[179,59,1],[214,154,54],[223,172,182],[0,154,160],[89,144,0],[151,188,168],[172,140,168],[218,212,255],[84,124,114],[0,186,105],[255,195,142],[184,0,212],[223,207,91],[98,154,123],[191,237,188],[193,189,253],[128,211,221],[226,133,126],[249,235,77],[191,109,130],[202,255,79],[239,114,170],[237,103,255],[153,70,174],[109,105,66],[226,86,96],[221,102,45],[156,219,93],[226,156,207],[184,117,0],[198,0,45],[223,188,218],[89,181,223],[255,89,218],[56,193,161],[158,105,140],[172,170,200],[149,98,47],[181,86,98],[43,126,96],[177,228,0],[237,165,144],[149,253,226],[255,84,142],[189,110,161],[170,59,54],[216,207,0],[170,128,205],[160,128,82],[225,0,232],[195,91,61],[181,58,133],[140,119,0],[219,188,149],[82,158,147],[175,188,130],[145,181,182],[167,84,35],[255,212,239],[121,174,107],[93,181,75],[128,251,154],[72,255,239],[151,149,72],[147,135,167],[49,212,0],[110,233,86],[182,212,235],[112,84,112],[242,219,138],[170,212,193],[126,205,242],[137,186,0],[100,182,186],[255,181,0],[195,130,133],[202,170,94],[100,119,72],[89,226,255],[223,77,205],[233,255,121],[188,102,184],[195,149,165],[100,198,116],[209,149,112],[112,207,79],[170,110,102],[156,96,165],[0,184,0],[226,153,179],[188,0,107],[179,232,239],[205,191,228],[119,163,66],[133,98,119],[86,142,91],[158,175,196],[232,47,160],[36,124,42],[130,103,35],[191,188,77],[221,211,165]],s=[[68,1,84],[71,16,99],[72,31,112],[71,45,123],[68,57,131],[64,70,136],[59,82,139],[54,93,141],[49,104,142],[44,114,142],[40,124,142],[36,134,142],[33,145,140],[31,154,138],[32,164,134],[40,174,128],[53,183,121],[72,193,110],[94,201,98],[117,208,84],[144,215,67],[173,220,48],[200,224,32],[229,228,25],[253,231,37]],c=[[34,17,80],[49,17,101],[64,15,116],[81,18,124],[95,24,127],[109,29,129],[123,35,130],[137,40,129],[152,45,128],[166,49,125],[183,55,121],[197,60,116],[211,67,110],[224,76,103],[235,87,96],[243,101,92],[248,118,92],[252,137,97],[253,154,106],[254,170,116],[254,187,129],[254,204,143],[253,220,158],[252,236,174],[252,253,191]],l=e=>{let t=1/0,n=-1/0,r=0;for(let i=0;i<e.length;i++){let a=e[i];a<t&&(t=a),a>n&&(n=a),r+=a}let i=n-t||1e-6,a=e.length>0?r/e.length:0;return{min:t,max:n,range:i,mean:a}},u=Uint8Array.of(65,82,82,79,87,49),d={V1:0,V2:1,V3:2,V4:3,V5:4},f={NONE:0,Schema:1,DictionaryBatch:2,RecordBatch:3,Tensor:4,SparseTensor:5},p={Dictionary:-1,NONE:0,Null:1,Int:2,Float:3,Binary:4,Utf8:5,Bool:6,Decimal:7,Date:8,Time:9,Timestamp:10,Interval:11,List:12,Struct:13,Union:14,FixedSizeBinary:15,FixedSizeList:16,Map:17,Duration:18,LargeBinary:19,LargeUtf8:20,LargeList:21,RunEndEncoded:22,BinaryView:23,Utf8View:24,ListView:25,LargeListView:26},m={HALF:0,SINGLE:1,DOUBLE:2},h={DAY:0,MILLISECOND:1},g={SECOND:0,MILLISECOND:1,MICROSECOND:2,NANOSECOND:3},_={YEAR_MONTH:0,DAY_TIME:1,MONTH_DAY_NANO:2},v={Sparse:0,Dense:1},y={LZ4_FRAME:0,ZSTD:1},b={BUFFER:0},x=Uint8Array,S=Uint16Array,C=Uint32Array,w=BigUint64Array,T=Int8Array,E=Int16Array,D=Int32Array,O=BigInt64Array,k=Float32Array,A=Float64Array;function j(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function M(e,t){let n=Math.log2(e)-3;return(t?[T,E,D,O]:[x,S,C,w])[n]}Object.getPrototypeOf(Int8Array);function ee(e,t){let n=0,r=e.length;if(r<=2147483648)do{let i=n+r>>>1;e[i]<=t?n=i+1:r=i}while(n<r);else do{let i=Math.trunc((n+r)/2);e[i]<=t?n=i+1:r=i}while(n<r);return n}function N(e,t,n){if(t(e))return e;throw Error(n(e))}function P(e,t,n){return t=Array.isArray(t)?t:Object.values(t),N(e,e=>t.includes(e),n??(()=>`${e} must be one of ${t}`))}function F(e,t){for(let[n,r]of Object.entries(e))if(r===t)return n;return`<Unknown>`}const te=e=>`Unsupported data type: \"${F(p,e)}\" (id ${e})`,ne=(e,t,n=!0,r=null)=>({name:e,type:t,nullable:n,metadata:r});function re(e){return Object.hasOwn(e,`name`)&&ie(e.type)}function ie(e){return typeof e?.typeId==`number`}function I(e,t=``,n=!0){return re(e)?e:ne(t,N(e,ie,()=>`Data type expected.`),n)}const ae=(e,t,n=!1,r=-1)=>({typeId:p.Dictionary,id:r,dictionary:e,indices:t||oe(),ordered:n}),L=(e=32,t=!0)=>({typeId:p.Int,bitWidth:P(e,[8,16,32,64]),signed:t,values:M(e,t)}),oe=()=>L(32),se=(e=2)=>({typeId:p.Float,precision:P(e,m),values:[S,k,A][e]}),ce=()=>({typeId:p.Binary,offsets:D}),le=()=>({typeId:p.Utf8,offsets:D}),ue=(e,t,n=128)=>({typeId:p.Decimal,precision:e,scale:t,bitWidth:P(n,[32,64,128,256]),values:n===32?D:w}),de=e=>({typeId:p.Date,unit:P(e,h),values:e===h.DAY?D:O}),fe=(e=g.MILLISECOND)=>{e=P(e,g);let t=e===g.SECOND||e===g.MILLISECOND?32:64;return{typeId:p.Time,unit:e,bitWidth:t,values:t===32?D:O}},pe=(e=g.MILLISECOND,t=null)=>({typeId:p.Timestamp,unit:P(e,g),timezone:t,values:O}),me=(e=_.MONTH_DAY_NANO)=>({typeId:p.Interval,unit:P(e,_),values:e===_.MONTH_DAY_NANO?void 0:D}),he=e=>({typeId:p.List,children:[I(e)],offsets:D}),ge=e=>({typeId:p.Struct,children:Array.isArray(e)&&e.length>0&&re(e[0])?e:Object.entries(e).map(([e,t])=>ne(e,t))}),_e=(e,t,n,r)=>(n??=t.map((e,t)=>t),{typeId:p.Union,mode:P(e,v),typeIds:n,typeMap:n.reduce((e,t,n)=>(e[t]=n,e),{}),children:t.map((e,t)=>I(e,`_${t}`)),typeIdForValue:r,offsets:D}),ve=e=>({typeId:p.FixedSizeBinary,stride:e}),ye=(e,t)=>({typeId:p.FixedSizeList,stride:t,children:[I(e)]}),be=(e,t)=>({typeId:p.Map,keysSorted:e,children:[t],offsets:D}),xe=(e=g.MILLISECOND)=>({typeId:p.Duration,unit:P(e,g),values:O}),Se=()=>({typeId:p.LargeBinary,offsets:O}),Ce=()=>({typeId:p.LargeUtf8,offsets:O}),we=e=>({typeId:p.LargeList,children:[I(e)],offsets:O}),Te=(e,t)=>({typeId:p.RunEndEncoded,children:[N(I(e,`run_ends`),e=>e.type.typeId===p.Int,()=>`Run-ends must have an integer type.`),I(t,`values`)]}),Ee=e=>({typeId:p.ListView,children:[I(e,`value`)],offsets:D}),De=e=>({typeId:p.LargeListView,children:[I(e,`value`)],offsets:O}),Oe=new A(2).buffer;new O(Oe),new C(Oe),new D(Oe),new x(Oe);function ke(e){if(e>2**53-1||e<-(2**53-1))throw Error(`BigInt exceeds integer number representation: ${e}`);return Number(e)}function Ae(e,t){return Number(e/t)+Number(e%t)/Number(t)}const je=e=>BigInt.asUintN(64,e);function Me(e,t){return BigInt.asIntN(64,e[t])}function Ne(e,t){let n=t<<1,r;return BigInt.asIntN(64,e[n+1])<0?(r=je(~e[n])|je(~e[n+1])<<64n,r=-(r+1n)):r=e[n]|e[n+1]<<64n,r}function Pe(e,t){let n=t<<2,r;return BigInt.asIntN(64,e[n+3])<0?(r=je(~e[n])|je(~e[n+1])<<64n|je(~e[n+2])<<128n|je(~e[n+3])<<192n,r=-(r+1n)):r=e[n]|e[n+1]<<64n|e[n+2]<<128n|e[n+3]<<192n,r}const Fe=new TextDecoder(`utf-8`);new TextEncoder;function Ie(e){return Fe.decode(e)}function Le(e,t){return(e[t>>3]&1<<t%8)!=0}function R(e,t){let n=t+B(e,t),r=n-B(e,n),i=z(e,r);return(t,a,o=null)=>{if(t<i){let i=z(e,r+t);if(i)return a(e,n+i)}return o}}function Re(e,t){return t}function ze(e,t){return!!Be(e,t)}function Be(e,t){return Ve(e,t)<<24>>24}function Ve(e,t){return e[t]}function z(e,t){return He(e,t)<<16>>16}function He(e,t){return e[t]|e[t+1]<<8}function B(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function Ue(e,t){return B(e,t)>>>0}function V(e,t){return ke(BigInt.asIntN(64,BigInt(Ue(e,t))+(BigInt(Ue(e,t+4))<<32n)))}function We(e,t){let n=t+B(e,t),r=B(e,n);return n+=4,Ie(e.subarray(n,n+r))}function Ge(e,t,n,r){if(!t)return[];let i=t+B(e,t);return Array.from({length:B(e,i)},(t,a)=>r(e,i+4+a*n))}const Ke=Symbol(`rowIndex`);function qe(e,t){class n{constructor(e){this[Ke]=e}toJSON(){return Ye(e,t,this[Ke])}}let r=n.prototype;for(let n=0;n<e.length;++n){if(Object.hasOwn(r,e[n]))continue;let i=t[n];Object.defineProperty(r,e[n],{get(){return i.at(this[Ke])},enumerable:!0})}return e=>new n(e)}function Je(e,t){return n=>Ye(e,t,n)}function Ye(e,t,n){let r={};for(let i=0;i<e.length;++i)r[e[i]]=t[i].at(n);return r}function Xe(e){return e instanceof Qe}var Ze=class{static ArrayType=null;constructor({length:e,nullCount:t,type:n,validity:r,values:i,offsets:a,sizes:o,children:s}){this.length=e,this.nullCount=t,this.type=n,this.validity=r,this.values=i,this.offsets=a,this.sizes=o,this.children=s,(!t||!this.validity)&&(this.at=e=>this.value(e))}get[Symbol.toStringTag](){return`Batch`}at(e){return this.isValid(e)?this.value(e):null}isValid(e){return Le(this.validity,e)}value(e){return this.values[e]}slice(e,t){let n=t-e,r=Array(n);for(let t=0;t<n;++t)r[t]=this.at(e+t);return r}*[Symbol.iterator](){for(let e=0;e<this.length;++e)yield this.at(e)}},Qe=class extends Ze{constructor(e){super(e);let{length:t,values:n}=this;this.values=n.subarray(0,t)}slice(e,t){return this.nullCount?super.slice(e,t):this.values.subarray(e,t)}[Symbol.iterator](){return this.nullCount?super[Symbol.iterator]():this.values[Symbol.iterator]()}},$e=class extends Ze{static ArrayType=A},H=class extends Ze{static ArrayType=Array},et=class extends H{value(e){return null}},tt=class extends $e{value(e){return ke(this.values[e])}},nt=class extends $e{value(e){let t=this.values[e],n=(t&31744)>>10,r=(t&1023)/1024,i=(-1)**((t&32768)>>15);switch(n){case 31:return i*(r?NaN:1/0);case 0:return i*(r?6103515625e-14*r:0)}return i*2**(n-15)*(1+r)}},rt=class extends H{value(e){return Le(this.values,e)}},it=class extends $e{constructor(e){super(e);let{scale:t}=this.type;this.scale=10**t}value(e){return this.values[e]/this.scale}},at=class extends Ze{constructor(e){super(e);let{bitWidth:t,scale:n}=this.type;this.decimal=t===64?Me:t===128?Ne:Pe,this.scale=10n**BigInt(n)}},ot=class extends at{static ArrayType=A;value(e){return Ae(this.decimal(this.values,e),this.scale)}},st=class extends at{static ArrayType=Array;value(e){return this.decimal(this.values,e)}},ct=class extends H{constructor(e){super(e),this.source=e}value(e){return new Date(this.source.value(e))}},lt=class extends $e{value(e){return 864e5*this.values[e]}};const ut=tt;var dt=class extends tt{value(e){return super.value(e)*1e3}};const ft=tt;var pt=class extends tt{value(e){return Ae(this.values[e],1000n)}},mt=class extends tt{value(e){return Ae(this.values[e],1000000n)}},ht=class extends H{value(e){return this.values.subarray(e<<1,e+1<<1)}},gt=class extends H{value(e){let t=this.values,n=e<<4;return Float64Array.of(B(t,n),B(t,n+4),V(t,n+8))}};const _t=({values:e,offsets:t},n)=>e.subarray(t[n],t[n+1]),vt=({values:e,offsets:t},n)=>e.subarray(ke(t[n]),ke(t[n+1]));var yt=class extends H{value(e){return _t(this,e)}},bt=class extends H{value(e){return vt(this,e)}},xt=class extends H{value(e){return Ie(_t(this,e))}},St=class extends H{value(e){return Ie(vt(this,e))}},Ct=class extends H{value(e){let t=this.offsets;return this.children[0].slice(t[e],t[e+1])}},wt=class extends H{value(e){let t=this.offsets;return this.children[0].slice(ke(t[e]),ke(t[e+1]))}},Tt=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(t,n)}},Et=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(ke(t),ke(n))}},Dt=class extends H{constructor(e){super(e),this.stride=this.type.stride}},Ot=class extends Dt{value(e){let{stride:t,values:n}=this;return n.subarray(e*t,(e+1)*t)}},kt=class extends Dt{value(e){let{children:t,stride:n}=this;return t[0].slice(e*n,(e+1)*n)}};function At({children:e,offsets:t},n){let[r,i]=e[0].children,a=t[n],o=t[n+1],s=[];for(let e=a;e<o;++e)s.push([r.at(e),i.at(e)]);return s}var jt=class extends H{value(e){return At(this,e)}},Mt=class extends H{value(e){return new Map(At(this,e))}},Nt=class extends H{constructor({typeIds:e,...t}){super(t),this.typeIds=e,this.typeMap=this.type.typeMap}value(e,t=e){let{typeIds:n,children:r,typeMap:i}=this;return r[i[n[e]]].at(t)}},Pt=class extends Nt{value(e){return super.value(e,this.offsets[e])}},Ft=class extends H{constructor(e,t=Je){super(e),this.names=this.type.children.map(e=>e.name),this.factory=t(this.names,this.children)}value(e){return this.factory(e)}},It=class extends Ft{constructor(e){super(e,qe)}},Lt=class extends H{value(e){let[{values:t},n]=this.children;return n.at(ee(t,e))}},Rt=class extends H{setDictionary(e){return this.dictionary=e,this.cache=e.cache(),this}value(e){return this.cache[this.key(e)]}key(e){return this.values[e]}},zt=class extends H{constructor({data:e,...t}){super(t),this.data=e}view(e){let{values:t,data:n}=this,r=e<<4,i=r+4,a=t,o=B(a,r);return o>12&&(i=B(a,r+12),a=n[B(a,r+8)]),a.subarray(i,i+o)}},Bt=class extends zt{value(e){return this.view(e)}},Vt=class extends zt{value(e){return Ie(this.view(e))}};function Ht(e){let t=[];return{add(e){return t.push(e),this},clear:()=>t=[],done:()=>new Ut(t,e)}}var Ut=class{constructor(e,t=e[0]?.type){this.type=t,this.length=e.reduce((e,t)=>e+t.length,0),this.nullCount=e.reduce((e,t)=>e+t.nullCount,0),this.data=e;let n=e.length,r=new Int32Array(n+1);if(n===1){let[t]=e;r[1]=t.length,this.at=e=>t.at(e)}else for(let t=0,i=0;t<n;++t)r[t+1]=i+=e[t].length;this.offsets=r}get[Symbol.toStringTag](){return`Column`}[Symbol.iterator](){let e=this.data;return e.length===1?e[0][Symbol.iterator]():Wt(e)}at(e){let{data:t,offsets:n}=this,r=ee(n,e)-1;return t[r]?.at(e-n[r])}get(e){return this.at(e)}toArray(){let{length:e,nullCount:t,data:n}=this,r=!t&&Xe(n[0]),i=n.length;if(r&&i===1)return n[0].values;let a=new(!i||t>0?Array:n[0].constructor.ArrayType??n[0].values.constructor)(e);return r?Gt(a,n):Kt(a,n)}cache(){return this._cache??=this.toArray()}};function*Wt(e){for(let t=0;t<e.length;++t){let n=e[t][Symbol.iterator]();for(let e=n.next();!e.done;e=n.next())yield e.value}}function Gt(e,t){for(let n=0,r=0;n<t.length;++n){let{values:i}=t[n];e.set(i,r),r+=i.length}return e}function Kt(e,t){let n=-1;for(let r=0;r<t.length;++r){let i=t[r];for(let t=0;t<i.length;++t)e[++n]=i.at(t)}return e}var qt=class e{constructor(e,t,n=!1){let r=e.fields.map(e=>e.name);this.schema=e,this.names=r,this.children=t,this.factory=n?qe:Je;let i=[];this.getFactory=e=>i[e]??(i[e]=this.factory(r,t.map(t=>t.data[e])))}get[Symbol.toStringTag](){return`Table`}get numCols(){return this.names.length}get numRows(){return this.children[0]?.length??0}getChildAt(e){return this.children[e]}getChild(e){let t=this.names.findIndex(t=>t===e);return t>-1?this.children[t]:void 0}selectAt(t,n=[]){let{children:r,factory:i,schema:a}=this,{fields:o}=a;return new e({...a,fields:t.map((e,t)=>Jt(o[e],n[t]))},t.map(e=>r[e]),i===qe)}select(e,t){let n=this.names,r=e.map(e=>n.indexOf(e));return this.selectAt(r,t)}toColumns(){let{children:e,names:t}=this,n={};return t.forEach((t,r)=>n[t]=e[r]?.toArray()??[]),n}toArray(){let{children:e,getFactory:t,numRows:n}=this,r=e[0]?.data??[],i=Array(n);for(let e=0,n=-1;e<r.length;++e){let a=t(e);for(let t=0;t<r[e].length;++t)i[++n]=a(t)}return i}*[Symbol.iterator](){let{children:e,getFactory:t}=this,n=e[0]?.data??[];for(let e=0;e<n.length;++e){let r=t(e);for(let t=0;t<n[e].length;++t)yield r(t)}}at(e){let{children:t,getFactory:n,numRows:r}=this;if(e<0||e>=r)return null;let[{offsets:i}]=t,a=ee(i,e)-1;return n(a)(e-i[a])}get(e){return this.at(e)}};function Jt(e,t){return t!=null&&t!==e.name?{...e,name:t}:e}function Yt(e,t={}){let{typeId:n,bitWidth:r,mode:i,precision:a,unit:o}=e,{useBigInt:s,useDate:c,useDecimalInt:l,useMap:u,useProxy:d}=t;switch(n){case p.Null:return et;case p.Bool:return rt;case p.Int:case p.Time:case p.Duration:return s||r<64?Qe:tt;case p.Float:return a?Qe:nt;case p.Date:return Xt(o===h.DAY?lt:ut,c&&ct);case p.Timestamp:return Xt(o===g.SECOND?dt:o===g.MILLISECOND?ft:o===g.MICROSECOND?pt:mt,c&&ct);case p.Decimal:return r===32?l?Qe:it:l?st:ot;case p.Interval:return o===_.DAY_TIME?ht:o===_.YEAR_MONTH?Qe:gt;case p.FixedSizeBinary:return Ot;case p.Utf8:return xt;case p.LargeUtf8:return St;case p.Binary:return yt;case p.LargeBinary:return bt;case p.BinaryView:return Bt;case p.Utf8View:return Vt;case p.List:return Ct;case p.LargeList:return wt;case p.Map:return u?Mt:jt;case p.ListView:return Tt;case p.LargeListView:return Et;case p.FixedSizeList:return kt;case p.Struct:return d?It:Ft;case p.RunEndEncoded:return Lt;case p.Dictionary:return Rt;case p.Union:return i?Pt:Nt}throw Error(te(n))}function Xt(e,t){return t?class extends t{constructor(t){super(new e(t))}}:e}function Zt(e){return`Missing compression codec \"${F(y,e)}\" (id ${e})`}const Qt=new Map;function $t(e){return e!=null&&Qt.get(e)||null}function en(e,{offset:t,length:n},r){if(n===0)return{bytes:new Uint8Array,offset:0,length:0};let i=V(e,t),a=e.subarray(t+8,t+n),o=i===-1?a:r.decode(a);return{bytes:o,offset:0,length:o.length}}function tn(e,t){return{offset:V(e,t),metadataLength:B(e,t+8),bodyLength:V(e,t+16)}}function nn(e,t){return Ge(e,t,24,tn)}function rn(e,t){let n=R(e,t);return{codec:n(4,Be,y.LZ4_FRAME),method:n(6,Be,b.BUFFER)}}function an(e,t,n){let r=R(e,t),i=n<d.V4?8:0;return{length:r(4,V,0),nodes:Ge(e,r(6,Re),16,(e,t)=>({length:V(e,t),nullCount:V(e,t+8)})),regions:Ge(e,r(8,Re),16+i,(e,t)=>({offset:V(e,t+i),length:V(e,t+i+8)})),compression:r(10,rn),variadic:Ge(e,r(12,Re),8,V)}}function on(e,t,n){let r=R(e,t);return{id:r(4,V,0),data:r(6,(e,t)=>an(e,t,n)),isDelta:r(8,ze,!1)}}function sn(e,t,n,r){P(n,p,te);let i=R(e,t);switch(n){case p.Binary:return ce();case p.Utf8:return le();case p.LargeBinary:return Se();case p.LargeUtf8:return Ce();case p.List:return he(r[0]);case p.ListView:return Ee(r[0]);case p.LargeList:return we(r[0]);case p.LargeListView:return De(r[0]);case p.Struct:return ge(r);case p.RunEndEncoded:return Te(r[0],r[1]);case p.Int:return L(i(4,B,0),i(6,ze,!1));case p.Float:return se(i(4,z,m.HALF));case p.Decimal:return ue(i(4,B,0),i(6,B,0),i(8,B,128));case p.Date:return de(i(4,z,h.MILLISECOND));case p.Time:return fe(i(4,z,g.MILLISECOND));case p.Timestamp:return pe(i(4,z,g.SECOND),i(6,We));case p.Interval:return me(i(4,z,_.YEAR_MONTH));case p.Duration:return xe(i(4,z,g.MILLISECOND));case p.FixedSizeBinary:return ve(i(4,B,0));case p.FixedSizeList:return ye(r[0],i(4,B,0));case p.Map:return be(i(4,ze,!1),r[0]);case p.Union:return _e(i(4,z,v.Sparse),r,Ge(e,i(6,Re),4,B))}return{typeId:n}}function cn(e,t){let n=Ge(e,t,4,(e,t)=>{let n=R(e,t);return[n(4,We),n(6,We)]});return n.length?new Map(n):null}function ln(e,t,n){let r=R(e,t);return{version:n,endianness:r(4,z,0),fields:r(6,un,[]),metadata:r(8,cn)}}function un(e,t){return Ge(e,t,4,dn)}function dn(e,t){let n=R(e,t),r=n(8,Ve,p.NONE),i=n(10,Re,0),a=n(12,pn),o=sn(e,i,r,n(14,fn,[]));return a&&(a.dictionary=o,o=a),{name:n(4,We),type:o,nullable:n(6,ze,!1),metadata:n(16,cn)}}function fn(e,t){return Ge(e,t,4,dn)}function pn(e,t){if(!t)return null;let n=R(e,t);return ae(null,n(6,mn,oe()),n(8,ze,!1),n(4,V,0))}function mn(e,t){return sn(e,t,p.Int)}const hn=(e,t)=>`Expected to read ${e} metadata bytes, but only read ${t}.`,gn=(e,t)=>`Expected to read ${e} bytes for message body, but only read ${t}.`,_n=e=>`Unsupported message type: ${e} (${F(f,e)})`;function vn(e,t){let n=B(e,t)||0;if(t+=4,n===-1&&(n=B(e,t)||0,t+=4),n===0)return null;let r=e.subarray(t,t+=n);if(r.byteLength<n)throw Error(hn(n,r.byteLength));let i=R(r,0),a=i(4,z,d.V1),o=i(6,Ve,f.NONE),s=i(8,Re,0),c=i(10,V,0),l;if(s){let n=o===f.Schema?ln:o===f.DictionaryBatch?on:o===f.RecordBatch?an:null;if(!n)throw Error(_n(o));if(l=n(r,s,a),c>0){let n=e.subarray(t,t+=c);if(n.byteLength<c)throw Error(gn(c,n.byteLength));l.body=n}else o!==f.Schema&&(l.body=new Uint8Array)}return{version:a,type:o,index:t,content:l}}function yn(e){let t=j(e)?new Uint8Array(e):e;return t instanceof Uint8Array&&bn(t)?Sn(t):xn(t)}function bn(e){if(!e||e.length<4)return!1;for(let t=0;t<6;++t)if(u[t]!==e[t])return!1;return!0}function xn(e){let t=[e].flat(),n,r=[],i=[];for(let e of t){if(!(e instanceof Uint8Array))throw Error(`IPC data batch was not a Uint8Array.`);let t=0;for(;;){let a=vn(e,t);if(a===null)break;if(t=a.index,a.content)switch(a.type){case f.Schema:n||=a.content;break;case f.RecordBatch:r.push(a.content);break;case f.DictionaryBatch:i.push(a.content);break}}}return{schema:n,dictionaries:i,records:r,metadata:null}}function Sn(e){let t=e.byteLength-(u.length+4),n=R(e,t-B(e,t)),r=n(4,z,d.V1),i=n(8,nn,[]),a=n(10,nn,[]);return{schema:n(6,(e,t)=>ln(e,t,r)),dictionaries:i.map(({offset:t})=>vn(e,t).content),records:a.map(({offset:t})=>vn(e,t).content),metadata:n(12,cn)}}function Cn(e,t){return wn(yn(e),t)}function wn(e,t={}){let{schema:n={fields:[]},dictionaries:r,records:i}=e,{version:a,fields:o}=n,s=new Map,c=En(t,a,s),l=new Map;Tn(n,e=>{let t=e.type;t.typeId===p.Dictionary&&l.set(t.id,t.dictionary)});let u=new Map;for(let e of r){let{id:t,data:n,isDelta:r,body:i}=e,a=l.get(t),o=On(a,c({...n,body:i}));if(u.has(t)){let e=u.get(t);r||e.clear(),e.add(o)}else{if(r)throw Error(`Delta update can not be first dictionary batch.`);u.set(t,Ht(a).add(o))}}u.forEach((e,t)=>s.set(t,e.done()));let d=o.map(e=>Ht(e.type));for(let e of i){let t=c(e);o.forEach((e,n)=>d[n].add(On(e.type,t)))}return new qt(n,d.map(e=>e.done()),t.useProxy)}function Tn(e,t){e.fields.forEach(function e(n){t(n),n.type.dictionary?.children?.forEach(e),n.type.children?.forEach(e)})}function En(e,t,n){let r={version:t,options:e,dictionary:e=>n.get(e)};return e=>{let{length:t,nodes:n,regions:i,compression:a,variadic:o,body:s}=e,c=-1,l=-1,u=-1;return{...r,length:t,node:()=>n[++c],buffer:e=>{let{bytes:t,length:n,offset:r}=Dn(s,i[++l],a);return e?new e(t.buffer,t.byteOffset+r,n/e.BYTES_PER_ELEMENT):t.subarray(r,r+n)},variadic:()=>o[++u],visit(e){return e.map(e=>On(e.type,this))}}}}function Dn(e,t,n){if(!n)return{bytes:e,...t};if(n.method!==b.BUFFER)throw Error(`Unknown compression method (${n.method})`);{let r=n.codec,i=$t(r);if(!i)throw Error(Zt(r));return en(e,t,i)}}function On(e,t){let{typeId:n}=e,{options:r,node:i,buffer:a,variadic:o,version:s}=t,c=Yt(e,r),l={...i(),type:e};if(n===p.Null)return new c({...l,nullCount:l.length});switch(n){case p.Bool:case p.Int:case p.Time:case p.Duration:case p.Float:case p.Decimal:case p.Date:case p.Timestamp:case p.Interval:case p.FixedSizeBinary:return new c({...l,validity:a(),values:a(e.values)});case p.Utf8:case p.LargeUtf8:case p.Binary:case p.LargeBinary:return new c({...l,validity:a(),offsets:a(e.offsets),values:a()});case p.BinaryView:case p.Utf8View:return new c({...l,validity:a(),values:a(),data:Array.from({length:o()},()=>a())});case p.List:case p.LargeList:case p.Map:return new c({...l,validity:a(),offsets:a(e.offsets),children:t.visit(e.children)});case p.ListView:case p.LargeListView:return new c({...l,validity:a(),offsets:a(e.offsets),sizes:a(e.offsets),children:t.visit(e.children)});case p.FixedSizeList:case p.Struct:return new c({...l,validity:a(),children:t.visit(e.children)});case p.RunEndEncoded:return new c({...l,children:t.visit(e.children)});case p.Dictionary:{let{id:n,indices:r}=e;return new c({...l,validity:a(),values:a(r.values)}).setDictionary(t.dictionary(n))}case p.Union:return s<d.V5&&a(),new c({...l,typeIds:a(T),offsets:e.mode===v.Sparse?null:a(e.offsets),children:t.visit(e.children)});default:throw Error(te(n))}}new Uint16Array(new Uint8Array([1,0]).buffer)[0];const kn=new Set([`Float32Array`,`Float64Array`,`Int8Array`,`Int16Array`,`Int32Array`,`Uint8Array`,`Uint16Array`,`Uint32Array`]),An=e=>{let t=Cn(new Uint8Array(e)).toColumns(),n={},r=[];for(let[e,i]of Object.entries(t)){if(ArrayBuffer.isView(i)){let t=Object.prototype.toString.call(i).slice(8,-1);kn.has(t)&&(n[e]=i instanceof Float32Array?i:new Float32Array(i));continue}if(Array.isArray(i)&&i.length>0&&typeof i[0]==`string`){let t=new Map,n=new Uint32Array(i.length);for(let e=0;e<i.length;e++){let r=String(i[e]??``),a=t.get(r);a===void 0&&(a=t.size,t.set(r,a)),n[e]=a}let a=[...t.keys()],o=[...a].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),s=new Map;for(let e=0;e<o.length;e++)s.set(o[e],e);let c=a.map(e=>s.get(e));for(let e=0;e<n.length;e++)n[e]=c[n[e]];r.push({name:e,indices:n,labels:o})}}return{numeric:n,categorical:r}},jn=[65,82,82,79,87,49],Mn=[80,65,82,49],Nn=(e,t)=>e.length>=t.length&&t.every((t,n)=>e[n]===t),Pn=e=>{let t=new Uint8Array(e,0,Math.min(8,e.byteLength));return Nn(t,jn)?`arrow`:Nn(t,Mn)?`parquet`:`arrow`},Fn=[`BOOLEAN`,`INT32`,`INT64`,`INT96`,`FLOAT`,`DOUBLE`,`BYTE_ARRAY`,`FIXED_LEN_BYTE_ARRAY`],In=[`PLAIN`,`GROUP_VAR_INT`,`PLAIN_DICTIONARY`,`RLE`,`BIT_PACKED`,`DELTA_BINARY_PACKED`,`DELTA_LENGTH_BYTE_ARRAY`,`DELTA_BYTE_ARRAY`,`RLE_DICTIONARY`,`BYTE_STREAM_SPLIT`],Ln=[`REQUIRED`,`OPTIONAL`,`REPEATED`],Rn=[`UTF8`,`MAP`,`MAP_KEY_VALUE`,`LIST`,`ENUM`,`DECIMAL`,`DATE`,`TIME_MILLIS`,`TIME_MICROS`,`TIMESTAMP_MILLIS`,`TIMESTAMP_MICROS`,`UINT_8`,`UINT_16`,`UINT_32`,`UINT_64`,`INT_8`,`INT_16`,`INT_32`,`INT_64`,`JSON`,`BSON`,`INTERVAL`],zn=[`UNCOMPRESSED`,`SNAPPY`,`GZIP`,`LZO`,`BROTLI`,`LZ4`,`ZSTD`,`LZ4_RAW`],Bn=[`DATA_PAGE`,`INDEX_PAGE`,`DICTIONARY_PAGE`,`DATA_PAGE_V2`],Vn=[`SPHERICAL`,`VINCENTY`,`THOMAS`,`ANDOYER`,`KARNEY`];function Hn(e){let t=Un(e);if(t.type===1)return{type:`Point`,coordinates:Wn(e,t)};if(t.type===2)return{type:`LineString`,coordinates:Gn(e,t)};if(t.type===3)return{type:`Polygon`,coordinates:Kn(e,t)};if(t.type===4){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e,Un(e)));return{type:`MultiPoint`,coordinates:n}}else if(t.type===5){let n=[];for(let r=0;r<t.count;r++)n.push(Gn(e,Un(e)));return{type:`MultiLineString`,coordinates:n}}else if(t.type===6){let n=[];for(let r=0;r<t.count;r++)n.push(Kn(e,Un(e)));return{type:`MultiPolygon`,coordinates:n}}else if(t.type===7){let n=[];for(let r=0;r<t.count;r++)n.push(Hn(e));return{type:`GeometryCollection`,geometries:n}}else throw Error(`Unsupported geometry type: ${t.type}`)}function Un(e){let{view:t}=e,n=t.getUint8(e.offset++)===1,r=t.getUint32(e.offset,n);e.offset+=4;let i=r%1e3,a=Math.floor(r/1e3),o=0;i>1&&i<=7&&(o=t.getUint32(e.offset,n),e.offset+=4);let s=2;return a&&s++,a===3&&s++,{littleEndian:n,type:i,dim:s,count:o}}function Wn(e,t){let n=[];for(let r=0;r<t.dim;r++){let r=e.view.getFloat64(e.offset,t.littleEndian);e.offset+=8,n.push(r)}return n}function Gn(e,t){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e,t));return n}function Kn(e,t){let{view:n}=e,r=[];for(let i=0;i<t.count;i++){let i=n.getUint32(e.offset,t.littleEndian);e.offset+=4,r.push(Gn(e,{...t,count:i}))}return r}const qn=new TextDecoder,Jn={timestampFromMilliseconds(e){return new Date(Number(e))},timestampFromMicroseconds(e){return new Date(Number(e/1000n))},timestampFromNanoseconds(e){return new Date(Number(e/1000000n))},dateFromDays(e){return new Date(e*864e5)},stringFromBytes(e){return e&&qn.decode(e)},geometryFromBytes(e){return e&&Hn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})},geographyFromBytes(e){return e&&Hn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})}};function Yn(e,t,n,r){if(t&&n.endsWith(`_DICTIONARY`)){let n=e;e instanceof Uint8Array&&!(t instanceof Uint8Array)&&(n=new t.constructor(e.length));for(let r=0;r<e.length;r++)n[r]=t[e[r]];return n}else return Xn(e,r)}function Xn(e,t){let{element:n,parsers:r,utf8:i=!0,schemaPath:a}=t,{type:o,converted_type:s,logical_type:c}=n;if(a?.some(e=>e.element.logical_type?.type===`VARIANT`)&&o===`BYTE_ARRAY`&&s!==`UTF8`&&c?.type!==`STRING`)return e;if(s===`DECIMAL`){let t=10**-(n.scale||0),r=Array(e.length);for(let n=0;n<r.length;n++)e[n]instanceof Uint8Array?r[n]=Zn(e[n])*t:r[n]=Number(e[n])*t;return r}if(!s&&o===`INT96`)return Array.from(e).map(e=>r.timestampFromNanoseconds(Qn(e)));if(s===`DATE`)return Array.from(e).map(e=>r.dateFromDays(e));if(s===`TIMESTAMP_MILLIS`)return Array.from(e).map(e=>r.timestampFromMilliseconds(e));if(s===`TIMESTAMP_MICROS`)return Array.from(e).map(e=>r.timestampFromMicroseconds(e));if(s===`JSON`)return e.map(e=>JSON.parse(qn.decode(e)));if(s===`BSON`)throw Error(`parquet bson not supported`);if(s===`INTERVAL`)throw Error(`parquet interval not supported`);if(c?.type===`GEOMETRY`)return e.map(e=>r.geometryFromBytes(e));if(c?.type===`GEOGRAPHY`)return e.map(e=>r.geographyFromBytes(e));if(s===`UTF8`||c?.type===`STRING`||i&&o===`BYTE_ARRAY`)return e.map(e=>r.stringFromBytes(e));if(s===`UINT_64`||c?.type===`INTEGER`&&c.bitWidth===64&&!c.isSigned){if(e instanceof BigInt64Array)return new BigUint64Array(e.buffer,e.byteOffset,e.length);let t=new BigUint64Array(e.length);for(let n=0;n<t.length;n++)t[n]=BigInt(e[n]);return t}if(s===`UINT_32`||c?.type===`INTEGER`&&c.bitWidth===32&&!c.isSigned){if(e instanceof Int32Array)return new Uint32Array(e.buffer,e.byteOffset,e.length);let t=new Uint32Array(e.length);for(let n=0;n<t.length;n++)t[n]=e[n];return t}if(c?.type===`FLOAT16`)return Array.from(e).map($n);if(c?.type===`TIMESTAMP`){let{unit:t}=c,n=r.timestampFromMilliseconds;t===`MICROS`&&(n=r.timestampFromMicroseconds),t===`NANOS`&&(n=r.timestampFromNanoseconds);let i=Array(e.length);for(let t=0;t<i.length;t++)i[t]=n(e[t]);return i}return e}function Zn(e){if(!e.length)return 0;let t=0n;for(let n of e)t=t*256n+BigInt(n);let n=e.length*8;return t>=2n**BigInt(n-1)&&(t-=2n**BigInt(n)),Number(t)}function Qn(e){let t=(e>>64n)-2440588n,n=e&18446744073709551615n;return t*86400000000000n+n}function $n(e){if(!e)return;let t=e[1]<<8|e[0],n=t>>15?-1:1,r=t>>10&31,i=t&1023;return r===0?n*2**-14*(i/1024):r===31?i?NaN:n*(1/0):n*2**(r-15)*(1+i/1024)}function er(e,t,n){let r=e[t],i=[],a=1;if(r.num_children)for(;i.length<r.num_children;){let r=e[t+a],o=er(e,t+a,[...n,r.name]);a+=o.count,i.push(o)}return{count:a,element:r,children:i,path:n}}function tr(e,t){let n=er(e,0,[]),r=[n];for(let e of t){let i=n.children.find(t=>t.element.name===e);if(!i)throw Error(`parquet schema element not found: ${t}`);r.push(i),n=i}return r}function nr(e){let t=[];function n(e){if(e.children.length)for(let t of e.children)n(t);else t.push(e.path.join(`.`))}return n(e),t}function rr(e){let t=0;for(let{element:n}of e)n.repetition_type===`REPEATED`&&t++;return t}function ir(e){let t=0;for(let{element:n}of e.slice(1))n.repetition_type!==`REQUIRED`&&t++;return t}function ar(e){if(!e||e.element.converted_type!==`LIST`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length>1||t.element.repetition_type!==`REPEATED`)}function or(e){if(!e||e.element.converted_type!==`MAP`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length!==2||t.element.repetition_type!==`REPEATED`||t.children.find(e=>e.element.name===`key`)?.element.repetition_type===`REPEATED`||t.children.find(e=>e.element.name===`value`)?.element.repetition_type===`REPEATED`)}function sr(e){if(e.length!==2)return!1;let[,t]=e;return!(t.element.repetition_type===`REPEATED`||t.children.length)}const U={STOP:0,TRUE:1,FALSE:2,BYTE:3,I16:4,I32:5,I64:6,DOUBLE:7,BINARY:8,LIST:9,SET:10,MAP:11,STRUCT:12,UUID:13};function cr(e){let t=0,n={};for(;e.offset<e.view.byteLength;){let[r,i,a]=mr(e,t);if(t=a,r===U.STOP)break;n[`field_${i}`]=lr(e,r)}return n}function lr(e,t){switch(t){case U.TRUE:return!0;case U.FALSE:return!1;case U.BYTE:return e.view.getInt8(e.offset++);case U.I16:case U.I32:return fr(e);case U.I64:return pr(e);case U.DOUBLE:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case U.BINARY:{let t=ur(e),n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}case U.LIST:{let t=e.view.getUint8(e.offset++),n=t&15,r=t>>4;r===15&&(r=ur(e));let i=n===U.TRUE||n===U.FALSE,a=Array(r);for(let t=0;t<r;t++)a[t]=i?lr(e,U.BYTE)===1:lr(e,n);return a}case U.STRUCT:{let t={},n=0;for(;;){let[r,i,a]=mr(e,n);if(n=a,r===U.STOP)break;t[`field_${i}`]=lr(e,r)}return t}default:throw Error(`thrift unhandled type: ${t}`)}}function ur(e){let t=0,n=0;for(;;){let r=e.view.getUint8(e.offset++);if(t|=(r&127)<<n,!(r&128))return t;n+=7}}function dr(e){let t=0n,n=0n;for(;;){let r=e.view.getUint8(e.offset++);if(t|=BigInt(r&127)<<n,!(r&128))return t;n+=7n}}function fr(e){let t=ur(e);return t>>>1^-(t&1)}function pr(e){let t=dr(e);return t>>1n^-(t&1n)}function mr(e,t){let n=e.view.getUint8(e.offset++),r=n&15;if(r===U.STOP)return[0,0,t];let i=n>>4,a=i?t+i:fr(e);return[r,a,a]}function hr(e,t){let n=new Map,r=t?.find(({key:e})=>e===`geo`)?.value,i=(r&&JSON.parse(r)?.columns)??{};for(let[e,t]of Object.entries(i)){if(t.encoding!==`WKB`)continue;let r=t.edges===`spherical`?`GEOGRAPHY`:`GEOMETRY`,i=t.crs?.id??t.crs?.ids?.[0],a=i?`${i.authority}:${i.code.toString()}`:void 0;n.set(e,{type:r,crs:a})}for(let t=1;t<e.length;t++){let r=e[t],{logical_type:i,name:a,num_children:o,repetition_type:s,type:c}=r;if(o){t+=o;continue}c===`BYTE_ARRAY`&&i===void 0&&s!==`REPEATED`&&(r.logical_type=n.get(a))}}const gr=new TextDecoder;function W(e){return e&&gr.decode(e)}async function _r(e,{parsers:t,initialFetchSize:n=524288,geoparquet:r=!0}={}){if(!e||!(e.byteLength>=0))throw Error(`parquet expected AsyncBuffer`);let i=Math.max(0,e.byteLength-n),a=await e.slice(i,e.byteLength),o=new DataView(a);if(o.getUint32(a.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let s=o.getUint32(a.byteLength-8,!0);if(s>e.byteLength-8)throw Error(`parquet metadata length ${s} exceeds available buffer ${e.byteLength-8}`);if(s+8>n){let n=e.byteLength-s-8,o=await e.slice(n,i),c=new ArrayBuffer(s+8),l=new Uint8Array(c);return l.set(new Uint8Array(o)),l.set(new Uint8Array(a),i-n),vr(c,{parsers:t,geoparquet:r})}else return vr(a,{parsers:t,geoparquet:r})}function vr(e,{parsers:t,geoparquet:n=!0}={}){if(!(e instanceof ArrayBuffer))throw Error(`parquet expected ArrayBuffer`);let r=new DataView(e);if(t={...Jn,...t},r.byteLength<8)throw Error(`parquet file is too short`);if(r.getUint32(r.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let i=r.byteLength-8,a=r.getUint32(i,!0);if(a>r.byteLength-8)throw Error(`parquet metadata length ${a} exceeds available buffer ${r.byteLength-8}`);let o=cr({view:r,offset:i-a}),s=o.field_1,c=o.field_2.map(e=>({type:Fn[e.field_1],type_length:e.field_2,repetition_type:Ln[e.field_3],name:W(e.field_4),num_children:e.field_5,converted_type:Rn[e.field_6],scale:e.field_7,precision:e.field_8,field_id:e.field_9,logical_type:br(e.field_10)})),l=c.filter(e=>e.type),u=o.field_3,d=o.field_4.map(e=>({columns:e.field_1.map((e,n)=>({file_path:W(e.field_1),file_offset:e.field_2,meta_data:e.field_3&&{type:Fn[e.field_3.field_1],encodings:e.field_3.field_2?.map(e=>In[e]),path_in_schema:e.field_3.field_3.map(W),codec:zn[e.field_3.field_4],num_values:e.field_3.field_5,total_uncompressed_size:e.field_3.field_6,total_compressed_size:e.field_3.field_7,key_value_metadata:e.field_3.field_8?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),data_page_offset:e.field_3.field_9,index_page_offset:e.field_3.field_10,dictionary_page_offset:e.field_3.field_11,statistics:Sr(e.field_3.field_12,l[n],t),encoding_stats:e.field_3.field_13?.map(e=>({page_type:Bn[e.field_1],encoding:In[e.field_2],count:e.field_3})),bloom_filter_offset:e.field_3.field_14,bloom_filter_length:e.field_3.field_15,size_statistics:e.field_3.field_16&&{unencoded_byte_array_data_bytes:e.field_3.field_16.field_1,repetition_level_histogram:e.field_3.field_16.field_2,definition_level_histogram:e.field_3.field_16.field_3},geospatial_statistics:e.field_3.field_17&&{bbox:e.field_3.field_17.field_1&&{xmin:e.field_3.field_17.field_1.field_1,xmax:e.field_3.field_17.field_1.field_2,ymin:e.field_3.field_17.field_1.field_3,ymax:e.field_3.field_17.field_1.field_4,zmin:e.field_3.field_17.field_1.field_5,zmax:e.field_3.field_17.field_1.field_6,mmin:e.field_3.field_17.field_1.field_7,mmax:e.field_3.field_17.field_1.field_8},geospatial_types:e.field_3.field_17.field_2}},offset_index_offset:e.field_4,offset_index_length:e.field_5,column_index_offset:e.field_6,column_index_length:e.field_7,crypto_metadata:e.field_8,encrypted_column_metadata:e.field_9})),total_byte_size:e.field_2,num_rows:e.field_3,sorting_columns:e.field_4?.map(e=>({column_idx:e.field_1,descending:e.field_2,nulls_first:e.field_3})),file_offset:e.field_5,total_compressed_size:e.field_6,ordinal:e.field_7})),f=o.field_5?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),p=W(o.field_6);return n&&hr(c,f),{version:s,schema:c,num_rows:u,row_groups:d,key_value_metadata:f,created_by:p,metadata_length:a}}function yr({schema:e}){return tr(e,[])[0]}function br(e){return e?.field_1?{type:`STRING`}:e?.field_2?{type:`MAP`}:e?.field_3?{type:`LIST`}:e?.field_4?{type:`ENUM`}:e?.field_5?{type:`DECIMAL`,scale:e.field_5.field_1,precision:e.field_5.field_2}:e?.field_6?{type:`DATE`}:e?.field_7?{type:`TIME`,isAdjustedToUTC:e.field_7.field_1,unit:xr(e.field_7.field_2)}:e?.field_8?{type:`TIMESTAMP`,isAdjustedToUTC:e.field_8.field_1,unit:xr(e.field_8.field_2)}:e?.field_10?{type:`INTEGER`,bitWidth:e.field_10.field_1,isSigned:e.field_10.field_2}:e?.field_11?{type:`NULL`}:e?.field_12?{type:`JSON`}:e?.field_13?{type:`BSON`}:e?.field_14?{type:`UUID`}:e?.field_15?{type:`FLOAT16`}:e?.field_16?{type:`VARIANT`,specification_version:e.field_16.field_1}:e?.field_17?{type:`GEOMETRY`,crs:W(e.field_17.field_1)}:e?.field_18?{type:`GEOGRAPHY`,crs:W(e.field_18.field_1),algorithm:Vn[e.field_18.field_2]}:e}function xr(e){if(e.field_1)return`MILLIS`;if(e.field_2)return`MICROS`;if(e.field_3)return`NANOS`;throw Error(`parquet time unit required`)}function Sr(e,t,n){return e&&{max:Cr(e.field_1,t,n),min:Cr(e.field_2,t,n),null_count:e.field_3,distinct_count:e.field_4,max_value:Cr(e.field_5,t,n),min_value:Cr(e.field_6,t,n),is_max_value_exact:e.field_7,is_min_value_exact:e.field_8}}function Cr(e,t,n){let{type:r,converted_type:i,logical_type:a}=t;if(e===void 0)return e;if(r===`BOOLEAN`)return e[0]===1;if(r===`BYTE_ARRAY`)return n.stringFromBytes(e);let o=new DataView(e.buffer,e.byteOffset,e.byteLength);return r===`FLOAT`&&o.byteLength===4?o.getFloat32(0,!0):r===`DOUBLE`&&o.byteLength===8?o.getFloat64(0,!0):r===`INT32`&&i===`DATE`?n.dateFromDays(o.getInt32(0,!0)):r===`INT64`&&i===`TIMESTAMP_MILLIS`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT64`&&i===`TIMESTAMP_MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`NANOS`?n.timestampFromNanoseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT32`&&o.byteLength===4?o.getInt32(0,!0):r===`INT64`&&o.byteLength===8?o.getBigInt64(0,!0):i===`DECIMAL`?Zn(e)*10**-(t.scale||0):a?.type===`FLOAT16`?$n(e):e}function wr(e){let t=cr(e);return{page_locations:t.field_1.map(Tr),unencoded_byte_array_data_bytes:t.field_2}}function Tr(e){return{offset:e.field_1,compressed_page_size:e.field_2,first_row_index:e.field_3}}function Er(e,t){let n=1e4;for(let r=0;r<t.length;r+=n)e.push(...t.slice(r,r+n))}function G(e,t,n=!0){if(n?e===t:e==t)return!0;if(e instanceof Uint8Array&&t instanceof Uint8Array)return G(Array.from(e),Array.from(t),n);if(!e||!t||typeof e!=typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!G(e[r],t[r],n))return!1;return!0}if(typeof e!=`object`)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!G(e[i],t[i],n))return!1;return!0}function Dr(e){if(!e)return[];if(e.length===1)return e[0];let t=[];for(let n of e)Er(t,n);return t}function Or(e){if(!e)return[];let t=[];return`$and`in e&&Array.isArray(e.$and)?t.push(...e.$and.flatMap(Or)):`$or`in e&&Array.isArray(e.$or)?t.push(...e.$or.flatMap(Or)):`$nor`in e&&Array.isArray(e.$nor)?t.push(...e.$nor.flatMap(Or)):t.push(...Object.keys(e).map(e=>e.split(`.`)[0])),[...new Set(t)]}function kr(e,t,n=!0){return`$and`in t&&Array.isArray(t.$and)?t.$and.every(t=>kr(e,t,n)):`$or`in t&&Array.isArray(t.$or)?t.$or.some(t=>kr(e,t,n)):`$nor`in t&&Array.isArray(t.$nor)?!t.$nor.some(t=>kr(e,t,n)):Object.entries(t).every(([t,r])=>{let i=jr(e,t);return typeof r!=`object`||!r||Array.isArray(r)?G(i,r,n):Object.entries(r||{}).every(([e,r])=>e===`$gt`?i>r:e===`$gte`?i>=r:e===`$lt`?i<r:e===`$lte`?i<=r:e===`$eq`?G(i,r,n):e===`$ne`?!G(i,r,n):e===`$in`?Array.isArray(r)&&r.includes(i):e===`$nin`?Array.isArray(r)&&!r.includes(i):e===`$not`?!kr({[t]:i},{[t]:r},n):!0)})}function Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r=!0}){if(!n)return!1;if(`$and`in n&&Array.isArray(n.$and))return n.$and.some(n=>Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$or`in n&&Array.isArray(n.$or))return n.$or.every(n=>Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$nor`in n&&Array.isArray(n.$nor))return!1;for(let[i,a]of Object.entries(n)){let n=t.indexOf(i);if(n===-1)continue;let o=e.columns[n].meta_data?.statistics;if(!o)continue;let{min:s,max:c,min_value:l,max_value:u}=o,d=l===void 0?s:l,f=u===void 0?c:u;if(!(d===void 0||f===void 0)){for(let[e,t]of Object.entries(a||{}))if(e===`$gt`&&f<=t||e===`$gte`&&f<t||e===`$lt`&&d>=t||e===`$lte`&&d>t||e===`$eq`&&(t<d||t>f)||e===`$ne`&&G(d,f,r)&&G(d,t,r)||e===`$in`&&Array.isArray(t)&&t.every(e=>e<d||e>f)||e===`$nin`&&Array.isArray(t)&&G(d,f,r)&&t.includes(d))return!0}}return!1}function jr(e,t){let n=e;for(let e of t.split(`.`))n=n?.[e];return n}function Mr({metadata:e,rowStart:t=0,rowEnd:n=1/0,columns:r,filter:i,filterStrict:a=!0,useOffsetIndex:o=!1}){if(!e)throw Error(`parquetPlan requires metadata`);let s=[],c=[],l=[],u=nr(yr(e)),d=0;for(let f of e.row_groups){let e=Number(f.num_rows),p=d+e;if(e>0&&p>t&&d<n&&!Ar({rowGroup:f,physicalColumns:u,filter:i,strict:a})){let i=[],a=1/0,u=-1/0;for(let e of f.columns){let t=e.meta_data;if(e.file_path)throw Error(`parquet file_path not supported`);if(!t)throw Error(`parquet column metadata is undefined`);if(!r||r.includes(t.path_in_schema[0])){let n=t.dictionary_page_offset||t.data_page_offset,r=Number(n),s=Number(n+t.total_compressed_size);if(r<a&&(a=r),s>u&&(u=s),o&&e.offset_index_offset&&e.offset_index_length){let n=Number(e.offset_index_offset);i.push({columnMetadata:t,offsetIndex:{startByte:n,endByte:n+e.offset_index_length},bounds:{startByte:r,endByte:s}})}else i.push({columnMetadata:t,range:{startByte:r,endByte:s}})}}let p=Math.max(t-d,0),m=Math.min(n-d,e);s.push({chunks:i,rowGroup:f,groupStart:d,groupRows:e,selectStart:p,selectEnd:m});let h;for(let e of i)if(`offsetIndex`in e)l.push(e.offsetIndex);else{let{range:t}=e;r?c.push(t):h&&t.endByte-h.startByte<=2097152?h.endByte=t.endByte:(h&&c.push(h),h={...t})}h&&c.push(h)}d=p}return isFinite(n)||(n=d),c.push(...l),{metadata:e,rowStart:t,rowEnd:n,columns:r,fetches:c,groups:s}}function Nr(e,{fetches:t}){let n=t.map(({startByte:t,endByte:n})=>e.slice(t,n));return{byteLength:e.byteLength,slice(r,i=e.byteLength){let a=t.findIndex(({startByte:e,endByte:t})=>e<=r&&i<=t);if(a<0)return e.slice(r,i);if(t[a].startByte!==r||t[a].endByte!==i){let e=r-t[a].startByte,o=i-t[a].startByte;return n[a]instanceof Promise?n[a].then(t=>t.slice(e,o)):n[a].slice(e,o)}else return n[a]}}}const Pr=new TextDecoder,Fr=new WeakMap;function Ir(e,t=Jn){if(Array.isArray(e))return e.map(e=>Ir(e,t));if(typeof e!=`object`)return e;if(`metadata`in e){let n=zr(e.metadata),r=e.typed_value&&Lr(e.typed_value,n,t),i=e.value&&Vr(Rr(e.value),n,t);return r&&i?{...i,...r}:r??i}return e}function Lr(e,t,n){if(e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanceof Uint8Array)){if(`typed_value`in e)return Lr(e.typed_value,t,n);if(`value`in e&&e.value instanceof Uint8Array)return Vr(Rr(e.value),t,n);let r={};for(let[i,a]of Object.entries(e))r[i]=Lr(a,t,n);return r}return e instanceof Uint8Array?Vr(Rr(e),t,n):Array.isArray(e)?e.map(e=>Lr(e,t,n)):e}function Rr(e){return{view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0}}function zr(e){let t=Fr.get(e.buffer);t||(t=new Map,Fr.set(e.buffer,t));let n=`${e.byteOffset}:${e.byteLength}`,r=t.get(n);if(r)return r;let i=Rr(e),a=i.view.getUint8(i.offset++),o=a&15;if(o!==1)throw Error(`parquet unsupported variant metadata version: ${o}`);let s=(a>>4&1)==1,c=(a>>6&3)+1,l=Br(i,c),u=Array(l+1);for(let e=0;e<u.length;e++)u[e]=Br(i,c);let d=i.offset,f=Array(l);for(let t=0;t<l;t++){let n=u[t],r=u[t+1],i=new Uint8Array(e.buffer,e.byteOffset+d+n,r-n);f[t]=Pr.decode(i)}let p={dictionary:f,sorted:s};return t.set(n,p),p}function Br(e,t){let n=0;for(let r=0;r<t;r++)n|=e.view.getUint8(e.offset+r)<<r*8;return e.offset+=t,n}function Vr(e,t,n){let r=e.view.getUint8(e.offset++),i=r&3,a=r>>2;if(i===0)return Hr(e,a,n);if(i===2)return Ur(e,a,t,n);if(i===3)return Wr(e,a,t,n);let o=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,a);return e.offset+=a,Pr.decode(o)}function Hr(e,t,n){switch(t){case 0:return null;case 1:return!0;case 2:return!1;case 3:{let t=e.view.getInt8(e.offset);return e.offset+=1,t}case 4:{let t=e.view.getInt16(e.offset,!0);return e.offset+=2,t}case 5:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,t}case 6:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 7:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case 8:return Gr(e,4);case 9:return Gr(e,8);case 10:return Gr(e,16);case 11:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,n.dateFromDays(t)}case 12:case 13:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromMicroseconds(t)}case 14:{let t=e.view.getFloat32(e.offset,!0);return e.offset+=4,t}case 15:return Kr(e);case 16:{let t=Kr(e);return Pr.decode(t)}case 17:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 18:case 19:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromNanoseconds(t)}case 20:{let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,16);e.offset+=16;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}default:throw Error(`parquet unsupported variant primitive type: ${t}`)}}function Ur(e,t,n,r){let i=(t&3)+1,a=(t>>2&3)+1,o=t>>4&1?Br(e,4):e.view.getUint8(e.offset++),s=Array(o);for(let t=0;t<o;t++)s[t]=Br(e,a);let c=Array(o+1);for(let t=0;t<c.length;t++)c[t]=Br(e,i);let l={};for(let t=0;t<o;t++){let i=n.dictionary[s[t]];l[i]=Vr({view:e.view,offset:e.offset+c[t]},n,r)}return e.offset+=c[c.length-1],l}function Wr(e,t,n,r){let i=t&3,a=t>>2&1,o=i+1,s=Br(e,a?4:1),c=Array(s+1);for(let t=0;t<c.length;t++)c[t]=Br(e,o);let l=e.offset,u=Array(s);for(let t=0;t<s;t++)u[t]=Vr({view:e.view,offset:l+c[t]},n,r);return e.offset=l+c[c.length-1],u}function Gr(e,t){let n=e.view.getUint8(e.offset);e.offset+=1;let r;if(t===4)r=BigInt(e.view.getInt32(e.offset,!0)),e.offset+=4;else if(t===8)r=e.view.getBigInt64(e.offset,!0),e.offset+=8;else{let t=e.view.getBigUint64(e.offset,!0);r=e.view.getBigInt64(e.offset+8,!0)<<64n|t,e.offset+=16}return Number(r)*10**-n}function Kr(e){let t=e.view.getUint32(e.offset,!0);e.offset+=4;let n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}function qr(e,t,n,r,i){let a=ir(i);if(!t?.length&&!n.length){if(!a||!r.length)return r;t=Array(r.length).fill(a)}let o=t?.length||n.length,s=i.map(({element:e})=>e.repetition_type),c=0,l=[e],u=e,d=0,f=0,p=0;if(n[0])for(;d<s.length-2&&p<n[0];)d++,s[d]!==`REQUIRED`&&(u=u.at(-1),l.push(u),f++),s[d]===`REPEATED`&&p++;for(let e=0;e<o;e++){let i=t?.length?t[e]:a,o=n[e];for(;d&&(o<p||s[d]!==`REPEATED`);)s[d]!==`REQUIRED`&&(l.pop(),f--),s[d]===`REPEATED`&&p--,d--;for(u=l.at(-1);(d<s.length-2||s[d+1]===`REPEATED`)&&(f<i||s[d+1]===`REQUIRED`);){if(d++,s[d]!==`REQUIRED`){let e=[];u.push(e),u=e,l.push(e),f++}s[d]===`REPEATED`&&p++}i===a?u.push(r[c++]):d===s.length-2?u.push(null):u.push([])}if(!e.length)for(let e=0;e<a;e++){let e=[];u.push(e),u=e}return e}function Jr(e,t,n,r=0){let i=t.path.join(`.`),a=t.element.repetition_type===`OPTIONAL`,o=a?r+1:r;if(ar(t)){let s=t.children[0],c=o;s.children.length===1&&(s=s.children[0],c++),Jr(e,s,n,c);let l=s.path.join(`.`),u=e.get(l);if(!u)throw Error(`parquet list column missing values`);a&&Yr(u,r),e.set(i,u),e.delete(l);return}if(or(t)){let s=t.children[0].element.name;Jr(e,t.children[0].children[0],n,o+1),Jr(e,t.children[0].children[1],n,o+1);let c=e.get(`${i}.${s}.key`),l=e.get(`${i}.${s}.value`);if(!c)throw Error(`parquet map column missing keys`);if(!l)throw Error(`parquet map column missing values`);if(c.length!==l.length)throw Error(`parquet map column key/value length mismatch`);let u=Xr(c,l,o);a&&Yr(u,r),e.delete(`${i}.${s}.key`),e.delete(`${i}.${s}.value`),e.set(i,u);return}if(t.children.length){let o=t.element.repetition_type===`REQUIRED`?r:r+1,s={};for(let r of t.children){Jr(e,r,n,o);let t=e.get(r.path.join(`.`));if(!t)throw Error(`parquet struct missing child data`);s[r.element.name]=t}for(let n of t.children)e.delete(n.path.join(`.`));let c=Zr(s,o);t.element.logical_type?.type===`VARIANT`&&(c=Ir(c,n)),a&&Yr(c,r),e.set(i,c)}}function Yr(e,t){for(let n=0;n<e.length;n++)t?Yr(e[n],t-1):e[n]=e[n][0]}function Xr(e,t,n){let r=[];for(let i=0;i<e.length;i++)if(n)r.push(Xr(e[i],t[i],n-1));else if(e[i]){let n={};for(let r=0;r<e[i].length;r++){let a=t[i][r];n[e[i][r]]=a===void 0?null:a}r.push(n)}else r.push(void 0);return r}function Zr(e,t){let n=Object.keys(e),r=e[n[0]]?.length,i=[];for(let a=0;a<r;a++){let o={};for(let t of n){if(e[t].length!==r)throw Error(`parquet struct parsing error`);o[t]=e[t][a]}t?i.push(Zr(o,t-1)):i.push(o)}return i}function Qr(e,t,n){let r=n instanceof Int32Array,i=ur(e),a=ur(e);ur(e);let o=pr(e),s=0;n[s++]=r?Number(o):o;let c=i/a;for(;s<t;){let i=pr(e),l=new Uint8Array(a);for(let t=0;t<a;t++)l[t]=e.view.getUint8(e.offset++);for(let u=0;u<a&&s<t;u++){let a=BigInt(l[u]);if(a){let l=0n,u=c,d=(1n<<a)-1n;for(;u&&s<t;){let t=BigInt(e.view.getUint8(e.offset))>>l&d;for(l+=a;l>=8;)l-=8n,e.offset++,l&&(t|=BigInt(e.view.getUint8(e.offset))<<a-l&d);let c=i+t;o+=c,n[s++]=r?Number(o):o,u--}u&&(e.offset+=Math.ceil((u*Number(a)+Number(l))/8))}else for(let e=0;e<c&&s<t;e++)o+=i,n[s++]=r?Number(o):o}}}function $r(e,t,n){let r=new Int32Array(t);Qr(e,t,r);for(let i=0;i<t;i++)n[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,r[i]),e.offset+=r[i]}function ei(e,t,n){let r=new Int32Array(t);Qr(e,t,r);let i=new Int32Array(t);Qr(e,t,i);for(let a=0;a<t;a++){let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,i[a]);r[a]?(n[a]=new Uint8Array(r[a]+i[a]),n[a].set(n[a-1].subarray(0,r[a])),n[a].set(t,r[a])):n[a]=t,e.offset+=i[a]}}function ti(e){return 32-Math.clz32(e)}function ni(e,t,n,r){r===void 0&&(r=e.view.getUint32(e.offset,!0),e.offset+=4);let i=e.offset,a=0;for(;a<n.length;){let r=ur(e);if(r&1)a=ii(e,r,t,n,a);else{let i=r>>>1;ri(e,i,t,n,a),a+=i}}e.offset=i+r}function ri(e,t,n,r,i){let a=n+7>>3,o=0;for(let t=0;t<a;t++)o|=e.view.getUint8(e.offset++)<<(t<<3);for(let e=0;e<t;e++)r[i+e]=o}function ii(e,t,n,r,i){let a=t>>1<<3,o=(1<<n)-1,s=0;if(e.offset<e.view.byteLength)s=e.view.getUint8(e.offset++);else if(o)throw Error(`parquet bitpack offset ${e.offset} out of range`);let c=8,l=0;for(;a;)l>8?(l-=8,c-=8,s>>>=8):c-l<n?(s|=e.view.getUint8(e.offset)<<c,e.offset++,c+=8):(i<r.length&&(r[i++]=s>>l&o),a--,l+=n);return i}function ai(e,t,n,r){let i=oi(n,r),a=new Uint8Array(t*i);for(let n=0;n<i;n++)for(let r=0;r<t;r++)a[r*i+n]=e.view.getUint8(e.offset++);if(n===`FLOAT`)return new Float32Array(a.buffer);if(n===`DOUBLE`)return new Float64Array(a.buffer);if(n===`INT32`)return new Int32Array(a.buffer);if(n===`INT64`)return new BigInt64Array(a.buffer);if(n===`FIXED_LEN_BYTE_ARRAY`){let e=Array(t);for(let n=0;n<t;n++)e[n]=a.subarray(n*i,(n+1)*i);return e}throw Error(`parquet byte_stream_split unsupported type: ${n}`)}function oi(e,t){switch(e){case`INT32`:case`FLOAT`:return 4;case`INT64`:case`DOUBLE`:return 8;case`FIXED_LEN_BYTE_ARRAY`:if(!t)throw Error(`parquet byteWidth missing type_length`);return t;default:throw Error(`parquet unsupported type: ${e}`)}}function si(e,t,n,r){if(n===0)return[];if(t===`BOOLEAN`)return ci(e,n);if(t===`INT32`)return li(e,n);if(t===`INT64`)return ui(e,n);if(t===`INT96`)return di(e,n);if(t===`FLOAT`)return fi(e,n);if(t===`DOUBLE`)return pi(e,n);if(t===`BYTE_ARRAY`)return mi(e,n);if(t===`FIXED_LEN_BYTE_ARRAY`){if(!r)throw Error(`parquet missing fixed length`);return hi(e,n,r)}else throw Error(`parquet unhandled type: ${t}`)}function ci(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.offset+(r/8|0),i=r%8;n[r]=(e.view.getUint8(t)&1<<i)!=0}return e.offset+=Math.ceil(t/8),n}function li(e,t){let n=(e.view.byteOffset+e.offset)%4?new Int32Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Int32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function ui(e,t){let n=(e.view.byteOffset+e.offset)%8?new BigInt64Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new BigInt64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function di(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getBigInt64(e.offset+r*12,!0),i=e.view.getInt32(e.offset+r*12+8,!0);n[r]=BigInt(i)<<64n|t}return e.offset+=t*12,n}function fi(e,t){let n=(e.view.byteOffset+e.offset)%4?new Float32Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Float32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function pi(e,t){let n=(e.view.byteOffset+e.offset)%8?new Float64Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new Float64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function mi(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getUint32(e.offset,!0);e.offset+=4,n[r]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t),e.offset+=t}return n}function hi(e,t,n){let r=Array(t);for(let i=0;i<t;i++)r[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,n),e.offset+=n;return r}function gi(e,t,n){let r=new ArrayBuffer(n);return new Uint8Array(r).set(new Uint8Array(e,t,n)),r}const _i=[0,255,65535,16777215,4294967295];function vi(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[t+a]}function yi(e,t){let n=e.byteLength,r=t.byteLength,i=0,a=0;for(;i<n;){let t=e[i];if(i++,t<128)break}if(r&&i>=n)throw Error(`invalid snappy length header`);for(;i<n;){let r=e[i],o=0;if(i++,i>=n)throw Error(`missing eof marker`);if(r&3){let s=0;switch(r&3){case 1:o=(r>>>2&7)+4,s=e[i]+(r>>>5<<8),i++;break;case 2:if(n<=i+1)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8),i+=2;break;case 3:if(n<=i+3)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),i+=4;break;default:break}if(s===0||isNaN(s))throw Error(`invalid offset ${s} pos ${i} inputLength ${n}`);if(s>a)throw Error(`cannot copy from before start of buffer`);vi(t,a-s,t,a,o),a+=o}else{let o=(r>>>2)+1;if(o>60){if(i+3>=n)throw Error(`snappy error literal pos + 3 >= inputLength`);let t=o-60;o=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),o=(o&_i[t])+1,i+=t}if(i+o>n)throw Error(`snappy error literal exceeds input length`);vi(e,i,t,a,o),i+=o,a+=o}}if(a!==r)throw Error(`premature end of input`)}function bi(e,t,{type:n,element:r,schemaPath:i}){let a=new DataView(e.buffer,e.byteOffset,e.byteLength),o={view:a,offset:0},s,c=xi(o,t,i),{definitionLevels:l,numNulls:u}=Si(o,t,i),d=t.num_values-u;if(t.encoding===`PLAIN`)s=si(o,n,d,r.type_length);else if(t.encoding===`PLAIN_DICTIONARY`||t.encoding===`RLE_DICTIONARY`||t.encoding===`RLE`){let e=n===`BOOLEAN`?1:a.getUint8(o.offset++);e?(s=Array(d),n===`BOOLEAN`?(ni(o,e,s),s=s.map(e=>!!e)):ni(o,e,s,a.byteLength-o.offset)):s=new Uint8Array(d)}else if(t.encoding===`BYTE_STREAM_SPLIT`)s=ai(o,d,n,r.type_length);else if(t.encoding===`DELTA_BINARY_PACKED`)s=n===`INT32`?new Int32Array(d):new BigInt64Array(d),Qr(o,d,s);else if(t.encoding===`DELTA_LENGTH_BYTE_ARRAY`)s=Array(d),$r(o,d,s);else throw Error(`parquet unsupported encoding: ${t.encoding}`);return{definitionLevels:l,repetitionLevels:c,dataPage:s}}function xi(e,t,n){if(n.length>1){let r=rr(n);if(r){let n=Array(t.num_values);return ni(e,ti(r),n),n}}return[]}function Si(e,t,n){let r=ir(n);if(!r)return{definitionLevels:[],numNulls:0};let i=Array(t.num_values);ni(e,ti(r),i);let a=t.num_values;for(let e of i)e===r&&a--;return a===0&&(i.length=0),{definitionLevels:i,numNulls:a}}function Ci(e,t,n,r){let i,a=r?.[n];if(n===`UNCOMPRESSED`)i=e;else if(a)i=a(e,t);else if(n===`SNAPPY`)i=new Uint8Array(t),yi(e,i);else throw Error(`parquet unsupported compression codec: ${n}`);if(i?.length!==t)throw Error(`parquet decompressed page length ${i?.length} does not match header ${t}`);return i}function wi(e,t,n){let r={view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0},{type:i,element:a,schemaPath:o,codec:s,compressors:c}=n,l=t.data_page_header_v2;if(!l)throw Error(`parquet data page header v2 is undefined`);let u=Ti(r,l,o);r.offset=l.repetition_levels_byte_length;let d=Ei(r,l,o),f=t.uncompressed_page_size-l.definition_levels_byte_length-l.repetition_levels_byte_length,p=e.subarray(r.offset);l.is_compressed!==!1&&(p=Ci(p,f,s,c));let m=new DataView(p.buffer,p.byteOffset,p.byteLength),h={view:m,offset:0},g,_=l.num_values-l.num_nulls;if(l.encoding===`PLAIN`)g=si(h,i,_,a.type_length);else if(l.encoding===`RLE`)g=Array(_),ni(h,1,g),g=g.map(e=>!!e);else if(l.encoding===`PLAIN_DICTIONARY`||l.encoding===`RLE_DICTIONARY`){let e=m.getUint8(h.offset++);g=Array(_),ni(h,e,g,f-1)}else if(l.encoding===`DELTA_BINARY_PACKED`)g=i===`INT32`?new Int32Array(_):new BigInt64Array(_),Qr(h,_,g);else if(l.encoding===`DELTA_LENGTH_BYTE_ARRAY`)g=Array(_),$r(h,_,g);else if(l.encoding===`DELTA_BYTE_ARRAY`)g=Array(_),ei(h,_,g);else if(l.encoding===`BYTE_STREAM_SPLIT`)g=ai(h,_,i,a.type_length);else throw Error(`parquet unsupported encoding: ${l.encoding}`);return{definitionLevels:d,repetitionLevels:u,dataPage:g}}function Ti(e,t,n){let r=rr(n);if(!r)return[];let i=Array(t.num_values);return ni(e,ti(r),i,t.repetition_levels_byte_length),i}function Ei(e,t,n){let r=ir(n);if(r){let n=Array(t.num_values);return ni(e,ti(r),n,t.definition_levels_byte_length),n}}function Di(e,{groupStart:t,selectStart:n,selectEnd:r},i,a){let{pathInSchema:o,schemaPath:s}=i,c=sr(s),l=[],u,d,f=0,p=0,m=a&&(()=>{d&&a({pathInSchema:o,columnData:d,rowStart:t+f-d.length,rowEnd:t+f})});for(;(c?f<r:e.offset<e.view.byteLength-1)&&!(e.offset>=e.view.byteLength-1);){let t=ki(e);if(t.type===`DICTIONARY_PAGE`){let{data:n}=Oi(e,t,i,u,void 0,0);n&&(u=Xn(n,i))}else{let r=d?.length||0,a=Oi(e,t,i,u,d,n-f);a.skipped?(l.length||(p+=a.skipped),f+=a.skipped):a.data&&d===a.data?f+=a.data.length-r:a.data&&a.data.length&&(m?.(),l.push(a.data),f+=a.data.length,d=a.data)}}return m?.(),{data:l,skipped:p}}function Oi(e,t,n,r,i,a){let{type:o,element:s,schemaPath:c,codec:l,compressors:u}=n,d=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t.compressed_page_size);if(e.offset+=t.compressed_page_size,t.type===`DATA_PAGE`){let e=t.data_page_header;if(!e)throw Error(`parquet data page header is undefined`);if(a>e.num_values&&sr(c))return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:f}=bi(Ci(d,Number(t.uncompressed_page_size),l,u),e,n),p=Yn(f,r,e.encoding,n);return{skipped:0,data:qr(Array.isArray(i)?i:[],o,s,p,c)}}else if(t.type===`DATA_PAGE_V2`){let e=t.data_page_header_v2;if(!e)throw Error(`parquet data page header v2 is undefined`);if(a>e.num_rows)return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:l}=wi(d,t,n),u=Yn(l,r,e.encoding,n);return{skipped:0,data:qr(Array.isArray(i)?i:[],o,s,u,c)}}else if(t.type===`DICTIONARY_PAGE`){let e=t.dictionary_page_header;if(!e)throw Error(`parquet dictionary page header is undefined`);let n=Ci(d,Number(t.uncompressed_page_size),l,u);return{skipped:0,data:si({view:new DataView(n.buffer,n.byteOffset,n.byteLength),offset:0},o,e.num_values,s.type_length)}}else throw Error(`parquet unsupported page type: ${t.type}`)}function ki(e){let t=cr(e);return{type:Bn[t.field_1],uncompressed_page_size:t.field_2,compressed_page_size:t.field_3,crc:t.field_4,data_page_header:t.field_5&&{num_values:t.field_5.field_1,encoding:In[t.field_5.field_2],definition_level_encoding:In[t.field_5.field_3],repetition_level_encoding:In[t.field_5.field_4],statistics:t.field_5.field_5&&{max:t.field_5.field_5.field_1,min:t.field_5.field_5.field_2,null_count:t.field_5.field_5.field_3,distinct_count:t.field_5.field_5.field_4,max_value:t.field_5.field_5.field_5,min_value:t.field_5.field_5.field_6}},index_page_header:t.field_6,dictionary_page_header:t.field_7&&{num_values:t.field_7.field_1,encoding:In[t.field_7.field_2],is_sorted:t.field_7.field_3},data_page_header_v2:t.field_8&&{num_values:t.field_8.field_1,num_nulls:t.field_8.field_2,num_rows:t.field_8.field_3,encoding:In[t.field_8.field_4],definition_levels_byte_length:t.field_8.field_5,repetition_levels_byte_length:t.field_8.field_6,is_compressed:t.field_8.field_7===void 0?!0:t.field_8.field_7,statistics:t.field_8.field_8}}}function Ai(e,{metadata:t},n){let{file:r,compressors:i,utf8:a}=e,o=[],s={...Jn,...e.parsers};for(let c of n.chunks){let{columnMetadata:l}=c,u=tr(t.schema,l.path_in_schema),d={pathInSchema:l.path_in_schema,type:l.type,element:u[u.length-1].element,schemaPath:u,codec:l.codec,parsers:s,compressors:i,utf8:a};if(!(`offsetIndex`in c)){o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.range.startByte,c.range.endByte)).then(t=>Di({view:new DataView(t),offset:0},n,d,e.onPage))});continue}o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.offsetIndex.startByte,c.offsetIndex.endByte)).then(async t=>{let i=wr({view:new DataView(t),offset:0}),{selectStart:a,selectEnd:o}=n,s=i.page_locations,c=NaN,l=NaN,u=0;for(let e=0;e<s.length;e++){let t=s[e],r=Number(t.first_row_index),i=e+1<s.length?Number(s[e+1].first_row_index):n.groupRows;r<o&&i>a&&(Number.isNaN(c)&&(c=Number(t.offset),u=r),l=Number(t.offset)+t.compressed_page_size)}let f=await r.slice(c,l),{data:p,skipped:m}=Di({view:new DataView(f),offset:0},u?{...n,groupStart:n.groupStart+u,selectStart:n.selectStart-u,selectEnd:n.selectEnd-u}:n,d,e.onPage);return{data:p,skipped:u+m}})})}return{groupStart:n.groupStart,groupRows:n.groupRows,asyncColumns:o}}async function ji({asyncColumns:e},t,n,r,i){let a=await Promise.all(e.map(async({data:e})=>{let t=await e;return{...t,data:Dr(t.data)}})),o=e.map(e=>e.pathInSchema[0]).filter(e=>!r||r.includes(e)),s=r??o,c=s.map(t=>e.findIndex(e=>e.pathInSchema[0]===t)),l=n-t;if(i===`object`){let n=Array(l);for(let r=0;r<l;r++){let i=t+r,o={};for(let t=0;t<e.length;t++){let{data:n,skipped:r}=a[t];o[e[t].pathInSchema[0]]=n[i-r]}n[r]=o}return n}let u=Array(l);for(let n=0;n<l;n++){let r=t+n,i=Array(e.length);for(let e=0;e<s.length;e++){let t=c[e];if(t>=0){let{data:n,skipped:o}=a[t];i[e]=n[r-o]}}u[n]=i}return u}function Mi(e,t,n){let{asyncColumns:r}=e;n={...Jn,...n};let i=[];for(let e of t.children)if(e.children.length){let t=r.filter(t=>t.pathInSchema[0]===e.element.name);if(!t.length)continue;let a=new Map,o=Promise.all(t.map(e=>e.data.then(({data:t})=>{a.set(e.pathInSchema.join(`.`),Dr(t))}))).then(()=>{Jr(a,e,n);let t=a.get(e.path.join(`.`));if(!t)throw Error(`parquet column data not assembled`);return{data:[t],skipped:0}});i.push({pathInSchema:e.path,data:o})}else{let t=r.find(t=>t.pathInSchema[0]===e.element.name);t&&i.push(t)}return{...e,asyncColumns:i}}async function Ni(e){e.metadata??=await _r(e.file,e);let{rowStart:t=0,rowEnd:n,columns:r,onChunk:i,onComplete:a,rowFormat:o,filter:s,filterStrict:c=!0}=e;if(s&&o!==`object`)throw Error(`parquet filter requires rowFormat: \"object\"`);let l=Or(s);if(l.length){let t=yr(e.metadata).children.map(e=>e.element.name),n=l.filter(e=>!t.includes(e));if(n.length)throw Error(`parquet filter columns not found: ${n.join(`, `)}`)}let u=r,d=!1;if(r&&s){let e=l.filter(e=>!r.includes(e));e.length&&(u=[...r,...e],d=!0)}let f=Pi(u===r?e:{...e,columns:u});if(!a&&!i){for(let{asyncColumns:e}of f)for(let{data:t}of e)await t;return}let p=yr(e.metadata),m=f.map(t=>Mi(t,p,e.parsers));if(i)for(let e of m)for(let t of e.asyncColumns)t.data.then(({data:n,skipped:r})=>{let a=e.groupStart+r;for(let e of n)i({columnName:t.pathInSchema[0],columnData:e,rowStart:a,rowEnd:a+e.length}),a+=e.length});if(a){let e=[];for(let i of m){let a=Math.max(t-i.groupStart,0),f=Math.min((n??1/0)-i.groupStart,i.groupRows),p=o===`object`?await ji(i,a,f,u,`object`):await ji(i,a,f,r,`array`);if(s){for(let t of p)if(kr(t,s,c)){if(d&&r)for(let e of l)r.includes(e)||delete t[e];e.push(t)}}else Er(e,p)}a(e)}else for(let{asyncColumns:e}of m)for(let{data:t}of e)await t}function Pi(e){if(!e.metadata)throw Error(`parquet requires metadata`);let t=Mr(e);return e.file=Nr(e.file,t),t.groups.map(n=>Ai(e,t,n))}var Fi=ArrayBuffer,K=Uint8Array,Ii=Uint16Array,Li=Int16Array,Ri=Int32Array,zi=function(e,t,n){if(K.prototype.slice)return K.prototype.slice.call(e,t,n);(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length);var r=new K(n-t);return r.set(e.subarray(t,n)),r},Bi=function(e,t,n,r){if(K.prototype.fill)return K.prototype.fill.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;++n)e[n]=t;return e},Vi=function(e,t,n,r){if(K.prototype.copyWithin)return K.prototype.copyWithin.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;)e[t++]=e[n++]},Hi=[`invalid zstd data`,`window size too large (>2046MB)`,`invalid block type`,`FSE accuracy too high`,`match distance too far back`,`unexpected EOF`],q=function(e,t,n){var r=Error(t||Hi[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,q),!n)throw r;return r},Ui=function(e,t,n){for(var r=0,i=0;r<n;++r)i|=e[t++]<<(r<<3);return i},Wi=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Gi=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],i=r>>5&1,a=r>>2&1,o=r&3,s=r>>6;r&8&&q(0);var c=6-i,l=o==3?4:o,u=Ui(e,c,l);c+=l;var d=s?1<<s:i,f=Ui(e,c,d)+(s==1&&256),p=f;if(!i){var m=1<<10+(e[5]>>3);p=m+(m>>3)*(e[5]&7)}p>2145386496&&q(1);var h=new K((t==1?f||p:t?0:p)+12);return h[0]=1,h[4]=4,h[8]=8,{b:c+d,y:0,l:0,d:u,w:t&&t!=1?t:h.subarray(12),e:p,o:new Ri(h.buffer,0,3),u:f,c:a,m:Math.min(131072,p)}}else if((n>>4|e[3]<<20)==25481893)return Wi(e,4)+8;q(0)},Ki=function(e){for(var t=0;1<<t<=e;++t);return t-1},qi=function(e,t,n){var r=(t<<3)+4,i=(e[t]&15)+5;i>n&&q(3);for(var a=1<<i,o=a,s=-1,c=-1,l=-1,u=a,d=new Fi(512+(a<<2)),f=new Li(d,0,256),p=new Ii(d,0,256),m=new Ii(d,512,a),h=512+(a<<1),g=new K(d,h,a),_=new K(d,h+a);s<255&&o>0;){var v=Ki(o+1),y=r>>3,b=(1<<v+1)-1,x=(e[y]|e[y+1]<<8|e[y+2]<<16)>>(r&7)&b,S=(1<<v)-1,C=b-o-1,w=x&S;if(w<C?(r+=v,x=w):(r+=v+1,x>S&&(x-=C)),f[++s]=--x,x==-1?(o+=x,g[--u]=s):o-=x,!x)do{var T=r>>3;c=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,s+=c}while(c==3)}(s>255||o)&&q(0);for(var E=0,D=(a>>1)+(a>>3)+3,O=a-1,k=0;k<=s;++k){var A=f[k];if(A<1){p[k]=-A;continue}for(l=0;l<A;++l){g[E]=k;do E=E+D&O;while(E>=u)}}for(E&&q(0),l=0;l<a;++l){var j=p[g[l]]++;m[l]=(j<<(_[l]=i-Ki(j)))-a}return[r+7>>3,{b:i,s:g,n:_,t:m}]},Ji=function(e,t){var n=0,r=-1,i=new K(292),a=e[t],o=i.subarray(0,256),s=i.subarray(256,268),c=new Ii(i.buffer,268);if(a<128){var l=qi(e,t+1,6),u=l[0],d=l[1];t+=a;var f=u<<3,p=e[t];p||q(0);for(var m=0,h=0,g=d.b,_=g,v=(++t<<3)-8+Ki(p);v-=g,!(v<f);){var y=v>>3;if(m+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<g)-1,o[++r]=d.s[m],v-=_,v<f)break;y=v>>3,h+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<_)-1,o[++r]=d.s[h],g=d.n[m],m=d.t[m],_=d.n[h],h=d.t[h]}++r>255&&q(0)}else{for(r=a-127;n<r;n+=2){var b=e[++t];o[n]=b>>4,o[n+1]=b&15}++t}var x=0;for(n=0;n<r;++n){var S=o[n];S>11&&q(0),x+=S&&1<<S-1}var C=Ki(x)+1,w=1<<C,T=w-x;for(T&T-1&&q(0),o[r++]=Ki(T)+1,n=0;n<r;++n){var S=o[n];++s[o[n]=S&&C+1-S]}var E=new K(w<<1),D=E.subarray(0,w),O=E.subarray(w);for(c[C]=0,n=C;n>0;--n){var k=c[n];Bi(O,n,k,c[n-1]=k+s[n]*(1<<C-n))}for(c[0]!=w&&q(0),n=0;n<r;++n){var A=o[n];if(A){var j=c[A];Bi(D,n,j,c[A]=j+(1<<C-A))}}return[t,{n:O,b:C,s:D}]},Yi=qi(new K([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Xi=qi(new K([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Zi=qi(new K([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Qi=function(e,t){for(var n=e.length,r=new Ri(n),i=0;i<n;++i)r[i]=t,t+=1<<e[i];return r},$i=new K(new Ri([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),ea=Qi($i,0),ta=new K(new Ri([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),na=Qi(ta,3),ra=function(e,t,n){var r=e.length,i=t.length,a=e[r-1],o=(1<<n.b)-1,s=-n.b;a||q(0);for(var c=0,l=n.b,u=(r<<3)-8+Ki(a)-l,d=-1;u>s&&d<i;){var f=u>>3,p=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(u&7);c=(c<<l|p)&o,t[++d]=n.s[c],u-=l=n.n[c]}(u!=s||d+1!=i)&&q(0)},ia=function(e,t,n){var r=6,i=t.length+3>>2,a=i<<1,o=i+a;ra(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,i),n),ra(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(i,a),n),ra(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(a,o),n),ra(e.subarray(r),t.subarray(o),n)},aa=function(e,t,n){var r,i=t.b,a=e[i],o=a>>1&3;t.l=a&1;var s=a>>3|e[i+1]<<5|e[i+2]<<13,c=(i+=3)+s;if(o==1)return i>=e.length?void 0:(t.b=i+1,n?(Bi(n,e[i],t.y,t.y+=s),n):Bi(new K(s),e[i]));if(!(c>e.length)){if(o==0)return t.b=c,n?(n.set(e.subarray(i,c),t.y),t.y+=s,n):zi(e,i,c);if(o==2){var l=e[i],u=l&3,d=l>>2&3,f=l>>4,p=0,m=0;u<2?d&1?f|=e[++i]<<4|(d&2&&e[++i]<<12):f=l>>3:(m=d,d<2?(f|=(e[++i]&63)<<4,p=e[i]>>6|e[++i]<<2):d==2?(f|=e[++i]<<4|(e[++i]&3)<<12,p=e[i]>>2|e[++i]<<6):(f|=e[++i]<<4|(e[++i]&63)<<12,p=e[i]>>6|e[++i]<<2|e[++i]<<10)),++i;var h=n?n.subarray(t.y,t.y+t.m):new K(t.m),g=h.length-f;if(u==0)h.set(e.subarray(i,i+=f),g);else if(u==1)Bi(h,e[i++],g);else{var _=t.h;if(u==2){var v=Ji(e,i);p+=i-(i=v[0]),t.h=_=v[1]}else _||q(0);(m?ia:ra)(e.subarray(i,i+=p),h.subarray(g),_)}var y=e[i++];if(y){y==255?y=(e[i++]|e[i++]<<8)+32512:y>127&&(y=y-128<<8|e[i++]);var b=e[i++];b&3&&q(0);for(var x=[Xi,Zi,Yi],S=2;S>-1;--S){var C=b>>(S<<1)+2&3;if(C==1){var w=new K([0,0,e[i++]]);x[S]={s:w.subarray(2,3),n:w.subarray(0,1),t:new Ii(w.buffer,0,1),b:0}}else C==2?(r=qi(e,i,9-(S&1)),i=r[0],x[S]=r[1]):C==3&&(t.t||q(0),x[S]=t.t[S])}var T=t.t=x,E=T[0],D=T[1],O=T[2],k=e[c-1];k||q(0);var A=(c<<3)-8+Ki(k)-O.b,j=A>>3,M=0,ee=(e[j]|e[j+1]<<8)>>(A&7)&(1<<O.b)-1;j=(A-=D.b)>>3;var N=(e[j]|e[j+1]<<8)>>(A&7)&(1<<D.b)-1;j=(A-=E.b)>>3;var P=(e[j]|e[j+1]<<8)>>(A&7)&(1<<E.b)-1;for(++y;--y;){var F=O.s[ee],te=O.n[ee],ne=E.s[P],re=E.n[P],ie=D.s[N],I=D.n[N];j=(A-=ie)>>3;var ae=1<<ie,L=ae+((e[j]|e[j+1]<<8|e[j+2]<<16|e[j+3]<<24)>>>(A&7)&ae-1);j=(A-=ta[ne])>>3;var oe=na[ne]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<ta[ne])-1);j=(A-=$i[F])>>3;var se=ea[F]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<$i[F])-1);if(j=(A-=te)>>3,ee=O.t[ee]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<te)-1),j=(A-=re)>>3,P=E.t[P]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<re)-1),j=(A-=I)>>3,N=D.t[N]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<I)-1),L>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=L-=3;else{var ce=L-(se!=0);ce?(L=ce==3?t.o[0]-1:t.o[ce],ce>1&&(t.o[2]=t.o[1]),t.o[1]=t.o[0],t.o[0]=L):L=t.o[0]}for(var S=0;S<se;++S)h[M+S]=h[g+S];M+=se,g+=se;var le=M-L;if(le<0){var ue=-le,de=t.e+le;ue>oe&&(ue=oe);for(var S=0;S<ue;++S)h[M+S]=t.w[de+S];M+=ue,oe-=ue,le=0}for(var S=0;S<oe;++S)h[M+S]=h[le+S];M+=oe}if(M!=g)for(;g<h.length;)h[M++]=h[g++];else M=h.length;n?t.y+=M:h=zi(h,0,M)}else if(n){if(t.y+=f,g)for(var S=0;S<f;++S)h[S]=h[g+S]}else g&&(h=zi(h,g));return t.b=c,h}q(2)}},oa=function(e,t){if(e.length==1)return e[0];for(var n=new K(t),r=0,i=0;r<e.length;++r){var a=e[r];n.set(a,i),i+=a.length}return n};function sa(e,t){for(var n=[],r=+!t,i=0,a=0;e.length;){var o=Gi(e,r||t);if(typeof o==`object`){for(r?(t=null,o.w.length==o.u&&(n.push(t=o.w),a+=o.u)):(n.push(t),o.e=0);!o.l;){var s=aa(e,o,t);s||q(5),t?o.e=o.y:(n.push(s),a+=s.length,Vi(o.w,0,s.length),o.w.set(s,o.w.length-s.length))}i=o.b+o.c*4}else i=o;e=e.subarray(i)}return oa(n,a)}function ca(){let e=la();return(t,n)=>{let{memory:r,uncompress:i}=e.exports,a=68e3,o=a+t.byteLength,s=a+t.byteLength+n;if(r.buffer.byteLength<s){let e=64*1024,t=r.buffer.byteLength/e,n=Math.ceil(s/e)-t;r.grow(n)}let c=new Uint8Array(r.buffer);c.set(t,a);let l=i(a,t.byteLength,o);if(l===-1)throw Error(`invalid snappy length header`);if(l===-2)throw Error(`missing eof marker`);if(l===-3)throw Error(`premature end of input`);if(l)throw Error(`failed to uncompress data ${l}`);return c.slice(o,o+n)}}function la(){let e=atob(ua),t=new Uint8Array(e.length);for(let n=0;n<e.length;n+=1)t[n]=e.charCodeAt(n);let n=new WebAssembly.Module(t);return new WebAssembly.Instance(n)}const ua=`AGFzbQEAAAABEANgAABgA39/fwF/YAF/AX8DBgUAAQEBAgUDAQACBj8KfwFBoIwEC38AQYAIC38AQaAMC38AQaAMC38AQaCMBAt/AEGACAt/AEGgjAQLfwBBgIAIC38AQQALfwBBAQsHwQEOBm1lbW9yeQIAEV9fd2FzbV9jYWxsX2N0b3JzAAAGbWVtY3B5AAEHbWVtbW92ZQACCnVuY29tcHJlc3MAAwxfX2Rzb19oYW5kbGUDAQpfX2RhdGFfZW5kAwILX19zdGFja19sb3cDAwxfX3N0YWNrX2hpZ2gDBA1fX2dsb2JhbF9iYXNlAwULX19oZWFwX2Jhc2UDBgpfX2hlYXBfZW5kAwcNX19tZW1vcnlfYmFzZQMIDF9fdGFibGVfYmFzZQMJCuASBQIAC8sBAQN/AkAgAkUNAAJAAkAgAkEHcSIDDQAgACEEIAIhBQwBCyAAIQQgAiEFA0AgBCABLQAAOgAAIARBAWohBCABQQFqIQEgBUF/aiEFIANBf2oiAw0ACwsgAkEISQ0AA0AgBCABLQAAOgAAIAQgAS0AAToAASAEIAEtAAI6AAIgBCABLQADOgADIAQgAS0ABDoABCAEIAEtAAU6AAUgBCABLQAGOgAGIAQgAS0ABzoAByAEQQhqIQQgAUEIaiEBIAVBeGoiBQ0ACwsgAAugAwEEfwJAIAAgAUYNAAJAAkAgACABSQ0AIAEgAmoiAyAASw0BCyACRQ0BAkACQCACQQdxIgMNACAAIQQgAiEFDAELIAAhBCACIQUDQCAEIAEtAAA6AAAgBEEBaiEEIAFBAWohASAFQX9qIQUgA0F/aiIDDQALCyACQQhJDQEDQCAEIAEtAAA6AAAgBCABLQABOgABIAQgAS0AAjoAAiAEIAEtAAM6AAMgBCABLQAEOgAEIAQgAS0ABToABSAEIAEtAAY6AAYgBCABLQAHOgAHIARBCGohBCABQQhqIQEgBUF4aiIFDQAMAgsLIAJFDQACQAJAIAJBA3EiBA0AIAAgAmohBiACIQUMAQsgAiEFA0AgBUF/aiIFIABqIgYgBSABaiIDLQAAOgAAIARBf2oiBA0ACwsgAkEESQ0AIAZBfGohASADQXxqIQQDQCABQQNqIARBA2otAAA6AAAgAUECaiAEQQJqLQAAOgAAIAFBAWogBEEBai0AADoAACABIAQtAAA6AAAgAUF8aiEBIARBfGohBCAFQXxqIgUNAAsLIAALswoBCX8jgICAgABBIGsiAySAgICAACADQQlqQgA3AAAgA0IANwIEIAMgA0EYajYCAEF/IQQCQCABRQ0AIAMgAUF/aiIFNgIcIAMgAEEBajYCGCAALAAAIgZB/wBxIQcCQCAGQX9KDQAgBUUNASADIAFBfmoiBTYCHCADIABBAmo2AhggACwAASIGQf8AcUEHdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfWoiBTYCHCADIABBA2o2AhggACwAAiIGQf8AcUEOdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfGoiBTYCHCADIABBBGo2AhggACwAAyIGQf8AcUEVdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBe2o2AhwgAyAAQQVqNgIYIAAsAAQiAUEASA0BIAFBHHQgB3IhBwsgAiAHaiEIAkACQCADEISAgIAADQAgAiEADAELIAMoAgQhASACIQADQAJAIAMoAgggAWtBBEoNACADIAE2AgQgAxCEgICAAEUNAiADKAIEIQELIAFBAWohBQJAAkAgAS0AACIGQQNxDQAgCCAAayEJIAMoAggiCiAFayEEIAZBAnYiC0EBaiEHAkAgBkE/Sw0AIARBEEkNACAJQRBIDQAgACABKAIBNgIAIAAgASgCBTYCBCAAIAEoAgk2AgggACABKAINNgIMIAAgB2ohACADKAIIIAUgB2oiAWtBBEoNAyADIAE2AgQgAxCEgICAAEUNBAwCCwJAAkAgBkHwAU8NACAFIQYMAQsgCiAFIAtBRWoiAWoiBmshBCABQQJ0QYCIgIAAaigCACAFKAIAcUEBaiEHCwJAIAcgBE0NAANAIAggAGsgBEkNBSAAIAYgBBCBgICAACEAIAMoAgAiASABKAIAIgkgAygCDCIFaiIGNgIAIAFBBGoiASABKAIAIgogBWsiATYCACADIAE2AgwgACAEaiEAIAFFDQUgAyAJIApqNgIIIAcgBGshByABIQQgByABSw0ACyAIIABrIQkLIAkgB0kNAyAAIAYgBxCBgICAACAHaiEAIAMoAgggBiAHaiIBa0EESg0CIAMgATYCBCADEISAgIAADQEMAwsgACACayAGQQF0QaCIgIAAai8BACIBQQt2IgpBAnRBgIiAgABq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`,da=4096;2*da+32;const fa=2*da-1,pa=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);function J(e){this.buf_=new Uint8Array(8224),this.input_=e,this.buf_ptr_=0,this.val_=0,this.pos_=0,this.reset()}J.READ_SIZE=da,J.IBUF_MASK=fa,J.prototype.reset=function(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(let e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,this.pos_++;return this.bit_end_pos_>0},J.prototype.readMoreInput=function(){if(!(this.bit_end_pos_>256))if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw Error(`Unexpected end of input `+this.bit_pos_+` `+this.bit_end_pos_)}else{let e=this.buf_ptr_,t=this.input_.read(this.buf_,e,da);if(t<0)throw Error(`Unexpected end of input`);if(t<da){this.eos_=1;for(let n=0;n<32;n++)this.buf_[e+t+n]=0}if(e===0){for(let e=0;e<32;e++)this.buf_[(da<<1)+e]=this.buf_[e];this.buf_ptr_=da}else this.buf_ptr_=0;this.bit_end_pos_+=t<<3}},J.prototype.fillBitWindow=function(){for(;this.bit_pos_>=8;)this.val_>>>=8,this.val_|=this.buf_[this.pos_&fa]<<24,this.pos_++,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0},J.prototype.readBits=function(e){32-this.bit_pos_<e&&this.fillBitWindow();let t=this.val_>>>this.bit_pos_&pa[e];return this.bit_pos_+=e,t};const ma=new Uint8Array([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),ha=new Uint16Array([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);function Y(e,t){this.bits=e,this.value=t}function ga(e,t){let n=1<<t-1;for(;e&n;)n>>=1;return(e&n-1)+n}function _a(e,t,n,r,i){do r-=n,e[t+r]=new Y(i.bits,i.value);while(r>0)}function va(e,t,n){let r=1<<t-n;for(;t<15&&(r-=e[t],!(r<=0));)++t,r<<=1;return t-n}function ya(e,t,n,r,i){let a=t,o=new Int32Array(16),s=new Int32Array(16),c=new Int32Array(i);for(let e=0;e<i;e++)o[r[e]]++;s[1]=0;for(let e=1;e<15;e++)s[e+1]=s[e]+o[e];for(let e=0;e<i;e++)r[e]!==0&&(c[s[r[e]]++]=e);let l=n,u=1<<l,d=u;if(s[15]===1){for(let n=0;n<d;++n)e[t+n]=new Y(0,c[0]&65535);return d}let f=0,p=0;for(let r=1,i=2;r<=n;++r,i<<=1)for(;o[r]>0;--o[r]){let n=new Y(r&255,c[p++]&65535);_a(e,t+f,i,u,n),f=ga(f,r)}let m=d-1,h=-1;for(let r=n+1,i=2;r<=15;++r,i<<=1)for(;o[r]>0;--o[r]){(f&m)!==h&&(t+=u,l=va(o,r,n),u=1<<l,d+=u,h=f&m,e[a+h]=new Y(l+n&255,t-a-h&65535));let s=new Y(r-n&255,c[p++]&65535);_a(e,t+(f>>n),i,u,s),f=ga(f,r)}return d}function ba(e,t,n,r){let i=new Uint8Array(e);r.readMoreInput();let a=r.readBits(2);if(a===1){let t=e-1,n=0,a=new Int32Array(4),o=r.readBits(2)+1;for(;t;)t>>=1,n++;for(let t=0;t<o;t++)a[t]=r.readBits(n)%e,i[a[t]]=2;switch(i[a[0]]=1,o){case 1:break;case 3:if(a[0]===a[1]||a[0]===a[2]||a[1]===a[2])throw Error(`[ReadHuffmanCode] invalid symbols`);break;case 2:if(a[0]===a[1])throw Error(`[ReadHuffmanCode] invalid symbols`);i[a[1]]=1;break;case 4:if(a[0]===a[1]||a[0]===a[2]||a[0]===a[3]||a[1]===a[2]||a[1]===a[3]||a[2]===a[3])throw Error(`[ReadHuffmanCode] invalid symbols`);r.readBits(1)?(i[a[2]]=3,i[a[3]]=3):i[a[0]]=2;break}}else{let t=new Uint8Array(18),n=32,o=0,s=[new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,1),new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,5)];for(let e=a;e<18&&n>0;e++){let i=ma[e],a=0;r.fillBitWindow(),a+=r.val_>>>r.bit_pos_&15,r.bit_pos_+=s[a].bits;let c=s[a].value;t[i]=c,c!==0&&(n-=32>>c,o++)}if(!(o===1||n===0))throw Error(`[ReadHuffmanCode] invalid num_codes or space`);Sa(t,e,i,r)}let o=ya(t,n,8,i,e);if(!o)throw Error(`brotli BuildHuffmanTable failed`);return o}function xa(e,t,n){n.fillBitWindow(),t+=n.val_>>>n.bit_pos_&255;let r=e[t].bits-8;return r>0&&(n.bit_pos_+=8,t+=e[t].value,t+=n.val_>>>n.bit_pos_&(1<<r)-1),n.bit_pos_+=e[t].bits,e[t].value}function Sa(e,t,n,r){let i=0,a=8,o=0,s=0,c=32768,l=[];for(let e=0;e<32;e++)l.push(new Y(0,0));for(ya(l,0,5,e,18);i<t&&c>0;){let e=0;r.readMoreInput(),r.fillBitWindow(),e+=r.val_>>>r.bit_pos_&31,r.bit_pos_+=l[e].bits;let u=l[e].value&255;if(u<16)o=0,n[i++]=u,u!==0&&(a=u,c-=32768>>u);else{let e=u-14,l=0;u===16&&(l=a),s!==l&&(o=0,s=l);let d=o;o>0&&(o-=2,o<<=e),o+=r.readBits(e)+3;let f=o-d;if(i+f>t)throw Error(`[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols`);for(let e=0;e<f;e++)n[i+e]=s;i+=f,s!==0&&(c-=f<<15-s)}}if(c!==0)throw Error(`[ReadHuffmanCodeLengths] space = `+c);for(;i<t;i++)n[i]=0}function Ca(e,t){this.alphabet_size=e,this.num_htrees=t,this.codes=Array(t+t*ha[e+31>>>5]),this.htrees=new Uint32Array(t)}Ca.prototype.decode=function(e){let t=0;for(let n=0;n<this.num_htrees;n++)this.htrees[n]=t,t+=ba(this.alphabet_size,this.codes,t,e)};function wa([e,t]){return{offset:e,nbits:t}}const Ta=[[1,2],[5,2],[9,2],[13,2],[17,3],[25,3],[33,3],[41,3],[49,4],[65,4],[81,4],[97,4],[113,5],[145,5],[177,5],[209,5],[241,6],[305,6],[369,7],[497,8],[753,9],[1265,10],[2289,11],[4337,12],[8433,13],[16625,24]].map(wa),Ea=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,1],[8,1],[10,2],[14,2],[18,3],[26,3],[34,4],[50,4],[66,5],[98,5],[130,6],[194,7],[322,8],[578,9],[1090,10],[2114,12],[6210,14],[22594,24]].map(wa),Da=[[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,1],[12,1],[14,2],[18,2],[22,3],[30,3],[38,4],[54,4],[70,5],[102,5],[134,6],[198,7],[326,8],[582,9],[1094,10],[2118,24]].map(wa),Oa=[0,0,8,8,0,16,8,16,16],ka=[0,8,0,8,16,0,16,8,16],X=1080,Aa=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),ja=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);function Ma(e,t){let n=new Uint16Array(31);for(let r=0;r<31;r++)n[r]=t+=1<<e[r-1];let r=new Int32Array(n[30]);for(let e=1;e<30;e++)for(let t=n[e];t<n[e+1];++t)r[t]=t-n[e]<<5|e;return{base:n,rev:r}}const{base:Na,rev:Pa}=Ma(Aa,2);Na[28]=258,Pa[258]=28;const{base:Fa}=Ma(ja,0),Ia=new Uint16Array(32768);for(let e=0;e<32768;e++){let t=(e&43690)>>1|(e&21845)<<1;t=(t&52428)>>2|(t&13107)<<2,t=(t&61680)>>4|(t&3855)<<4,Ia[e]=((t&65280)>>8|(t&255)<<8)>>1}function La(e,t,n){let r=new Uint16Array(t);for(let t=0;t<e.length;t++)e[t]&&++r[e[t]-1];let i=new Uint16Array(t);for(let e=1;e<t;e++)i[e]=i[e-1]+r[e-1]<<1;let a;if(n){a=new Uint16Array(1<<t);let n=15-t;for(let r=0;r<e.length;r++)if(e[r]){let o=r<<4|e[r],s=t-e[r],c=i[e[r]-1]++<<s;for(let e=c|(1<<s)-1;c<=e;c++)a[Ia[c]>>n]=o}}else{a=new Uint16Array(e.length);for(let t=0;t<e.length;t++)e[t]&&(a[t]=Ia[i[e[t]-1]++]>>15-e[t])}return a}const Ra=new Uint8Array(288);for(let e=0;e<144;e++)Ra[e]=8;for(let e=144;e<256;e++)Ra[e]=9;for(let e=256;e<280;e++)Ra[e]=7;for(let e=280;e<288;e++)Ra[e]=8;const za=new Uint8Array(32);for(let e=0;e<32;e++)za[e]=5;const Ba=La(Ra,9,1),Va=La(za,5,1);function Ha(e,t,n,r,i,a,o){let s=n*2,c=n,l=xa(t,n*X,o),u;u=l===0?i[s+(a[c]&1)]:l===1?i[s+(a[c]-1&1)]+1:l-2,u>=e&&(u-=e),r[n]=u,i[s+(a[c]&1)]=u,a[c]++}function Ua(e){let t={meta_block_length:0,input_end:0,is_uncompressed:0,is_metadata:!1};if(t.input_end=e.readBits(1),t.input_end&&e.readBits(1))return t;let n=e.readBits(2)+4;if(n===7){if(t.is_metadata=!0,e.readBits(1)!==0)throw Error(`Invalid reserved bit`);let n=e.readBits(2);if(n===0)return t;for(let r=0;r<n;r++){let i=e.readBits(8);if(r+1===n&&n>1&&i===0)throw Error(`Invalid size byte`);t.meta_block_length|=i<<r*8}}else for(let r=0;r<n;r++){let i=e.readBits(4);if(r+1===n&&n>4&&i===0)throw Error(`Invalid size nibble`);t.meta_block_length|=i<<r*4}return t.meta_block_length++,!t.input_end&&!t.is_metadata&&(t.is_uncompressed=e.readBits(1)),t}function Wa(e,t,n,r,i,a){let o=i+1,s=n&i,c=a.pos_&J.IBUF_MASK;if(t<8||a.bit_pos_+(t<<3)<a.bit_end_pos_){for(;t-- >0;)a.readMoreInput(),r[s++]=a.readBits(8),s===o&&(e.write(r,o),s=0);return}if(a.bit_end_pos_<32)throw Error(`copyUncompressedBlockToOutput: br.bit_end_pos_ < 32`);for(;a.bit_pos_<32;)r[s]=a.val_>>>a.bit_pos_,a.bit_pos_+=8,s++,t--;let l=a.bit_end_pos_-a.bit_pos_>>3;if(c+l>J.IBUF_MASK){let e=J.IBUF_MASK+1-c;for(let t=0;t<e;t++)r[s+t]=a.buf_[c+t];l-=e,s+=e,t-=e,c=0}for(let e=0;e<l;e++)r[s+e]=a.buf_[c+e];if(s+=l,t-=l,s>=o){e.write(r,o),s-=o;for(let e=0;e<s;e++)r[e]=r[o+e]}for(;s+t>=o;){if(l=o-s,a.input_.read(r,s,l)<l)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);e.write(r,o),t-=l,s=0}if(a.input_.read(r,s,t)<t)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);a.reset()}function Ga(e){if(e.readBits(1)){let t=e.readBits(3);return t===0?1:e.readBits(t)+(1<<t)}return 0}function Ka(e){if(e.readBits(1)===0)return 16;let t=e.readBits(3);return t>0?17+t:(t=e.readBits(3),t>0?8+t:17)}function qa(e){let t=e.bit_pos_+7&-8;return!e.readBits(t-e.bit_pos_)}function Ja(e,t,n){let{offset:r,nbits:i}=Ta[xa(e,t,n)];return r+n.readBits(i)}const Ya=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Xa=new Uint16Array([1024,1536,1280,1536,0,256,768,512]);function Za(e,t){let n=0;t.readMoreInput();let r=Ga(t)+1,i=new Uint8Array(e);if(r<=1)return[r,i];t.readBits(1)&&(n=t.readBits(4)+1);let a=[];for(let e=0;e<X;e++)a[e]=new Y(0,0);ba(r+n,a,0,t);for(let r=0;r<e;){t.readMoreInput();let o=xa(a,0,t);if(o===0)i[r]=0,r++;else if(o<=n){let n=1+(1<<o)+t.readBits(o);for(;--n;){if(r>=e)throw Error(`[DecodeContextMap] i >= context_map_size`);i[r]=0,r++}}else i[r]=o-n,r++}return t.readBits(1)&&$a(i,e),[r,i]}function Qa(e,t){let n=e[t];for(let n=t;n;n--)e[n]=e[n-1];e[0]=n}function $a(e,t){let n=new Uint8Array(256);for(let e=0;e<256;e++)n[e]=e;for(let r=0;r<t;r++){let t=e[r];e[r]=n[t],t&&Qa(n,t)}}function eo(e){this.buffer=e,this.pos=0}eo.prototype.read=function(e,t,n){this.pos+n>this.buffer.length&&(n=this.buffer.length-this.pos);for(let r=0;r<n;r++)e[t+r]=this.buffer[this.pos+r];return this.pos+=n,n};function to(e){this.buffer=e,this.pos=0}to.prototype.write=function(e,t){if(this.pos+t>this.buffer.length)throw Error(`brotli output buffer is not large enough`);return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t};const no=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);function Z(e,t,n){let r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n}function ro(e,t){let n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)}function io(e){return(e+7)/8|0}function ao(e,t){if(e[t++]!==31||e[t++]!==139||e[t++]!==8)return 0;let n=e[t++];t+=6,n&4&&(t+=(e[t+10]|e[t+11]<<8)+2);for(let r=(n>>3&1)+(n>>4&1);r>0;r-=Number(!e[t++]));return t+(n&2)}function oo(e,t,n=0,r=0){let i=t??new Uint8Array(1024);if(!(e.length-n))return i;let a=ao(e,n);if(a===e.length-8)return i;if(a>e.length-8)throw Error(`unexpected EOF`);let o=a*8,s=0,c=0,l=0,u,d,f=e.length*8;function p(e){if(!t&&e>i.length){let t=i;i=new Uint8Array(Math.max(t.length*2,e)),i.set(t)}}do{if(!u){s=Z(e,o,1);let t=Z(e,o+1,3);if(o+=3,!t){let t=io(o)+4,n=e[t-4]|e[t-3]<<8,a=t+n;if(a>e.length)throw Error(`unexpected EOF`);p(r+n),i.set(e.subarray(t,a),r),r+=n,o=a*8;continue}else if(t===1)u=Ba,d=Va,c=9,l=5;else if(t===2){let t=Z(e,o,31)+257,n=Z(e,o+10,15)+4,r=t+Z(e,o+5,31)+1;o+=14;let i=new Uint8Array(r),a=new Uint8Array(19);for(let t=0;t<n;++t)a[no[t]]=Z(e,o+t*3,7);o+=n*3;let s=Math.max(...a),f=(1<<s)-1,p=La(a,s,1);for(let t=0;t<r;){let n=p[Z(e,o,f)];o+=n&15;let r=n>>4;if(r<16)i[t++]=r;else{let n=0,a=0;for(r===16?(a=3+Z(e,o,3),o+=2,n=i[t-1]):r===17?(a=3+Z(e,o,7),o+=3):r===18&&(a=11+Z(e,o,127),o+=7);a--;)i[t++]=n}}let m=i.subarray(0,t),h=i.subarray(t);c=Math.max(...m),l=Math.max(...h),u=La(m,c,1),d=La(h,l,1)}else throw Error(`invalid block type`);if(o>f)throw Error(`unexpected EOF`)}p(r+131072);let t=(1<<c)-1,n=(1<<l)-1,a=o;for(;;a=o){let s=u[ro(e,o)&t],c=s>>4;if(o+=s&15,o>f)throw Error(`unexpected EOF`);if(!s)throw Error(`invalid length/literal`);if(c<256)i[r++]=c;else if(c===256){a=o,u=void 0;break}else{let t=c-254;if(c>264){let n=c-257,r=Aa[n];t=Z(e,o,(1<<r)-1)+Na[n],o+=r}if(!d)throw Error(`invalid distance map`);let a=d[ro(e,o)&n],s=a>>4;if(!a)throw Error(`invalid distance`);o+=a&15;let l=Fa[s];if(s>3){let t=ja[s];l+=ro(e,o)&(1<<t)-1,o+=t}if(o>f)throw Error(`unexpected EOF`);let u=r+t;if(r<l)throw Error(`unexpected dictionary case`);for(p(u);r<u;r++)i[r]=i[r-l]}}o=a,u&&(s=1)}while(!s);if(r<i.length){let t=Math.ceil(o/8)+8;oo(e,i,t,r)}return t?i:i.subarray(0,r)}let so;function co(){if(!so){so=new Uint8Array(122784);let e=atob(`\n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\nXH/9kw/e+uTa937x6JlPn7j+86ee/PnpG7e/+yefvfzM7ddetBc/+977t3/83mcf/PknV4/fPvfq7e+/\n+cm7P/z0/F/84uwzn7154uc/PvHp69//9I9/+Ml7P7r9/IXbz57/9Pqf3r7y5GdvX/vs+KlPn/7LT0+9\n8en505+dP/PZ+eufPnP99jtvffripU+vnrz9J+duf/+GtefTZ37wyfU37JVPT7/+6bnXfv79lz678vTt\nv3jV/v25Pc73HsfFP3j59ok3rc0BJ2xs7t08Zz7DAKYbJnK5UgK2jQzJmCC4augYsG4CCZp91RPMCbYW\n8rY2w92psSU9JsJr5eZ15HTJPhdaiJXaqRIg7wbBWKEHHX5adwdhvA2PhJOVkIQAXgHUR5kUgqH6MGbJ\nTde53MIZEy6yqT3ANRAzmtC71THhd+I63zxX1ps3X4Z9ESjZchjwqiFzLkBagm7Pm5oZd/Ona2Dpo0SW\nY7IEIhOZVrcgTg4z9eUeatU7/9w2XQdQNR4xq0vb/pGqKBvnbA8aB2VF1VrreWvMzZdXR+KVEBjpfVg7\nksxeQS+zV7Fw2NR4Ckd5E65GGF/Zc94LlRfsBWghULUSXnoJFac+6hn2H7HmV49EANm8/B5nSxkwvsbN\nMkyBIZCVfSDxXmYmA5BcYsTQZk6SrdK/FWjBJmCS0fODJopqn2RJ7A+85DaKjp9kYWwVBb/Kf1/lu5f5\n1gV+7ImoRK4i5Sf+9vSf+1v4/Bv89zVW7L4W11FV8mv88HNxneNshm76GptxJr5+ultDqWKw2ngJcDTp\nwt++epL1y8/wM+f5+2n+/jN+/QKLo1/li6ejSRejbLnu/njc4kJUDb8Sb1lLXuArF3k7Nen5uJeKlL/B\neurHvan45Ud8imd4R/XYxahQ/gILnD8Vdcpf4/9Oq846r6BOuBL1zk/xuz/gTc/FXX4Q5d7Vkxeyeu0a\nuKeiSDwHzvvZOuqElznHWy95b+MBv8NC7M9HJ5yKe/0gCrefZm+kausvRUed5IfVnu/FTc9Hj6nlN2LQ\n7c+no0r9j+Je34su0gVVEv4Dvqjevsi+0nx4IwZaj6O5eiN69Tg74Q027wxbq68/EQ17HK97XXnNZ81V\njc5TbO25KGN/IZ7iRZ8q3s/n/bnw7ln++2I84Ktxr+Ns/7Woaq9G/jj+1IdP8JG1gk7zxTRbTkfzXmOb\n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\n+y++LtIcOB5PrcLur8W9XuSTnkS9eG//1agFf7V95DRv/Qrsf3z+xayvLscKusrLnon+POMF7ts2q69+\nGCXUL7bP5b16nO15Ij7P5uHKp9nmC+zJk+yli+3Y+Tq6EaXkH8/2jcvx+pl2DqvfMMfeiK9ci8/rM1dj\nnV5j807zk5pvmv8vRZ+cjkG5EnNAbb7iDda4t3M19eETsd6f5NWuRJ+8lu0Px7NnzPYcf6LoUtw3tecC\nq9WnfYb3xdXOZ/Mnzc/jMUsv8y0WsvfxeiGbY6dizrzKm6a1prXwwvT+eZzf0lo7z2f/IK6j+a9N/vnp\nPf9afOa1bM5oYl/M9oGfRZ+8ETv5ad+j8JXz0bAf8InS9S/ECnqv7Qe89Xi8dTZG/EyMAluibmnX+wtT\ne0U7uLHWfJ5f9odN+4P/qbHQ3HuG1+e08V36QnvG+fOmfj7FP6/yM29EI5/zZ/TPXI0Bupg94xPx7wu8\nwmW+/k52Vl7w72Lf0Hn3ahp3qkVDF/tpKiS/TT3pR5Pq86Vb74Ri88cnoC798Sm+foWKyK1Ws5SUT926\nSDXvpAOeFJZfzzSW37QrvAldcOhphzI4Xp3SEH9Myti438cn/V7hAVNVmrrXev0NtMnVpi+46jh+P4fP\n+jXPfXySV1J73qLudVzzdXvvFBSp7TpX/fNQ6H6cn4K+9ROhUU4V6VeSNvlbt37Cp4DW+Jnsvk9Sn5tt\nc4VzKVJfomq3FL+hzX0Kz88+DWXst6hv/rj0xqVdTR3xS9Sf1uuPUsX8rPfb43zKM1KsvnUWz4/r8NUr\n1Et/mq9Dxfws+iB9lxrdrtd9ht94068v3XK1B9d+x5/xvM2Dp29d4hXfSnrdP8v+vUwFbe/zVuvcZkbb\nJ+ehh+7j/oara7fa8U/E62lMoe99DXMvxiKe8dZraI36wa7qiuPWX49TuTzUvWNcMPPe8vnzpv32JK+M\n+X/d/oJO+mW2IObGGSq+n/W2XcXrjCsi8ge3vS0nisj/3gxmJm1wx55SUmN9PPToZb99h3LTEVam+DDY\neIPN2R1MhkivZQIUDyJ7KqK1Wg9Xx5secZzPscE5Jr9Z+hwSs81tZ2JWwHlAB8Fztq2eUu1y1p1U5D20\nNMlAP4KSuvP2TyeERIdKtYd8IsJh9yO/s7oxhuyJyBae+d3L5F9kZhhkjzDs1hBlrT2hkWEgvrgWIHQy\n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`),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);oo(t,so)}return so}function Q(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(let t=0;t<e.length;t++)this.prefix[t]=e.charCodeAt(t);for(let e=0;e<n.length;e++)this.suffix[e]=n.charCodeAt(e)}const lo=[new Q(``,0,``),new Q(``,0,` `),new Q(` `,0,` `),new Q(``,12,``),new Q(``,10,` `),new Q(``,0,` the `),new Q(` `,0,``),new Q(`s `,0,` `),new Q(``,0,` of `),new Q(``,10,``),new Q(``,0,` and `),new Q(``,13,``),new Q(``,1,``),new Q(`, `,0,` `),new Q(``,0,`, `),new Q(` `,10,` `),new Q(``,0,` in `),new Q(``,0,` to `),new Q(`e `,0,` `),new Q(``,0,`\"`),new Q(``,0,`.`),new Q(``,0,`\">`),new Q(``,0,`\n`),new Q(``,3,``),new Q(``,0,`]`),new Q(``,0,` for `),new Q(``,14,``),new Q(``,2,``),new Q(``,0,` a `),new Q(``,0,` that `),new Q(` `,10,``),new Q(``,0,`. `),new Q(`.`,0,``),new Q(` `,0,`, `),new Q(``,15,``),new Q(``,0,` with `),new Q(``,0,`'`),new Q(``,0,` from `),new Q(``,0,` by `),new Q(``,16,``),new Q(``,17,``),new Q(` the `,0,``),new Q(``,4,``),new Q(``,0,`. The `),new Q(``,11,``),new Q(``,0,` on `),new Q(``,0,` as `),new Q(``,0,` is `),new Q(``,7,``),new Q(``,1,`ing `),new Q(``,0,`\n `),new Q(``,0,`:`),new Q(` `,0,`. `),new Q(``,0,`ed `),new Q(``,20,``),new Q(``,18,``),new Q(``,6,``),new Q(``,0,`(`),new Q(``,10,`, `),new Q(``,8,``),new Q(``,0,` at `),new Q(``,0,`ly `),new Q(` the `,0,` of `),new Q(``,5,``),new Q(``,9,``),new Q(` `,10,`, `),new Q(``,10,`\"`),new Q(`.`,0,`(`),new Q(``,11,` `),new Q(``,10,`\">`),new Q(``,0,`=\"`),new Q(` `,0,`.`),new Q(`.com/`,0,``),new Q(` the `,0,` of the `),new Q(``,10,`'`),new Q(``,0,`. This `),new Q(``,0,`,`),new Q(`.`,0,` `),new Q(``,10,`(`),new Q(``,10,`.`),new Q(``,0,` not `),new Q(` `,0,`=\"`),new Q(``,0,`er `),new Q(` `,11,` `),new Q(``,0,`al `),new Q(` `,11,``),new Q(``,0,`='`),new Q(``,11,`\"`),new Q(``,10,`. `),new Q(` `,0,`(`),new Q(``,0,`ful `),new Q(` `,10,`. `),new Q(``,0,`ive `),new Q(``,0,`less `),new Q(``,11,`'`),new Q(``,0,`est `),new Q(` `,10,`.`),new Q(``,11,`\">`),new Q(` `,0,`='`),new Q(``,10,`,`),new Q(``,0,`ize `),new Q(``,11,`.`),new Q(`Â\\xA0`,0,``),new Q(` `,0,`,`),new Q(``,10,`=\"`),new Q(``,11,`=\"`),new Q(``,0,`ous `),new Q(``,11,`, `),new Q(``,10,`='`),new Q(` `,10,`,`),new Q(` `,11,`=\"`),new Q(` `,11,`, `),new Q(``,11,`,`),new Q(``,11,`(`),new Q(``,11,`. `),new Q(` `,11,`.`),new Q(``,11,`='`),new Q(` `,11,`. `),new Q(` `,10,`=\"`),new Q(` `,11,`='`),new Q(` `,10,`='`)],uo=lo.length;function fo(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}function po(e,t,n,r,i){let a=co(),{prefix:o}=lo[i],{suffix:s}=lo[i],c=lo[i].transform,l=c<12?0:c-11,u=t;l>r&&(l=r);let d=0;for(;d<o.length;)e[t++]=o[d++];n+=l,r-=l,c<=9&&(r-=c);for(let i=0;i<r;i++)e[t++]=a[n+i];let f=t-r;if(c===10)fo(e,f);else if(c===11)for(;r>0;){let t=fo(e,f);f+=t,r-=t}let p=0;for(;p<s.length;)e[t++]=s[p++];return t-u}const mo=new Uint8Array([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),ho=new Int8Array([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),go=new Uint32Array([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),_o=new Uint8Array([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]);function vo(e,t){let n=new Uint8Array(t);return yo(new eo(e),new to(n)),n}function yo(e,t){let n=0,r=0,i=0,a=0,o=[16,15,11,4],s=0,c=0,l=0,u=[new Ca(0,0),new Ca(0,0),new Ca(0,0)],d=128+J.READ_SIZE,f=new J(e);i=Ka(f);let p=(1<<i)-16,m=1<<i,h=m-1,g=new Uint8Array(m+d+24),_=m,v=[],y=[];for(let e=0;e<3*X;e++)v[e]=new Y(0,0),y[e]=new Y(0,0);for(;!r;){let e=0,i=[1<<28,1<<28,1<<28],d=[0],b=[1,1,1],x=[0,1,0,1,0,1],S=[0],C=0;for(let e=0;e<3;e++)u[e].codes=[],u[e].htrees=new Uint32Array;f.readMoreInput();let w=Ua(f);if(e=w.meta_block_length,n+e>t.buffer.length){let r=new Uint8Array(n+e);r.set(t.buffer),t.buffer=r}if(r=w.input_end,w.is_metadata){for(qa(f);e>0;--e)f.readMoreInput(),f.readBits(8);continue}if(e===0)continue;if(w.is_uncompressed){f.bit_pos_=f.bit_pos_+7&-8,Wa(t,e,n,g,h,f),n+=e;continue}for(let e=0;e<3;e++)b[e]=Ga(f)+1,b[e]>=2&&(ba(b[e]+2,v,e*X,f),ba(26,y,e*X,f),i[e]=Ja(y,e*X,f),S[e]=1);f.readMoreInput();let T=f.readBits(2),E=16+(f.readBits(4)<<T),D=(1<<T)-1,O=E+(48<<T),k=new Uint8Array(b[0]);for(let e=0;e<b[0];e++)f.readMoreInput(),k[e]=f.readBits(2)<<1;let[A,j]=Za(b[0]<<6,f),[M,ee]=Za(b[2]<<2,f);u[0]=new Ca(256,A),u[1]=new Ca(704,b[1]),u[2]=new Ca(O,M);for(let e=0;e<3;++e)u[e].decode(f);let N=0,P=0,F=k[d[0]],te=Xa[F],ne=Xa[F+1],re=u[1].htrees[0];for(;e>0;){let r;f.readMoreInput(),i[1]===0&&(Ha(b[1],v,1,d,x,S,f),i[1]=Ja(y,X,f),re=u[1].htrees[d[1]]),i[1]--;let w=xa(u[1].codes,re,f),O=w>>6;O>=2?(O-=2,r=-1):r=0;let A=Ea[Oa[O]+(w>>3&7)],M=A.offset+f.readBits(A.nbits),ie=Da[ka[O]+(w&7)],I=ie.offset+f.readBits(ie.nbits);c=g[n-1&h],l=g[n-2&h];for(let e=0;e<M;e++){f.readMoreInput(),i[0]===0&&(Ha(b[0],v,0,d,x,S,f),i[0]=Ja(y,0,f),C=d[0]<<6,N=C,F=k[d[0]],te=Xa[F],ne=Xa[F+1]);let e=Ya[te+c]|Ya[ne+l],r=j[N+e];i[0]--,l=c,c=xa(u[0].codes,u[0].htrees[r],f),g[n&h]=c,(n&h)===h&&t.write(g,m),n++}if(e-=M,e<=0)break;if(r<0){f.readMoreInput(),i[2]===0&&(Ha(b[2],v,2,d,x,S,f),i[2]=Ja(y,2*X,f),P=d[2]<<2),i[2]--;let e=(I>4?3:I-2)&255,t=ee[P+e];if(r=xa(u[2].codes,u[2].htrees[t],f),r>=E){r-=E;let e=r&D;r>>=T;let t=(r>>1)+1;r=E+((2+(r&1)<<t)-4+f.readBits(t)<<T)+e}}let ae=bo(r,o,s);if(ae<0)throw Error(`[BrotliDecompress] invalid distance`);a=n<p&&a!==p?n:p;let L=n&h;if(ae>a)if(I>=4&&I<=24){let r=go[I],i=ae-a-1,o=_o[I],s=i&(1<<o)-1,c=i>>o;if(r+=s*I,c<uo){let i=po(g,L,r,I,c);if(L+=i,n+=i,e-=i,L>=_){t.write(g,m);for(let e=0;e<L-_;e++)g[e]=g[_+e]}}else throw Error(`Invalid backward reference`)}else throw Error(`Invalid backward reference`);else{if(r>0&&(o[s&3]=ae,s++),I>e)throw Error(`Invalid backward reference`);for(let r=0;r<I;r++)g[n&h]=g[n-ae&h],(n&h)===h&&t.write(g,m),n++,e--}c=g[n-1&h],l=g[n-2&h]}n&=1073741823}t.write(g,n&h)}function bo(e,t,n){return e<16?(n+=mo[e],n&=3,t[n]+ho[e]):e-16+1}function xo(e,t){let n=new Uint8Array(t);try{let t=0,r=0;for(;t<e.length-8;){let i=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++],a=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++];if(e.length-t<a||n.length<i||Co(e.subarray(t,t+a),n,r)!==i)throw Error(`lz4 not hadoop`);if(t+=a,r+=i,t===e.length)return n}if(t<e.length)throw Error(`lz4 not hadoop`)}catch(t){if(t instanceof Error&&t.message!==`lz4 not hadoop`)throw t;Co(e,n,0)}return n}function So(e,t){let n=new Uint8Array(t);return Co(e,n,0),n}function Co(e,t,n){let r=n;for(let i=0;i<e.length;){let a=e[i++],o=a>>4;if(o){let a=o+240;for(;a===255;)o+=a=e[i++];if(t.set(e.subarray(i,i+o),r),r+=o,i+=o,i>=e.length)return r-n}let s=e[i++]|e[i++]<<8;if(!s||s>r)throw Error(`lz4 offset out of range ${s}`);let c=(a&15)+4,l=c+240;for(;l===255;)c+=l=e[i++];let u=r-s,d=r+c;for(;r<d;)t[r++]=t[u++]}return r-n}const wo={SNAPPY:ca(),GZIP:(e,t)=>oo(e,new Uint8Array(t)),BROTLI:vo,ZSTD:e=>sa(e),LZ4:xo,LZ4_RAW:So},To=e=>({byteLength:e.byteLength,slice:(t,n)=>Promise.resolve(e.slice(t,n))}),Eo=e=>{let t=e?.find(e=>e.key===`ARROW:schema`);if(t?.value)try{let e=atob(t.value),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return Do(n)}catch{return}},Do=e=>{let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.length<16||t.getInt32(0,!0)!==-1)return;let n=e=>t.getInt32(8+e,!0),r=e=>t.getUint16(8+e,!0),i=t=>{let r=n(t);return new TextDecoder().decode(e.subarray(8+t+4,8+t+4+r))},a=n(0),o=a-n(a);if(r(o)-4>>1<3)return;let s=r(o+4+4);if(s===0)return;let c=n(a+s),l=a+s+c,u=l-n(l);if(r(u)-4>>1<3)return;let d=r(u+4+4);if(d===0)return;let f=n(l+d),p=l+d+f,m=n(p);for(let e=0;e<m;e++){let t=n(p+4+e*4),a=p+4+e*4+t,o=a-n(a);if(r(o)-4>>1<2)continue;let s=r(o+4),c=r(o+6);if(!(s===0||c===0)&&i(a+s+n(a+s))===`dtour`)return i(a+c+n(a+c))}},Oo=async e=>{let t=To(e),n=vr(e),r=n.key_value_metadata?.find(e=>e.key===`dtour`)?.value??Eo(n.key_value_metadata),i=new Set([`list`,`element`,`key`,`value`,`bag`,`array`,`item`,`entries`,`entry`]),a=[],o=[];for(let e of n.schema){if(!(`type`in e)||e.type==null||/^__index_level_\\d+__$/.test(e.name)||i.has(e.name))continue;let t=e.type;t===`FLOAT`||t===`DOUBLE`||t===`INT32`||t===`INT64`||t===`INT96`||t===`BOOLEAN`?a.push(e.name):t===`BYTE_ARRAY`&&o.push(e.name)}let s=Number(n.num_rows),c={};for(let e of a)c[e]=new Float32Array(s);let l=new Map,u=new Map;for(let e of o)l.set(e,new Map),u.set(e,new Uint32Array(s));let d=new Set(a),f=new Set(o);return await Ni({file:t,compressors:wo,columns:[...a,...o],onChunk({columnName:e,columnData:t,rowStart:n}){let r=t.length;if(d.has(e)){let i=c[e];if(t instanceof Float32Array)i.set(t,n);else for(let e=0;e<r;e++){let r=t[e];i[n+e]=typeof r==`bigint`?Number.isFinite(Number(r))?Number(r):0:typeof r==`number`&&Number.isFinite(r)?r:0}return}if(f.has(e)){let i=u.get(e),a=l.get(e);for(let e=0;e<r;e++){let r=String(t[e]??``),o=a.get(r);o===void 0&&(o=a.size,a.set(r,o)),i[n+e]=o}}}}),{numeric:c,categorical:o.map(e=>{let t=[...l.get(e).keys()],n=[...t].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),r=new Map;for(let e=0;e<n.length;e++)r.set(n[e],e);let i=t.map(e=>r.get(e)),a=u.get(e);for(let e=0;e<a.length;e++)a[e]=i[a[e]];return{name:e,indices:a,labels:n}}),embeddedConfig:r}},ko=async e=>{let t=Pn(e)===`parquet`?await Oo(e):null,n=t??An(e),r=Object.keys(n.numeric);if(r.length===0)throw Error(`No numeric columns found in dataset`);let i=n.numeric[r[0]].length;if(i===0)throw Error(`Dataset contains no rows`);for(let e of r){let t=n.numeric[e];if(t.length!==i)throw Error(`Column \"${e}\" has ${t.length} rows, expected ${i}. All columns must have equal length.`)}return{columns:r.map(e=>{let t=n.numeric[e],{min:r,max:i,range:a,mean:o}=l(t);return{name:e,values:t,min:r,max:i,range:a,mean:o}}),categoricalColumns:n.categorical,rowCount:i,embeddedConfig:t?.embeddedConfig}},Ao=e=>{let t=new Uint32Array(e.length);for(let n=0;n<e.length;n++){let[r,i,a]=e[n];t[n]=255<<24|a<<16|i<<8|r}return t};let $=null,jo=0,Mo=[],No=new Map,Po=new Map,Fo=new Map,Io=0;self.onmessage=async e=>{let n=e.data;if(n.type===`init`){$=n.gpuPort;return}if(n.type===`load`){if(!$){self.postMessage({type:`error`,message:`GPU port not initialized before load`});return}try{let e=await ko(n.buffer);jo++,Io=e.rowCount,Mo=e.columns.map(e=>e.name),No=new Map,Po=new Map;for(let t of e.columns)No.set(t.name,t.min),Po.set(t.name,t.range);Fo=new Map;for(let t of e.categoricalColumns)Fo.set(t.name,t.labels);let t={};for(let n of e.categoricalColumns)t[n.name]=n.labels;let r={type:`metadata`,metadata:{columnNames:e.columns.map(e=>e.name),categoricalColumnNames:e.categoricalColumns.map(e=>e.name),categoricalLabels:t,rowCount:e.rowCount,dimCount:e.columns.length,mins:e.columns.map(e=>e.min),maxes:e.columns.map(e=>e.max),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),embeddedConfig:e.embeddedConfig}};self.postMessage(r);let i=e.columns.map(e=>e.values),a=e.categoricalColumns.map(e=>({name:e.name,indices:e.indices})),o=[...new Set(i.map(e=>e.buffer)),...a.map(e=>e.indices.buffer)],s={type:`data`,dataVersion:jo,dims:e.columns.length,rows:e.rowCount,buffers:i,mins:e.columns.map(e=>e.min),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),categoricalColumns:a};$.postMessage(s,o)}catch(e){let t={type:`error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)}}if(n.type===`encodeColor`){if(!$)return;let{column:e,palette:t,theme:r,colorMap:l}=n,u=r===`light`,d=Fo.get(e);if(d){let t;if(l)t=d.map(e=>l[e]??[128,128,128]);else{let e=u?o:a;t=d.length<=i.length?i:[...i,...Array(Math.ceil((d.length-i.length)/e.length)).fill(void 0).flatMap(()=>e)]}let n=Ao(t),r={type:`setColorCategorical`,dataVersion:jo,catColumnName:e,palette:n};$.postMessage(r,[n.buffer]);return}let f=Mo.indexOf(e);if(f>=0){let n=No.get(e)??0,r=Po.get(e)??1,i=t===`magma`?c:s,a=Ao(u?[...i].reverse():i),o={type:`setColorContinuous`,dataVersion:jo,columnIndex:f,min:n,range:r,colormap:a};$.postMessage(o,[a.buffer])}}if(n.type===`encodeColor2D`){if(!$)return;let{columnX:e,columnY:i,colormap:a}=n,o=Mo.indexOf(e),s=Mo.indexOf(i);if(o<0||s<0)return;let c=t[a]??0,l=r(c),u=[];l&&u.push(l.buffer);let d={type:`setColor2D`,dataVersion:jo,columnIndexX:o,columnIndexY:s,minX:No.get(e)??0,rangeX:Po.get(e)??1,minY:No.get(i)??0,rangeY:Po.get(i)??1,lut:l,mapIndex:c};$.postMessage(d,u)}if(n.type===`selectByColumn`){if(!$||Io===0)return;let{column:e,labelIndices:t,valueRanges:r}=n,i=Fo.get(e);if(i&&t&&t.length>0){let n=new Uint32Array(i.length);for(let e of t)e<n.length&&(n[e]=1);let r={type:`selectCategorical`,dataVersion:jo,catColumnName:e,selectedLabels:n};$.postMessage(r,[n.buffer]);return}let a=Mo.indexOf(e);if(a>=0&&r&&r.length>=2){let e={type:`selectContinuous`,dataVersion:jo,columnIndex:a,ranges:r};$.postMessage(e,[r.buffer]);return}}};", d = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", u], { type: "text/javascript;charset=utf-8" });
|
|
2610
|
-
|
|
2609
|
+
], u = async () => {
|
|
2610
|
+
try {
|
|
2611
|
+
if (typeof navigator > "u" || !navigator.gpu) return "webgl";
|
|
2612
|
+
let e = await navigator.gpu.requestAdapter({ powerPreference: "high-performance" });
|
|
2613
|
+
return !e || !e.features.has("float32-blendable") ? "webgl" : "webgpu";
|
|
2614
|
+
} catch {
|
|
2615
|
+
return "webgl";
|
|
2616
|
+
}
|
|
2617
|
+
}, d = "const e=new Float32Array(16),t={schumann:0,bremm:1,steiger:2,ziegler:3,teulingfig2:4,cubediagonal:5,oklab_polar:6},n=[{r_x:[-0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.4877,-14.9075,-16.3272,-17.747,-19.1668,-20.5865,-22.0063],r_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],g_x:[-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953,-12.9953],g_y:[-.076,-.0709,-.0661,-.061,-.0561,-.051,-.0462,-.041,-.0359,-.0308,-.0257,-.0205,-.0154,-.0103,-.0051,0],b_x:[-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581,-11.3581],b_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442]},{r_x:[-15.2067,-15.095,-14.9554,-14.7857,-14.5812,-14.3334,-14.0291,-13.6663,-13.2288,-12.7355,-12.1699,-11.5268,-10.802,-9.9949,-9.1075,-8.1425],r_y:[-.0066,-.0112,-.0161,-.021,-.026,-.031,-.036,-.0408,-.0449,-.0486,-.0521,-.0554,-.0586,-.0617,-.0647,-.0676],g_x:[-10.7187,-10.7357,-10.755,-10.7798,-10.8079,-10.8405,-10.8775,-10.92,-10.9701,-11.0227,-11.0828,-11.147,-11.2183,-11.2958,-11.3803,-11.4703],g_y:[-.054,-.0531,-.0521,-.0511,-.0499,-.0487,-.0473,-.0459,-.0442,-.0425,-.0405,-.0383,-.0359,-.0331,-.0298,-.0259],b_x:[-2.3509,-4.0466,-5.3978,-6.6213,-7.7862,-8.9196,-10.0363,-11.1469,-12.2854,-13.3981,-14.5092,-15.6231,-16.7524,-17.8862,-19.025,-20.1748],b_y:[-.0437,-.0438,-.0438,-.0439,-.0439,-.044,-.0441,-.0441,-.0442,-.0443,-.0444,-.0444,-.0445,-.0446,-.0447,-.0448]},{r_x:[-21.9278,-21.3484,-20.7628,-20.1344,-19.4757,-18.7856,-18.0477,-17.2595,-16.3843,-15.4484,-14.4257,-13.2751,-11.9456,-10.3735,-8.3553,-5.2147],r_y:[-.0407,-.0417,-.0426,-.0433,-.0439,-.0443,-.0447,-.045,-.0451,-.0452,-.0452,-.0451,-.045,-.0447,-.0444,-.044],g_x:[-13.0812,-13.0665,-13.0508,-13.0388,-13.0293,-13.0203,-13.0133,-13.0087,-13.0068,-13.0092,-13.0125,-13.0162,-13.0269,-13.0372,-13.0532,-13.0708],g_y:[-.0665,-.0634,-.0603,-.0572,-.054,-.0508,-.0476,-.0443,-.0408,-.0373,-.0337,-.0299,-.0258,-.0211,-.0155,-.006],b_x:[-7.2789,-8.4407,-9.4718,-10.4471,-11.3919,-12.3169,-13.2284,-14.1319,-15.0565,-15.9516,-16.8449,-17.7392,-18.6339,-19.5305,-20.4287,-21.3308],b_y:[-.0372,-.0384,-.0395,-.0405,-.0415,-.0424,-.0432,-.044,-.0448,-.0455,-.0462,-.0469,-.0476,-.0482,-.0488,-.0494]},{r_x:[-22.5873,-21.9563,-21.3711,-20.7867,-19.9754,-18.4599,-16.9442,-15.4282,-13.4591,-11.1479,-8.8297,-6.5275,-5.1161,-3.9946,-2.8733,-1.7523],r_y:[-.0419,-.0427,-.0435,-.0443,-.0452,-.0461,-.0471,-.0481,-.0478,-.0462,-.0446,-.0431,-.0419,-.0408,-.0397,-.0387],g_x:[-13.1499,-13.6389,-14.1283,-14.6177,-15.0304,-15.2028,-15.3755,-15.5483,-15.5483,-15.3755,-15.2028,-15.0304,-14.6177,-14.1283,-13.6389,-13.1499],g_y:[-.0679,-.0663,-.0649,-.0634,-.061,-.0553,-.0497,-.0441,-.0373,-.0299,-.0224,-.015,-.0104,-.0069,-.0035,0],b_x:[0,-1.1629,-2.4025,-3.6427,-5.0938,-7.0911,-9.0872,-11.0838,-12.4271,-13.0415,-13.651,-14.263,-13.9595,-13.3667,-12.7641,-12.1687],b_y:[0,-.0049,-.0102,-.0154,-.0216,-.0301,-.0385,-.047,-.0527,-.0553,-.0579,-.0605,-.0592,-.0567,-.0541,-.0516],b_x2:[0,.1737,.3579,.5429,.7486,1.01,1.2709,1.5314,1.3563,.758,.152,-.4504,-.9129,-1.327,-1.7466,-2.1664],b_y2:[0,.0073,.015,.0227,.0314,.0423,.0533,.0642,.0568,.0318,.0064,-.0189,-.0383,-.0556,-.0732,-.0908]},{r_x:[-9.3217,-9.7119,-10.1026,-10.4928,-10.8832,-11.2736,-11.6641,-12.0545,-12.4564,-12.8467,-13.2372,-13.6275,-14.0181,-14.4083,-14.7989,-15.1894],r_y:[-.0121,-.0159,-.0198,-.0236,-.0274,-.0313,-.0351,-.039,-.0429,-.0467,-.0506,-.0544,-.0582,-.0621,-.0659,-.0698],g_x:[-17.2405,-16.5128,-15.7853,-15.0578,-14.3304,-13.6031,-12.8759,-12.1487,-11.4004,-10.6733,-9.9465,-9.2196,-8.4931,-7.7664,-7.04,-6.3134],g_y:[-.0229,-.0255,-.0282,-.0308,-.0334,-.0361,-.0387,-.0413,-.044,-.0467,-.0493,-.0519,-.0546,-.0572,-.0599,-.0625],b_x:[-19.5271,-18.4535,-17.3793,-16.3057,-15.2322,-14.1586,-13.0846,-12.0108,-10.9055,-9.8317,-8.7578,-7.6841,-6.6107,-5.537,-4.4628,-3.3892],b_y:[-.0543,-.0529,-.0515,-.0501,-.0487,-.0473,-.0459,-.0445,-.0431,-.0417,-.0403,-.0389,-.0375,-.0361,-.0347,-.0333]},{r_x:[-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767,-13.0767],r_y:[-.0765,-.0714,-.0663,-.0612,-.0561,-.051,-.0459,-.0408,-.0357,-.0306,-.0255,-.0204,-.0153,-.0102,-.0051,0],g_x:[0,-1.5085,-3.017,-4.5255,-6.034,-7.5425,-9.051,-10.5595,-12.068,-13.5765,-15.0849,-16.5934,-18.1019,-19.6104,-21.1189,-22.6274],g_y:[-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442,-.0442],b_x:[13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767,13.0767],b_y:[0,.0051,.0102,.0153,.0204,.0255,.0306,.0357,.0408,.0459,.051,.0561,.0612,.0663,.0714,.0765]}],r=t=>{if(t>=n.length)return null;let r=n[t],i=new Float32Array(128);return i.set(r.r_x,0),i.set(r.r_y,16),i.set(r.g_x,32),i.set(r.g_y,48),i.set(r.b_x,64),i.set(r.b_y,80),i.set(r.b_x2??e,96),i.set(r.b_y2??e,112),i},i=[[0,114,178],[230,159,0],[0,158,115],[204,121,167],[86,180,233],[213,94,0],[240,228,66]],a=[[215,0,0],[0,151,0],[0,0,255],[255,186,0],[0,208,255],[255,0,186],[143,90,0],[0,255,151],[169,0,255],[129,129,129],[255,129,97],[0,107,79],[109,109,255],[255,0,57],[137,171,0],[176,106,255],[0,168,168],[255,131,222],[104,70,43],[175,185,143],[163,0,96],[93,136,200],[230,215,127],[0,64,36],[62,53,91],[199,186,255],[127,0,18],[85,233,188],[70,80,0],[255,195,182],[106,50,89],[0,107,140],[238,114,0],[168,161,195],[148,85,115],[0,172,95],[199,0,171],[135,141,113],[27,36,65],[185,111,84],[113,109,60],[0,232,87],[162,55,0],[0,157,218],[231,164,255],[96,131,120],[96,76,255],[192,155,103],[207,0,116],[36,65,103],[157,205,255],[182,97,176],[89,186,138],[255,78,147],[81,113,0],[255,168,105],[75,0,48],[117,217,0],[0,90,179],[214,194,0],[0,74,56],[237,237,220],[90,12,0],[147,161,236]],o=[[214,0,0],[1,135,0],[181,0,255],[5,172,198],[151,255,0],[255,165,47],[255,142,200],[121,82,94],[0,253,207],[175,165,255],[147,172,131],[154,105,0],[54,105,98],[211,0,140],[253,244,144],[200,110,102],[158,226,255],[0,200,70],[168,119,172],[184,186,1],[244,191,177],[255,40,253],[242,205,255],[0,158,124],[255,98,0],[86,100,42],[149,63,31],[144,49,142],[255,52,100],[160,228,145],[140,154,177],[130,144,38],[174,8,63],[119,198,186],[188,145,87],[228,142,255],[114,184,255],[198,165,193],[255,144,112],[211,195,124],[188,237,219],[107,133,103],[145,110,86],[249,255,0],[186,193,223],[172,86,124],[255,205,3],[255,73,177],[193,86,3],[93,140,144],[193,68,188],[0,117,63],[186,110,253],[0,212,147],[0,255,117],[73,161,80],[204,151,144],[0,235,237],[219,126,1],[247,117,137],[184,149,0],[200,66,72],[0,207,249],[117,87,38],[133,212,1],[235,255,212],[167,123,135],[219,114,200],[202,226,86],[138,191,93],[161,33,107],[133,91,137],[137,186,207],[255,186,214],[182,207,170],[151,65,77],[103,170,0],[253,225,177],[255,54,40],[128,121,61],[214,232,255],[167,149,198],[126,165,154],[209,130,163],[84,130,59],[230,168,114],[156,255,255],[218,84,128],[5,179,170],[255,170,246],[209,175,239],[218,1,93],[172,26,19],[96,179,133],[212,66,253],[172,170,89],[251,156,167],[179,114,59],[242,105,82],[174,209,212],[154,255,195],[219,179,51],[235,1,195],[153,0,196],[207,255,158],[165,89,73],[59,109,1],[0,133,121],[149,145,103],[137,219,179],[109,116,0],[170,93,202],[7,239,0],[128,79,61],[216,128,82],[255,200,98],[184,0,158],[153,172,221],[144,79,0],[140,68,112],[79,110,82],[255,135,52],[198,142,205],[212,226,158],[177,130,109],[156,251,117],[86,221,119],[249,0,135],[161,205,255],[19,202,209],[17,142,84],[209,84,165],[0,223,195],[163,131,47],[119,151,91],[186,170,128],[112,163,175],[214,251,255],[232,1,58],[216,70,33],[255,130,237],[182,56,98],[182,205,114],[151,98,107],[137,116,144],[0,163,22],[0,244,161],[191,144,242],[137,228,216],[163,77,149],[110,93,0],[140,198,142],[149,170,42],[198,114,221],[179,59,1],[214,154,54],[223,172,182],[0,154,160],[89,144,0],[151,188,168],[172,140,168],[218,212,255],[84,124,114],[0,186,105],[255,195,142],[184,0,212],[223,207,91],[98,154,123],[191,237,188],[193,189,253],[128,211,221],[226,133,126],[249,235,77],[191,109,130],[202,255,79],[239,114,170],[237,103,255],[153,70,174],[109,105,66],[226,86,96],[221,102,45],[156,219,93],[226,156,207],[184,117,0],[198,0,45],[223,188,218],[89,181,223],[255,89,218],[56,193,161],[158,105,140],[172,170,200],[149,98,47],[181,86,98],[43,126,96],[177,228,0],[237,165,144],[149,253,226],[255,84,142],[189,110,161],[170,59,54],[216,207,0],[170,128,205],[160,128,82],[225,0,232],[195,91,61],[181,58,133],[140,119,0],[219,188,149],[82,158,147],[175,188,130],[145,181,182],[167,84,35],[255,212,239],[121,174,107],[93,181,75],[128,251,154],[72,255,239],[151,149,72],[147,135,167],[49,212,0],[110,233,86],[182,212,235],[112,84,112],[242,219,138],[170,212,193],[126,205,242],[137,186,0],[100,182,186],[255,181,0],[195,130,133],[202,170,94],[100,119,72],[89,226,255],[223,77,205],[233,255,121],[188,102,184],[195,149,165],[100,198,116],[209,149,112],[112,207,79],[170,110,102],[156,96,165],[0,184,0],[226,153,179],[188,0,107],[179,232,239],[205,191,228],[119,163,66],[133,98,119],[86,142,91],[158,175,196],[232,47,160],[36,124,42],[130,103,35],[191,188,77],[221,211,165]],s=[[68,1,84],[71,16,99],[72,31,112],[71,45,123],[68,57,131],[64,70,136],[59,82,139],[54,93,141],[49,104,142],[44,114,142],[40,124,142],[36,134,142],[33,145,140],[31,154,138],[32,164,134],[40,174,128],[53,183,121],[72,193,110],[94,201,98],[117,208,84],[144,215,67],[173,220,48],[200,224,32],[229,228,25],[253,231,37]],c=[[34,17,80],[49,17,101],[64,15,116],[81,18,124],[95,24,127],[109,29,129],[123,35,130],[137,40,129],[152,45,128],[166,49,125],[183,55,121],[197,60,116],[211,67,110],[224,76,103],[235,87,96],[243,101,92],[248,118,92],[252,137,97],[253,154,106],[254,170,116],[254,187,129],[254,204,143],[253,220,158],[252,236,174],[252,253,191]],l=e=>{let t=1/0,n=-1/0,r=0;for(let i=0;i<e.length;i++){let a=e[i];a<t&&(t=a),a>n&&(n=a),r+=a}let i=n-t||1e-6,a=e.length>0?r/e.length:0;return{min:t,max:n,range:i,mean:a}},u=Uint8Array.of(65,82,82,79,87,49),d={V1:0,V2:1,V3:2,V4:3,V5:4},f={NONE:0,Schema:1,DictionaryBatch:2,RecordBatch:3,Tensor:4,SparseTensor:5},p={Dictionary:-1,NONE:0,Null:1,Int:2,Float:3,Binary:4,Utf8:5,Bool:6,Decimal:7,Date:8,Time:9,Timestamp:10,Interval:11,List:12,Struct:13,Union:14,FixedSizeBinary:15,FixedSizeList:16,Map:17,Duration:18,LargeBinary:19,LargeUtf8:20,LargeList:21,RunEndEncoded:22,BinaryView:23,Utf8View:24,ListView:25,LargeListView:26},m={HALF:0,SINGLE:1,DOUBLE:2},h={DAY:0,MILLISECOND:1},g={SECOND:0,MILLISECOND:1,MICROSECOND:2,NANOSECOND:3},_={YEAR_MONTH:0,DAY_TIME:1,MONTH_DAY_NANO:2},v={Sparse:0,Dense:1},y={LZ4_FRAME:0,ZSTD:1},b={BUFFER:0},x=Uint8Array,S=Uint16Array,C=Uint32Array,w=BigUint64Array,T=Int8Array,E=Int16Array,D=Int32Array,O=BigInt64Array,k=Float32Array,A=Float64Array;function j(e){return e instanceof ArrayBuffer||typeof SharedArrayBuffer<`u`&&e instanceof SharedArrayBuffer}function M(e,t){let n=Math.log2(e)-3;return(t?[T,E,D,O]:[x,S,C,w])[n]}Object.getPrototypeOf(Int8Array);function ee(e,t){let n=0,r=e.length;if(r<=2147483648)do{let i=n+r>>>1;e[i]<=t?n=i+1:r=i}while(n<r);else do{let i=Math.trunc((n+r)/2);e[i]<=t?n=i+1:r=i}while(n<r);return n}function N(e,t,n){if(t(e))return e;throw Error(n(e))}function P(e,t,n){return t=Array.isArray(t)?t:Object.values(t),N(e,e=>t.includes(e),n??(()=>`${e} must be one of ${t}`))}function F(e,t){for(let[n,r]of Object.entries(e))if(r===t)return n;return`<Unknown>`}const te=e=>`Unsupported data type: \"${F(p,e)}\" (id ${e})`,ne=(e,t,n=!0,r=null)=>({name:e,type:t,nullable:n,metadata:r});function re(e){return Object.hasOwn(e,`name`)&&ie(e.type)}function ie(e){return typeof e?.typeId==`number`}function I(e,t=``,n=!0){return re(e)?e:ne(t,N(e,ie,()=>`Data type expected.`),n)}const ae=(e,t,n=!1,r=-1)=>({typeId:p.Dictionary,id:r,dictionary:e,indices:t||oe(),ordered:n}),L=(e=32,t=!0)=>({typeId:p.Int,bitWidth:P(e,[8,16,32,64]),signed:t,values:M(e,t)}),oe=()=>L(32),se=(e=2)=>({typeId:p.Float,precision:P(e,m),values:[S,k,A][e]}),ce=()=>({typeId:p.Binary,offsets:D}),le=()=>({typeId:p.Utf8,offsets:D}),ue=(e,t,n=128)=>({typeId:p.Decimal,precision:e,scale:t,bitWidth:P(n,[32,64,128,256]),values:n===32?D:w}),de=e=>({typeId:p.Date,unit:P(e,h),values:e===h.DAY?D:O}),fe=(e=g.MILLISECOND)=>{e=P(e,g);let t=e===g.SECOND||e===g.MILLISECOND?32:64;return{typeId:p.Time,unit:e,bitWidth:t,values:t===32?D:O}},pe=(e=g.MILLISECOND,t=null)=>({typeId:p.Timestamp,unit:P(e,g),timezone:t,values:O}),me=(e=_.MONTH_DAY_NANO)=>({typeId:p.Interval,unit:P(e,_),values:e===_.MONTH_DAY_NANO?void 0:D}),he=e=>({typeId:p.List,children:[I(e)],offsets:D}),ge=e=>({typeId:p.Struct,children:Array.isArray(e)&&e.length>0&&re(e[0])?e:Object.entries(e).map(([e,t])=>ne(e,t))}),_e=(e,t,n,r)=>(n??=t.map((e,t)=>t),{typeId:p.Union,mode:P(e,v),typeIds:n,typeMap:n.reduce((e,t,n)=>(e[t]=n,e),{}),children:t.map((e,t)=>I(e,`_${t}`)),typeIdForValue:r,offsets:D}),ve=e=>({typeId:p.FixedSizeBinary,stride:e}),ye=(e,t)=>({typeId:p.FixedSizeList,stride:t,children:[I(e)]}),be=(e,t)=>({typeId:p.Map,keysSorted:e,children:[t],offsets:D}),xe=(e=g.MILLISECOND)=>({typeId:p.Duration,unit:P(e,g),values:O}),Se=()=>({typeId:p.LargeBinary,offsets:O}),Ce=()=>({typeId:p.LargeUtf8,offsets:O}),we=e=>({typeId:p.LargeList,children:[I(e)],offsets:O}),Te=(e,t)=>({typeId:p.RunEndEncoded,children:[N(I(e,`run_ends`),e=>e.type.typeId===p.Int,()=>`Run-ends must have an integer type.`),I(t,`values`)]}),Ee=e=>({typeId:p.ListView,children:[I(e,`value`)],offsets:D}),De=e=>({typeId:p.LargeListView,children:[I(e,`value`)],offsets:O}),Oe=new A(2).buffer;new O(Oe),new C(Oe),new D(Oe),new x(Oe);function ke(e){if(e>2**53-1||e<-(2**53-1))throw Error(`BigInt exceeds integer number representation: ${e}`);return Number(e)}function Ae(e,t){return Number(e/t)+Number(e%t)/Number(t)}const je=e=>BigInt.asUintN(64,e);function Me(e,t){return BigInt.asIntN(64,e[t])}function Ne(e,t){let n=t<<1,r;return BigInt.asIntN(64,e[n+1])<0?(r=je(~e[n])|je(~e[n+1])<<64n,r=-(r+1n)):r=e[n]|e[n+1]<<64n,r}function Pe(e,t){let n=t<<2,r;return BigInt.asIntN(64,e[n+3])<0?(r=je(~e[n])|je(~e[n+1])<<64n|je(~e[n+2])<<128n|je(~e[n+3])<<192n,r=-(r+1n)):r=e[n]|e[n+1]<<64n|e[n+2]<<128n|e[n+3]<<192n,r}const Fe=new TextDecoder(`utf-8`);new TextEncoder;function Ie(e){return Fe.decode(e)}function Le(e,t){return(e[t>>3]&1<<t%8)!=0}function R(e,t){let n=t+B(e,t),r=n-B(e,n),i=z(e,r);return(t,a,o=null)=>{if(t<i){let i=z(e,r+t);if(i)return a(e,n+i)}return o}}function Re(e,t){return t}function ze(e,t){return!!Be(e,t)}function Be(e,t){return Ve(e,t)<<24>>24}function Ve(e,t){return e[t]}function z(e,t){return He(e,t)<<16>>16}function He(e,t){return e[t]|e[t+1]<<8}function B(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function Ue(e,t){return B(e,t)>>>0}function V(e,t){return ke(BigInt.asIntN(64,BigInt(Ue(e,t))+(BigInt(Ue(e,t+4))<<32n)))}function We(e,t){let n=t+B(e,t),r=B(e,n);return n+=4,Ie(e.subarray(n,n+r))}function Ge(e,t,n,r){if(!t)return[];let i=t+B(e,t);return Array.from({length:B(e,i)},(t,a)=>r(e,i+4+a*n))}const Ke=Symbol(`rowIndex`);function qe(e,t){class n{constructor(e){this[Ke]=e}toJSON(){return Ye(e,t,this[Ke])}}let r=n.prototype;for(let n=0;n<e.length;++n){if(Object.hasOwn(r,e[n]))continue;let i=t[n];Object.defineProperty(r,e[n],{get(){return i.at(this[Ke])},enumerable:!0})}return e=>new n(e)}function Je(e,t){return n=>Ye(e,t,n)}function Ye(e,t,n){let r={};for(let i=0;i<e.length;++i)r[e[i]]=t[i].at(n);return r}function Xe(e){return e instanceof Qe}var Ze=class{static ArrayType=null;constructor({length:e,nullCount:t,type:n,validity:r,values:i,offsets:a,sizes:o,children:s}){this.length=e,this.nullCount=t,this.type=n,this.validity=r,this.values=i,this.offsets=a,this.sizes=o,this.children=s,(!t||!this.validity)&&(this.at=e=>this.value(e))}get[Symbol.toStringTag](){return`Batch`}at(e){return this.isValid(e)?this.value(e):null}isValid(e){return Le(this.validity,e)}value(e){return this.values[e]}slice(e,t){let n=t-e,r=Array(n);for(let t=0;t<n;++t)r[t]=this.at(e+t);return r}*[Symbol.iterator](){for(let e=0;e<this.length;++e)yield this.at(e)}},Qe=class extends Ze{constructor(e){super(e);let{length:t,values:n}=this;this.values=n.subarray(0,t)}slice(e,t){return this.nullCount?super.slice(e,t):this.values.subarray(e,t)}[Symbol.iterator](){return this.nullCount?super[Symbol.iterator]():this.values[Symbol.iterator]()}},$e=class extends Ze{static ArrayType=A},H=class extends Ze{static ArrayType=Array},et=class extends H{value(e){return null}},tt=class extends $e{value(e){return ke(this.values[e])}},nt=class extends $e{value(e){let t=this.values[e],n=(t&31744)>>10,r=(t&1023)/1024,i=(-1)**((t&32768)>>15);switch(n){case 31:return i*(r?NaN:1/0);case 0:return i*(r?6103515625e-14*r:0)}return i*2**(n-15)*(1+r)}},rt=class extends H{value(e){return Le(this.values,e)}},it=class extends $e{constructor(e){super(e);let{scale:t}=this.type;this.scale=10**t}value(e){return this.values[e]/this.scale}},at=class extends Ze{constructor(e){super(e);let{bitWidth:t,scale:n}=this.type;this.decimal=t===64?Me:t===128?Ne:Pe,this.scale=10n**BigInt(n)}},ot=class extends at{static ArrayType=A;value(e){return Ae(this.decimal(this.values,e),this.scale)}},st=class extends at{static ArrayType=Array;value(e){return this.decimal(this.values,e)}},ct=class extends H{constructor(e){super(e),this.source=e}value(e){return new Date(this.source.value(e))}},lt=class extends $e{value(e){return 864e5*this.values[e]}};const ut=tt;var dt=class extends tt{value(e){return super.value(e)*1e3}};const ft=tt;var pt=class extends tt{value(e){return Ae(this.values[e],1000n)}},mt=class extends tt{value(e){return Ae(this.values[e],1000000n)}},ht=class extends H{value(e){return this.values.subarray(e<<1,e+1<<1)}},gt=class extends H{value(e){let t=this.values,n=e<<4;return Float64Array.of(B(t,n),B(t,n+4),V(t,n+8))}};const _t=({values:e,offsets:t},n)=>e.subarray(t[n],t[n+1]),vt=({values:e,offsets:t},n)=>e.subarray(ke(t[n]),ke(t[n+1]));var yt=class extends H{value(e){return _t(this,e)}},bt=class extends H{value(e){return vt(this,e)}},xt=class extends H{value(e){return Ie(_t(this,e))}},St=class extends H{value(e){return Ie(vt(this,e))}},Ct=class extends H{value(e){let t=this.offsets;return this.children[0].slice(t[e],t[e+1])}},wt=class extends H{value(e){let t=this.offsets;return this.children[0].slice(ke(t[e]),ke(t[e+1]))}},Tt=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(t,n)}},Et=class extends H{value(e){let t=this.offsets[e],n=t+this.sizes[e];return this.children[0].slice(ke(t),ke(n))}},Dt=class extends H{constructor(e){super(e),this.stride=this.type.stride}},Ot=class extends Dt{value(e){let{stride:t,values:n}=this;return n.subarray(e*t,(e+1)*t)}},kt=class extends Dt{value(e){let{children:t,stride:n}=this;return t[0].slice(e*n,(e+1)*n)}};function At({children:e,offsets:t},n){let[r,i]=e[0].children,a=t[n],o=t[n+1],s=[];for(let e=a;e<o;++e)s.push([r.at(e),i.at(e)]);return s}var jt=class extends H{value(e){return At(this,e)}},Mt=class extends H{value(e){return new Map(At(this,e))}},Nt=class extends H{constructor({typeIds:e,...t}){super(t),this.typeIds=e,this.typeMap=this.type.typeMap}value(e,t=e){let{typeIds:n,children:r,typeMap:i}=this;return r[i[n[e]]].at(t)}},Pt=class extends Nt{value(e){return super.value(e,this.offsets[e])}},Ft=class extends H{constructor(e,t=Je){super(e),this.names=this.type.children.map(e=>e.name),this.factory=t(this.names,this.children)}value(e){return this.factory(e)}},It=class extends Ft{constructor(e){super(e,qe)}},Lt=class extends H{value(e){let[{values:t},n]=this.children;return n.at(ee(t,e))}},Rt=class extends H{setDictionary(e){return this.dictionary=e,this.cache=e.cache(),this}value(e){return this.cache[this.key(e)]}key(e){return this.values[e]}},zt=class extends H{constructor({data:e,...t}){super(t),this.data=e}view(e){let{values:t,data:n}=this,r=e<<4,i=r+4,a=t,o=B(a,r);return o>12&&(i=B(a,r+12),a=n[B(a,r+8)]),a.subarray(i,i+o)}},Bt=class extends zt{value(e){return this.view(e)}},Vt=class extends zt{value(e){return Ie(this.view(e))}};function Ht(e){let t=[];return{add(e){return t.push(e),this},clear:()=>t=[],done:()=>new Ut(t,e)}}var Ut=class{constructor(e,t=e[0]?.type){this.type=t,this.length=e.reduce((e,t)=>e+t.length,0),this.nullCount=e.reduce((e,t)=>e+t.nullCount,0),this.data=e;let n=e.length,r=new Int32Array(n+1);if(n===1){let[t]=e;r[1]=t.length,this.at=e=>t.at(e)}else for(let t=0,i=0;t<n;++t)r[t+1]=i+=e[t].length;this.offsets=r}get[Symbol.toStringTag](){return`Column`}[Symbol.iterator](){let e=this.data;return e.length===1?e[0][Symbol.iterator]():Wt(e)}at(e){let{data:t,offsets:n}=this,r=ee(n,e)-1;return t[r]?.at(e-n[r])}get(e){return this.at(e)}toArray(){let{length:e,nullCount:t,data:n}=this,r=!t&&Xe(n[0]),i=n.length;if(r&&i===1)return n[0].values;let a=new(!i||t>0?Array:n[0].constructor.ArrayType??n[0].values.constructor)(e);return r?Gt(a,n):Kt(a,n)}cache(){return this._cache??=this.toArray()}};function*Wt(e){for(let t=0;t<e.length;++t){let n=e[t][Symbol.iterator]();for(let e=n.next();!e.done;e=n.next())yield e.value}}function Gt(e,t){for(let n=0,r=0;n<t.length;++n){let{values:i}=t[n];e.set(i,r),r+=i.length}return e}function Kt(e,t){let n=-1;for(let r=0;r<t.length;++r){let i=t[r];for(let t=0;t<i.length;++t)e[++n]=i.at(t)}return e}var qt=class e{constructor(e,t,n=!1){let r=e.fields.map(e=>e.name);this.schema=e,this.names=r,this.children=t,this.factory=n?qe:Je;let i=[];this.getFactory=e=>i[e]??(i[e]=this.factory(r,t.map(t=>t.data[e])))}get[Symbol.toStringTag](){return`Table`}get numCols(){return this.names.length}get numRows(){return this.children[0]?.length??0}getChildAt(e){return this.children[e]}getChild(e){let t=this.names.findIndex(t=>t===e);return t>-1?this.children[t]:void 0}selectAt(t,n=[]){let{children:r,factory:i,schema:a}=this,{fields:o}=a;return new e({...a,fields:t.map((e,t)=>Jt(o[e],n[t]))},t.map(e=>r[e]),i===qe)}select(e,t){let n=this.names,r=e.map(e=>n.indexOf(e));return this.selectAt(r,t)}toColumns(){let{children:e,names:t}=this,n={};return t.forEach((t,r)=>n[t]=e[r]?.toArray()??[]),n}toArray(){let{children:e,getFactory:t,numRows:n}=this,r=e[0]?.data??[],i=Array(n);for(let e=0,n=-1;e<r.length;++e){let a=t(e);for(let t=0;t<r[e].length;++t)i[++n]=a(t)}return i}*[Symbol.iterator](){let{children:e,getFactory:t}=this,n=e[0]?.data??[];for(let e=0;e<n.length;++e){let r=t(e);for(let t=0;t<n[e].length;++t)yield r(t)}}at(e){let{children:t,getFactory:n,numRows:r}=this;if(e<0||e>=r)return null;let[{offsets:i}]=t,a=ee(i,e)-1;return n(a)(e-i[a])}get(e){return this.at(e)}};function Jt(e,t){return t!=null&&t!==e.name?{...e,name:t}:e}function Yt(e,t={}){let{typeId:n,bitWidth:r,mode:i,precision:a,unit:o}=e,{useBigInt:s,useDate:c,useDecimalInt:l,useMap:u,useProxy:d}=t;switch(n){case p.Null:return et;case p.Bool:return rt;case p.Int:case p.Time:case p.Duration:return s||r<64?Qe:tt;case p.Float:return a?Qe:nt;case p.Date:return Xt(o===h.DAY?lt:ut,c&&ct);case p.Timestamp:return Xt(o===g.SECOND?dt:o===g.MILLISECOND?ft:o===g.MICROSECOND?pt:mt,c&&ct);case p.Decimal:return r===32?l?Qe:it:l?st:ot;case p.Interval:return o===_.DAY_TIME?ht:o===_.YEAR_MONTH?Qe:gt;case p.FixedSizeBinary:return Ot;case p.Utf8:return xt;case p.LargeUtf8:return St;case p.Binary:return yt;case p.LargeBinary:return bt;case p.BinaryView:return Bt;case p.Utf8View:return Vt;case p.List:return Ct;case p.LargeList:return wt;case p.Map:return u?Mt:jt;case p.ListView:return Tt;case p.LargeListView:return Et;case p.FixedSizeList:return kt;case p.Struct:return d?It:Ft;case p.RunEndEncoded:return Lt;case p.Dictionary:return Rt;case p.Union:return i?Pt:Nt}throw Error(te(n))}function Xt(e,t){return t?class extends t{constructor(t){super(new e(t))}}:e}function Zt(e){return`Missing compression codec \"${F(y,e)}\" (id ${e})`}const Qt=new Map;function $t(e){return e!=null&&Qt.get(e)||null}function en(e,{offset:t,length:n},r){if(n===0)return{bytes:new Uint8Array,offset:0,length:0};let i=V(e,t),a=e.subarray(t+8,t+n),o=i===-1?a:r.decode(a);return{bytes:o,offset:0,length:o.length}}function tn(e,t){return{offset:V(e,t),metadataLength:B(e,t+8),bodyLength:V(e,t+16)}}function nn(e,t){return Ge(e,t,24,tn)}function rn(e,t){let n=R(e,t);return{codec:n(4,Be,y.LZ4_FRAME),method:n(6,Be,b.BUFFER)}}function an(e,t,n){let r=R(e,t),i=n<d.V4?8:0;return{length:r(4,V,0),nodes:Ge(e,r(6,Re),16,(e,t)=>({length:V(e,t),nullCount:V(e,t+8)})),regions:Ge(e,r(8,Re),16+i,(e,t)=>({offset:V(e,t+i),length:V(e,t+i+8)})),compression:r(10,rn),variadic:Ge(e,r(12,Re),8,V)}}function on(e,t,n){let r=R(e,t);return{id:r(4,V,0),data:r(6,(e,t)=>an(e,t,n)),isDelta:r(8,ze,!1)}}function sn(e,t,n,r){P(n,p,te);let i=R(e,t);switch(n){case p.Binary:return ce();case p.Utf8:return le();case p.LargeBinary:return Se();case p.LargeUtf8:return Ce();case p.List:return he(r[0]);case p.ListView:return Ee(r[0]);case p.LargeList:return we(r[0]);case p.LargeListView:return De(r[0]);case p.Struct:return ge(r);case p.RunEndEncoded:return Te(r[0],r[1]);case p.Int:return L(i(4,B,0),i(6,ze,!1));case p.Float:return se(i(4,z,m.HALF));case p.Decimal:return ue(i(4,B,0),i(6,B,0),i(8,B,128));case p.Date:return de(i(4,z,h.MILLISECOND));case p.Time:return fe(i(4,z,g.MILLISECOND));case p.Timestamp:return pe(i(4,z,g.SECOND),i(6,We));case p.Interval:return me(i(4,z,_.YEAR_MONTH));case p.Duration:return xe(i(4,z,g.MILLISECOND));case p.FixedSizeBinary:return ve(i(4,B,0));case p.FixedSizeList:return ye(r[0],i(4,B,0));case p.Map:return be(i(4,ze,!1),r[0]);case p.Union:return _e(i(4,z,v.Sparse),r,Ge(e,i(6,Re),4,B))}return{typeId:n}}function cn(e,t){let n=Ge(e,t,4,(e,t)=>{let n=R(e,t);return[n(4,We),n(6,We)]});return n.length?new Map(n):null}function ln(e,t,n){let r=R(e,t);return{version:n,endianness:r(4,z,0),fields:r(6,un,[]),metadata:r(8,cn)}}function un(e,t){return Ge(e,t,4,dn)}function dn(e,t){let n=R(e,t),r=n(8,Ve,p.NONE),i=n(10,Re,0),a=n(12,pn),o=sn(e,i,r,n(14,fn,[]));return a&&(a.dictionary=o,o=a),{name:n(4,We),type:o,nullable:n(6,ze,!1),metadata:n(16,cn)}}function fn(e,t){return Ge(e,t,4,dn)}function pn(e,t){if(!t)return null;let n=R(e,t);return ae(null,n(6,mn,oe()),n(8,ze,!1),n(4,V,0))}function mn(e,t){return sn(e,t,p.Int)}const hn=(e,t)=>`Expected to read ${e} metadata bytes, but only read ${t}.`,gn=(e,t)=>`Expected to read ${e} bytes for message body, but only read ${t}.`,_n=e=>`Unsupported message type: ${e} (${F(f,e)})`;function vn(e,t){let n=B(e,t)||0;if(t+=4,n===-1&&(n=B(e,t)||0,t+=4),n===0)return null;let r=e.subarray(t,t+=n);if(r.byteLength<n)throw Error(hn(n,r.byteLength));let i=R(r,0),a=i(4,z,d.V1),o=i(6,Ve,f.NONE),s=i(8,Re,0),c=i(10,V,0),l;if(s){let n=o===f.Schema?ln:o===f.DictionaryBatch?on:o===f.RecordBatch?an:null;if(!n)throw Error(_n(o));if(l=n(r,s,a),c>0){let n=e.subarray(t,t+=c);if(n.byteLength<c)throw Error(gn(c,n.byteLength));l.body=n}else o!==f.Schema&&(l.body=new Uint8Array)}return{version:a,type:o,index:t,content:l}}function yn(e){let t=j(e)?new Uint8Array(e):e;return t instanceof Uint8Array&&bn(t)?Sn(t):xn(t)}function bn(e){if(!e||e.length<4)return!1;for(let t=0;t<6;++t)if(u[t]!==e[t])return!1;return!0}function xn(e){let t=[e].flat(),n,r=[],i=[];for(let e of t){if(!(e instanceof Uint8Array))throw Error(`IPC data batch was not a Uint8Array.`);let t=0;for(;;){let a=vn(e,t);if(a===null)break;if(t=a.index,a.content)switch(a.type){case f.Schema:n||=a.content;break;case f.RecordBatch:r.push(a.content);break;case f.DictionaryBatch:i.push(a.content);break}}}return{schema:n,dictionaries:i,records:r,metadata:null}}function Sn(e){let t=e.byteLength-(u.length+4),n=R(e,t-B(e,t)),r=n(4,z,d.V1),i=n(8,nn,[]),a=n(10,nn,[]);return{schema:n(6,(e,t)=>ln(e,t,r)),dictionaries:i.map(({offset:t})=>vn(e,t).content),records:a.map(({offset:t})=>vn(e,t).content),metadata:n(12,cn)}}function Cn(e,t){return wn(yn(e),t)}function wn(e,t={}){let{schema:n={fields:[]},dictionaries:r,records:i}=e,{version:a,fields:o}=n,s=new Map,c=En(t,a,s),l=new Map;Tn(n,e=>{let t=e.type;t.typeId===p.Dictionary&&l.set(t.id,t.dictionary)});let u=new Map;for(let e of r){let{id:t,data:n,isDelta:r,body:i}=e,a=l.get(t),o=On(a,c({...n,body:i}));if(u.has(t)){let e=u.get(t);r||e.clear(),e.add(o)}else{if(r)throw Error(`Delta update can not be first dictionary batch.`);u.set(t,Ht(a).add(o))}}u.forEach((e,t)=>s.set(t,e.done()));let d=o.map(e=>Ht(e.type));for(let e of i){let t=c(e);o.forEach((e,n)=>d[n].add(On(e.type,t)))}return new qt(n,d.map(e=>e.done()),t.useProxy)}function Tn(e,t){e.fields.forEach(function e(n){t(n),n.type.dictionary?.children?.forEach(e),n.type.children?.forEach(e)})}function En(e,t,n){let r={version:t,options:e,dictionary:e=>n.get(e)};return e=>{let{length:t,nodes:n,regions:i,compression:a,variadic:o,body:s}=e,c=-1,l=-1,u=-1;return{...r,length:t,node:()=>n[++c],buffer:e=>{let{bytes:t,length:n,offset:r}=Dn(s,i[++l],a);return e?new e(t.buffer,t.byteOffset+r,n/e.BYTES_PER_ELEMENT):t.subarray(r,r+n)},variadic:()=>o[++u],visit(e){return e.map(e=>On(e.type,this))}}}}function Dn(e,t,n){if(!n)return{bytes:e,...t};if(n.method!==b.BUFFER)throw Error(`Unknown compression method (${n.method})`);{let r=n.codec,i=$t(r);if(!i)throw Error(Zt(r));return en(e,t,i)}}function On(e,t){let{typeId:n}=e,{options:r,node:i,buffer:a,variadic:o,version:s}=t,c=Yt(e,r),l={...i(),type:e};if(n===p.Null)return new c({...l,nullCount:l.length});switch(n){case p.Bool:case p.Int:case p.Time:case p.Duration:case p.Float:case p.Decimal:case p.Date:case p.Timestamp:case p.Interval:case p.FixedSizeBinary:return new c({...l,validity:a(),values:a(e.values)});case p.Utf8:case p.LargeUtf8:case p.Binary:case p.LargeBinary:return new c({...l,validity:a(),offsets:a(e.offsets),values:a()});case p.BinaryView:case p.Utf8View:return new c({...l,validity:a(),values:a(),data:Array.from({length:o()},()=>a())});case p.List:case p.LargeList:case p.Map:return new c({...l,validity:a(),offsets:a(e.offsets),children:t.visit(e.children)});case p.ListView:case p.LargeListView:return new c({...l,validity:a(),offsets:a(e.offsets),sizes:a(e.offsets),children:t.visit(e.children)});case p.FixedSizeList:case p.Struct:return new c({...l,validity:a(),children:t.visit(e.children)});case p.RunEndEncoded:return new c({...l,children:t.visit(e.children)});case p.Dictionary:{let{id:n,indices:r}=e;return new c({...l,validity:a(),values:a(r.values)}).setDictionary(t.dictionary(n))}case p.Union:return s<d.V5&&a(),new c({...l,typeIds:a(T),offsets:e.mode===v.Sparse?null:a(e.offsets),children:t.visit(e.children)});default:throw Error(te(n))}}new Uint16Array(new Uint8Array([1,0]).buffer)[0];const kn=new Set([`Float32Array`,`Float64Array`,`Int8Array`,`Int16Array`,`Int32Array`,`Uint8Array`,`Uint16Array`,`Uint32Array`]),An=e=>{let t=Cn(new Uint8Array(e)).toColumns(),n={},r=[];for(let[e,i]of Object.entries(t)){if(ArrayBuffer.isView(i)){let t=Object.prototype.toString.call(i).slice(8,-1);kn.has(t)&&(n[e]=i instanceof Float32Array?i:new Float32Array(i));continue}if(Array.isArray(i)&&i.length>0&&typeof i[0]==`string`){let t=new Map,n=new Uint32Array(i.length);for(let e=0;e<i.length;e++){let r=String(i[e]??``),a=t.get(r);a===void 0&&(a=t.size,t.set(r,a)),n[e]=a}let a=[...t.keys()],o=[...a].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),s=new Map;for(let e=0;e<o.length;e++)s.set(o[e],e);let c=a.map(e=>s.get(e));for(let e=0;e<n.length;e++)n[e]=c[n[e]];r.push({name:e,indices:n,labels:o})}}return{numeric:n,categorical:r}},jn=[65,82,82,79,87,49],Mn=[80,65,82,49],Nn=(e,t)=>e.length>=t.length&&t.every((t,n)=>e[n]===t),Pn=e=>{let t=new Uint8Array(e,0,Math.min(8,e.byteLength));return Nn(t,jn)?`arrow`:Nn(t,Mn)?`parquet`:`arrow`},Fn=[`BOOLEAN`,`INT32`,`INT64`,`INT96`,`FLOAT`,`DOUBLE`,`BYTE_ARRAY`,`FIXED_LEN_BYTE_ARRAY`],In=[`PLAIN`,`GROUP_VAR_INT`,`PLAIN_DICTIONARY`,`RLE`,`BIT_PACKED`,`DELTA_BINARY_PACKED`,`DELTA_LENGTH_BYTE_ARRAY`,`DELTA_BYTE_ARRAY`,`RLE_DICTIONARY`,`BYTE_STREAM_SPLIT`],Ln=[`REQUIRED`,`OPTIONAL`,`REPEATED`],Rn=[`UTF8`,`MAP`,`MAP_KEY_VALUE`,`LIST`,`ENUM`,`DECIMAL`,`DATE`,`TIME_MILLIS`,`TIME_MICROS`,`TIMESTAMP_MILLIS`,`TIMESTAMP_MICROS`,`UINT_8`,`UINT_16`,`UINT_32`,`UINT_64`,`INT_8`,`INT_16`,`INT_32`,`INT_64`,`JSON`,`BSON`,`INTERVAL`],zn=[`UNCOMPRESSED`,`SNAPPY`,`GZIP`,`LZO`,`BROTLI`,`LZ4`,`ZSTD`,`LZ4_RAW`],Bn=[`DATA_PAGE`,`INDEX_PAGE`,`DICTIONARY_PAGE`,`DATA_PAGE_V2`],Vn=[`SPHERICAL`,`VINCENTY`,`THOMAS`,`ANDOYER`,`KARNEY`];function Hn(e){let t=Un(e);if(t.type===1)return{type:`Point`,coordinates:Wn(e,t)};if(t.type===2)return{type:`LineString`,coordinates:Gn(e,t)};if(t.type===3)return{type:`Polygon`,coordinates:Kn(e,t)};if(t.type===4){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e,Un(e)));return{type:`MultiPoint`,coordinates:n}}else if(t.type===5){let n=[];for(let r=0;r<t.count;r++)n.push(Gn(e,Un(e)));return{type:`MultiLineString`,coordinates:n}}else if(t.type===6){let n=[];for(let r=0;r<t.count;r++)n.push(Kn(e,Un(e)));return{type:`MultiPolygon`,coordinates:n}}else if(t.type===7){let n=[];for(let r=0;r<t.count;r++)n.push(Hn(e));return{type:`GeometryCollection`,geometries:n}}else throw Error(`Unsupported geometry type: ${t.type}`)}function Un(e){let{view:t}=e,n=t.getUint8(e.offset++)===1,r=t.getUint32(e.offset,n);e.offset+=4;let i=r%1e3,a=Math.floor(r/1e3),o=0;i>1&&i<=7&&(o=t.getUint32(e.offset,n),e.offset+=4);let s=2;return a&&s++,a===3&&s++,{littleEndian:n,type:i,dim:s,count:o}}function Wn(e,t){let n=[];for(let r=0;r<t.dim;r++){let r=e.view.getFloat64(e.offset,t.littleEndian);e.offset+=8,n.push(r)}return n}function Gn(e,t){let n=[];for(let r=0;r<t.count;r++)n.push(Wn(e,t));return n}function Kn(e,t){let{view:n}=e,r=[];for(let i=0;i<t.count;i++){let i=n.getUint32(e.offset,t.littleEndian);e.offset+=4,r.push(Gn(e,{...t,count:i}))}return r}const qn=new TextDecoder,Jn={timestampFromMilliseconds(e){return new Date(Number(e))},timestampFromMicroseconds(e){return new Date(Number(e/1000n))},timestampFromNanoseconds(e){return new Date(Number(e/1000000n))},dateFromDays(e){return new Date(e*864e5)},stringFromBytes(e){return e&&qn.decode(e)},geometryFromBytes(e){return e&&Hn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})},geographyFromBytes(e){return e&&Hn({view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0})}};function Yn(e,t,n,r){if(t&&n.endsWith(`_DICTIONARY`)){let n=e;e instanceof Uint8Array&&!(t instanceof Uint8Array)&&(n=new t.constructor(e.length));for(let r=0;r<e.length;r++)n[r]=t[e[r]];return n}else return Xn(e,r)}function Xn(e,t){let{element:n,parsers:r,utf8:i=!0,schemaPath:a}=t,{type:o,converted_type:s,logical_type:c}=n;if(a?.some(e=>e.element.logical_type?.type===`VARIANT`)&&o===`BYTE_ARRAY`&&s!==`UTF8`&&c?.type!==`STRING`)return e;if(s===`DECIMAL`){let t=10**-(n.scale||0),r=Array(e.length);for(let n=0;n<r.length;n++)e[n]instanceof Uint8Array?r[n]=Zn(e[n])*t:r[n]=Number(e[n])*t;return r}if(!s&&o===`INT96`)return Array.from(e).map(e=>r.timestampFromNanoseconds(Qn(e)));if(s===`DATE`)return Array.from(e).map(e=>r.dateFromDays(e));if(s===`TIMESTAMP_MILLIS`)return Array.from(e).map(e=>r.timestampFromMilliseconds(e));if(s===`TIMESTAMP_MICROS`)return Array.from(e).map(e=>r.timestampFromMicroseconds(e));if(s===`JSON`)return e.map(e=>JSON.parse(qn.decode(e)));if(s===`BSON`)throw Error(`parquet bson not supported`);if(s===`INTERVAL`)throw Error(`parquet interval not supported`);if(c?.type===`GEOMETRY`)return e.map(e=>r.geometryFromBytes(e));if(c?.type===`GEOGRAPHY`)return e.map(e=>r.geographyFromBytes(e));if(s===`UTF8`||c?.type===`STRING`||i&&o===`BYTE_ARRAY`)return e.map(e=>r.stringFromBytes(e));if(s===`UINT_64`||c?.type===`INTEGER`&&c.bitWidth===64&&!c.isSigned){if(e instanceof BigInt64Array)return new BigUint64Array(e.buffer,e.byteOffset,e.length);let t=new BigUint64Array(e.length);for(let n=0;n<t.length;n++)t[n]=BigInt(e[n]);return t}if(s===`UINT_32`||c?.type===`INTEGER`&&c.bitWidth===32&&!c.isSigned){if(e instanceof Int32Array)return new Uint32Array(e.buffer,e.byteOffset,e.length);let t=new Uint32Array(e.length);for(let n=0;n<t.length;n++)t[n]=e[n];return t}if(c?.type===`FLOAT16`)return Array.from(e).map($n);if(c?.type===`TIMESTAMP`){let{unit:t}=c,n=r.timestampFromMilliseconds;t===`MICROS`&&(n=r.timestampFromMicroseconds),t===`NANOS`&&(n=r.timestampFromNanoseconds);let i=Array(e.length);for(let t=0;t<i.length;t++)i[t]=n(e[t]);return i}return e}function Zn(e){if(!e.length)return 0;let t=0n;for(let n of e)t=t*256n+BigInt(n);let n=e.length*8;return t>=2n**BigInt(n-1)&&(t-=2n**BigInt(n)),Number(t)}function Qn(e){let t=(e>>64n)-2440588n,n=e&18446744073709551615n;return t*86400000000000n+n}function $n(e){if(!e)return;let t=e[1]<<8|e[0],n=t>>15?-1:1,r=t>>10&31,i=t&1023;return r===0?n*2**-14*(i/1024):r===31?i?NaN:n*(1/0):n*2**(r-15)*(1+i/1024)}function er(e,t,n){let r=e[t],i=[],a=1;if(r.num_children)for(;i.length<r.num_children;){let r=e[t+a],o=er(e,t+a,[...n,r.name]);a+=o.count,i.push(o)}return{count:a,element:r,children:i,path:n}}function tr(e,t){let n=er(e,0,[]),r=[n];for(let e of t){let i=n.children.find(t=>t.element.name===e);if(!i)throw Error(`parquet schema element not found: ${t}`);r.push(i),n=i}return r}function nr(e){let t=[];function n(e){if(e.children.length)for(let t of e.children)n(t);else t.push(e.path.join(`.`))}return n(e),t}function rr(e){let t=0;for(let{element:n}of e)n.repetition_type===`REPEATED`&&t++;return t}function ir(e){let t=0;for(let{element:n}of e.slice(1))n.repetition_type!==`REQUIRED`&&t++;return t}function ar(e){if(!e||e.element.converted_type!==`LIST`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length>1||t.element.repetition_type!==`REPEATED`)}function or(e){if(!e||e.element.converted_type!==`MAP`||e.children.length>1)return!1;let t=e.children[0];return!(t.children.length!==2||t.element.repetition_type!==`REPEATED`||t.children.find(e=>e.element.name===`key`)?.element.repetition_type===`REPEATED`||t.children.find(e=>e.element.name===`value`)?.element.repetition_type===`REPEATED`)}function sr(e){if(e.length!==2)return!1;let[,t]=e;return!(t.element.repetition_type===`REPEATED`||t.children.length)}const U={STOP:0,TRUE:1,FALSE:2,BYTE:3,I16:4,I32:5,I64:6,DOUBLE:7,BINARY:8,LIST:9,SET:10,MAP:11,STRUCT:12,UUID:13};function cr(e){let t=0,n={};for(;e.offset<e.view.byteLength;){let[r,i,a]=mr(e,t);if(t=a,r===U.STOP)break;n[`field_${i}`]=lr(e,r)}return n}function lr(e,t){switch(t){case U.TRUE:return!0;case U.FALSE:return!1;case U.BYTE:return e.view.getInt8(e.offset++);case U.I16:case U.I32:return fr(e);case U.I64:return pr(e);case U.DOUBLE:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case U.BINARY:{let t=ur(e),n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}case U.LIST:{let t=e.view.getUint8(e.offset++),n=t&15,r=t>>4;r===15&&(r=ur(e));let i=n===U.TRUE||n===U.FALSE,a=Array(r);for(let t=0;t<r;t++)a[t]=i?lr(e,U.BYTE)===1:lr(e,n);return a}case U.STRUCT:{let t={},n=0;for(;;){let[r,i,a]=mr(e,n);if(n=a,r===U.STOP)break;t[`field_${i}`]=lr(e,r)}return t}default:throw Error(`thrift unhandled type: ${t}`)}}function ur(e){let t=0,n=0;for(;;){let r=e.view.getUint8(e.offset++);if(t|=(r&127)<<n,!(r&128))return t;n+=7}}function dr(e){let t=0n,n=0n;for(;;){let r=e.view.getUint8(e.offset++);if(t|=BigInt(r&127)<<n,!(r&128))return t;n+=7n}}function fr(e){let t=ur(e);return t>>>1^-(t&1)}function pr(e){let t=dr(e);return t>>1n^-(t&1n)}function mr(e,t){let n=e.view.getUint8(e.offset++),r=n&15;if(r===U.STOP)return[0,0,t];let i=n>>4,a=i?t+i:fr(e);return[r,a,a]}function hr(e,t){let n=new Map,r=t?.find(({key:e})=>e===`geo`)?.value,i=(r&&JSON.parse(r)?.columns)??{};for(let[e,t]of Object.entries(i)){if(t.encoding!==`WKB`)continue;let r=t.edges===`spherical`?`GEOGRAPHY`:`GEOMETRY`,i=t.crs?.id??t.crs?.ids?.[0],a=i?`${i.authority}:${i.code.toString()}`:void 0;n.set(e,{type:r,crs:a})}for(let t=1;t<e.length;t++){let r=e[t],{logical_type:i,name:a,num_children:o,repetition_type:s,type:c}=r;if(o){t+=o;continue}c===`BYTE_ARRAY`&&i===void 0&&s!==`REPEATED`&&(r.logical_type=n.get(a))}}const gr=new TextDecoder;function W(e){return e&&gr.decode(e)}async function _r(e,{parsers:t,initialFetchSize:n=524288,geoparquet:r=!0}={}){if(!e||!(e.byteLength>=0))throw Error(`parquet expected AsyncBuffer`);let i=Math.max(0,e.byteLength-n),a=await e.slice(i,e.byteLength),o=new DataView(a);if(o.getUint32(a.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let s=o.getUint32(a.byteLength-8,!0);if(s>e.byteLength-8)throw Error(`parquet metadata length ${s} exceeds available buffer ${e.byteLength-8}`);if(s+8>n){let n=e.byteLength-s-8,o=await e.slice(n,i),c=new ArrayBuffer(s+8),l=new Uint8Array(c);return l.set(new Uint8Array(o)),l.set(new Uint8Array(a),i-n),vr(c,{parsers:t,geoparquet:r})}else return vr(a,{parsers:t,geoparquet:r})}function vr(e,{parsers:t,geoparquet:n=!0}={}){if(!(e instanceof ArrayBuffer))throw Error(`parquet expected ArrayBuffer`);let r=new DataView(e);if(t={...Jn,...t},r.byteLength<8)throw Error(`parquet file is too short`);if(r.getUint32(r.byteLength-4,!0)!==827474256)throw Error(`parquet file invalid (footer != PAR1)`);let i=r.byteLength-8,a=r.getUint32(i,!0);if(a>r.byteLength-8)throw Error(`parquet metadata length ${a} exceeds available buffer ${r.byteLength-8}`);let o=cr({view:r,offset:i-a}),s=o.field_1,c=o.field_2.map(e=>({type:Fn[e.field_1],type_length:e.field_2,repetition_type:Ln[e.field_3],name:W(e.field_4),num_children:e.field_5,converted_type:Rn[e.field_6],scale:e.field_7,precision:e.field_8,field_id:e.field_9,logical_type:br(e.field_10)})),l=c.filter(e=>e.type),u=o.field_3,d=o.field_4.map(e=>({columns:e.field_1.map((e,n)=>({file_path:W(e.field_1),file_offset:e.field_2,meta_data:e.field_3&&{type:Fn[e.field_3.field_1],encodings:e.field_3.field_2?.map(e=>In[e]),path_in_schema:e.field_3.field_3.map(W),codec:zn[e.field_3.field_4],num_values:e.field_3.field_5,total_uncompressed_size:e.field_3.field_6,total_compressed_size:e.field_3.field_7,key_value_metadata:e.field_3.field_8?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),data_page_offset:e.field_3.field_9,index_page_offset:e.field_3.field_10,dictionary_page_offset:e.field_3.field_11,statistics:Sr(e.field_3.field_12,l[n],t),encoding_stats:e.field_3.field_13?.map(e=>({page_type:Bn[e.field_1],encoding:In[e.field_2],count:e.field_3})),bloom_filter_offset:e.field_3.field_14,bloom_filter_length:e.field_3.field_15,size_statistics:e.field_3.field_16&&{unencoded_byte_array_data_bytes:e.field_3.field_16.field_1,repetition_level_histogram:e.field_3.field_16.field_2,definition_level_histogram:e.field_3.field_16.field_3},geospatial_statistics:e.field_3.field_17&&{bbox:e.field_3.field_17.field_1&&{xmin:e.field_3.field_17.field_1.field_1,xmax:e.field_3.field_17.field_1.field_2,ymin:e.field_3.field_17.field_1.field_3,ymax:e.field_3.field_17.field_1.field_4,zmin:e.field_3.field_17.field_1.field_5,zmax:e.field_3.field_17.field_1.field_6,mmin:e.field_3.field_17.field_1.field_7,mmax:e.field_3.field_17.field_1.field_8},geospatial_types:e.field_3.field_17.field_2}},offset_index_offset:e.field_4,offset_index_length:e.field_5,column_index_offset:e.field_6,column_index_length:e.field_7,crypto_metadata:e.field_8,encrypted_column_metadata:e.field_9})),total_byte_size:e.field_2,num_rows:e.field_3,sorting_columns:e.field_4?.map(e=>({column_idx:e.field_1,descending:e.field_2,nulls_first:e.field_3})),file_offset:e.field_5,total_compressed_size:e.field_6,ordinal:e.field_7})),f=o.field_5?.map(e=>({key:W(e.field_1),value:W(e.field_2)})),p=W(o.field_6);return n&&hr(c,f),{version:s,schema:c,num_rows:u,row_groups:d,key_value_metadata:f,created_by:p,metadata_length:a}}function yr({schema:e}){return tr(e,[])[0]}function br(e){return e?.field_1?{type:`STRING`}:e?.field_2?{type:`MAP`}:e?.field_3?{type:`LIST`}:e?.field_4?{type:`ENUM`}:e?.field_5?{type:`DECIMAL`,scale:e.field_5.field_1,precision:e.field_5.field_2}:e?.field_6?{type:`DATE`}:e?.field_7?{type:`TIME`,isAdjustedToUTC:e.field_7.field_1,unit:xr(e.field_7.field_2)}:e?.field_8?{type:`TIMESTAMP`,isAdjustedToUTC:e.field_8.field_1,unit:xr(e.field_8.field_2)}:e?.field_10?{type:`INTEGER`,bitWidth:e.field_10.field_1,isSigned:e.field_10.field_2}:e?.field_11?{type:`NULL`}:e?.field_12?{type:`JSON`}:e?.field_13?{type:`BSON`}:e?.field_14?{type:`UUID`}:e?.field_15?{type:`FLOAT16`}:e?.field_16?{type:`VARIANT`,specification_version:e.field_16.field_1}:e?.field_17?{type:`GEOMETRY`,crs:W(e.field_17.field_1)}:e?.field_18?{type:`GEOGRAPHY`,crs:W(e.field_18.field_1),algorithm:Vn[e.field_18.field_2]}:e}function xr(e){if(e.field_1)return`MILLIS`;if(e.field_2)return`MICROS`;if(e.field_3)return`NANOS`;throw Error(`parquet time unit required`)}function Sr(e,t,n){return e&&{max:Cr(e.field_1,t,n),min:Cr(e.field_2,t,n),null_count:e.field_3,distinct_count:e.field_4,max_value:Cr(e.field_5,t,n),min_value:Cr(e.field_6,t,n),is_max_value_exact:e.field_7,is_min_value_exact:e.field_8}}function Cr(e,t,n){let{type:r,converted_type:i,logical_type:a}=t;if(e===void 0)return e;if(r===`BOOLEAN`)return e[0]===1;if(r===`BYTE_ARRAY`)return n.stringFromBytes(e);let o=new DataView(e.buffer,e.byteOffset,e.byteLength);return r===`FLOAT`&&o.byteLength===4?o.getFloat32(0,!0):r===`DOUBLE`&&o.byteLength===8?o.getFloat64(0,!0):r===`INT32`&&i===`DATE`?n.dateFromDays(o.getInt32(0,!0)):r===`INT64`&&i===`TIMESTAMP_MILLIS`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT64`&&i===`TIMESTAMP_MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`NANOS`?n.timestampFromNanoseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`&&a?.unit===`MICROS`?n.timestampFromMicroseconds(o.getBigInt64(0,!0)):r===`INT64`&&a?.type===`TIMESTAMP`?n.timestampFromMilliseconds(o.getBigInt64(0,!0)):r===`INT32`&&o.byteLength===4?o.getInt32(0,!0):r===`INT64`&&o.byteLength===8?o.getBigInt64(0,!0):i===`DECIMAL`?Zn(e)*10**-(t.scale||0):a?.type===`FLOAT16`?$n(e):e}function wr(e){let t=cr(e);return{page_locations:t.field_1.map(Tr),unencoded_byte_array_data_bytes:t.field_2}}function Tr(e){return{offset:e.field_1,compressed_page_size:e.field_2,first_row_index:e.field_3}}function Er(e,t){let n=1e4;for(let r=0;r<t.length;r+=n)e.push(...t.slice(r,r+n))}function G(e,t,n=!0){if(n?e===t:e==t)return!0;if(e instanceof Uint8Array&&t instanceof Uint8Array)return G(Array.from(e),Array.from(t),n);if(!e||!t||typeof e!=typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!G(e[r],t[r],n))return!1;return!0}if(typeof e!=`object`)return!1;let r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(let i of r)if(!G(e[i],t[i],n))return!1;return!0}function Dr(e){if(!e)return[];if(e.length===1)return e[0];let t=[];for(let n of e)Er(t,n);return t}function Or(e){if(!e)return[];let t=[];return`$and`in e&&Array.isArray(e.$and)?t.push(...e.$and.flatMap(Or)):`$or`in e&&Array.isArray(e.$or)?t.push(...e.$or.flatMap(Or)):`$nor`in e&&Array.isArray(e.$nor)?t.push(...e.$nor.flatMap(Or)):t.push(...Object.keys(e).map(e=>e.split(`.`)[0])),[...new Set(t)]}function kr(e,t,n=!0){return`$and`in t&&Array.isArray(t.$and)?t.$and.every(t=>kr(e,t,n)):`$or`in t&&Array.isArray(t.$or)?t.$or.some(t=>kr(e,t,n)):`$nor`in t&&Array.isArray(t.$nor)?!t.$nor.some(t=>kr(e,t,n)):Object.entries(t).every(([t,r])=>{let i=jr(e,t);return typeof r!=`object`||!r||Array.isArray(r)?G(i,r,n):Object.entries(r||{}).every(([e,r])=>e===`$gt`?i>r:e===`$gte`?i>=r:e===`$lt`?i<r:e===`$lte`?i<=r:e===`$eq`?G(i,r,n):e===`$ne`?!G(i,r,n):e===`$in`?Array.isArray(r)&&r.includes(i):e===`$nin`?Array.isArray(r)&&!r.includes(i):e===`$not`?!kr({[t]:i},{[t]:r},n):!0)})}function Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r=!0}){if(!n)return!1;if(`$and`in n&&Array.isArray(n.$and))return n.$and.some(n=>Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$or`in n&&Array.isArray(n.$or))return n.$or.every(n=>Ar({rowGroup:e,physicalColumns:t,filter:n,strict:r}));if(`$nor`in n&&Array.isArray(n.$nor))return!1;for(let[i,a]of Object.entries(n)){let n=t.indexOf(i);if(n===-1)continue;let o=e.columns[n].meta_data?.statistics;if(!o)continue;let{min:s,max:c,min_value:l,max_value:u}=o,d=l===void 0?s:l,f=u===void 0?c:u;if(!(d===void 0||f===void 0)){for(let[e,t]of Object.entries(a||{}))if(e===`$gt`&&f<=t||e===`$gte`&&f<t||e===`$lt`&&d>=t||e===`$lte`&&d>t||e===`$eq`&&(t<d||t>f)||e===`$ne`&&G(d,f,r)&&G(d,t,r)||e===`$in`&&Array.isArray(t)&&t.every(e=>e<d||e>f)||e===`$nin`&&Array.isArray(t)&&G(d,f,r)&&t.includes(d))return!0}}return!1}function jr(e,t){let n=e;for(let e of t.split(`.`))n=n?.[e];return n}function Mr({metadata:e,rowStart:t=0,rowEnd:n=1/0,columns:r,filter:i,filterStrict:a=!0,useOffsetIndex:o=!1}){if(!e)throw Error(`parquetPlan requires metadata`);let s=[],c=[],l=[],u=nr(yr(e)),d=0;for(let f of e.row_groups){let e=Number(f.num_rows),p=d+e;if(e>0&&p>t&&d<n&&!Ar({rowGroup:f,physicalColumns:u,filter:i,strict:a})){let i=[],a=1/0,u=-1/0;for(let e of f.columns){let t=e.meta_data;if(e.file_path)throw Error(`parquet file_path not supported`);if(!t)throw Error(`parquet column metadata is undefined`);if(!r||r.includes(t.path_in_schema[0])){let n=t.dictionary_page_offset||t.data_page_offset,r=Number(n),s=Number(n+t.total_compressed_size);if(r<a&&(a=r),s>u&&(u=s),o&&e.offset_index_offset&&e.offset_index_length){let n=Number(e.offset_index_offset);i.push({columnMetadata:t,offsetIndex:{startByte:n,endByte:n+e.offset_index_length},bounds:{startByte:r,endByte:s}})}else i.push({columnMetadata:t,range:{startByte:r,endByte:s}})}}let p=Math.max(t-d,0),m=Math.min(n-d,e);s.push({chunks:i,rowGroup:f,groupStart:d,groupRows:e,selectStart:p,selectEnd:m});let h;for(let e of i)if(`offsetIndex`in e)l.push(e.offsetIndex);else{let{range:t}=e;r?c.push(t):h&&t.endByte-h.startByte<=2097152?h.endByte=t.endByte:(h&&c.push(h),h={...t})}h&&c.push(h)}d=p}return isFinite(n)||(n=d),c.push(...l),{metadata:e,rowStart:t,rowEnd:n,columns:r,fetches:c,groups:s}}function Nr(e,{fetches:t}){let n=t.map(({startByte:t,endByte:n})=>e.slice(t,n));return{byteLength:e.byteLength,slice(r,i=e.byteLength){let a=t.findIndex(({startByte:e,endByte:t})=>e<=r&&i<=t);if(a<0)return e.slice(r,i);if(t[a].startByte!==r||t[a].endByte!==i){let e=r-t[a].startByte,o=i-t[a].startByte;return n[a]instanceof Promise?n[a].then(t=>t.slice(e,o)):n[a].slice(e,o)}else return n[a]}}}const Pr=new TextDecoder,Fr=new WeakMap;function Ir(e,t=Jn){if(Array.isArray(e))return e.map(e=>Ir(e,t));if(typeof e!=`object`)return e;if(`metadata`in e){let n=zr(e.metadata),r=e.typed_value&&Lr(e.typed_value,n,t),i=e.value&&Vr(Rr(e.value),n,t);return r&&i?{...i,...r}:r??i}return e}function Lr(e,t,n){if(e&&typeof e==`object`&&!Array.isArray(e)&&!(e instanceof Uint8Array)){if(`typed_value`in e)return Lr(e.typed_value,t,n);if(`value`in e&&e.value instanceof Uint8Array)return Vr(Rr(e.value),t,n);let r={};for(let[i,a]of Object.entries(e))r[i]=Lr(a,t,n);return r}return e instanceof Uint8Array?Vr(Rr(e),t,n):Array.isArray(e)?e.map(e=>Lr(e,t,n)):e}function Rr(e){return{view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0}}function zr(e){let t=Fr.get(e.buffer);t||(t=new Map,Fr.set(e.buffer,t));let n=`${e.byteOffset}:${e.byteLength}`,r=t.get(n);if(r)return r;let i=Rr(e),a=i.view.getUint8(i.offset++),o=a&15;if(o!==1)throw Error(`parquet unsupported variant metadata version: ${o}`);let s=(a>>4&1)==1,c=(a>>6&3)+1,l=Br(i,c),u=Array(l+1);for(let e=0;e<u.length;e++)u[e]=Br(i,c);let d=i.offset,f=Array(l);for(let t=0;t<l;t++){let n=u[t],r=u[t+1],i=new Uint8Array(e.buffer,e.byteOffset+d+n,r-n);f[t]=Pr.decode(i)}let p={dictionary:f,sorted:s};return t.set(n,p),p}function Br(e,t){let n=0;for(let r=0;r<t;r++)n|=e.view.getUint8(e.offset+r)<<r*8;return e.offset+=t,n}function Vr(e,t,n){let r=e.view.getUint8(e.offset++),i=r&3,a=r>>2;if(i===0)return Hr(e,a,n);if(i===2)return Ur(e,a,t,n);if(i===3)return Wr(e,a,t,n);let o=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,a);return e.offset+=a,Pr.decode(o)}function Hr(e,t,n){switch(t){case 0:return null;case 1:return!0;case 2:return!1;case 3:{let t=e.view.getInt8(e.offset);return e.offset+=1,t}case 4:{let t=e.view.getInt16(e.offset,!0);return e.offset+=2,t}case 5:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,t}case 6:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 7:{let t=e.view.getFloat64(e.offset,!0);return e.offset+=8,t}case 8:return Gr(e,4);case 9:return Gr(e,8);case 10:return Gr(e,16);case 11:{let t=e.view.getInt32(e.offset,!0);return e.offset+=4,n.dateFromDays(t)}case 12:case 13:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromMicroseconds(t)}case 14:{let t=e.view.getFloat32(e.offset,!0);return e.offset+=4,t}case 15:return Kr(e);case 16:{let t=Kr(e);return Pr.decode(t)}case 17:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,t}case 18:case 19:{let t=e.view.getBigInt64(e.offset,!0);return e.offset+=8,n.timestampFromNanoseconds(t)}case 20:{let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,16);e.offset+=16;let n=Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``);return`${n.slice(0,8)}-${n.slice(8,12)}-${n.slice(12,16)}-${n.slice(16,20)}-${n.slice(20)}`}default:throw Error(`parquet unsupported variant primitive type: ${t}`)}}function Ur(e,t,n,r){let i=(t&3)+1,a=(t>>2&3)+1,o=t>>4&1?Br(e,4):e.view.getUint8(e.offset++),s=Array(o);for(let t=0;t<o;t++)s[t]=Br(e,a);let c=Array(o+1);for(let t=0;t<c.length;t++)c[t]=Br(e,i);let l={};for(let t=0;t<o;t++){let i=n.dictionary[s[t]];l[i]=Vr({view:e.view,offset:e.offset+c[t]},n,r)}return e.offset+=c[c.length-1],l}function Wr(e,t,n,r){let i=t&3,a=t>>2&1,o=i+1,s=Br(e,a?4:1),c=Array(s+1);for(let t=0;t<c.length;t++)c[t]=Br(e,o);let l=e.offset,u=Array(s);for(let t=0;t<s;t++)u[t]=Vr({view:e.view,offset:l+c[t]},n,r);return e.offset=l+c[c.length-1],u}function Gr(e,t){let n=e.view.getUint8(e.offset);e.offset+=1;let r;if(t===4)r=BigInt(e.view.getInt32(e.offset,!0)),e.offset+=4;else if(t===8)r=e.view.getBigInt64(e.offset,!0),e.offset+=8;else{let t=e.view.getBigUint64(e.offset,!0);r=e.view.getBigInt64(e.offset+8,!0)<<64n|t,e.offset+=16}return Number(r)*10**-n}function Kr(e){let t=e.view.getUint32(e.offset,!0);e.offset+=4;let n=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t,n}function qr(e,t,n,r,i){let a=ir(i);if(!t?.length&&!n.length){if(!a||!r.length)return r;t=Array(r.length).fill(a)}let o=t?.length||n.length,s=i.map(({element:e})=>e.repetition_type),c=0,l=[e],u=e,d=0,f=0,p=0;if(n[0])for(;d<s.length-2&&p<n[0];)d++,s[d]!==`REQUIRED`&&(u=u.at(-1),l.push(u),f++),s[d]===`REPEATED`&&p++;for(let e=0;e<o;e++){let i=t?.length?t[e]:a,o=n[e];for(;d&&(o<p||s[d]!==`REPEATED`);)s[d]!==`REQUIRED`&&(l.pop(),f--),s[d]===`REPEATED`&&p--,d--;for(u=l.at(-1);(d<s.length-2||s[d+1]===`REPEATED`)&&(f<i||s[d+1]===`REQUIRED`);){if(d++,s[d]!==`REQUIRED`){let e=[];u.push(e),u=e,l.push(e),f++}s[d]===`REPEATED`&&p++}i===a?u.push(r[c++]):d===s.length-2?u.push(null):u.push([])}if(!e.length)for(let e=0;e<a;e++){let e=[];u.push(e),u=e}return e}function Jr(e,t,n,r=0){let i=t.path.join(`.`),a=t.element.repetition_type===`OPTIONAL`,o=a?r+1:r;if(ar(t)){let s=t.children[0],c=o;s.children.length===1&&(s=s.children[0],c++),Jr(e,s,n,c);let l=s.path.join(`.`),u=e.get(l);if(!u)throw Error(`parquet list column missing values`);a&&Yr(u,r),e.set(i,u),e.delete(l);return}if(or(t)){let s=t.children[0].element.name;Jr(e,t.children[0].children[0],n,o+1),Jr(e,t.children[0].children[1],n,o+1);let c=e.get(`${i}.${s}.key`),l=e.get(`${i}.${s}.value`);if(!c)throw Error(`parquet map column missing keys`);if(!l)throw Error(`parquet map column missing values`);if(c.length!==l.length)throw Error(`parquet map column key/value length mismatch`);let u=Xr(c,l,o);a&&Yr(u,r),e.delete(`${i}.${s}.key`),e.delete(`${i}.${s}.value`),e.set(i,u);return}if(t.children.length){let o=t.element.repetition_type===`REQUIRED`?r:r+1,s={};for(let r of t.children){Jr(e,r,n,o);let t=e.get(r.path.join(`.`));if(!t)throw Error(`parquet struct missing child data`);s[r.element.name]=t}for(let n of t.children)e.delete(n.path.join(`.`));let c=Zr(s,o);t.element.logical_type?.type===`VARIANT`&&(c=Ir(c,n)),a&&Yr(c,r),e.set(i,c)}}function Yr(e,t){for(let n=0;n<e.length;n++)t?Yr(e[n],t-1):e[n]=e[n][0]}function Xr(e,t,n){let r=[];for(let i=0;i<e.length;i++)if(n)r.push(Xr(e[i],t[i],n-1));else if(e[i]){let n={};for(let r=0;r<e[i].length;r++){let a=t[i][r];n[e[i][r]]=a===void 0?null:a}r.push(n)}else r.push(void 0);return r}function Zr(e,t){let n=Object.keys(e),r=e[n[0]]?.length,i=[];for(let a=0;a<r;a++){let o={};for(let t of n){if(e[t].length!==r)throw Error(`parquet struct parsing error`);o[t]=e[t][a]}t?i.push(Zr(o,t-1)):i.push(o)}return i}function Qr(e,t,n){let r=n instanceof Int32Array,i=ur(e),a=ur(e);ur(e);let o=pr(e),s=0;n[s++]=r?Number(o):o;let c=i/a;for(;s<t;){let i=pr(e),l=new Uint8Array(a);for(let t=0;t<a;t++)l[t]=e.view.getUint8(e.offset++);for(let u=0;u<a&&s<t;u++){let a=BigInt(l[u]);if(a){let l=0n,u=c,d=(1n<<a)-1n;for(;u&&s<t;){let t=BigInt(e.view.getUint8(e.offset))>>l&d;for(l+=a;l>=8;)l-=8n,e.offset++,l&&(t|=BigInt(e.view.getUint8(e.offset))<<a-l&d);let c=i+t;o+=c,n[s++]=r?Number(o):o,u--}u&&(e.offset+=Math.ceil((u*Number(a)+Number(l))/8))}else for(let e=0;e<c&&s<t;e++)o+=i,n[s++]=r?Number(o):o}}}function $r(e,t,n){let r=new Int32Array(t);Qr(e,t,r);for(let i=0;i<t;i++)n[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,r[i]),e.offset+=r[i]}function ei(e,t,n){let r=new Int32Array(t);Qr(e,t,r);let i=new Int32Array(t);Qr(e,t,i);for(let a=0;a<t;a++){let t=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,i[a]);r[a]?(n[a]=new Uint8Array(r[a]+i[a]),n[a].set(n[a-1].subarray(0,r[a])),n[a].set(t,r[a])):n[a]=t,e.offset+=i[a]}}function ti(e){return 32-Math.clz32(e)}function ni(e,t,n,r){r===void 0&&(r=e.view.getUint32(e.offset,!0),e.offset+=4);let i=e.offset,a=0;for(;a<n.length;){let r=ur(e);if(r&1)a=ii(e,r,t,n,a);else{let i=r>>>1;ri(e,i,t,n,a),a+=i}}e.offset=i+r}function ri(e,t,n,r,i){let a=n+7>>3,o=0;for(let t=0;t<a;t++)o|=e.view.getUint8(e.offset++)<<(t<<3);for(let e=0;e<t;e++)r[i+e]=o}function ii(e,t,n,r,i){let a=t>>1<<3,o=(1<<n)-1,s=0;if(e.offset<e.view.byteLength)s=e.view.getUint8(e.offset++);else if(o)throw Error(`parquet bitpack offset ${e.offset} out of range`);let c=8,l=0;for(;a;)l>8?(l-=8,c-=8,s>>>=8):c-l<n?(s|=e.view.getUint8(e.offset)<<c,e.offset++,c+=8):(i<r.length&&(r[i++]=s>>l&o),a--,l+=n);return i}function ai(e,t,n,r){let i=oi(n,r),a=new Uint8Array(t*i);for(let n=0;n<i;n++)for(let r=0;r<t;r++)a[r*i+n]=e.view.getUint8(e.offset++);if(n===`FLOAT`)return new Float32Array(a.buffer);if(n===`DOUBLE`)return new Float64Array(a.buffer);if(n===`INT32`)return new Int32Array(a.buffer);if(n===`INT64`)return new BigInt64Array(a.buffer);if(n===`FIXED_LEN_BYTE_ARRAY`){let e=Array(t);for(let n=0;n<t;n++)e[n]=a.subarray(n*i,(n+1)*i);return e}throw Error(`parquet byte_stream_split unsupported type: ${n}`)}function oi(e,t){switch(e){case`INT32`:case`FLOAT`:return 4;case`INT64`:case`DOUBLE`:return 8;case`FIXED_LEN_BYTE_ARRAY`:if(!t)throw Error(`parquet byteWidth missing type_length`);return t;default:throw Error(`parquet unsupported type: ${e}`)}}function si(e,t,n,r){if(n===0)return[];if(t===`BOOLEAN`)return ci(e,n);if(t===`INT32`)return li(e,n);if(t===`INT64`)return ui(e,n);if(t===`INT96`)return di(e,n);if(t===`FLOAT`)return fi(e,n);if(t===`DOUBLE`)return pi(e,n);if(t===`BYTE_ARRAY`)return mi(e,n);if(t===`FIXED_LEN_BYTE_ARRAY`){if(!r)throw Error(`parquet missing fixed length`);return hi(e,n,r)}else throw Error(`parquet unhandled type: ${t}`)}function ci(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.offset+(r/8|0),i=r%8;n[r]=(e.view.getUint8(t)&1<<i)!=0}return e.offset+=Math.ceil(t/8),n}function li(e,t){let n=(e.view.byteOffset+e.offset)%4?new Int32Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Int32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function ui(e,t){let n=(e.view.byteOffset+e.offset)%8?new BigInt64Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new BigInt64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function di(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getBigInt64(e.offset+r*12,!0),i=e.view.getInt32(e.offset+r*12+8,!0);n[r]=BigInt(i)<<64n|t}return e.offset+=t*12,n}function fi(e,t){let n=(e.view.byteOffset+e.offset)%4?new Float32Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*4)):new Float32Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*4,n}function pi(e,t){let n=(e.view.byteOffset+e.offset)%8?new Float64Array(gi(e.view.buffer,e.view.byteOffset+e.offset,t*8)):new Float64Array(e.view.buffer,e.view.byteOffset+e.offset,t);return e.offset+=t*8,n}function mi(e,t){let n=Array(t);for(let r=0;r<t;r++){let t=e.view.getUint32(e.offset,!0);e.offset+=4,n[r]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t),e.offset+=t}return n}function hi(e,t,n){let r=Array(t);for(let i=0;i<t;i++)r[i]=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,n),e.offset+=n;return r}function gi(e,t,n){let r=new ArrayBuffer(n);return new Uint8Array(r).set(new Uint8Array(e,t,n)),r}const _i=[0,255,65535,16777215,4294967295];function vi(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[t+a]}function yi(e,t){let n=e.byteLength,r=t.byteLength,i=0,a=0;for(;i<n;){let t=e[i];if(i++,t<128)break}if(r&&i>=n)throw Error(`invalid snappy length header`);for(;i<n;){let r=e[i],o=0;if(i++,i>=n)throw Error(`missing eof marker`);if(r&3){let s=0;switch(r&3){case 1:o=(r>>>2&7)+4,s=e[i]+(r>>>5<<8),i++;break;case 2:if(n<=i+1)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8),i+=2;break;case 3:if(n<=i+3)throw Error(`snappy error end of input`);o=(r>>>2)+1,s=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),i+=4;break;default:break}if(s===0||isNaN(s))throw Error(`invalid offset ${s} pos ${i} inputLength ${n}`);if(s>a)throw Error(`cannot copy from before start of buffer`);vi(t,a-s,t,a,o),a+=o}else{let o=(r>>>2)+1;if(o>60){if(i+3>=n)throw Error(`snappy error literal pos + 3 >= inputLength`);let t=o-60;o=e[i]+(e[i+1]<<8)+(e[i+2]<<16)+(e[i+3]<<24),o=(o&_i[t])+1,i+=t}if(i+o>n)throw Error(`snappy error literal exceeds input length`);vi(e,i,t,a,o),i+=o,a+=o}}if(a!==r)throw Error(`premature end of input`)}function bi(e,t,{type:n,element:r,schemaPath:i}){let a=new DataView(e.buffer,e.byteOffset,e.byteLength),o={view:a,offset:0},s,c=xi(o,t,i),{definitionLevels:l,numNulls:u}=Si(o,t,i),d=t.num_values-u;if(t.encoding===`PLAIN`)s=si(o,n,d,r.type_length);else if(t.encoding===`PLAIN_DICTIONARY`||t.encoding===`RLE_DICTIONARY`||t.encoding===`RLE`){let e=n===`BOOLEAN`?1:a.getUint8(o.offset++);e?(s=Array(d),n===`BOOLEAN`?(ni(o,e,s),s=s.map(e=>!!e)):ni(o,e,s,a.byteLength-o.offset)):s=new Uint8Array(d)}else if(t.encoding===`BYTE_STREAM_SPLIT`)s=ai(o,d,n,r.type_length);else if(t.encoding===`DELTA_BINARY_PACKED`)s=n===`INT32`?new Int32Array(d):new BigInt64Array(d),Qr(o,d,s);else if(t.encoding===`DELTA_LENGTH_BYTE_ARRAY`)s=Array(d),$r(o,d,s);else throw Error(`parquet unsupported encoding: ${t.encoding}`);return{definitionLevels:l,repetitionLevels:c,dataPage:s}}function xi(e,t,n){if(n.length>1){let r=rr(n);if(r){let n=Array(t.num_values);return ni(e,ti(r),n),n}}return[]}function Si(e,t,n){let r=ir(n);if(!r)return{definitionLevels:[],numNulls:0};let i=Array(t.num_values);ni(e,ti(r),i);let a=t.num_values;for(let e of i)e===r&&a--;return a===0&&(i.length=0),{definitionLevels:i,numNulls:a}}function Ci(e,t,n,r){let i,a=r?.[n];if(n===`UNCOMPRESSED`)i=e;else if(a)i=a(e,t);else if(n===`SNAPPY`)i=new Uint8Array(t),yi(e,i);else throw Error(`parquet unsupported compression codec: ${n}`);if(i?.length!==t)throw Error(`parquet decompressed page length ${i?.length} does not match header ${t}`);return i}function wi(e,t,n){let r={view:new DataView(e.buffer,e.byteOffset,e.byteLength),offset:0},{type:i,element:a,schemaPath:o,codec:s,compressors:c}=n,l=t.data_page_header_v2;if(!l)throw Error(`parquet data page header v2 is undefined`);let u=Ti(r,l,o);r.offset=l.repetition_levels_byte_length;let d=Ei(r,l,o),f=t.uncompressed_page_size-l.definition_levels_byte_length-l.repetition_levels_byte_length,p=e.subarray(r.offset);l.is_compressed!==!1&&(p=Ci(p,f,s,c));let m=new DataView(p.buffer,p.byteOffset,p.byteLength),h={view:m,offset:0},g,_=l.num_values-l.num_nulls;if(l.encoding===`PLAIN`)g=si(h,i,_,a.type_length);else if(l.encoding===`RLE`)g=Array(_),ni(h,1,g),g=g.map(e=>!!e);else if(l.encoding===`PLAIN_DICTIONARY`||l.encoding===`RLE_DICTIONARY`){let e=m.getUint8(h.offset++);g=Array(_),ni(h,e,g,f-1)}else if(l.encoding===`DELTA_BINARY_PACKED`)g=i===`INT32`?new Int32Array(_):new BigInt64Array(_),Qr(h,_,g);else if(l.encoding===`DELTA_LENGTH_BYTE_ARRAY`)g=Array(_),$r(h,_,g);else if(l.encoding===`DELTA_BYTE_ARRAY`)g=Array(_),ei(h,_,g);else if(l.encoding===`BYTE_STREAM_SPLIT`)g=ai(h,_,i,a.type_length);else throw Error(`parquet unsupported encoding: ${l.encoding}`);return{definitionLevels:d,repetitionLevels:u,dataPage:g}}function Ti(e,t,n){let r=rr(n);if(!r)return[];let i=Array(t.num_values);return ni(e,ti(r),i,t.repetition_levels_byte_length),i}function Ei(e,t,n){let r=ir(n);if(r){let n=Array(t.num_values);return ni(e,ti(r),n,t.definition_levels_byte_length),n}}function Di(e,{groupStart:t,selectStart:n,selectEnd:r},i,a){let{pathInSchema:o,schemaPath:s}=i,c=sr(s),l=[],u,d,f=0,p=0,m=a&&(()=>{d&&a({pathInSchema:o,columnData:d,rowStart:t+f-d.length,rowEnd:t+f})});for(;(c?f<r:e.offset<e.view.byteLength-1)&&!(e.offset>=e.view.byteLength-1);){let t=ki(e);if(t.type===`DICTIONARY_PAGE`){let{data:n}=Oi(e,t,i,u,void 0,0);n&&(u=Xn(n,i))}else{let r=d?.length||0,a=Oi(e,t,i,u,d,n-f);a.skipped?(l.length||(p+=a.skipped),f+=a.skipped):a.data&&d===a.data?f+=a.data.length-r:a.data&&a.data.length&&(m?.(),l.push(a.data),f+=a.data.length,d=a.data)}}return m?.(),{data:l,skipped:p}}function Oi(e,t,n,r,i,a){let{type:o,element:s,schemaPath:c,codec:l,compressors:u}=n,d=new Uint8Array(e.view.buffer,e.view.byteOffset+e.offset,t.compressed_page_size);if(e.offset+=t.compressed_page_size,t.type===`DATA_PAGE`){let e=t.data_page_header;if(!e)throw Error(`parquet data page header is undefined`);if(a>e.num_values&&sr(c))return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:f}=bi(Ci(d,Number(t.uncompressed_page_size),l,u),e,n),p=Yn(f,r,e.encoding,n);return{skipped:0,data:qr(Array.isArray(i)?i:[],o,s,p,c)}}else if(t.type===`DATA_PAGE_V2`){let e=t.data_page_header_v2;if(!e)throw Error(`parquet data page header v2 is undefined`);if(a>e.num_rows)return{skipped:e.num_values};let{definitionLevels:o,repetitionLevels:s,dataPage:l}=wi(d,t,n),u=Yn(l,r,e.encoding,n);return{skipped:0,data:qr(Array.isArray(i)?i:[],o,s,u,c)}}else if(t.type===`DICTIONARY_PAGE`){let e=t.dictionary_page_header;if(!e)throw Error(`parquet dictionary page header is undefined`);let n=Ci(d,Number(t.uncompressed_page_size),l,u);return{skipped:0,data:si({view:new DataView(n.buffer,n.byteOffset,n.byteLength),offset:0},o,e.num_values,s.type_length)}}else throw Error(`parquet unsupported page type: ${t.type}`)}function ki(e){let t=cr(e);return{type:Bn[t.field_1],uncompressed_page_size:t.field_2,compressed_page_size:t.field_3,crc:t.field_4,data_page_header:t.field_5&&{num_values:t.field_5.field_1,encoding:In[t.field_5.field_2],definition_level_encoding:In[t.field_5.field_3],repetition_level_encoding:In[t.field_5.field_4],statistics:t.field_5.field_5&&{max:t.field_5.field_5.field_1,min:t.field_5.field_5.field_2,null_count:t.field_5.field_5.field_3,distinct_count:t.field_5.field_5.field_4,max_value:t.field_5.field_5.field_5,min_value:t.field_5.field_5.field_6}},index_page_header:t.field_6,dictionary_page_header:t.field_7&&{num_values:t.field_7.field_1,encoding:In[t.field_7.field_2],is_sorted:t.field_7.field_3},data_page_header_v2:t.field_8&&{num_values:t.field_8.field_1,num_nulls:t.field_8.field_2,num_rows:t.field_8.field_3,encoding:In[t.field_8.field_4],definition_levels_byte_length:t.field_8.field_5,repetition_levels_byte_length:t.field_8.field_6,is_compressed:t.field_8.field_7===void 0?!0:t.field_8.field_7,statistics:t.field_8.field_8}}}function Ai(e,{metadata:t},n){let{file:r,compressors:i,utf8:a}=e,o=[],s={...Jn,...e.parsers};for(let c of n.chunks){let{columnMetadata:l}=c,u=tr(t.schema,l.path_in_schema),d={pathInSchema:l.path_in_schema,type:l.type,element:u[u.length-1].element,schemaPath:u,codec:l.codec,parsers:s,compressors:i,utf8:a};if(!(`offsetIndex`in c)){o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.range.startByte,c.range.endByte)).then(t=>Di({view:new DataView(t),offset:0},n,d,e.onPage))});continue}o.push({pathInSchema:l.path_in_schema,data:Promise.resolve(r.slice(c.offsetIndex.startByte,c.offsetIndex.endByte)).then(async t=>{let i=wr({view:new DataView(t),offset:0}),{selectStart:a,selectEnd:o}=n,s=i.page_locations,c=NaN,l=NaN,u=0;for(let e=0;e<s.length;e++){let t=s[e],r=Number(t.first_row_index),i=e+1<s.length?Number(s[e+1].first_row_index):n.groupRows;r<o&&i>a&&(Number.isNaN(c)&&(c=Number(t.offset),u=r),l=Number(t.offset)+t.compressed_page_size)}let f=await r.slice(c,l),{data:p,skipped:m}=Di({view:new DataView(f),offset:0},u?{...n,groupStart:n.groupStart+u,selectStart:n.selectStart-u,selectEnd:n.selectEnd-u}:n,d,e.onPage);return{data:p,skipped:u+m}})})}return{groupStart:n.groupStart,groupRows:n.groupRows,asyncColumns:o}}async function ji({asyncColumns:e},t,n,r,i){let a=await Promise.all(e.map(async({data:e})=>{let t=await e;return{...t,data:Dr(t.data)}})),o=e.map(e=>e.pathInSchema[0]).filter(e=>!r||r.includes(e)),s=r??o,c=s.map(t=>e.findIndex(e=>e.pathInSchema[0]===t)),l=n-t;if(i===`object`){let n=Array(l);for(let r=0;r<l;r++){let i=t+r,o={};for(let t=0;t<e.length;t++){let{data:n,skipped:r}=a[t];o[e[t].pathInSchema[0]]=n[i-r]}n[r]=o}return n}let u=Array(l);for(let n=0;n<l;n++){let r=t+n,i=Array(e.length);for(let e=0;e<s.length;e++){let t=c[e];if(t>=0){let{data:n,skipped:o}=a[t];i[e]=n[r-o]}}u[n]=i}return u}function Mi(e,t,n){let{asyncColumns:r}=e;n={...Jn,...n};let i=[];for(let e of t.children)if(e.children.length){let t=r.filter(t=>t.pathInSchema[0]===e.element.name);if(!t.length)continue;let a=new Map,o=Promise.all(t.map(e=>e.data.then(({data:t})=>{a.set(e.pathInSchema.join(`.`),Dr(t))}))).then(()=>{Jr(a,e,n);let t=a.get(e.path.join(`.`));if(!t)throw Error(`parquet column data not assembled`);return{data:[t],skipped:0}});i.push({pathInSchema:e.path,data:o})}else{let t=r.find(t=>t.pathInSchema[0]===e.element.name);t&&i.push(t)}return{...e,asyncColumns:i}}async function Ni(e){e.metadata??=await _r(e.file,e);let{rowStart:t=0,rowEnd:n,columns:r,onChunk:i,onComplete:a,rowFormat:o,filter:s,filterStrict:c=!0}=e;if(s&&o!==`object`)throw Error(`parquet filter requires rowFormat: \"object\"`);let l=Or(s);if(l.length){let t=yr(e.metadata).children.map(e=>e.element.name),n=l.filter(e=>!t.includes(e));if(n.length)throw Error(`parquet filter columns not found: ${n.join(`, `)}`)}let u=r,d=!1;if(r&&s){let e=l.filter(e=>!r.includes(e));e.length&&(u=[...r,...e],d=!0)}let f=Pi(u===r?e:{...e,columns:u});if(!a&&!i){for(let{asyncColumns:e}of f)for(let{data:t}of e)await t;return}let p=yr(e.metadata),m=f.map(t=>Mi(t,p,e.parsers));if(i)for(let e of m)for(let t of e.asyncColumns)t.data.then(({data:n,skipped:r})=>{let a=e.groupStart+r;for(let e of n)i({columnName:t.pathInSchema[0],columnData:e,rowStart:a,rowEnd:a+e.length}),a+=e.length});if(a){let e=[];for(let i of m){let a=Math.max(t-i.groupStart,0),f=Math.min((n??1/0)-i.groupStart,i.groupRows),p=o===`object`?await ji(i,a,f,u,`object`):await ji(i,a,f,r,`array`);if(s){for(let t of p)if(kr(t,s,c)){if(d&&r)for(let e of l)r.includes(e)||delete t[e];e.push(t)}}else Er(e,p)}a(e)}else for(let{asyncColumns:e}of m)for(let{data:t}of e)await t}function Pi(e){if(!e.metadata)throw Error(`parquet requires metadata`);let t=Mr(e);return e.file=Nr(e.file,t),t.groups.map(n=>Ai(e,t,n))}var Fi=ArrayBuffer,K=Uint8Array,Ii=Uint16Array,Li=Int16Array,Ri=Int32Array,zi=function(e,t,n){if(K.prototype.slice)return K.prototype.slice.call(e,t,n);(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length);var r=new K(n-t);return r.set(e.subarray(t,n)),r},Bi=function(e,t,n,r){if(K.prototype.fill)return K.prototype.fill.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;++n)e[n]=t;return e},Vi=function(e,t,n,r){if(K.prototype.copyWithin)return K.prototype.copyWithin.call(e,t,n,r);for((n==null||n<0)&&(n=0),(r==null||r>e.length)&&(r=e.length);n<r;)e[t++]=e[n++]},Hi=[`invalid zstd data`,`window size too large (>2046MB)`,`invalid block type`,`FSE accuracy too high`,`match distance too far back`,`unexpected EOF`],q=function(e,t,n){var r=Error(t||Hi[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,q),!n)throw r;return r},Ui=function(e,t,n){for(var r=0,i=0;r<n;++r)i|=e[t++]<<(r<<3);return i},Wi=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Gi=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],i=r>>5&1,a=r>>2&1,o=r&3,s=r>>6;r&8&&q(0);var c=6-i,l=o==3?4:o,u=Ui(e,c,l);c+=l;var d=s?1<<s:i,f=Ui(e,c,d)+(s==1&&256),p=f;if(!i){var m=1<<10+(e[5]>>3);p=m+(m>>3)*(e[5]&7)}p>2145386496&&q(1);var h=new K((t==1?f||p:t?0:p)+12);return h[0]=1,h[4]=4,h[8]=8,{b:c+d,y:0,l:0,d:u,w:t&&t!=1?t:h.subarray(12),e:p,o:new Ri(h.buffer,0,3),u:f,c:a,m:Math.min(131072,p)}}else if((n>>4|e[3]<<20)==25481893)return Wi(e,4)+8;q(0)},Ki=function(e){for(var t=0;1<<t<=e;++t);return t-1},qi=function(e,t,n){var r=(t<<3)+4,i=(e[t]&15)+5;i>n&&q(3);for(var a=1<<i,o=a,s=-1,c=-1,l=-1,u=a,d=new Fi(512+(a<<2)),f=new Li(d,0,256),p=new Ii(d,0,256),m=new Ii(d,512,a),h=512+(a<<1),g=new K(d,h,a),_=new K(d,h+a);s<255&&o>0;){var v=Ki(o+1),y=r>>3,b=(1<<v+1)-1,x=(e[y]|e[y+1]<<8|e[y+2]<<16)>>(r&7)&b,S=(1<<v)-1,C=b-o-1,w=x&S;if(w<C?(r+=v,x=w):(r+=v+1,x>S&&(x-=C)),f[++s]=--x,x==-1?(o+=x,g[--u]=s):o-=x,!x)do{var T=r>>3;c=(e[T]|e[T+1]<<8)>>(r&7)&3,r+=2,s+=c}while(c==3)}(s>255||o)&&q(0);for(var E=0,D=(a>>1)+(a>>3)+3,O=a-1,k=0;k<=s;++k){var A=f[k];if(A<1){p[k]=-A;continue}for(l=0;l<A;++l){g[E]=k;do E=E+D&O;while(E>=u)}}for(E&&q(0),l=0;l<a;++l){var j=p[g[l]]++;m[l]=(j<<(_[l]=i-Ki(j)))-a}return[r+7>>3,{b:i,s:g,n:_,t:m}]},Ji=function(e,t){var n=0,r=-1,i=new K(292),a=e[t],o=i.subarray(0,256),s=i.subarray(256,268),c=new Ii(i.buffer,268);if(a<128){var l=qi(e,t+1,6),u=l[0],d=l[1];t+=a;var f=u<<3,p=e[t];p||q(0);for(var m=0,h=0,g=d.b,_=g,v=(++t<<3)-8+Ki(p);v-=g,!(v<f);){var y=v>>3;if(m+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<g)-1,o[++r]=d.s[m],v-=_,v<f)break;y=v>>3,h+=(e[y]|e[y+1]<<8)>>(v&7)&(1<<_)-1,o[++r]=d.s[h],g=d.n[m],m=d.t[m],_=d.n[h],h=d.t[h]}++r>255&&q(0)}else{for(r=a-127;n<r;n+=2){var b=e[++t];o[n]=b>>4,o[n+1]=b&15}++t}var x=0;for(n=0;n<r;++n){var S=o[n];S>11&&q(0),x+=S&&1<<S-1}var C=Ki(x)+1,w=1<<C,T=w-x;for(T&T-1&&q(0),o[r++]=Ki(T)+1,n=0;n<r;++n){var S=o[n];++s[o[n]=S&&C+1-S]}var E=new K(w<<1),D=E.subarray(0,w),O=E.subarray(w);for(c[C]=0,n=C;n>0;--n){var k=c[n];Bi(O,n,k,c[n-1]=k+s[n]*(1<<C-n))}for(c[0]!=w&&q(0),n=0;n<r;++n){var A=o[n];if(A){var j=c[A];Bi(D,n,j,c[A]=j+(1<<C-A))}}return[t,{n:O,b:C,s:D}]},Yi=qi(new K([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Xi=qi(new K([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Zi=qi(new K([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],Qi=function(e,t){for(var n=e.length,r=new Ri(n),i=0;i<n;++i)r[i]=t,t+=1<<e[i];return r},$i=new K(new Ri([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),ea=Qi($i,0),ta=new K(new Ri([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),na=Qi(ta,3),ra=function(e,t,n){var r=e.length,i=t.length,a=e[r-1],o=(1<<n.b)-1,s=-n.b;a||q(0);for(var c=0,l=n.b,u=(r<<3)-8+Ki(a)-l,d=-1;u>s&&d<i;){var f=u>>3,p=(e[f]|e[f+1]<<8|e[f+2]<<16)>>(u&7);c=(c<<l|p)&o,t[++d]=n.s[c],u-=l=n.n[c]}(u!=s||d+1!=i)&&q(0)},ia=function(e,t,n){var r=6,i=t.length+3>>2,a=i<<1,o=i+a;ra(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,i),n),ra(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(i,a),n),ra(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(a,o),n),ra(e.subarray(r),t.subarray(o),n)},aa=function(e,t,n){var r,i=t.b,a=e[i],o=a>>1&3;t.l=a&1;var s=a>>3|e[i+1]<<5|e[i+2]<<13,c=(i+=3)+s;if(o==1)return i>=e.length?void 0:(t.b=i+1,n?(Bi(n,e[i],t.y,t.y+=s),n):Bi(new K(s),e[i]));if(!(c>e.length)){if(o==0)return t.b=c,n?(n.set(e.subarray(i,c),t.y),t.y+=s,n):zi(e,i,c);if(o==2){var l=e[i],u=l&3,d=l>>2&3,f=l>>4,p=0,m=0;u<2?d&1?f|=e[++i]<<4|(d&2&&e[++i]<<12):f=l>>3:(m=d,d<2?(f|=(e[++i]&63)<<4,p=e[i]>>6|e[++i]<<2):d==2?(f|=e[++i]<<4|(e[++i]&3)<<12,p=e[i]>>2|e[++i]<<6):(f|=e[++i]<<4|(e[++i]&63)<<12,p=e[i]>>6|e[++i]<<2|e[++i]<<10)),++i;var h=n?n.subarray(t.y,t.y+t.m):new K(t.m),g=h.length-f;if(u==0)h.set(e.subarray(i,i+=f),g);else if(u==1)Bi(h,e[i++],g);else{var _=t.h;if(u==2){var v=Ji(e,i);p+=i-(i=v[0]),t.h=_=v[1]}else _||q(0);(m?ia:ra)(e.subarray(i,i+=p),h.subarray(g),_)}var y=e[i++];if(y){y==255?y=(e[i++]|e[i++]<<8)+32512:y>127&&(y=y-128<<8|e[i++]);var b=e[i++];b&3&&q(0);for(var x=[Xi,Zi,Yi],S=2;S>-1;--S){var C=b>>(S<<1)+2&3;if(C==1){var w=new K([0,0,e[i++]]);x[S]={s:w.subarray(2,3),n:w.subarray(0,1),t:new Ii(w.buffer,0,1),b:0}}else C==2?(r=qi(e,i,9-(S&1)),i=r[0],x[S]=r[1]):C==3&&(t.t||q(0),x[S]=t.t[S])}var T=t.t=x,E=T[0],D=T[1],O=T[2],k=e[c-1];k||q(0);var A=(c<<3)-8+Ki(k)-O.b,j=A>>3,M=0,ee=(e[j]|e[j+1]<<8)>>(A&7)&(1<<O.b)-1;j=(A-=D.b)>>3;var N=(e[j]|e[j+1]<<8)>>(A&7)&(1<<D.b)-1;j=(A-=E.b)>>3;var P=(e[j]|e[j+1]<<8)>>(A&7)&(1<<E.b)-1;for(++y;--y;){var F=O.s[ee],te=O.n[ee],ne=E.s[P],re=E.n[P],ie=D.s[N],I=D.n[N];j=(A-=ie)>>3;var ae=1<<ie,L=ae+((e[j]|e[j+1]<<8|e[j+2]<<16|e[j+3]<<24)>>>(A&7)&ae-1);j=(A-=ta[ne])>>3;var oe=na[ne]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<ta[ne])-1);j=(A-=$i[F])>>3;var se=ea[F]+((e[j]|e[j+1]<<8|e[j+2]<<16)>>(A&7)&(1<<$i[F])-1);if(j=(A-=te)>>3,ee=O.t[ee]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<te)-1),j=(A-=re)>>3,P=E.t[P]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<re)-1),j=(A-=I)>>3,N=D.t[N]+((e[j]|e[j+1]<<8)>>(A&7)&(1<<I)-1),L>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=L-=3;else{var ce=L-(se!=0);ce?(L=ce==3?t.o[0]-1:t.o[ce],ce>1&&(t.o[2]=t.o[1]),t.o[1]=t.o[0],t.o[0]=L):L=t.o[0]}for(var S=0;S<se;++S)h[M+S]=h[g+S];M+=se,g+=se;var le=M-L;if(le<0){var ue=-le,de=t.e+le;ue>oe&&(ue=oe);for(var S=0;S<ue;++S)h[M+S]=t.w[de+S];M+=ue,oe-=ue,le=0}for(var S=0;S<oe;++S)h[M+S]=h[le+S];M+=oe}if(M!=g)for(;g<h.length;)h[M++]=h[g++];else M=h.length;n?t.y+=M:h=zi(h,0,M)}else if(n){if(t.y+=f,g)for(var S=0;S<f;++S)h[S]=h[g+S]}else g&&(h=zi(h,g));return t.b=c,h}q(2)}},oa=function(e,t){if(e.length==1)return e[0];for(var n=new K(t),r=0,i=0;r<e.length;++r){var a=e[r];n.set(a,i),i+=a.length}return n};function sa(e,t){for(var n=[],r=+!t,i=0,a=0;e.length;){var o=Gi(e,r||t);if(typeof o==`object`){for(r?(t=null,o.w.length==o.u&&(n.push(t=o.w),a+=o.u)):(n.push(t),o.e=0);!o.l;){var s=aa(e,o,t);s||q(5),t?o.e=o.y:(n.push(s),a+=s.length,Vi(o.w,0,s.length),o.w.set(s,o.w.length-s.length))}i=o.b+o.c*4}else i=o;e=e.subarray(i)}return oa(n,a)}function ca(){let e=la();return(t,n)=>{let{memory:r,uncompress:i}=e.exports,a=68e3,o=a+t.byteLength,s=a+t.byteLength+n;if(r.buffer.byteLength<s){let e=64*1024,t=r.buffer.byteLength/e,n=Math.ceil(s/e)-t;r.grow(n)}let c=new Uint8Array(r.buffer);c.set(t,a);let l=i(a,t.byteLength,o);if(l===-1)throw Error(`invalid snappy length header`);if(l===-2)throw Error(`missing eof marker`);if(l===-3)throw Error(`premature end of input`);if(l)throw Error(`failed to uncompress data ${l}`);return c.slice(o,o+n)}}function la(){let e=atob(ua),t=new Uint8Array(e.length);for(let n=0;n<e.length;n+=1)t[n]=e.charCodeAt(n);let n=new WebAssembly.Module(t);return new WebAssembly.Instance(n)}const ua=`AGFzbQEAAAABEANgAABgA39/fwF/YAF/AX8DBgUAAQEBAgUDAQACBj8KfwFBoIwEC38AQYAIC38AQaAMC38AQaAMC38AQaCMBAt/AEGACAt/AEGgjAQLfwBBgIAIC38AQQALfwBBAQsHwQEOBm1lbW9yeQIAEV9fd2FzbV9jYWxsX2N0b3JzAAAGbWVtY3B5AAEHbWVtbW92ZQACCnVuY29tcHJlc3MAAwxfX2Rzb19oYW5kbGUDAQpfX2RhdGFfZW5kAwILX19zdGFja19sb3cDAwxfX3N0YWNrX2hpZ2gDBA1fX2dsb2JhbF9iYXNlAwULX19oZWFwX2Jhc2UDBgpfX2hlYXBfZW5kAwcNX19tZW1vcnlfYmFzZQMIDF9fdGFibGVfYmFzZQMJCuASBQIAC8sBAQN/AkAgAkUNAAJAAkAgAkEHcSIDDQAgACEEIAIhBQwBCyAAIQQgAiEFA0AgBCABLQAAOgAAIARBAWohBCABQQFqIQEgBUF/aiEFIANBf2oiAw0ACwsgAkEISQ0AA0AgBCABLQAAOgAAIAQgAS0AAToAASAEIAEtAAI6AAIgBCABLQADOgADIAQgAS0ABDoABCAEIAEtAAU6AAUgBCABLQAGOgAGIAQgAS0ABzoAByAEQQhqIQQgAUEIaiEBIAVBeGoiBQ0ACwsgAAugAwEEfwJAIAAgAUYNAAJAAkAgACABSQ0AIAEgAmoiAyAASw0BCyACRQ0BAkACQCACQQdxIgMNACAAIQQgAiEFDAELIAAhBCACIQUDQCAEIAEtAAA6AAAgBEEBaiEEIAFBAWohASAFQX9qIQUgA0F/aiIDDQALCyACQQhJDQEDQCAEIAEtAAA6AAAgBCABLQABOgABIAQgAS0AAjoAAiAEIAEtAAM6AAMgBCABLQAEOgAEIAQgAS0ABToABSAEIAEtAAY6AAYgBCABLQAHOgAHIARBCGohBCABQQhqIQEgBUF4aiIFDQAMAgsLIAJFDQACQAJAIAJBA3EiBA0AIAAgAmohBiACIQUMAQsgAiEFA0AgBUF/aiIFIABqIgYgBSABaiIDLQAAOgAAIARBf2oiBA0ACwsgAkEESQ0AIAZBfGohASADQXxqIQQDQCABQQNqIARBA2otAAA6AAAgAUECaiAEQQJqLQAAOgAAIAFBAWogBEEBai0AADoAACABIAQtAAA6AAAgAUF8aiEBIARBfGohBCAFQXxqIgUNAAsLIAALswoBCX8jgICAgABBIGsiAySAgICAACADQQlqQgA3AAAgA0IANwIEIAMgA0EYajYCAEF/IQQCQCABRQ0AIAMgAUF/aiIFNgIcIAMgAEEBajYCGCAALAAAIgZB/wBxIQcCQCAGQX9KDQAgBUUNASADIAFBfmoiBTYCHCADIABBAmo2AhggACwAASIGQf8AcUEHdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfWoiBTYCHCADIABBA2o2AhggACwAAiIGQf8AcUEOdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBfGoiBTYCHCADIABBBGo2AhggACwAAyIGQf8AcUEVdCAHciEHQX8hBCAGQX9KDQAgBUUNASADIAFBe2o2AhwgAyAAQQVqNgIYIAAsAAQiAUEASA0BIAFBHHQgB3IhBwsgAiAHaiEIAkACQCADEISAgIAADQAgAiEADAELIAMoAgQhASACIQADQAJAIAMoAgggAWtBBEoNACADIAE2AgQgAxCEgICAAEUNAiADKAIEIQELIAFBAWohBQJAAkAgAS0AACIGQQNxDQAgCCAAayEJIAMoAggiCiAFayEEIAZBAnYiC0EBaiEHAkAgBkE/Sw0AIARBEEkNACAJQRBIDQAgACABKAIBNgIAIAAgASgCBTYCBCAAIAEoAgk2AgggACABKAINNgIMIAAgB2ohACADKAIIIAUgB2oiAWtBBEoNAyADIAE2AgQgAxCEgICAAEUNBAwCCwJAAkAgBkHwAU8NACAFIQYMAQsgCiAFIAtBRWoiAWoiBmshBCABQQJ0QYCIgIAAaigCACAFKAIAcUEBaiEHCwJAIAcgBE0NAANAIAggAGsgBEkNBSAAIAYgBBCBgICAACEAIAMoAgAiASABKAIAIgkgAygCDCIFaiIGNgIAIAFBBGoiASABKAIAIgogBWsiATYCACADIAE2AgwgACAEaiEAIAFFDQUgAyAJIApqNgIIIAcgBGshByABIQQgByABSw0ACyAIIABrIQkLIAkgB0kNAyAAIAYgBxCBgICAACAHaiEAIAMoAgggBiAHaiIBa0EESg0CIAMgATYCBCADEISAgIAADQEMAwsgACACayAGQQF0QaCIgIAAai8BACIBQQt2IgpBAnRBgIiAgABq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`,da=4096;2*da+32;const fa=2*da-1,pa=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);function J(e){this.buf_=new Uint8Array(8224),this.input_=e,this.buf_ptr_=0,this.val_=0,this.pos_=0,this.reset()}J.READ_SIZE=da,J.IBUF_MASK=fa,J.prototype.reset=function(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(let e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,this.pos_++;return this.bit_end_pos_>0},J.prototype.readMoreInput=function(){if(!(this.bit_end_pos_>256))if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw Error(`Unexpected end of input `+this.bit_pos_+` `+this.bit_end_pos_)}else{let e=this.buf_ptr_,t=this.input_.read(this.buf_,e,da);if(t<0)throw Error(`Unexpected end of input`);if(t<da){this.eos_=1;for(let n=0;n<32;n++)this.buf_[e+t+n]=0}if(e===0){for(let e=0;e<32;e++)this.buf_[(da<<1)+e]=this.buf_[e];this.buf_ptr_=da}else this.buf_ptr_=0;this.bit_end_pos_+=t<<3}},J.prototype.fillBitWindow=function(){for(;this.bit_pos_>=8;)this.val_>>>=8,this.val_|=this.buf_[this.pos_&fa]<<24,this.pos_++,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0},J.prototype.readBits=function(e){32-this.bit_pos_<e&&this.fillBitWindow();let t=this.val_>>>this.bit_pos_&pa[e];return this.bit_pos_+=e,t};const ma=new Uint8Array([1,2,3,4,0,5,17,6,16,7,8,9,10,11,12,13,14,15]),ha=new Uint16Array([256,402,436,468,500,534,566,598,630,662,694,726,758,790,822,854,886,920,952,984,1016,1048,1080]);function Y(e,t){this.bits=e,this.value=t}function ga(e,t){let n=1<<t-1;for(;e&n;)n>>=1;return(e&n-1)+n}function _a(e,t,n,r,i){do r-=n,e[t+r]=new Y(i.bits,i.value);while(r>0)}function va(e,t,n){let r=1<<t-n;for(;t<15&&(r-=e[t],!(r<=0));)++t,r<<=1;return t-n}function ya(e,t,n,r,i){let a=t,o=new Int32Array(16),s=new Int32Array(16),c=new Int32Array(i);for(let e=0;e<i;e++)o[r[e]]++;s[1]=0;for(let e=1;e<15;e++)s[e+1]=s[e]+o[e];for(let e=0;e<i;e++)r[e]!==0&&(c[s[r[e]]++]=e);let l=n,u=1<<l,d=u;if(s[15]===1){for(let n=0;n<d;++n)e[t+n]=new Y(0,c[0]&65535);return d}let f=0,p=0;for(let r=1,i=2;r<=n;++r,i<<=1)for(;o[r]>0;--o[r]){let n=new Y(r&255,c[p++]&65535);_a(e,t+f,i,u,n),f=ga(f,r)}let m=d-1,h=-1;for(let r=n+1,i=2;r<=15;++r,i<<=1)for(;o[r]>0;--o[r]){(f&m)!==h&&(t+=u,l=va(o,r,n),u=1<<l,d+=u,h=f&m,e[a+h]=new Y(l+n&255,t-a-h&65535));let s=new Y(r-n&255,c[p++]&65535);_a(e,t+(f>>n),i,u,s),f=ga(f,r)}return d}function ba(e,t,n,r){let i=new Uint8Array(e);r.readMoreInput();let a=r.readBits(2);if(a===1){let t=e-1,n=0,a=new Int32Array(4),o=r.readBits(2)+1;for(;t;)t>>=1,n++;for(let t=0;t<o;t++)a[t]=r.readBits(n)%e,i[a[t]]=2;switch(i[a[0]]=1,o){case 1:break;case 3:if(a[0]===a[1]||a[0]===a[2]||a[1]===a[2])throw Error(`[ReadHuffmanCode] invalid symbols`);break;case 2:if(a[0]===a[1])throw Error(`[ReadHuffmanCode] invalid symbols`);i[a[1]]=1;break;case 4:if(a[0]===a[1]||a[0]===a[2]||a[0]===a[3]||a[1]===a[2]||a[1]===a[3]||a[2]===a[3])throw Error(`[ReadHuffmanCode] invalid symbols`);r.readBits(1)?(i[a[2]]=3,i[a[3]]=3):i[a[0]]=2;break}}else{let t=new Uint8Array(18),n=32,o=0,s=[new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,1),new Y(2,0),new Y(2,4),new Y(2,3),new Y(3,2),new Y(2,0),new Y(2,4),new Y(2,3),new Y(4,5)];for(let e=a;e<18&&n>0;e++){let i=ma[e],a=0;r.fillBitWindow(),a+=r.val_>>>r.bit_pos_&15,r.bit_pos_+=s[a].bits;let c=s[a].value;t[i]=c,c!==0&&(n-=32>>c,o++)}if(!(o===1||n===0))throw Error(`[ReadHuffmanCode] invalid num_codes or space`);Sa(t,e,i,r)}let o=ya(t,n,8,i,e);if(!o)throw Error(`brotli BuildHuffmanTable failed`);return o}function xa(e,t,n){n.fillBitWindow(),t+=n.val_>>>n.bit_pos_&255;let r=e[t].bits-8;return r>0&&(n.bit_pos_+=8,t+=e[t].value,t+=n.val_>>>n.bit_pos_&(1<<r)-1),n.bit_pos_+=e[t].bits,e[t].value}function Sa(e,t,n,r){let i=0,a=8,o=0,s=0,c=32768,l=[];for(let e=0;e<32;e++)l.push(new Y(0,0));for(ya(l,0,5,e,18);i<t&&c>0;){let e=0;r.readMoreInput(),r.fillBitWindow(),e+=r.val_>>>r.bit_pos_&31,r.bit_pos_+=l[e].bits;let u=l[e].value&255;if(u<16)o=0,n[i++]=u,u!==0&&(a=u,c-=32768>>u);else{let e=u-14,l=0;u===16&&(l=a),s!==l&&(o=0,s=l);let d=o;o>0&&(o-=2,o<<=e),o+=r.readBits(e)+3;let f=o-d;if(i+f>t)throw Error(`[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols`);for(let e=0;e<f;e++)n[i+e]=s;i+=f,s!==0&&(c-=f<<15-s)}}if(c!==0)throw Error(`[ReadHuffmanCodeLengths] space = `+c);for(;i<t;i++)n[i]=0}function Ca(e,t){this.alphabet_size=e,this.num_htrees=t,this.codes=Array(t+t*ha[e+31>>>5]),this.htrees=new Uint32Array(t)}Ca.prototype.decode=function(e){let t=0;for(let n=0;n<this.num_htrees;n++)this.htrees[n]=t,t+=ba(this.alphabet_size,this.codes,t,e)};function wa([e,t]){return{offset:e,nbits:t}}const Ta=[[1,2],[5,2],[9,2],[13,2],[17,3],[25,3],[33,3],[41,3],[49,4],[65,4],[81,4],[97,4],[113,5],[145,5],[177,5],[209,5],[241,6],[305,6],[369,7],[497,8],[753,9],[1265,10],[2289,11],[4337,12],[8433,13],[16625,24]].map(wa),Ea=[[0,0],[1,0],[2,0],[3,0],[4,0],[5,0],[6,1],[8,1],[10,2],[14,2],[18,3],[26,3],[34,4],[50,4],[66,5],[98,5],[130,6],[194,7],[322,8],[578,9],[1090,10],[2114,12],[6210,14],[22594,24]].map(wa),Da=[[2,0],[3,0],[4,0],[5,0],[6,0],[7,0],[8,0],[9,0],[10,1],[12,1],[14,2],[18,2],[22,3],[30,3],[38,4],[54,4],[70,5],[102,5],[134,6],[198,7],[326,8],[582,9],[1094,10],[2118,24]].map(wa),Oa=[0,0,8,8,0,16,8,16,16],ka=[0,8,0,8,16,0,16,8,16],X=1080,Aa=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),ja=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);function Ma(e,t){let n=new Uint16Array(31);for(let r=0;r<31;r++)n[r]=t+=1<<e[r-1];let r=new Int32Array(n[30]);for(let e=1;e<30;e++)for(let t=n[e];t<n[e+1];++t)r[t]=t-n[e]<<5|e;return{base:n,rev:r}}const{base:Na,rev:Pa}=Ma(Aa,2);Na[28]=258,Pa[258]=28;const{base:Fa}=Ma(ja,0),Ia=new Uint16Array(32768);for(let e=0;e<32768;e++){let t=(e&43690)>>1|(e&21845)<<1;t=(t&52428)>>2|(t&13107)<<2,t=(t&61680)>>4|(t&3855)<<4,Ia[e]=((t&65280)>>8|(t&255)<<8)>>1}function La(e,t,n){let r=new Uint16Array(t);for(let t=0;t<e.length;t++)e[t]&&++r[e[t]-1];let i=new Uint16Array(t);for(let e=1;e<t;e++)i[e]=i[e-1]+r[e-1]<<1;let a;if(n){a=new Uint16Array(1<<t);let n=15-t;for(let r=0;r<e.length;r++)if(e[r]){let o=r<<4|e[r],s=t-e[r],c=i[e[r]-1]++<<s;for(let e=c|(1<<s)-1;c<=e;c++)a[Ia[c]>>n]=o}}else{a=new Uint16Array(e.length);for(let t=0;t<e.length;t++)e[t]&&(a[t]=Ia[i[e[t]-1]++]>>15-e[t])}return a}const Ra=new Uint8Array(288);for(let e=0;e<144;e++)Ra[e]=8;for(let e=144;e<256;e++)Ra[e]=9;for(let e=256;e<280;e++)Ra[e]=7;for(let e=280;e<288;e++)Ra[e]=8;const za=new Uint8Array(32);for(let e=0;e<32;e++)za[e]=5;const Ba=La(Ra,9,1),Va=La(za,5,1);function Ha(e,t,n,r,i,a,o){let s=n*2,c=n,l=xa(t,n*X,o),u;u=l===0?i[s+(a[c]&1)]:l===1?i[s+(a[c]-1&1)]+1:l-2,u>=e&&(u-=e),r[n]=u,i[s+(a[c]&1)]=u,a[c]++}function Ua(e){let t={meta_block_length:0,input_end:0,is_uncompressed:0,is_metadata:!1};if(t.input_end=e.readBits(1),t.input_end&&e.readBits(1))return t;let n=e.readBits(2)+4;if(n===7){if(t.is_metadata=!0,e.readBits(1)!==0)throw Error(`Invalid reserved bit`);let n=e.readBits(2);if(n===0)return t;for(let r=0;r<n;r++){let i=e.readBits(8);if(r+1===n&&n>1&&i===0)throw Error(`Invalid size byte`);t.meta_block_length|=i<<r*8}}else for(let r=0;r<n;r++){let i=e.readBits(4);if(r+1===n&&n>4&&i===0)throw Error(`Invalid size nibble`);t.meta_block_length|=i<<r*4}return t.meta_block_length++,!t.input_end&&!t.is_metadata&&(t.is_uncompressed=e.readBits(1)),t}function Wa(e,t,n,r,i,a){let o=i+1,s=n&i,c=a.pos_&J.IBUF_MASK;if(t<8||a.bit_pos_+(t<<3)<a.bit_end_pos_){for(;t-- >0;)a.readMoreInput(),r[s++]=a.readBits(8),s===o&&(e.write(r,o),s=0);return}if(a.bit_end_pos_<32)throw Error(`copyUncompressedBlockToOutput: br.bit_end_pos_ < 32`);for(;a.bit_pos_<32;)r[s]=a.val_>>>a.bit_pos_,a.bit_pos_+=8,s++,t--;let l=a.bit_end_pos_-a.bit_pos_>>3;if(c+l>J.IBUF_MASK){let e=J.IBUF_MASK+1-c;for(let t=0;t<e;t++)r[s+t]=a.buf_[c+t];l-=e,s+=e,t-=e,c=0}for(let e=0;e<l;e++)r[s+e]=a.buf_[c+e];if(s+=l,t-=l,s>=o){e.write(r,o),s-=o;for(let e=0;e<s;e++)r[e]=r[o+e]}for(;s+t>=o;){if(l=o-s,a.input_.read(r,s,l)<l)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);e.write(r,o),t-=l,s=0}if(a.input_.read(r,s,t)<t)throw Error(`copyUncompressedBlockToOutput: not enough bytes`);a.reset()}function Ga(e){if(e.readBits(1)){let t=e.readBits(3);return t===0?1:e.readBits(t)+(1<<t)}return 0}function Ka(e){if(e.readBits(1)===0)return 16;let t=e.readBits(3);return t>0?17+t:(t=e.readBits(3),t>0?8+t:17)}function qa(e){let t=e.bit_pos_+7&-8;return!e.readBits(t-e.bit_pos_)}function Ja(e,t,n){let{offset:r,nbits:i}=Ta[xa(e,t,n)];return r+n.readBits(i)}const Ya=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Xa=new Uint16Array([1024,1536,1280,1536,0,256,768,512]);function Za(e,t){let n=0;t.readMoreInput();let r=Ga(t)+1,i=new Uint8Array(e);if(r<=1)return[r,i];t.readBits(1)&&(n=t.readBits(4)+1);let a=[];for(let e=0;e<X;e++)a[e]=new Y(0,0);ba(r+n,a,0,t);for(let r=0;r<e;){t.readMoreInput();let o=xa(a,0,t);if(o===0)i[r]=0,r++;else if(o<=n){let n=1+(1<<o)+t.readBits(o);for(;--n;){if(r>=e)throw Error(`[DecodeContextMap] i >= context_map_size`);i[r]=0,r++}}else i[r]=o-n,r++}return t.readBits(1)&&$a(i,e),[r,i]}function Qa(e,t){let n=e[t];for(let n=t;n;n--)e[n]=e[n-1];e[0]=n}function $a(e,t){let n=new Uint8Array(256);for(let e=0;e<256;e++)n[e]=e;for(let r=0;r<t;r++){let t=e[r];e[r]=n[t],t&&Qa(n,t)}}function eo(e){this.buffer=e,this.pos=0}eo.prototype.read=function(e,t,n){this.pos+n>this.buffer.length&&(n=this.buffer.length-this.pos);for(let r=0;r<n;r++)e[t+r]=this.buffer[this.pos+r];return this.pos+=n,n};function to(e){this.buffer=e,this.pos=0}to.prototype.write=function(e,t){if(this.pos+t>this.buffer.length)throw Error(`brotli output buffer is not large enough`);return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t};const no=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);function Z(e,t,n){let r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n}function ro(e,t){let n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)}function io(e){return(e+7)/8|0}function ao(e,t){if(e[t++]!==31||e[t++]!==139||e[t++]!==8)return 0;let n=e[t++];t+=6,n&4&&(t+=(e[t+10]|e[t+11]<<8)+2);for(let r=(n>>3&1)+(n>>4&1);r>0;r-=Number(!e[t++]));return t+(n&2)}function oo(e,t,n=0,r=0){let i=t??new Uint8Array(1024);if(!(e.length-n))return i;let a=ao(e,n);if(a===e.length-8)return i;if(a>e.length-8)throw Error(`unexpected EOF`);let o=a*8,s=0,c=0,l=0,u,d,f=e.length*8;function p(e){if(!t&&e>i.length){let t=i;i=new Uint8Array(Math.max(t.length*2,e)),i.set(t)}}do{if(!u){s=Z(e,o,1);let t=Z(e,o+1,3);if(o+=3,!t){let t=io(o)+4,n=e[t-4]|e[t-3]<<8,a=t+n;if(a>e.length)throw Error(`unexpected EOF`);p(r+n),i.set(e.subarray(t,a),r),r+=n,o=a*8;continue}else if(t===1)u=Ba,d=Va,c=9,l=5;else if(t===2){let t=Z(e,o,31)+257,n=Z(e,o+10,15)+4,r=t+Z(e,o+5,31)+1;o+=14;let i=new Uint8Array(r),a=new Uint8Array(19);for(let t=0;t<n;++t)a[no[t]]=Z(e,o+t*3,7);o+=n*3;let s=Math.max(...a),f=(1<<s)-1,p=La(a,s,1);for(let t=0;t<r;){let n=p[Z(e,o,f)];o+=n&15;let r=n>>4;if(r<16)i[t++]=r;else{let n=0,a=0;for(r===16?(a=3+Z(e,o,3),o+=2,n=i[t-1]):r===17?(a=3+Z(e,o,7),o+=3):r===18&&(a=11+Z(e,o,127),o+=7);a--;)i[t++]=n}}let m=i.subarray(0,t),h=i.subarray(t);c=Math.max(...m),l=Math.max(...h),u=La(m,c,1),d=La(h,l,1)}else throw Error(`invalid block type`);if(o>f)throw Error(`unexpected EOF`)}p(r+131072);let t=(1<<c)-1,n=(1<<l)-1,a=o;for(;;a=o){let s=u[ro(e,o)&t],c=s>>4;if(o+=s&15,o>f)throw Error(`unexpected EOF`);if(!s)throw Error(`invalid length/literal`);if(c<256)i[r++]=c;else if(c===256){a=o,u=void 0;break}else{let t=c-254;if(c>264){let n=c-257,r=Aa[n];t=Z(e,o,(1<<r)-1)+Na[n],o+=r}if(!d)throw Error(`invalid distance map`);let a=d[ro(e,o)&n],s=a>>4;if(!a)throw Error(`invalid distance`);o+=a&15;let l=Fa[s];if(s>3){let t=ja[s];l+=ro(e,o)&(1<<t)-1,o+=t}if(o>f)throw Error(`unexpected EOF`);let u=r+t;if(r<l)throw Error(`unexpected dictionary case`);for(p(u);r<u;r++)i[r]=i[r-l]}}o=a,u&&(s=1)}while(!s);if(r<i.length){let t=Math.ceil(o/8)+8;oo(e,i,t,r)}return t?i:i.subarray(0,r)}let so;function co(){if(!so){so=new Uint8Array(122784);let e=atob(`\n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\nXH/9kw/e+uTa937x6JlPn7j+86ee/PnpG7e/+yefvfzM7ddetBc/+977t3/83mcf/PknV4/fPvfq7e+/\n+cm7P/z0/F/84uwzn7154uc/PvHp69//9I9/+Ml7P7r9/IXbz57/9Pqf3r7y5GdvX/vs+KlPn/7LT0+9\n8en505+dP/PZ+eufPnP99jtvffripU+vnrz9J+duf/+GtefTZ37wyfU37JVPT7/+6bnXfv79lz678vTt\nv3jV/v25Pc73HsfFP3j59ok3rc0BJ2xs7t08Zz7DAKYbJnK5UgK2jQzJmCC4augYsG4CCZp91RPMCbYW\n8rY2w92psSU9JsJr5eZ15HTJPhdaiJXaqRIg7wbBWKEHHX5adwdhvA2PhJOVkIQAXgHUR5kUgqH6MGbJ\nTde53MIZEy6yqT3ANRAzmtC71THhd+I63zxX1ps3X4Z9ESjZchjwqiFzLkBagm7Pm5oZd/Ona2Dpo0SW\nY7IEIhOZVrcgTg4z9eUeatU7/9w2XQdQNR4xq0vb/pGqKBvnbA8aB2VF1VrreWvMzZdXR+KVEBjpfVg7\nksxeQS+zV7Fw2NR4Ckd5E65GGF/Zc94LlRfsBWghULUSXnoJFac+6hn2H7HmV49EANm8/B5nSxkwvsbN\nMkyBIZCVfSDxXmYmA5BcYsTQZk6SrdK/FWjBJmCS0fODJopqn2RJ7A+85DaKjp9kYWwVBb/Kf1/lu5f5\n1gV+7ImoRK4i5Sf+9vSf+1v4/Bv89zVW7L4W11FV8mv88HNxneNshm76GptxJr5+ultDqWKw2ngJcDTp\nwt++epL1y8/wM+f5+2n+/jN+/QKLo1/li6ejSRejbLnu/njc4kJUDb8Sb1lLXuArF3k7Nen5uJeKlL/B\neurHvan45Ud8imd4R/XYxahQ/gILnD8Vdcpf4/9Oq846r6BOuBL1zk/xuz/gTc/FXX4Q5d7Vkxeyeu0a\nuKeiSDwHzvvZOuqElznHWy95b+MBv8NC7M9HJ5yKe/0gCrefZm+kausvRUed5IfVnu/FTc9Hj6nlN2LQ\n7c+no0r9j+Je34su0gVVEv4Dvqjevsi+0nx4IwZaj6O5eiN69Tg74Q027wxbq68/EQ17HK97XXnNZ81V\njc5TbO25KGN/IZ7iRZ8q3s/n/bnw7ln++2I84Ktxr+Ns/7Woaq9G/jj+1IdP8JG1gk7zxTRbTkfzXmOb\n9ftZbzDa/Awf4Uq057WYWm/GTdXUNzm4vJG3+bjrd6DAF8rHkOwS2fXtM/sDx1I8XB4pRVlMABZWZpOa\nxdJWYHOYWGPJNdhAqt2wVMa7UpTEFuZ1ab60azeufFBXDhBQA7WI7upwvLkCa9I2ZLOugfR5BLtTT44q\nrrIfJV1QIbN0vY2aSGgP/TygkFbNI6AvW9mj2fZbP72r+GiZPfnSZvAsOkVKYkfFRH2jFKjEq0yYmTiG\n0Hxxx9f27RwmtnxCITUIOiiSzbbQUf56SQ3i0aANvs0XyUisySDANxBUWBkio6H8LnU05W3XSXl3b+eL\ngbmnzpsbcm4q4Hmro43KIrtmCPoKidta2BpVp6q3DqURfAjFrEtHgG2VjFiPezGW83SMH1yb7cBV7hFL\n4ulr9rMnYRtV4INf+NWUVfxGwoQx/W8u06DbHzgldokRbF4F5Di5pBSF2qI3C9lNu8vezlIW4KRzgc40\nQ3meprenxOwq+wd99+noXsH/HWHQdtLCT4lx1LQYi84ZKRM9kZ0z1lQoZoh1PRvn8Bx1M0tfPcOoIA7g\nCN6+M60ArzCJFE6fA1A31SwLtUC+OmWgOqGy0ikcxWDndzLpFxJaZSZqj7NlZucB2751bNFdzS1zGcHw\n2JhEYnc18u6SswOYhhx5Twh2txL0A0JhUnqNcGLFOMEKjI3JxmQLo9GgJBez0bM7FqnSxRA2USNePRga\nnXjee9hD7NPAoHUoaLnlKjCujwG+wVjcvIjuok+RLRkpFyoxxW696flEmwf7BaQKDiPSPXDiaCKtro63\nNKwDOGxrpHOBI8nS9sOBo8ycD15LIQEkB2iLxC617sCcerWTmEysIseyVinHvtCtYvRX01zbGkMZBVep\netR+EIvYx4PVbAUY2Ao/nhsJ5yRZqWxBchW7G7tj5UFRXKgShx+sSq2T06BB3HaFueAvp31yZuYueqnF\nKOUJ4XHU8v+QjiE/aeSxnBF4u5u+BhmJ4HMspYyAwkqIGT2AAj6siLZSTQYa89BKqrrOCrS/HEkkxRJf\nC1IEqPqdhA7YPhO6KIuFY3TI6WTZYrBOqe0KIf0Efoq4FrSWmMFnSx2Ltn2mSJCPwGMUhSJofLYV192l\nKp3CRRT9ZP+FZkHVf4js+TFoTciYMlEPrIT5MeCDboZ6FHEhzICWPQZ2wOQ8VjQg4xZfZDiE8QxXbYD6\nZb9wWJGjEh/BTATgEYEJsI9Z2LKJKBsUHZB1w+Mx5klA6caXYm7YbuE41dkU1KaqKOYRTjCWj4cOUce1\n07ueZh5OiHTbEkYoduq1dv0eS9ocgkOsjXuBoxo24KNBaWy8SXgJc6ton+IT/YEdinbIjhZd/wOBXSl+\n1STGCTfkVcAxPcb9iE4EoG91kkJzEBFHMgWDZPszqykPsX5lmPgcpzpHb1VBaWozcp33bHZ6IhtjSbn7\nXQlbHIAn23N6vbGyh2tQPGZ4l7OPW/9D2s3sy7vTd7caxKNxchKZxRyK6KJ4IpvZeAGZ5wFrAdgGBhnX\nimsmAY6byDP0JssJRDigWjKUjRF8G7J3601iZlHce61QIYK5UsUj7B73JUvha/3AYSIOqmTjTII+1wo+\n2rv7B5EYJRiApR4eUuFTYu4oC4QsZ6ARioMRhZ+TygP5sILl2FW2p5vA7hGAcyQpVmsf5hfQKbYPKXvv\nQDJdWfq70OP5n1I2PKDLq5CcdHdXQV/YNLG6lxaSXXJHbcbUrsWiLpYCjrtKZJPALwn82ygajPUWake9\nyWggnV6issEBGyHcvNPFf789EzuW889hq4hR/Qg1hCrtBwCx89GWfc0QzzHwkOT9Vdkn63Yu1kIlDAI5\n6Ag4q3CGMBkIJR5KViSgjMK5rpTN4YpabgQ8UtbbY6GMSxYeg11KqUxBDjDXWCOO9hUCDRuVFI485d0o\neovN1VX3bI9QYquhKChLAEMdNuWS0hnffEU7P09sx6+F5UF1I2w0xPygFylCs62dkwgosU+XkwOSMP8N\nw7ZMkkSGp2ruSntYAtM3ylOOWTdG9FH0SeHZBUoxUmo6YYm3MaBAFIybp9g7q6hT2iKZXOubo0OWIpZ3\ngnUrjY9MTkI7F46GsY6+b3zMbDfrnPVQGikRxSk0sZRZQsatI2O4s2PRgRRHS6HRWMmdFAozv/Z2BJu4\nG1FjV+ix+eU7Z2/iEDR4HYMtP3XHaT9IzIr+g9npEnvsjMNUkRCmnUitXyJ7bZLDpNE6csi8beQqV43O\n35dm2BpAF9w7Z1Jy1BEhDPmDD0pQ4u/GLqqTriGqqOcemmBO9N+Y0sY+PhvzZTahghsVgsCukPIwzRI1\naWFC6whCnoTqKcRyy7OhlCOzIHhflZp4+vktcFoRWEbr5oiDzr3+H3Zvyh/jvk5JeQS23pqLDFB8mZYi\ndla7uu3unH8IXFZbARIqqCZDMVhA1nXlhHP9UihPDNaaow64mnfvybq/z6QB7I2jQ2Rz+8XKJIFpmgQL\n3Y19pzssj5a9td6gHO2BmG+NkjbEvST8eQvrb1RJGyfSXcm6XkENMVqqW8lHhC0gkAHtqz4J5a4iCZil\nEyIKgcawyrDDCdQHj7REDqV0XbUe5poTUxqqUdq0J2hYp333oeSL9+qYOQflOUC9Sy+Y2YFdngZTk7CJ\nrN+nIgz3gcWsCAGS8YIKqBAj0+VEyAuiIbxWd19atSnDu3mfwJyD4STBXb+USCuoPux2DjzNiiOovkdZ\nvrDLcTdobKAnCUtcMVcRiJqeKg0dTPa9K/lZx0DazE9dV8foIOFbKE8AAWZPSgvNVAlCS/jQnNdJ40x0\ncMfMFqtVAs0hGw6Z55QPt7kWGnLJsCxaclVZIJg+JEnD4eAdwIVQAEsroE/L13ZgV+RI2ctCSHvgQhKB\noVClVB4HUrUwC57oprJYq45CP18YJ80f9J9QyECzJGTE8j5UpWdptiJNCe0RFIR3TcyKCsc19TpSFGJG\nMX/k6YX+xz3uZsXkolpfT8BvKBsgHWs7yEMpJrM/WUEBIe4spytvX2ghBarEZDNi58NN0z18x44di151\nhb5Bq26L9Qmf3V/BPQKY0iQMclESog89nYStNMsc8TvMqYdSLMjOEy/S+VCKFUhJkDGFiiW8rQVeYoFg\nlaOsk7hRJWBxwrMTjA3Rn127dkEUbVCsg2WVPEjHDMAep9iKz3YBrLqNPcFOABLXBv3D1YR7yGLUXd1z\nbxX2qYgiLAEcZJRCNWHpBw1Xvah5WFpHqgTqKBJmq3B9SlhGUnpE/ERVQeGRMrOKTQLoPoGWQmFn2zb2\nPaIiYV/ZRHX9O6CPaQMhr4MCE5LB644rr3Snks0YVVhk0vIzWwoSTw4TUzkuLy9nrx0KktIc0lmyn7/q\nap1lX4gBkD/uTlbBYRtK+XlpXQbzj5GxSt8YwnNdB56/aRmZ8IVq81uHVKbcqkGgkQYqK4b1u47qK9Hm\nLi23wA77CsDFV5MPAe4O4khmbbpHD2tki1qU8mHp+ZRh/R+pVNiZmjSusdubyFNCqMdzctY+9uQqWkDf\nlGNEK9Lszmpkq2esdcZjUQdzcj9nE51qf+aHFo5y4AzjVoUiDSO6bTZaLtkUsAtMQV++v59grzNel9hG\nFWejIouhDVSUnSJoBvfVlfUFFHtmEvJOgHGiETTMhGJ0UTxXQMhKT8ldXuXEhuvjyrEktgRowQdQ5I7G\nNXfpaQ435f+KSTHegiITELjr9CEUhRisJRQ6dbDlp8wnFNmdQkRw9K1XWFg8sSpZkJS8zKppz99gpM2v\nqogzoJv9QnXBZNDvPOpzUvbAQYL48eRuD9UwRXx27mHdUBRwGHg1FKzXB6qjxf8KWFwZZklTJ9ZnN52r\n4+CNBjbHtg4AEXnAlhEBP1IR/QcRb/Fwqfq2XwAoe/xgtcIWKbuTg4SfOLaYZZRifTSBIyHcUJQOmCw6\nrZKlQLtzBB8RzAbhuOaKUGMS1wLnfoLKYh9x0UnX8Mb4AhvC430hRSHWq4i3M0EjH6zqydKpEgG4AINM\nOxzkHJNYmdnAe80gI3CVw4WKcTVL2kH7RSBx2AcAHUBvkWsVKx5I4VQrT/6M9pzxEP58KIZysnKPdXAj\nIp/BNikSqXouMjXcqcfaDwivI/Yb91DZr8TQbhJIrbhL+y4QxgIV7t61i9Bp3txLmAUmhgrFXjEbG/Kg\n8FsnVgOhN/fA5tpwzDBqFbqSemcZVbdkwkQUp+y5H9Udb3ohOSz6InY2wN21+osEb04c23kkJHaS90Jr\nrlfaoeX4InvsbqLI91RKryhHUofGZUqWryIIC5vwQMUGRHYUPl4oZj8Ei4HAmTyZEjI1eeBHKmHnYGM2\n2G0pB69RRpFNL4VcwKZC1RTMAWhx8soofk60J9AHgy1HQQqJrLXPiVr2BaTGOcNcDAOAybpR4USWsFNc\niqrEE+JjmRiCQYF1wOLjLFMqwhTeXRkGdN3jrHAxyP/gLrrqcTgW7ml0FZ+TUnwV2AyzHdVtoIaPmdaF\ndoAKPWudrwo3u6vYXW3i/4t3ppjMQgpw4CSBs0QH0jMSC0lVAMVmZBeOUqzAds6RbS3D9Y1ko28P3djZ\nNelroqCj15tlhI+2yvaZwryEUtGmFSHxYYRAI90pQapuwBgjMZKFw7wwRvtjb59rCSegYKN1VP6mqTNu\nkgRB4bhV+2U5nWqJn77kQTOUvkMchdC1eZX+6ywsQOncc6QUugPMMdTe7ayFD7ZaOutRCPpuEUDDfso+\nSN8Wyod/85O/+eO/OfM3f/Y3Zz8+QZW3S//nMxBQGsKthL9fqcImdxrCcxp4ao5ooqqZTVeePXx3vFL7\n52R71a6GRiRNiwxq0s5aqfYFXkuoLrA46f5i7jswC/lGVyljdIv3CAhvPWDVFd4tuGb1gHoHastgxcFX\niXZdJfBWwwgkvtAoH48dOuyXVLODalrKGDNrbrYBziMp7+spFQuqUcurZ89jr65ApxCudyn0l+BWqr1h\nbQ48WhM6dKD9OGipceZf9UgZogpV9AvgV9b8m5dQdCGJS6DeizXTbJ1HFIusmXZ32Jhnm1k8JW28a0hX\nSIENHAlprIWsQsUiqXRZqFd0hUpEb0ld6qOT/hp+uwgNpg/f++g5qihd56tPUBMJulNv2c937f3LH96g\nHlPSpaIq0nX+hI7VB9SZejepSV1q9aik5MS7vBPaSR+dTO9CA+sqtZWuUrXpCjWw2FJ87sOXXLvqun3m\nbVdKcoUoaVt99Jy9Az2sR/WUSUfqmitO4Te07zj74D3+K00vaU9dSwpZp5IG1AXvDehlvSfFL3yCLcS3\nvM3WllB5wt0etZ6DwtQH/rxv25Nf4Hevxm+u7yS9LHwPqlTtfdH6G+x1tVmKYlQQ452fYF+8y7/5XXvt\nUbxCJSqNyLvU/pKG1NvpOS77qMVoPUH9q5di3PxzV7MrX4unpuYW34Wal/Sp7H4vU6PquiuOQQvrvQ9/\nlO5xnSN6ydt7A33qilYYj/d99EOV7Kr0xzCW1qcYN/ZB6r8bvO9l6of9iPpZ6JPTcV/omaEtPlLSJPsg\nZo61ECphz9nVNJbPffS4q4edtG+e5DXepsLaBSqLnUrXu/DhX6TeYFv4JDEjLtiTQ9fsGY7RBVzLR/k4\nnzY+p3l2nb+7qpeN+XuatVI3Y79f1W8ffdfnxnucR5c4d6FBxvZRrezZpFqGsX0fT5Pm/Xtst+bu96xN\np+yqF6GidevsrTc/furWqzgpXBVMP6Uhdg2qUFKXku4XVbhO3XqDylpPf/wklLbsc9LDCpWx+O4Ve/VV\n6lWd0Gsfn7x1yb9xzfW4zkG5jApSj/HEOovf7N+T1iqodb1J/TB8421qT0FZi2pW9u47dv+n7TdXCbMr\n23PgKnafd6CqRY0yapndum4tOItv2TfO8DXoWulZoRl2PvXG096+t/xzJ29dtv/aM7Adp5KmGvXP+Pmf\nhR5bPBufxvuN6mJSLXtUuma4EpTU+GzooTf5PD+l5tdbaIv6FIpo9hoUwrwP7HlPUnvrcfvuKbZGCl34\n3GX25CnrobfwROwHqsDZ+3waKYlRse0MtM3SKOBzl6gldgpKZlAdY9/jjk9JzwzqaP453O0N9YSPtLXU\n78bWuLKZ971r0r2exvgVzAyoxoXKmV/lPMeS8+/Wa/68JzWKVFR709p+yp7/9VvvoIcxE601j3Hc3rHX\nNcPU55rJb1Dp7G2Mu/rePvWmK+W9gxnT3Dk5VK5DFWlWpUaYIdzdghbm1+s1f1XnMoFvUeVaWLieO92d\nNguWGGMw/iXyZaab8FO8WNU/Ug8HRKd4jo2wGIRktwDIqogr2uyWzcZiYpWDFuGpxqUFpcHpSSJm5ulu\nT/4Haq0aMcjMyP4Gi2S32eg9Saars7yrBfhUEiGA5+AAHwFxwF316K7EeWqVw3G/e59HNAlrCmgIdYS3\n3IusRl4veXY87M06/GITT8F0SCNMz05ILdMJYUoGZDWa/HbdHW0kq82zN/NfeejL36LG1reSlTSqlLxb\ngph2m+lZXGqzJRtmKVl3we2ambk3aJOqFyOoJMJNe5BUXlwdJCSj6i8Xyrybiwqzfm9HohpsOsIy/1tV\nwipPQiVVd2tjMHKRo1CQQdihN1psxluANirxA1zO5AGyo2jWhy6Tdd9meUz8vb2dxhrxiD5xVzvcSWWq\nB/V+F5UplhaiZNPyaIMRvpV62B1WSe1K+DXOM4xU5Bk9glVXDQAjjWf8Uqy1mdmWPJ0WKdINxhv8W1ci\nQ2jYderq0OkFnKD7v7RTro2BLzLYS1YyCM9RvoR9pjhpeP1ruKLChuZ/71tbZz5ipNCwO3P32+RCZeTB\ncLYxpw4ePFExfXlsK5XKZLkgBgUVShasVu1au/FSCy1iZEWUx5olQxlCq/tH6Ghag3fMr2uKz+6gGU5P\nq3dXhYpkjCt0Wu+wVpCZnXqsjHyrqiv5qwh8aJG1wQWFI+jkRkUQ0ncDltOspFhlgcryvsjuatdQ6FbZ\nyppvAUACmgqhmXCAjacgmfJ2VBg7qj8pFAfqpjhTocJLij0OCA9AyuV+lokokDdaagGu7b5j12GZbFwi\nGDLcQIoQcwOdoy80IiNJClSFM4eKcR5XAxMPSXn50klvsDdhbUGbaP3RZGeb7IP4ug+syrRydqD3bWPp\ngRs7AJygj5lIMGXN2IDQiAQ5fdUmS424hm3bRcI5OSQM01O1JDyBTwiBj3G3EnmTkJRmuLq3s7DUwhs9\nxREiLT5T3VNFZn1pISX4onwi9oeaalTiLZMcSDk4HFSrnjvwfEFVqEg1g4HzOtAeABd4fVir/l21r913\nUgVLwJQZ+yb7UVE9BtoSb7aYbSHY6F9PurvIzu5du34bMRTXvFhqIQ+keWKU93Z2zCchobTmB/0H+5Gh\nKqJgH3ITrkqEAPRQ+B3RDbPEgiJn1HrqlTEWAaZoDrTHeMDSOX/lsbMsZ8GdnSiflPFuN67dbfS/UKkc\nXmHHoi1STfYkCIIah1B+Q2n3vgNIETEC0rmv7TOhwjvLLU6fwVcv34QvOL7ht1K8ZXHr2GLhZ2eUwUOk\n0XMpjOduuj5Et80LFA6gUza/GXjIemnjf45h6VKuYlV95jICK5OWfdDyQbEFFZH8PyqBQcXjtgBJQ4St\nXP1v49oPVsXDGNxlxaKxUIvCn9iv32RpDWDJ9sQBUACNhEg0EDFVy9XoclMAogeoli62NereJCB+cM44\ngRJyfT5p4vUmB7LNfFSE5qMT5yaMnZKRD6ihlyXj0wPrWBKErmJ2juhWKIbQ0WHkzrDe7C+cIBgsT+5y\n21SsEaFxV7QpKblD2yeKeSAWmlCRBQq9KDjdRLVQKWR4l6gmHKT5qMaRsmeVAM/U6yxT3DMS9GYQ2ZSG\not8A1aFUbVQAoTWvLcQotoabPFyhK7T5s2qFNTXwOs2AN2XTlTIA5TiqdEIxh6hcUuij5g8hOyyWzn6Q\nAim6+sDBB6NOEsVvBkOA5Np0ViF1EaqJeMEuipTaR0NAjYxlTss9SepwFhOOXWK2sqPGYyeQhNDCw00U\n2rCLBSEakXtgvXDnNi4MaUc3RtqjbsZj05hc22eiCM2Sw4IP6dzcqrXvALblibkomwn5mEAosFicK3jQ\nIOoLfiixQuVAieYS6GpQNOWEg3B3a5SVRQIihUYqjroED21ci4O6PslkbaJqnF3hXhX6wmqKbDxTY5IE\nrXsTKaII7hpyO71J1AVDmhT+QElc5Zrv75i/Dt+zr22I6iCwWUDCmqjcaustivfYwHL5yyhrNrB0RHEv\nJVUKESAmyfhy1BTDkiZIkVmpTgszJqYAG2izhxJ6+prNdUn/bVQtertweVzkHwY88ZnvpcZBNJ0VX6WG\nK9AqsrsuqWbN25A1CY0NO8oPeEG6Tth31qp+yvG2YElOGCdbzMxk9mSSTG3PniVxF+4+QsiaSnXZXTsF\nEuiVHV/fQJnHWk/BsmwO51PRJywaZl5rvrO/PZ2CG2NPoUQVp+f942RE4pBCqsL+bA/LL2FH9w+49Yq/\nNutjIeSxUo2OVhLPiEJvmBpJaLqXXNojMGICBBoJAqJt/cw6Ui3cdeiu4r9AFcDFWgnp4bLpr06EuqNW\noH3NIWJYv93WXm8T+kU4QdbQ+aQ2UFB4QqbEvtZ4wh7l9X8CYsVThKrUwJJx35Q+xVzr+gTVxdr50FRE\nwMl5TaiB1i6WoRuXKys4G5SWXo+IQJNyREXrjRdRDTXsVOEzmZ+XuRhgbx5fcQbvjiLe9rV7200X2Sov\nu6qNnhMFZYKpWzR0S4GbGAdAULUWY54BnRstSOpywEwi1G2lavl5dtcv339INeD2tdY2DGi3Vu5OIYM5\neoA0KFPdX9wL03CFGWHNEhDHNijWskFbLNhY7rxWQi3eT/NWgEjATryjEmqmL2E/msMtspJwQ8/Q22ok\n1sKOoAOtPRloQsrwoD5iF7sctjBP+CW/+0jG5WuKllfKvU+nq2YUc6qjkLyhfU+hiyrnH1FRppCPxgdy\nCNGGsuAUdENqt2ZZrY2EpliZpDEOwhlWuDn2o50QQk0l5My4cEsXi0Dp6xqcwEFrxeOcA0ig7CocYreU\nGjHFA8A5EboAU641OOeWFtLJWsk/p1uddpjfPdD6Fy1DtKEPsJN5uvkiRUaiRNdog9qObrWJysTjK2pq\nQ0EKgGQZcBnT0faf4OHwFlp6XgoT452E0UEldpE9a4Tz4ezSVLgTlj5EnmVM2+olDoBF24I6CcMmUE+K\ncBQlMYb2v62tOinz91BTNSo4r5DzypZRUIgz46j4BOyAzcrMT1UtPhScEHMIEnS+OdS6RgGio0KPM1KR\nEk6zpOV3NkE+Qs67TN6inYiYWBTyUQ1llExtIaG/n7BxdT/p7lddx0HCUdFPzp3E+iOMjdoWdt37mUOm\njRJywhkWDEZ64xqMNmlbOmOoDpIOl0inQa97BDaXamdjX3ddTOIZu4UjjQha0zqBzF0jaIicE47bQ1So\nYN1takc5L3OU7D4uaSwDILILmmjQHSRJj62jCqSEN0Mo1WyuA4kRNNdCEJsR5YzouNlMDSMkxeXKXgpq\nlr2UIzY3itpJNp05jUBFP6w5SYfNRjJVmyjK4thmr9/sGazvNbsl0dwTF/7YaH/iGrqIOLsNKEXINALw\nSToVQcktinsminBgT7XmuI/C7qQEbRmoDurfbla+DSqqxhOnJelBmAsWDHZ6xvDUvzSbGx5cOHAchtSG\nKhZbKv+cHHVieKwNh6tqS2McTOcGG2DBGuiNZjJqgnT2uxNv4xV1Mm00GXAlCHPRMbhYUkKeMSrm4TSU\ny7QGQTwQUyMqytKU4EQkx9r7ARBlwkeocRtVyP9bh3UORLIblIXQGgQaSZ2rWAB6S5CH3uTuNiexvaW/\n+BDadJhbbg3OXS2nArd1GUSH7mOMgsngjq7L50T98SmgIxC0UJJ3AKFTOZo9fTsxFikRuEQHtICMOWVd\nBRKV3Ye1NYAngJllHppgXDQoeLgLNuaUcUyYKJqALiFUc8CK84mXVhyI+P6IHFMnqCbtWrAMtFXYzq1n\nYyy9XtPZimC7bQprYhSVNvFHClhtn9kmt3v7DPrXT7I1gerzarnYXrkuaPA5R4drflAk21uhCPbZUXm/\nOCSGCQhJn0aJiSFr43puRohw+N3ALzXyg6hiSJXAlpFRrLZnVsjmYaGE+7wji9MUFGgc9B2F5d7vEmsr\niMHRKmjsCWgodAhC+c3OYFQ6rFeG9XiTDHkddbUrpNqShqqo76ktAZbxB+DmUJ97WAX6lAaknjVKYmMT\ngxCgb69w4hVxCcWMutU9RQC+u578IXOWWVUZk1YxLLu2j/rObjlJqv4gTuqABPpurDrw0PJoU2byybSO\nG28MEOHAkAuunbTxvVYE1d25Ban6h7wAjB+Bt461H/Tvxwp4ECcRYGRiYEZdV+s+6EQhb2J+gSYtKxyH\nZ6kTMk4ynbyMD5RF0s1G/3obks5oPXJyAfXPqZtHUwhT3adBoB8ZxqL0Rrt42bJUcUeHj6MWA9Btn32o\n9ZpVs8NXS8K6H4Va6DrZ8SsTdY3D9h1+6spcjiLeAhHJHj74/l69YyTyDW9FMfBeG1Wb59ITcdAlp2GM\nhC9WiKwC35QwP66fr80fDI2EKTQmxIF7kWlbawUB8B0/x1MZDsDtiw0ImBJRyqrtXWpvelSGmUYdgoM1\nYVrd0PLYymiw27rgbttUgdaUiwrjNKmfIavsHNBCO5jmHdVTld7xy8PniwrCFImtQvTdjULuRt3uPVIZ\nq2K336i3uC49lukBQWVSw+4V7pgShkp92292QrJ+NmcJu5RbVJEwuxvaaUU+jI0Jo9mLCFDSosGkdTfB\nzi50KvxXFLNIxLjSoz8cIYeDKvaqCHLdD63qUXe575ZTLelpihdDRjGp+NADZPYlZZpWRn0UJfeOCgQ1\nNokNGVRMgyk9zIi3rDds0JDlbWeJh8jus13QX000ShzCDZYlRGnvbkMnUYkci6EN9bQKM3Ne+2DoC8ct\nLApoKlWUYvHKZ/HIqfvAYR7WlgULzwsXj6LMzh2ob1ogeEz2whrOYJA2vPA1xqJ18KD90/d+kK0iF63F\nx7eaQVQPdQoHooY+uZbjhN22zXlX7DNPgpjR7IEwirmatyM9Prvbw7EbJbXM/qTVcpiLQixj1J3ZiogA\nyE1eMwQKsz4EbtaFartYEBC2OewhRfD1EYLv1ctaVAVqjdMYYf21rsrjfh0GliOycbf72ohACuPixJGc\nKpWDm9jBsSZ83GCHx5TTUcuRl63DuevxKkxWhU1IHFESgpOLs5CGFf8RI225dZNo/evXUVKsmovKNgUm\nbRmlj0atk8kERyKbhn1Kjku1H9t/CtnasFTJhzzYWvytvtOcszSEiw6tp8ZF2OnlU4Cf+5kI+HyHpruT\nV0Q+wwQN1gf6zItAmXmQYCI4/b02BhQcML+5YrnIjjG+lR6+ppHjdgmWk1srkqfhesMguEyBG/kQrW77\ndAEfkEzkxD1UnGvSzmXWSziIJHnraXX44f7ELnQPi1g6E25ahpjZPFcsFRBkG03C/IpcBA0SGadaklAF\nhqPb9+7jBwhN7iXpWTC5FD+zWQ7D2EfInwKmz+bnU8lpl/u6mnOojWipOgONp4Ot7x8aN18qvsV4VMEA\nTJhATIZsRYBCMjPcBoMXQtcoES6iKpDsM5Qc6SlWDPeFIhRi//Qpgc8FYwYkNdn9SfqDIhJzrsjSKMGh\nIKqdItwtUdm+Iu1hE9z9BTfr4LS7wwQHVuEQ9larfjZHQ1YuDT+rIAWnUV/V36K9qD6SdntxpzjtAYyK\npVck/e7NNoTvOzh8/1Zmbo7y9MizmbmVtu1514Fo8ohL3d+WQYRGLWvHxbqxGJrkMKWEF2I3KXXolfjY\ndNvUPWfpq5BdonMFv27LhMJQVoEk3a7bGioWROuC9S24TyIm22C1eHQaT+w7EmzEgXYOj1iC1tgelvP7\nnaFh7pHfQlVxyp7LgzB8o4gL7mZbNQI+ZVteS6F5VYorx326BNxWjvi+48AarMnETJJn6TZXypYcHbji\nBhMn8lZh4bWre4496jIafRp7Xp7B9+p5J/JiTiSY4+okXEVkPQcF5HqUBmO6V/mhFDTjuuj5cko6JMqj\nI84ygDz5AYnTRE5tA5q0RezyjC9X0LRrtO8wWeyyg9zX19O5eahNnrORipM6KZflSZPpPufm+NdVCGni\ndOimZ1O1/1fPQog+sWKaEIrrluo+UTxa0d5WJxIpl1UGiG6eKzV/nSbTDzZLSdiFCqarH1A7vOWfNEG4\nAY+QRRR4LAIMUm7WFCSr7OpCh0QFKd7NTfcQZeQtWgZOIuNYI+GxIp7dLbtuWuITq1DO1S2ScK/tNmMv\nL9/AHYVOL+V7EzemkdzPqnNOxt26FJGHcAG4htJ+5AdslXfNFnq4hPZ68IqagedK2b+eTIVMClPNa/Zs\nYLkN1RxEjs0awhOHfiR7En4WB4DerUZIgFto8pCK5JgbRbb4a9+2gPU0FhS1sZtAXCzkvxnNkOzDnk6x\nJymEZQjfBuHiqI8VpRawoywsJKGmmQdVE1ZYosA72u/QrfNUxZ5UuNNco24FdfWdDKdxxwwtswxgGj1I\nPGCbBZlZyMKNLpwJAuJskeGDsvYvtACs1Wph4ejRo/Prg8F6zyvsqM0YgbCWsyy2Ys9D50XS4VOUUZnN\nSl0tHBLAtnt2/57ZlyquOIFwXjQoA/q12UviHNtsnlf8ERYV4hTett3/Obtm1CixEzHLf3e/tKv9zM4M\nU8XjGVmvFRuv5RYEg1I7a95BdyT5jjt23DNmMg2ewhxxEUc8JJXyv3sRRRkM/QTqQujbfTChK2qvlyre\nMIfbDixn1zcsa1Wg6Am4923A+qGq328mvSPWAeW+1iyeW8IouyYfkMMLDh2GSkrI/AMtYkunZz/LFiDT\nm2SItBmHHwlondCeZc/ciH0h9pXhmJoUCK+liRVJvL1ZJNBLWqtO8Xx31EUlHWtwqyBZ9vYP2oG/Yy6D\n4UQ1UqDWUhodZl3biAwU2WRRx91l0arKLLWU1c7ddnitstx1XQrdIaBlhrbryt8SSD/pg9oz3mWf8UY3\nWb8tpWJqNqapzDcOHRiia4q2tJphiKq0RkucyrNfO7gDfnS/S/9m1sFGyifOF5mDEWiB1aqToYyEZWea\nYHE/Y4dH6WkAJBvRvWSd06Vx3wTF1jJvqcr6ZzFL9T88NjM4JBFHbojZ/MjTOwegGyDDYi5D5/+O60o6\nfpw66gryNEUqpT3stNq8CYTuSHhQATCf/VWx5ROP1/oT+4MnHVr1YmAlN1EPW/fdKDe3fF8laWJvx75q\nxmewbGn3O9qJEQkVPBqOq8WDZGsvLNz9gPU4xsWLrUhHSkk1hIljr8jQo0VSebP5sz9rQ9Iugbbdb/0R\nSsut/dedO5e/3cb/Z5LrwUruCTQ45yWl5Ck7l1xpZ6ZmOTiyLRUVnA35BBqK9KEJpB33W2VQrNtU1CQ0\nF61PsnOkSKXMC2Zn+zHumZO/EFgJNEg6R64nJnkqto3nhVfbWcqyzF8e08KVW3qEgNEeQrsewI3Ug1xJ\nW25zM/N95EPpm7SAfWoFOrp0Jsd2KrRkm8PWsSJLUexO1cnteTO+y+5NAODSmLbnI2Ez7ouvMxyouLN5\nATgLVFo3eD7W/q8kJe9O0ccypoPSNC3McLW6M6qo2+eXs2hidkzNZMNYJBWwIkq0aHfBZhbo/mwtmKPT\nW4v9OTOGi7gVobihF5flPiZK7ARpwXzLEVygHmGvcNSl0mt70bHN3h6dQa2qBlRtkb5UyZYknkpHqkoD\nloNnU9Fte8Kv2PHWuAP+ULbPg/8R4haIYe3kTfYMs6Njh7tCXF9waW27xRxGVjNJtKDcH4qSEybQFEkD\nR/o89L4XsshDwSrKG3XXJsGiDaldf4U4XO11UsJK9bsxLgjgu0OK70dl320ZO8qr2fLBAojESp0ANyhK\n3LCQfZ2qjqqaj62TBwaoDs6pNJcxvZqZba3Pa3t5CvVULXSOUowh8jtrLm/BGoY75jtFq1eyle0z+Hw8\nMsfd8+Lb2nTOzEzm2COQ1gsNuRYoWdzrWY174PW2Z0STwey1r6atGINxB4Z5QXDOUJwtUiiZ09RDHd9s\nYVB7soBikYW2Q8aE5zW5GE4OifrIVR6ftdf3FS24NYMGFxlaoSvUltq/nFNalKljfHWlzckTWS58TxXj\nzvxqBJkZsul2qzaK0TLUWlpP2TuIEjOj4msolmJPHtZH18PSvHufZVuVC6GGTyS527BmkdEDmwN91sqc\nY862vW1Zb7b+DiRFOP0Jn0nBIchKD8Jf2MpyUdzkeneOV/Cd7IDMgnyFPH4upe6wjepKusaa36NASpFk\n3Q5kthCNON/3MneqnbQFCvmm8RpujO0vlT6m7xbnl3+eOC8Ge4aaQFnctwhFMyom8TqEqTTsZ29zOaxS\nAhC/B+C82WS5TZ0XhehKgMCzkKUjX4G+C5iyDWjClzv8gDAIrhFnfxL4X0n94yClKrHzl/3Wk9k+E9A8\nh7Wk6tW44AOeCUqLdwvbK1wL7cOtYh2KGJYQ/B83nuYLvBQ0F+PMZa7WnzcyRggV6azRv23cr1NIF2mL\n66g/KFLebVgFRbQ3iX0Pc3U5Q8wzmeY5OX4x6jBmNljkMJRFS0BAduYBbJu1AMSsy6AQHd5ibUhPW/GF\n/ZnfkSUVnGuo1YzbcE+nHrMbhwx/CmBk+++x4KjiubLtqsjOMuXpXH0WdkbhuSOBeRQCpgab01VS3l1n\nDWOnKizo+SumLomraZCQdb4Pt4lUq3TkYCFPOcxmftyBUSsWiIxonL/WLC5x2OHKPQlhvC/zwR1pyGmc\n0faazIbpS1tM7UylhKEcRV/YU5klGVU8TMzaSBpBR7XWVwa97mLSlmNomMXoCRdKRCXsaS29rlatCUU8\nWFq2+Ho5LA4cGHGFUFy1iXUs+1nznblKV9ljDr9FqHM+R+iS665h5LeINYi+bm3pFQZTI/q9P8VSVJgV\n1kQ3fBM/C7L8ewGF6MIdmofagHO27w36niknQCaDb5IzE3uLvGXhXgKY6Kg6ojYTNHw48vPLq8wr7LsV\nXAo/W9k3bm8TrZVx2YOLyk2TmSnfITLwg6tUixGWimNiHdnsi71xOTucEuPJ+ZVOkW0yOn3TyWI7Oh+J\nF7B9tfVZog4EYw7MoRWcsANs8m5EuxpcZzTY6iRVcCJf2TXUkc1icdtDxxXJBrdbCFdQ9pp5g8YriIxU\nhDoxexrVNIx+9sIjyAeoP50c1XL6uB86FZA+msc9RBWWn4UGBJAy8YXsatortF/xrK9CB0+1dsOOJYK4\nHLKYZuwdPEN9EaSyv8wIJrJmwxyyr03zpyBi9uBq1fqRyAOE/hrmUvgxWJsCsmvmMKFwNPzZ4Pk6xtiv\nn9G9fJ9UqQweOgm+1QatMrd7Bp+nBKm0ZlmlPUu8cEtqUCsOzs6uznKrOS8lOdWbJwFAFWnp/9oDuMyB\nA7Mi+dQEAj+0svvY1UNVHRnCVVkbWFQpe4xzfFilJCzWW+Tt60wFPzBy/ryjWDuwV5EEgr+QAfRndHXF\nEAZRLNl2ISAsPT64l55RQhN5lVL2VTpz50LRj+uoAX5OZSmaLM4T9P8Jc6N22HqaOcrTwhzpJAuG9Uko\nKqa90ZU0PWOWUDfZOZVUH7B1+JpFABqfl9+OYjq9NOdtfyO5GTHG1kogLHxTBznLpidEzlHWdNfaCIwG\n0EWOtyURvd2HocY6TrlV71su/lTI2967l/bkV2mXBuNRMIgEQGyCeY35wOhwJepkyuKOHP7kTB8vTEub\nAP1WMs/vdHC/vtYXynGs+xpXWzNXtRHaQzuYMo867LJteI3P48aH9ljt7SG/jSPPmRIeQWljkpmdOWR4\nxg/2QKajPW21gc7yV2HRF3dvAtod+XjtLUVkF+eSXcRsfJEkktE/3EbqtWo2ozkvZw+cwQ+LKkH8zSYx\n0yf288S80t7o5O3+gHsOFo1so9hxquTg2HgdaEFucytZ/Ed16rWeU11pWJUCNXE/2WTFCM+1al8S83A1\nPJPeBMIqJPQhhoZRcTj3kXpVvWkdM5sFslv1ZuQp3M7Bhhtxm5L5mtQtXLP+ZMFBI27XOSqc50PN8aNg\nfgw2E0sExIbwf53F5GdZ2kPmWe9sNArNb9jhjdAKyVedC7oPxmUkyDX50GE7Mc4TFcbF0S2oksB9QzMC\na0D7pHpSh/io53GAUeAswq6XtEbrI7RqFzXLSbe2XwL3qsy924ot36mp6BdECfK0lut+kotQ3D7BukTA\nGvl6dxCUdZk9nTiwjiVykMskzmpVXhB7+5AtIu1dOvuDber7zDjitCUBXW57ExVcEzydDoW2H8zOaqoE\nb4MUNuLSA6/dHLkGO91lG0NzAf3T+k0HPYlNiDvxhLI/M+2f3Qv/x//e/M637P//YWG92vFNeAJHi+rb\ni26T8CwHISvpZAeiBIW/NwaJTJPoLfCDbMfcSGeZbSGiEDbbMgJQYqcn+0d7UaajBJVoz+P8wY4qy+l8\n+CL19S5Rae/lj45/+AHVCa9Soe5//P1G6ItBkev2uVd+8bPvf3L13O0XnlBVaP/92on0++0Xn/rFn30P\nxZefu/rJ9eu3L/zx7e9/8On1F3/xww9+8cQzn77ztv3v56dvfPLejz65+u4n1566/afPfvL+iz+/9O7P\n333JPvnzcy/cvvT8Z68/5uuOaXDriaFgBlFbBSCC1YHH65Qqty2ScbAua+MOAjTg+Th+JpQwyy44lLj+\nzZdVlDleHzSqTMfoMioPrZQPlyyyLBR4qWT9BDWYdX0gA+wT99UrQ9rDrDpspraUGFx3cwzjNXASQRR3\nLc+mjlR/Qx1MKGy2z1gGMgPXUcEgNKM7UJw2ngt6K/rd9sX0Oy4WubMK5e42K4crRLxukKNEovSzwCEp\ngg+0xUqUHy2p3AfNQCj0/ZjKhieg/NfqQobu5kfPSE0S6n+uxdjqdkJd8jhVH6nKKPVJu8Jl6m+GWmGo\ncUKRMd3ro+cwhzk7L+bXcd1Oag1KjTLuzb/f//B9alW+zZl/BX8l5UKoFaZr2qdwxbeoU3ktu1emjUh9\nxavUFNU9QxPzcrr+ZaojhrblVb5HZU3ru7+k6qZUDpNOpn267cNHoXNJzch37XnxLFA0fQqqoa7YeSnT\nCr3kPXwBCp1QF/U+gQZlq2552Z6e/WPjEn0D9caL6Fd7onddefECVUy/Y89+0V5zBdAPL/EqH9j3vpNp\nSF7Onv0C+0nKne+6iii1J6li+q637m3psHLE9JmrfKa3XEcVMwBPRh1P6kFKLfN9u8N1tuCqX8fHEcqV\nVJa0e9sT4u8n2ALMz9S2D3/SzlvpYHJuvWc/T/qsuZZ9F8/yAfU3b0D5kqN4BZqynIF8cvvuB9Q0vcD+\nUXulzfqB5rqN19WkFIt3P3Ad2vf4HP6ZqWe5kY3FVd2Pc+5GO4d5Z82Aq7G+qM958sOXs7XznjRioSWa\nVFQvcR69j+fj07br5TL62kaY6yvTAL3caoRaWx7lpy9aK56TjqqvKSncanzf5xrAvP2uzdz3uW6O22/v\nuf7uk3n7uR4v+Aq8xvG/QJXYk7wO7vuO3audwxjHdh0lPVTNOvY39p8/dy1b65+sNvdJVmG+ELWkT3n9\ncdVAR8npKC3tJaRVI9s+8Czfej5+uRHVse0zL7clyNvrqJD0a9k1z0b5cpaZxusn+cq5qKZ9OmvPcZZo\nv9F+Hv9ebtuGot6pWrfue43Vvc/E9Z+Pz7wR9dBTiWoWEPfP6yle9ArmuqaXbn+pvVd7X5Xwfoq/PM/P\nv5kVxb7K26m1eq53+O/jfK7noyr3B1Ga/AobpkLw0Wy8/kN2zkvTz3i8fS7Vzvaa46mXno8C6K9HqfdT\nWX151Z3Xw57nff8ivqX+fyX6JD2vjex7vG96xpPxmZf4IFdYNf7ZKNKdxvrFGMEz0bdxzVefzAqan427\np7E+HgXBz0SN8pPx7GdjjI57jXjvqxhHvP4Gr/9jXjb1uVpyge18J0b8JF9Mn/lOlG6/ODUfvN+usetO\n+y++LtIcOB5PrcLur8W9XuSTnkS9eG//1agFf7V95DRv/Qrsf3z+xayvLscKusrLnon+POMF7ts2q69+\nGCXUL7bP5b16nO15Ij7P5uHKp9nmC+zJk+yli+3Y+Tq6EaXkH8/2jcvx+pl2DqvfMMfeiK9ci8/rM1dj\nnV5j807zk5pvmv8vRZ+cjkG5EnNAbb7iDda4t3M19eETsd6f5NWuRJ+8lu0Px7NnzPYcf6LoUtw3tecC\nq9WnfYb3xdXOZ/Mnzc/jMUsv8y0WsvfxeiGbY6dizrzKm6a1prXwwvT+eZzf0lo7z2f/IK6j+a9N/vnp\nPf9afOa1bM5oYl/M9oGfRZ+8ETv5ad+j8JXz0bAf8InS9S/ECnqv7Qe89Xi8dTZG/EyMAluibmnX+wtT\ne0U7uLHWfJ5f9odN+4P/qbHQ3HuG1+e08V36QnvG+fOmfj7FP6/yM29EI5/zZ/TPXI0Bupg94xPx7wu8\nwmW+/k52Vl7w72Lf0Hn3ahp3qkVDF/tpKiS/TT3pR5Pq86Vb74Ri88cnoC798Sm+foWKyK1Ws5SUT926\nSDXvpAOeFJZfzzSW37QrvAldcOhphzI4Xp3SEH9Myti438cn/V7hAVNVmrrXev0NtMnVpi+46jh+P4fP\n+jXPfXySV1J73qLudVzzdXvvFBSp7TpX/fNQ6H6cn4K+9ROhUU4V6VeSNvlbt37Cp4DW+Jnsvk9Sn5tt\nc4VzKVJfomq3FL+hzX0Kz88+DWXst6hv/rj0xqVdTR3xS9Sf1uuPUsX8rPfb43zKM1KsvnUWz4/r8NUr\n1Et/mq9Dxfws+iB9lxrdrtd9ht94068v3XK1B9d+x5/xvM2Dp29d4hXfSnrdP8v+vUwFbe/zVuvcZkbb\nJ+ehh+7j/oara7fa8U/E62lMoe99DXMvxiKe8dZraI36wa7qiuPWX49TuTzUvWNcMPPe8vnzpv32JK+M\n+X/d/oJO+mW2IObGGSq+n/W2XcXrjCsi8ge3vS0nisj/3gxmJm1wx55SUmN9PPToZb99h3LTEVam+DDY\neIPN2R1MhkivZQIUDyJ7KqK1Wg9Xx5secZzPscE5Jr9Z+hwSs81tZ2JWwHlAB8Fztq2eUu1y1p1U5D20\nNMlAP4KSuvP2TyeERIdKtYd8IsJh9yO/s7oxhuyJyBae+d3L5F9kZhhkjzDs1hBlrT2hkWEgvrgWIHQy\n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`),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);oo(t,so)}return so}function Q(e,t,n){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(n.length);for(let t=0;t<e.length;t++)this.prefix[t]=e.charCodeAt(t);for(let e=0;e<n.length;e++)this.suffix[e]=n.charCodeAt(e)}const lo=[new Q(``,0,``),new Q(``,0,` `),new Q(` `,0,` `),new Q(``,12,``),new Q(``,10,` `),new Q(``,0,` the `),new Q(` `,0,``),new Q(`s `,0,` `),new Q(``,0,` of `),new Q(``,10,``),new Q(``,0,` and `),new Q(``,13,``),new Q(``,1,``),new Q(`, `,0,` `),new Q(``,0,`, `),new Q(` `,10,` `),new Q(``,0,` in `),new Q(``,0,` to `),new Q(`e `,0,` `),new Q(``,0,`\"`),new Q(``,0,`.`),new Q(``,0,`\">`),new Q(``,0,`\n`),new Q(``,3,``),new Q(``,0,`]`),new Q(``,0,` for `),new Q(``,14,``),new Q(``,2,``),new Q(``,0,` a `),new Q(``,0,` that `),new Q(` `,10,``),new Q(``,0,`. `),new Q(`.`,0,``),new Q(` `,0,`, `),new Q(``,15,``),new Q(``,0,` with `),new Q(``,0,`'`),new Q(``,0,` from `),new Q(``,0,` by `),new Q(``,16,``),new Q(``,17,``),new Q(` the `,0,``),new Q(``,4,``),new Q(``,0,`. The `),new Q(``,11,``),new Q(``,0,` on `),new Q(``,0,` as `),new Q(``,0,` is `),new Q(``,7,``),new Q(``,1,`ing `),new Q(``,0,`\n `),new Q(``,0,`:`),new Q(` `,0,`. `),new Q(``,0,`ed `),new Q(``,20,``),new Q(``,18,``),new Q(``,6,``),new Q(``,0,`(`),new Q(``,10,`, `),new Q(``,8,``),new Q(``,0,` at `),new Q(``,0,`ly `),new Q(` the `,0,` of `),new Q(``,5,``),new Q(``,9,``),new Q(` `,10,`, `),new Q(``,10,`\"`),new Q(`.`,0,`(`),new Q(``,11,` `),new Q(``,10,`\">`),new Q(``,0,`=\"`),new Q(` `,0,`.`),new Q(`.com/`,0,``),new Q(` the `,0,` of the `),new Q(``,10,`'`),new Q(``,0,`. This `),new Q(``,0,`,`),new Q(`.`,0,` `),new Q(``,10,`(`),new Q(``,10,`.`),new Q(``,0,` not `),new Q(` `,0,`=\"`),new Q(``,0,`er `),new Q(` `,11,` `),new Q(``,0,`al `),new Q(` `,11,``),new Q(``,0,`='`),new Q(``,11,`\"`),new Q(``,10,`. `),new Q(` `,0,`(`),new Q(``,0,`ful `),new Q(` `,10,`. `),new Q(``,0,`ive `),new Q(``,0,`less `),new Q(``,11,`'`),new Q(``,0,`est `),new Q(` `,10,`.`),new Q(``,11,`\">`),new Q(` `,0,`='`),new Q(``,10,`,`),new Q(``,0,`ize `),new Q(``,11,`.`),new Q(`Â\\xA0`,0,``),new Q(` `,0,`,`),new Q(``,10,`=\"`),new Q(``,11,`=\"`),new Q(``,0,`ous `),new Q(``,11,`, `),new Q(``,10,`='`),new Q(` `,10,`,`),new Q(` `,11,`=\"`),new Q(` `,11,`, `),new Q(``,11,`,`),new Q(``,11,`(`),new Q(``,11,`. `),new Q(` `,11,`.`),new Q(``,11,`='`),new Q(` `,11,`. `),new Q(` `,10,`=\"`),new Q(` `,11,`='`),new Q(` `,10,`='`)],uo=lo.length;function fo(e,t){return e[t]<192?(e[t]>=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}function po(e,t,n,r,i){let a=co(),{prefix:o}=lo[i],{suffix:s}=lo[i],c=lo[i].transform,l=c<12?0:c-11,u=t;l>r&&(l=r);let d=0;for(;d<o.length;)e[t++]=o[d++];n+=l,r-=l,c<=9&&(r-=c);for(let i=0;i<r;i++)e[t++]=a[n+i];let f=t-r;if(c===10)fo(e,f);else if(c===11)for(;r>0;){let t=fo(e,f);f+=t,r-=t}let p=0;for(;p<s.length;)e[t++]=s[p++];return t-u}const mo=new Uint8Array([3,2,1,0,3,3,3,3,3,3,2,2,2,2,2,2]),ho=new Int8Array([0,0,0,0,-1,1,-2,2,-3,3,-1,1,-2,2,-3,3]),go=new Uint32Array([0,0,0,0,0,4096,9216,21504,35840,44032,53248,63488,74752,87040,93696,100864,104704,106752,108928,113536,115968,118528,119872,121280,122016]),_o=new Uint8Array([0,0,0,0,10,10,11,11,10,10,10,10,10,9,9,8,7,7,8,7,7,6,6,5,5]);function vo(e,t){let n=new Uint8Array(t);return yo(new eo(e),new to(n)),n}function yo(e,t){let n=0,r=0,i=0,a=0,o=[16,15,11,4],s=0,c=0,l=0,u=[new Ca(0,0),new Ca(0,0),new Ca(0,0)],d=128+J.READ_SIZE,f=new J(e);i=Ka(f);let p=(1<<i)-16,m=1<<i,h=m-1,g=new Uint8Array(m+d+24),_=m,v=[],y=[];for(let e=0;e<3*X;e++)v[e]=new Y(0,0),y[e]=new Y(0,0);for(;!r;){let e=0,i=[1<<28,1<<28,1<<28],d=[0],b=[1,1,1],x=[0,1,0,1,0,1],S=[0],C=0;for(let e=0;e<3;e++)u[e].codes=[],u[e].htrees=new Uint32Array;f.readMoreInput();let w=Ua(f);if(e=w.meta_block_length,n+e>t.buffer.length){let r=new Uint8Array(n+e);r.set(t.buffer),t.buffer=r}if(r=w.input_end,w.is_metadata){for(qa(f);e>0;--e)f.readMoreInput(),f.readBits(8);continue}if(e===0)continue;if(w.is_uncompressed){f.bit_pos_=f.bit_pos_+7&-8,Wa(t,e,n,g,h,f),n+=e;continue}for(let e=0;e<3;e++)b[e]=Ga(f)+1,b[e]>=2&&(ba(b[e]+2,v,e*X,f),ba(26,y,e*X,f),i[e]=Ja(y,e*X,f),S[e]=1);f.readMoreInput();let T=f.readBits(2),E=16+(f.readBits(4)<<T),D=(1<<T)-1,O=E+(48<<T),k=new Uint8Array(b[0]);for(let e=0;e<b[0];e++)f.readMoreInput(),k[e]=f.readBits(2)<<1;let[A,j]=Za(b[0]<<6,f),[M,ee]=Za(b[2]<<2,f);u[0]=new Ca(256,A),u[1]=new Ca(704,b[1]),u[2]=new Ca(O,M);for(let e=0;e<3;++e)u[e].decode(f);let N=0,P=0,F=k[d[0]],te=Xa[F],ne=Xa[F+1],re=u[1].htrees[0];for(;e>0;){let r;f.readMoreInput(),i[1]===0&&(Ha(b[1],v,1,d,x,S,f),i[1]=Ja(y,X,f),re=u[1].htrees[d[1]]),i[1]--;let w=xa(u[1].codes,re,f),O=w>>6;O>=2?(O-=2,r=-1):r=0;let A=Ea[Oa[O]+(w>>3&7)],M=A.offset+f.readBits(A.nbits),ie=Da[ka[O]+(w&7)],I=ie.offset+f.readBits(ie.nbits);c=g[n-1&h],l=g[n-2&h];for(let e=0;e<M;e++){f.readMoreInput(),i[0]===0&&(Ha(b[0],v,0,d,x,S,f),i[0]=Ja(y,0,f),C=d[0]<<6,N=C,F=k[d[0]],te=Xa[F],ne=Xa[F+1]);let e=Ya[te+c]|Ya[ne+l],r=j[N+e];i[0]--,l=c,c=xa(u[0].codes,u[0].htrees[r],f),g[n&h]=c,(n&h)===h&&t.write(g,m),n++}if(e-=M,e<=0)break;if(r<0){f.readMoreInput(),i[2]===0&&(Ha(b[2],v,2,d,x,S,f),i[2]=Ja(y,2*X,f),P=d[2]<<2),i[2]--;let e=(I>4?3:I-2)&255,t=ee[P+e];if(r=xa(u[2].codes,u[2].htrees[t],f),r>=E){r-=E;let e=r&D;r>>=T;let t=(r>>1)+1;r=E+((2+(r&1)<<t)-4+f.readBits(t)<<T)+e}}let ae=bo(r,o,s);if(ae<0)throw Error(`[BrotliDecompress] invalid distance`);a=n<p&&a!==p?n:p;let L=n&h;if(ae>a)if(I>=4&&I<=24){let r=go[I],i=ae-a-1,o=_o[I],s=i&(1<<o)-1,c=i>>o;if(r+=s*I,c<uo){let i=po(g,L,r,I,c);if(L+=i,n+=i,e-=i,L>=_){t.write(g,m);for(let e=0;e<L-_;e++)g[e]=g[_+e]}}else throw Error(`Invalid backward reference`)}else throw Error(`Invalid backward reference`);else{if(r>0&&(o[s&3]=ae,s++),I>e)throw Error(`Invalid backward reference`);for(let r=0;r<I;r++)g[n&h]=g[n-ae&h],(n&h)===h&&t.write(g,m),n++,e--}c=g[n-1&h],l=g[n-2&h]}n&=1073741823}t.write(g,n&h)}function bo(e,t,n){return e<16?(n+=mo[e],n&=3,t[n]+ho[e]):e-16+1}function xo(e,t){let n=new Uint8Array(t);try{let t=0,r=0;for(;t<e.length-8;){let i=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++],a=e[t++]<<24|e[t++]<<16|e[t++]<<8|e[t++];if(e.length-t<a||n.length<i||Co(e.subarray(t,t+a),n,r)!==i)throw Error(`lz4 not hadoop`);if(t+=a,r+=i,t===e.length)return n}if(t<e.length)throw Error(`lz4 not hadoop`)}catch(t){if(t instanceof Error&&t.message!==`lz4 not hadoop`)throw t;Co(e,n,0)}return n}function So(e,t){let n=new Uint8Array(t);return Co(e,n,0),n}function Co(e,t,n){let r=n;for(let i=0;i<e.length;){let a=e[i++],o=a>>4;if(o){let a=o+240;for(;a===255;)o+=a=e[i++];if(t.set(e.subarray(i,i+o),r),r+=o,i+=o,i>=e.length)return r-n}let s=e[i++]|e[i++]<<8;if(!s||s>r)throw Error(`lz4 offset out of range ${s}`);let c=(a&15)+4,l=c+240;for(;l===255;)c+=l=e[i++];let u=r-s,d=r+c;for(;r<d;)t[r++]=t[u++]}return r-n}const wo={SNAPPY:ca(),GZIP:(e,t)=>oo(e,new Uint8Array(t)),BROTLI:vo,ZSTD:e=>sa(e),LZ4:xo,LZ4_RAW:So},To=e=>({byteLength:e.byteLength,slice:(t,n)=>Promise.resolve(e.slice(t,n))}),Eo=e=>{let t=e?.find(e=>e.key===`ARROW:schema`);if(t?.value)try{let e=atob(t.value),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return Do(n)}catch{return}},Do=e=>{let t=new DataView(e.buffer,e.byteOffset,e.byteLength);if(e.length<16||t.getInt32(0,!0)!==-1)return;let n=e=>t.getInt32(8+e,!0),r=e=>t.getUint16(8+e,!0),i=t=>{let r=n(t);return new TextDecoder().decode(e.subarray(8+t+4,8+t+4+r))},a=n(0),o=a-n(a);if(r(o)-4>>1<3)return;let s=r(o+4+4);if(s===0)return;let c=n(a+s),l=a+s+c,u=l-n(l);if(r(u)-4>>1<3)return;let d=r(u+4+4);if(d===0)return;let f=n(l+d),p=l+d+f,m=n(p);for(let e=0;e<m;e++){let t=n(p+4+e*4),a=p+4+e*4+t,o=a-n(a);if(r(o)-4>>1<2)continue;let s=r(o+4),c=r(o+6);if(!(s===0||c===0)&&i(a+s+n(a+s))===`dtour`)return i(a+c+n(a+c))}},Oo=async e=>{let t=To(e),n=vr(e),r=n.key_value_metadata?.find(e=>e.key===`dtour`)?.value??Eo(n.key_value_metadata),i=new Set([`list`,`element`,`key`,`value`,`bag`,`array`,`item`,`entries`,`entry`]),a=[],o=[];for(let e of n.schema){if(!(`type`in e)||e.type==null||/^__index_level_\\d+__$/.test(e.name)||i.has(e.name))continue;let t=e.type;t===`FLOAT`||t===`DOUBLE`||t===`INT32`||t===`INT64`||t===`INT96`||t===`BOOLEAN`?a.push(e.name):t===`BYTE_ARRAY`&&o.push(e.name)}let s=Number(n.num_rows),c={};for(let e of a)c[e]=new Float32Array(s);let l=new Map,u=new Map;for(let e of o)l.set(e,new Map),u.set(e,new Uint32Array(s));let d=new Set(a),f=new Set(o);return await Ni({file:t,compressors:wo,columns:[...a,...o],onChunk({columnName:e,columnData:t,rowStart:n}){let r=t.length;if(d.has(e)){let i=c[e];if(t instanceof Float32Array)i.set(t,n);else for(let e=0;e<r;e++){let r=t[e];i[n+e]=typeof r==`bigint`?Number.isFinite(Number(r))?Number(r):0:typeof r==`number`&&Number.isFinite(r)?r:0}return}if(f.has(e)){let i=u.get(e),a=l.get(e);for(let e=0;e<r;e++){let r=String(t[e]??``),o=a.get(r);o===void 0&&(o=a.size,a.set(r,o)),i[n+e]=o}}}}),{numeric:c,categorical:o.map(e=>{let t=[...l.get(e).keys()],n=[...t].sort((e,t)=>e.localeCompare(t,void 0,{numeric:!0,sensitivity:`base`})),r=new Map;for(let e=0;e<n.length;e++)r.set(n[e],e);let i=t.map(e=>r.get(e)),a=u.get(e);for(let e=0;e<a.length;e++)a[e]=i[a[e]];return{name:e,indices:a,labels:n}}),embeddedConfig:r}},ko=async e=>{let t=Pn(e)===`parquet`?await Oo(e):null,n=t??An(e),r=Object.keys(n.numeric);if(r.length===0)throw Error(`No numeric columns found in dataset`);let i=n.numeric[r[0]].length;if(i===0)throw Error(`Dataset contains no rows`);for(let e of r){let t=n.numeric[e];if(t.length!==i)throw Error(`Column \"${e}\" has ${t.length} rows, expected ${i}. All columns must have equal length.`)}return{columns:r.map(e=>{let t=n.numeric[e],{min:r,max:i,range:a,mean:o}=l(t);return{name:e,values:t,min:r,max:i,range:a,mean:o}}),categoricalColumns:n.categorical,rowCount:i,embeddedConfig:t?.embeddedConfig}},Ao=e=>{let t=new Uint32Array(e.length);for(let n=0;n<e.length;n++){let[r,i,a]=e[n];t[n]=255<<24|a<<16|i<<8|r}return t};let $=null,jo=0,Mo=[],No=new Map,Po=new Map,Fo=new Map,Io=0;self.onmessage=async e=>{let n=e.data;if(n.type===`init`){$=n.gpuPort;return}if(n.type===`load`){if(!$){self.postMessage({type:`error`,message:`GPU port not initialized before load`});return}try{let e=await ko(n.buffer);jo++,Io=e.rowCount,Mo=e.columns.map(e=>e.name),No=new Map,Po=new Map;for(let t of e.columns)No.set(t.name,t.min),Po.set(t.name,t.range);Fo=new Map;for(let t of e.categoricalColumns)Fo.set(t.name,t.labels);let t={};for(let n of e.categoricalColumns)t[n.name]=n.labels;let r={type:`metadata`,metadata:{columnNames:e.columns.map(e=>e.name),categoricalColumnNames:e.categoricalColumns.map(e=>e.name),categoricalLabels:t,rowCount:e.rowCount,dimCount:e.columns.length,mins:e.columns.map(e=>e.min),maxes:e.columns.map(e=>e.max),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),embeddedConfig:e.embeddedConfig}};self.postMessage(r);let i=e.columns.map(e=>e.values),a=e.categoricalColumns.map(e=>({name:e.name,indices:e.indices})),o=[...new Set(i.map(e=>e.buffer)),...a.map(e=>e.indices.buffer)],s={type:`data`,dataVersion:jo,dims:e.columns.length,rows:e.rowCount,buffers:i,mins:e.columns.map(e=>e.min),ranges:e.columns.map(e=>e.range),means:e.columns.map(e=>e.mean),categoricalColumns:a};$.postMessage(s,o)}catch(e){let t={type:`error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)}}if(n.type===`encodeColor`){if(!$)return;let{column:e,palette:t,theme:r,colorMap:l}=n,u=r===`light`,d=Fo.get(e);if(d){let t;if(l)t=d.map(e=>l[e]??[128,128,128]);else{let e=u?o:a;t=d.length<=i.length?i:[...i,...Array(Math.ceil((d.length-i.length)/e.length)).fill(void 0).flatMap(()=>e)]}let n=Ao(t),r={type:`setColorCategorical`,dataVersion:jo,catColumnName:e,palette:n};$.postMessage(r,[n.buffer]);return}let f=Mo.indexOf(e);if(f>=0){let n=No.get(e)??0,r=Po.get(e)??1,i=t===`magma`?c:s,a=Ao(u?[...i].reverse():i),o={type:`setColorContinuous`,dataVersion:jo,columnIndex:f,min:n,range:r,colormap:a};$.postMessage(o,[a.buffer])}}if(n.type===`encodeColor2D`){if(!$)return;let{columnX:e,columnY:i,colormap:a}=n,o=Mo.indexOf(e),s=Mo.indexOf(i);if(o<0||s<0)return;let c=t[a]??0,l=r(c),u=[];l&&u.push(l.buffer);let d={type:`setColor2D`,dataVersion:jo,columnIndexX:o,columnIndexY:s,minX:No.get(e)??0,rangeX:Po.get(e)??1,minY:No.get(i)??0,rangeY:Po.get(i)??1,lut:l,mapIndex:c};$.postMessage(d,u)}if(n.type===`selectByColumn`){if(!$||Io===0)return;let{column:e,labelIndices:t,valueRanges:r}=n,i=Fo.get(e);if(i&&t&&t.length>0){let n=new Uint32Array(i.length);for(let e of t)e<n.length&&(n[e]=1);let r={type:`selectCategorical`,dataVersion:jo,catColumnName:e,selectedLabels:n};$.postMessage(r,[n.buffer]);return}let a=Mo.indexOf(e);if(a>=0&&r&&r.length>=2){let e={type:`selectContinuous`,dataVersion:jo,columnIndex:a,ranges:r};$.postMessage(e,[r.buffer]);return}}};", f = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", d], { type: "text/javascript;charset=utf-8" });
|
|
2618
|
+
function p(e) {
|
|
2611
2619
|
let t;
|
|
2612
2620
|
try {
|
|
2613
|
-
if (t =
|
|
2621
|
+
if (t = f && (self.URL || self.webkitURL).createObjectURL(f), !t) throw "";
|
|
2614
2622
|
let n = new Worker(t, {
|
|
2615
2623
|
type: "module",
|
|
2616
2624
|
name: e?.name
|
|
@@ -2619,7 +2627,7 @@ function f(e) {
|
|
|
2619
2627
|
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
2620
2628
|
}), n;
|
|
2621
2629
|
} catch {
|
|
2622
|
-
return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(
|
|
2630
|
+
return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(d), {
|
|
2623
2631
|
type: "module",
|
|
2624
2632
|
name: e?.name
|
|
2625
2633
|
});
|
|
@@ -2627,11 +2635,11 @@ function f(e) {
|
|
|
2627
2635
|
}
|
|
2628
2636
|
//#endregion
|
|
2629
2637
|
//#region src/gpu/worker.ts?worker&inline
|
|
2630
|
-
var p = "var e=`// PCA compute shader — two-pass reduction to compute covariance matrix.\n//\n// Pass 1 (reduce_partial): Each workgroup reduces its chunk of points into\n// per-workgroup partial sums for d means + d*(d+1)/2 cross-product terms.\n//\n// Pass 2 (final_reduce): A single workgroup reduces all partial sums into\n// the final means and covariance matrix.\n//\n// Data is normalized identically to the projection shader:\n// v = (raw - center) / range\n\nstruct PcaParams {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: PcaParams;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n@group(0) @binding(3) var<storage, read_write> partials: array<f32>;\n// result layout: [mean_0 .. mean_{d-1}, cov_00, cov_01, ..., cov_{d-1,d-1}]\n// upper-triangle covariance packed as: d1*d - d1*(d1-1)/2 + (d2-d1)\n@group(0) @binding(4) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 32u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn normalize(dim: u32, point_idx: u32, N: u32) -> f32 {\n let raw = data[dim * N + point_idx];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n return (raw - np.x) / range;\n}\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values for this point into registers\n var vals: array<f32, 32>; // MAX_DIMS\n if (valid) {\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] = normalize(dim, i, N);\n }\n }\n\n // Reduce mean terms\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle covariance terms (including diagonal)\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n let ci = cov_idx(d, d1, d2);\n partials[wid.x * num_terms + d + ci] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final means + covariance ────────────\n\n@compute @workgroup_size(256)\nfn final_reduce(\n @builtin(local_invocation_id) lid: vec3u,\n) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n // For each term, reduce across all workgroups\n for (var t = 0u; t < num_terms; t++) {\n // Each thread accumulates a stride of workgroups\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n // Store as E[X] or E[XY]\n result[t] = wg_reduce[0] / N_f32;\n }\n workgroupBarrier();\n }\n\n // Correct covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const t=(e,t)=>{let n=e,r=new Float32Array(t*t);for(let e=0;e<t;e++)r[e*t+e]=1;let i=1e-10;for(let e=0;e<50;e++){let e=0;for(let r=0;r<t;r++)for(let i=r+1;i<t;i++)e+=n[r*t+i]*n[r*t+i];if(e<i)break;for(let e=0;e<t;e++)for(let a=e+1;a<t;a++){let o=n[e*t+a];if(Math.abs(o)<i*.01)continue;let s=n[e*t+e],c=n[a*t+a],l=(c-s)/(2*o),u=Math.sign(l)/(Math.abs(l)+Math.sqrt(1+l*l)),d=1/Math.sqrt(1+u*u),f=u*d;n[e*t+e]=s-u*o,n[a*t+a]=c+u*o,n[e*t+a]=0,n[a*t+e]=0;for(let r=0;r<t;r++){if(r===e||r===a)continue;let i=n[r*t+e],o=n[r*t+a];n[r*t+e]=d*i-f*o,n[e*t+r]=d*i-f*o,n[r*t+a]=f*i+d*o,n[a*t+r]=f*i+d*o}for(let n=0;n<t;n++){let i=r[n*t+e],o=r[n*t+a];r[n*t+e]=d*i-f*o,r[n*t+a]=f*i+d*o}}}let a=new Float32Array(t),o=Array.from({length:t},(e,t)=>t);for(let e=0;e<t;e++)a[e]=n[e*t+e];o.sort((e,t)=>a[t]-a[e]);let s=new Float32Array(t),c=[];for(let e=0;e<t;e++){let n=o[e];s[e]=a[n];let i=new Float32Array(t);for(let e=0;e<t;e++)i[e]=r[e*t+n];c.push(i)}return{eigenvalues:s,eigenvectors:c}},n=t=>{let n=t.createShaderModule({label:`compute-pca`,code:e}),r=t.createBindGroupLayout({label:`pca-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),i=t.createPipelineLayout({bindGroupLayouts:[r]});return{partialPipeline:t.createComputePipeline({label:`pca-partial-pipeline`,layout:i,compute:{module:n,entryPoint:`reduce_partial`}}),finalPipeline:t.createComputePipeline({label:`pca-final-pipeline`,layout:i,compute:{module:n,entryPoint:`final_reduce`}}),bindGroupLayout:r,paramsBuffer:t.createBuffer({label:`pca-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},r=async(e,n,r,i,a,o)=>{let s=Math.min(o,32),c=s+s*(s+1)/2,l=Math.ceil(a/256),u=new ArrayBuffer(16),d=new Uint32Array(u);d[0]=a,d[1]=s,d[2]=l,d[3]=0,e.queue.writeBuffer(n.paramsBuffer,0,u);let f=e.createBuffer({label:`pca-partials`,size:l*c*4,usage:GPUBufferUsage.STORAGE}),p=c*4,m=e.createBuffer({label:`pca-result`,size:p,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`pca-readback`,size:p,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`pca-bg`,layout:n.bindGroupLayout,entries:[{binding:0,resource:{buffer:n.paramsBuffer}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`pca-compute`}),v=_.beginComputePass({label:`pca-partial`});v.setPipeline(n.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(l),v.end();let y=_.beginComputePass({label:`pca-final`});y.setPipeline(n.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,p),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();h.unmap(),f.destroy(),m.destroy(),h.destroy();let x=new Float32Array(s*s);for(let e=0;e<s;e++)for(let t=e;t<s;t++){let n=e*s-e*(e-1)/2+(t-e);x[e*s+t]=b[s+n],x[t*s+e]=b[s+n]}return t(x,s)},i=(e,t)=>{let n=e.getContext(`webgpu`);if(!n)throw Error(`Failed to get WebGPU context from canvas. Ensure WebGPU is supported and the canvas is valid.`);let r=navigator.gpu.getPreferredCanvasFormat();return n.configure({device:t,format:r,alphaMode:`premultiplied`}),{canvas:e,context:n,format:r}},a=2e6,o=(e,t,n,r,i,o=[0,0,0])=>{let s=e.beginRenderPass({colorAttachments:[{view:t,clearValue:{r:o[0],g:o[1],b:o[2],a:1},loadOp:`clear`,storeOp:`store`}]});if(i>0){s.setPipeline(n),s.setBindGroup(0,r);for(let e=0;e<i;e+=a){let t=Math.min(a,i-e);s.draw(4,t,0,e)}}s.end()},s=(e,t,n,r)=>{let i=e.beginRenderPass({colorAttachments:[{view:t.context.getCurrentTexture().createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});i.setPipeline(n),i.setBindGroup(0,r),i.draw(3),i.end()},c=1e-10,l=e=>{let t=e[0],n=e[1],r=e[2],i=e[3],a=t*t+r*r,o=t*n+r*i,s=n*n+i*i,l=a+s,u=a*s-o*o,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(o)>c){let e=f-s,t=Math.sqrt(e*e+o*o);_[0]=e/t,_[1]=o/t;let n=p-s,r=Math.sqrt(n*n+o*o);_[2]=n/r,_[3]=o/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>c&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+i*_[1])/m),h>c&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+i*_[3])/h),m<=c&&h>c?(v[0]=-v[3],v[2]=v[1]):h<=c&&m>c?(v[1]=-v[2],v[3]=v[0]):m<=c&&h<=c&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},u=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},d=(e,t,n,r,i,a,o,s=!0)=>{let c=o*o,l=c*o,d=.5*(-o+2*c-l),f=.5*(2-5*c+3*l),p=.5*(o+4*c-3*l),m=.5*(-c+l);for(let o=0;o<a*2;o++)e[o]=d*t[o]+f*n[o]+p*r[o]+m*i[o];return s&&u(e,a),e},f=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=l(r),a=Math.acos(Math.max(-1,Math.min(1,i[0]))),o=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(a*a+o*o)},p=(e,t,n=!0)=>{let r=e.length,i=new Float32Array(r+1);if(i[0]=0,!n){for(let e=1;e<=r;e++)i[e]=e/r;return i}let a=new Float32Array(t*2),o=new Float32Array(t*2);for(let n=0;n<r;n++){let s=(n-1+r)%r,c=n,l=(n+1)%r,u=(n+2)%r,p=0;d(a,e[s],e[c],e[l],e[u],t,0);for(let n=1;n<=8;n++){let r=n/8;d(o,e[s],e[c],e[l],e[u],t,r),p+=f(a,o,t),a.set(o)}i[n+1]=i[n]+p}let s=i[r];if(s>1e-10)for(let e=1;e<=r;e++)i[e]=i[e]/s;return i},m=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},h=(e,t,n,r,i,a=!0)=>{let o=t.length,{segment:s,localT:c}=m(n,i),l=(s-1+o)%o,u=s,f=(s+1)%o,p=(s+2)%o;return d(e,t[l],t[u],t[f],t[p],r,c,a)};var g=`// GPU categorical selection (bit-packed output)\n//\n// For each point, checks if its category index is in the selected set.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n num_labels: u32,\n}\n\n@group(0) @binding(0) var<storage, read> indices: array<u32>;\n@group(0) @binding(1) var<storage, read> selected: array<u32>; // 1 per label: selected or not\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n let idx = indices[i];\n if (idx < params.num_labels && selected[idx] > 0u) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n }\n}\n`,_=`// GPU continuous selection (bit-packed output)\n//\n// For each point, checks if the column value falls within any [lo, hi] range.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n column_offset: u32, // columnIndex * numPoints\n num_ranges: u32,\n}\n\n@group(0) @binding(0) var<storage, read> data: array<f32>;\n@group(0) @binding(1) var<storage, read> ranges: array<f32>; // [lo0, hi0, lo1, hi1, ...]\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let v = data[params.column_offset + i];\n for (var r = 0u; r < params.num_ranges; r++) {\n if (v >= ranges[r * 2u] && v <= ranges[r * 2u + 1u]) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n break;\n }\n }\n}\n`;const v=e=>{let t=e.createBindGroupLayout({label:`color-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),n=e.createPipelineLayout({bindGroupLayouts:[t]}),r=(t,r)=>e.createComputePipeline({label:t,layout:n,compute:{module:e.createShaderModule({label:t,code:r}),entryPoint:`main`}}),i=e.createBuffer({label:`color-params`,size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return{selectContinuous:r(`select-continuous`,_),selectCategorical:r(`select-categorical`,g),bindGroupLayout:t,paramsBuffer:i}},y=(e,t,n,r,i,a)=>e.createBindGroup({label:`color-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}}]}),b=(e,t,n,r,i)=>{let a=new ArrayBuffer(32),o=new Uint32Array(a);o[0]=n,o[1]=r,o[2]=i,e.queue.writeBuffer(t,0,a)},x=(e,t,n,r)=>{let i=new ArrayBuffer(32),a=new Uint32Array(i);a[0]=n,a[1]=r,e.queue.writeBuffer(t,0,i)},ee=async()=>{if(!navigator.gpu)throw Error(`WebGPU is not supported in this environment. Please use Chrome 113+, Edge 113+, or Firefox Nightly with WebGPU enabled.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter found. Your GPU may not support WebGPU, or the browser may have blocked access.`);if(!e.features.has(`float32-blendable`))throw Error(`Your GPU does not support float32-blendable, which is required for HDR rendering. Please try a different browser or device with a GPU that supports this WebGPU feature.`);let t=await e.requestDevice({label:`dtour-scatter`,requiredFeatures:[`float32-blendable`],requiredLimits:{maxStorageBufferBindingSize:e.limits.maxStorageBufferBindingSize,maxBufferSize:e.limits.maxBufferSize}});return t.lost.then(e=>{console.error(`WebGPU device lost: ${e.message} (reason: ${e.reason})`)}),{adapter:e,device:t}};var S=`// Point renderer — instanced quads with SDF circle anti-aliasing\n//\n// Projects raw ND data to 2D inline using pre-adjusted basis weights and\n// biases (normalization folded into the basis on CPU). This eliminates the\n// separate compute-projection pass and its GPU barrier.\n//\n// Trade-off: the projection loop runs once per vertex (4x per point) since\n// vertex shaders can't share results across a strip. This is a net win\n// because eliminating the compute dispatch + barrier + projected-buffer\n// read costs more than the redundant ALU, and GPUs are throughput-oriented.\n// For very high dim counts (>200) this balance may shift — profile first.\n//\n// Applies 2D camera transform (pan/zoom/aspect). Each point is rendered as\n// a unit quad (triangle strip, 4 vertices) scaled by point_size (NDC units).\n//\n// Color mapping: instead of a pre-computed N-element color buffer, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n// This eliminates the 20MB color buffer for 5M points and makes color changes\n// instant (just swap the ~100-byte LUT + update uniforms).\n\nstruct Uniforms {\n point_size: f32,\n opacity: f32,\n // Color mode: 0 = uniform color, 1 = continuous, 2 = categorical\n color_mode: u32,\n useSelectionMask: f32,\n color: vec4f,\n useSubtractive: f32,\n num_points: u32,\n num_dims: u32,\n max_points: u32,\n bias: vec2f,\n // Color mapping params (used when color_mode > 0)\n color_column_offset: u32, // columnIndex * num_points (continuous only)\n color_min: f32,\n color_range: f32,\n color_num_stops: u32, // LUT size\n bias_z: f32, // z-axis bias (3D mode only)\n // 2D colormap params (used when color_mode == 3)\n color_column_offset_v: u32, // second column index * num_points\n color_min_v: f32,\n color_range_v: f32,\n color2d_map_index: u32, // 0-5 = LUT-based, 6 = oklab_polar\n scale_opacity_by_zoom: f32, // 1.0 = auto (zoom² density scaling), 0.0 = manual (fixed)\n}\n\nstruct Camera {\n pan_x: f32,\n pan_y: f32,\n zoom: f32,\n aspect: f32,\n viewport_height: f32,\n // NDC-space Y offset applied after zoom — used to shift the viewport\n // down when a toolbar covers the top of the canvas.\n inset_offset_y: f32,\n // Zoom multiplier for the inset — scales content to fit in the visible\n // area below the toolbar (typically (H - toolbar) / H).\n inset_zoom: f32,\n // 3D camera rotation: 0.0 = 2D mode (skip z projection), 1.0 = 3D mode\n use_3d: f32,\n // 3×3 rotation matrix (column-major, each column padded to vec4f for alignment)\n rot_col0: vec3f,\n _pad0: f32,\n rot_col1: vec3f,\n _pad1: f32,\n rot_col2: vec3f,\n _pad2: f32,\n}\n\n@group(0) @binding(0) var<uniform> uni: Uniforms;\n// Raw ND data (column-major): dim0[0..N], dim1[0..N], ..., dimP[0..N]\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<uniform> camera: Camera;\n// Colormap/palette LUT — packed RGBA8 u32 entries (25 for continuous, up to 256 for categorical)\n@group(0) @binding(3) var<storage, read> colorLut: array<u32>;\n// Bit-packed selection mask (1 bit per point, 32 per u32)\n@group(0) @binding(4) var<storage, read> selectionMask: array<u32>;\n// Adjusted basis weights (normalization folded in):\n// first num_dims = x-weights, next num_dims = y-weights\n// adj_basis[d] = basis[d] / range[d] * viewport_scale\n@group(0) @binding(5) var<storage, read> adj_basis: array<f32>;\n// Categorical index buffer (per-point category index, used when color_mode == 2)\n@group(0) @binding(6) var<storage, read> catIndices: array<u32>;\n\nstruct VertOut {\n @builtin(position) clip_pos: vec4f,\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n}\n\n// Triangle strip: 4 vertices forming a unit quad [-1, 1]²\nfn quad_vertex(vi: u32) -> vec2f {\n switch vi {\n case 0u: { return vec2f(-1.0, -1.0); }\n case 1u: { return vec2f( 1.0, -1.0); }\n case 2u: { return vec2f(-1.0, 1.0); }\n default: { return vec2f( 1.0, 1.0); }\n }\n}\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nfn unpackColor(packed: u32) -> vec4f {\n let r = f32(packed & 0xFFu) / 255.0;\n let g = f32((packed >> 8u) & 0xFFu) / 255.0;\n let b = f32((packed >> 16u) & 0xFFu) / 255.0;\n let a = f32((packed >> 24u) & 0xFFu) / 255.0;\n return vec4f(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from instance index.\n// Used for vertex-shader decimation when num_points > max_points.\nfn pcg_hash(input: u32) -> u32 {\n var state = input * 747796405u + 2891336453u;\n let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfn random_float(seed: u32) -> f32 {\n return f32(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ─── 2D Colormap helpers ──────────────────────────────────────────────────\n\n// Read f32 from the colorLut buffer (which stores u32). Used for 2D colormap LUT curves.\nfn lut_f32(index: u32) -> f32 {\n return bitcast<f32>(colorLut[index]);\n}\n\n// Linearly interpolate a 16-entry LUT curve stored in colorLut at the given base offset.\nfn lut_interp(base: u32, t: f32) -> f32 {\n let pos = t * 15.0;\n let lo = min(u32(floor(pos)), 14u);\n let hi = lo + 1u;\n return mix(lut_f32(base + lo), lut_f32(base + hi), fract(pos));\n}\n\n// Reconstruct a 2D colormap color from SVD rank-1 LUT curves stored in colorLut.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nfn colormap2d_lut(u: f32, v: f32) -> vec3f {\n let r = lut_interp(0u, u) * lut_interp(16u, v);\n let g = lut_interp(32u, u) * lut_interp(48u, v);\n let b = lut_interp(64u, u) * lut_interp(80u, v)\n + lut_interp(96u, u) * lut_interp(112u, v); // rank-2 correction\n return clamp(vec3f(r, g, b), vec3f(0.0), vec3f(1.0));\n}\n\n// Oklab → linear sRGB conversion\nfn oklab_to_linear(L: f32, a: f32, b: f32) -> vec3f {\n let l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n let m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n let s_ = L - 0.0894841775 * a - 1.2914855480 * b;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n return vec3f(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nfn colormap2d_oklab_polar(u: f32, v: f32) -> vec3f {\n let cx = u - 0.5;\n let cy = v - 0.5;\n let radius = min(length(vec2f(cx, cy)) * 2.0, 1.0);\n let angle = atan2(cy, cx);\n let chroma = radius * 0.25;\n let lightness = 0.80 - radius * 0.30;\n let a_val = chroma * cos(angle);\n let b_val = chroma * sin(angle);\n let linear = oklab_to_linear(lightness, a_val, b_val);\n // Linear to sRGB gamma (approximate)\n return pow(clamp(linear, vec3f(0.0), vec3f(1.0)), vec3f(1.0 / 2.2));\n}\n\n// Dispatch 2D colormap by index\nfn colormap2d(map_index: u32, u: f32, v: f32) -> vec3f {\n if map_index == 6u {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\n@vertex\nfn vs_main(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) ii: u32,\n) -> VertOut {\n // Vertex-shader decimation: skip expensive projection for excess points.\n // Early exit before the ND projection loop saves ~50 cycles per rejected point.\n if (uni.max_points > 0u && uni.num_points > uni.max_points) {\n let threshold = f32(uni.max_points) / f32(uni.num_points);\n if (random_float(ii) > threshold) {\n var out: VertOut;\n out.clip_pos = vec4f(0.0, 0.0, 0.0, 0.0);\n out.uv = vec2f(0.0);\n out.point_color = vec4f(0.0);\n out.selected = 0u;\n out.effective_opacity = 0.0;\n return out;\n }\n }\n\n // Inline ND → 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n // Must produce the same result as compute-projection.wgsl (used for lasso).\n let N = uni.num_points;\n let p = uni.num_dims;\n var x = uni.bias.x;\n var y = uni.bias.y;\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + ii];\n x += raw * adj_basis[d];\n y += raw * adj_basis[p + d];\n }\n\n // 3D camera rotation: project z-axis, rotate, then discard z (orthographic).\n if (camera.use_3d > 0.5) {\n var z = uni.bias_z;\n for (var d = 0u; d < p; d++) {\n z += data[d * N + ii] * adj_basis[2u * p + d];\n }\n let pos3 = vec3f(x, y, z);\n let rot = mat3x3f(camera.rot_col0, camera.rot_col1, camera.rot_col2);\n let rotated = rot * pos3;\n x = rotated.x;\n y = rotated.y;\n // z discarded — orthographic projection\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n // inset_zoom shrinks the scene to fit below the toolbar;\n // inset_offset_y shifts it down so it's centered in the visible area.\n let iz = camera.inset_zoom;\n let center = vec2f(\n (x + camera.pan_x) * camera.zoom * iz / camera.aspect,\n (y + camera.pan_y) * camera.zoom * iz + camera.inset_offset_y,\n );\n\n let q = quad_vertex(vi);\n // Clamp point size to [2, 32] pixels (physical).\n // min_ndc ensures points are always at least 2px — 1px quads can miss pixel\n // centers entirely depending on sub-pixel alignment, producing no fragments.\n let min_ndc = 4.0 / camera.viewport_height;\n let max_ndc = 64.0 / camera.viewport_height;\n let point_size = clamp(uni.point_size, min_ndc, max_ndc);\n // Aspect-correct the offset so circles stay circular on non-square canvases\n let offset = vec2f(q.x / camera.aspect, q.y) * (point_size * 0.5);\n\n // Scale opacity by zoom² to keep constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n let z = camera.zoom * camera.inset_zoom;\n let zoom_scale = select(1.0, z * z, uni.scale_opacity_by_zoom > 0.5);\n let eff_opacity = uni.opacity * zoom_scale;\n\n // Resolve per-point color from LUT\n var col: vec4f;\n if uni.color_mode == 1u {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n let raw = data[uni.color_column_offset + ii];\n let inv_range = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let t = clamp((raw - uni.color_min) * inv_range, 0.0, 1.0);\n let stops = f32(uni.color_num_stops - 1u);\n let pos = t * stops;\n let idx = min(u32(floor(pos)), uni.color_num_stops - 2u);\n let frac = pos - f32(idx);\n let c0 = unpackColor(colorLut[idx]);\n let c1 = unpackColor(colorLut[idx + 1u]);\n col = mix(c0, c1, frac);\n } else if uni.color_mode == 2u {\n // Categorical: read category index, direct palette lookup\n let catIdx = catIndices[ii];\n col = unpackColor(colorLut[catIdx % uni.color_num_stops]);\n } else if uni.color_mode == 3u {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n let raw_u = data[uni.color_column_offset + ii];\n let raw_v = data[uni.color_column_offset_v + ii];\n let inv_range_u = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let inv_range_v = select(0.0, 1.0 / uni.color_range_v, uni.color_range_v > 0.0);\n let u_val = clamp((raw_u - uni.color_min) * inv_range_u, 0.0, 1.0);\n let v_val = clamp((raw_v - uni.color_min_v) * inv_range_v, 0.0, 1.0);\n let rgb = colormap2d(uni.color2d_map_index, u_val, v_val);\n col = vec4f(rgb, 1.0);\n } else {\n col = uni.color;\n }\n\n // Read selection\n var sel: u32 = 1u;\n if uni.useSelectionMask > 0.5 {\n sel = (selectionMask[ii / 32u] >> (ii % 32u)) & 1u;\n }\n\n var out: VertOut;\n out.clip_pos = vec4f(center + offset, 0.0, 1.0);\n out.uv = q;\n out.point_color = col;\n out.selected = sel;\n out.effective_opacity = eff_opacity;\n return out;\n}\n\n// Shared fragment helper — computes edge, selection factor, and intensity.\nfn fragment_intensity(\n uv: vec2f,\n point_alpha: f32,\n selected: u32,\n effective_opacity: f32,\n) -> f32 {\n let dist = length(uv);\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n let edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n var sel_factor = 1.0;\n if uni.useSelectionMask > 0.5 {\n if selected == 0u {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(effective_opacity, 0.01);\n }\n }\n\n return edge * effective_opacity * point_alpha * sel_factor;\n}\n\n// ─── Fragment: single-target (additive / subtractive) ──────────────────────\n\n@fragment\nfn fs_main(\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n) -> @location(0) vec4f {\n let intensity = fragment_intensity(uv, point_color.a, selected, effective_opacity);\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n let rgb = select(point_color.rgb, vec3f(1.0) - point_color.rgb, uni.useSubtractive > 0.5);\n return vec4f(rgb * intensity, intensity);\n}\n`,C=`// Fullscreen tone-map pass — reads an HDR float texture and maps to [0,1]\n// for the canvas. Uses a single oversized triangle (3 vertices, no vertex\n// buffer) to cover the viewport.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n// Values are already bounded; tone mapping is identity.\n\nstruct Params {\n mode: f32,\n}\n\n@group(0) @binding(0) var hdrTexture: texture_2d<f32>;\n@group(0) @binding(1) var<uniform> params: Params;\n\n@vertex\nfn vs(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4f {\n // Oversized triangle covering the full clip space:\n // vi=0 → (-1, -1) vi=1 → (3, -1) vi=2 → (-1, 3)\n let x = f32(i32(vi) / 2) * 4.0 - 1.0;\n let y = f32(i32(vi) % 2) * 4.0 - 1.0;\n return vec4f(x, y, 0.0, 1.0);\n}\n\n@fragment\nfn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f {\n let hdr = textureLoad(hdrTexture, vec2u(pos.xy), 0);\n\n var mapped: vec3f;\n if params.mode < 0.5 {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3f(0.0), vec3f(1.0));\n }\n return vec4f(mapped, 1.0);\n}\n`;const w={pointSize:.012,opacity:.7,color:[.25,.5,.9],scaleOpacityByZoom:!0},T={useSelectionMask:!1},E={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},te={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},D=new ArrayBuffer(96),O=new Float32Array(D),k=new Uint32Array(D),A=new Float32Array(80/4),j=new Float32Array(4),ne=(e,t=`rgba32float`)=>{let n=e.createShaderModule({label:`point-shader`,code:S}),r=e.createBindGroupLayout({label:`point-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:5,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:6,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}}]}),i=e.createPipelineLayout({bindGroupLayouts:[r]}),a=e.createRenderPipeline({label:`point-pipeline-additive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),o=e.createRenderPipeline({label:`point-pipeline-normal`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-strip`}}),s=e.createRenderPipeline({label:`point-pipeline-subtractive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{operation:`reverse-subtract`,srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),c=e.createBuffer({label:`point-uniforms`,size:96,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),l=e.createBuffer({label:`camera-uniforms`,size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),u=e.createBuffer({label:`default-color-lut-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),d=e.createBuffer({label:`default-selection-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),f=e.createBuffer({label:`default-cat-indices-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return M(e,c,w,T,E),re(e,l,te),{additivePipeline:a,normalPipeline:o,subtractivePipeline:s,bindGroupLayout:r,uniformBuffer:c,cameraBuffer:l,defaultColorLutBuffer:u,defaultSelectionBuffer:d,defaultCatIndicesBuffer:f}},M=(e,t,n,r=T,i=E,a=!1,o=0,s=0,c=0,l=0,u=0,d=0)=>{O[0]=n.pointSize,O[1]=n.opacity,k[2]=i.mode,O[3]=r.useSelectionMask?1:0,O[4]=n.color[0],O[5]=n.color[1],O[6]=n.color[2],O[7]=1,O[8]=a?1:0,k[9]=o,k[10]=s,k[11]=u,O[12]=c,O[13]=l,k[14]=i.columnOffset,O[15]=i.min,O[16]=i.range,k[17]=i.numStops,O[18]=d,k[19]=i.columnOffsetV,O[20]=i.minV,O[21]=i.rangeV,k[22]=i.mapIndex,O[23]=n.scaleOpacityByZoom?1:0,e.queue.writeBuffer(t,0,D)},re=(e,t,n)=>{A[0]=n.panX,A[1]=n.panY,A[2]=n.zoom,A[3]=n.aspect,A[4]=n.viewportHeight,A[5]=n.insetOffsetY,A[6]=n.insetZoom,A[7]=n.use3d?1:0;let r=n.rotation;A[8]=r?r[0]:1,A[9]=r?r[1]:0,A[10]=r?r[2]:0,A[11]=0,A[12]=r?r[3]:0,A[13]=r?r[4]:1,A[14]=r?r[5]:0,A[15]=0,A[16]=r?r[6]:0,A[17]=r?r[7]:0,A[18]=r?r[8]:1,A[19]=0,e.queue.writeBuffer(t,0,A)},ie=(e,t,n,r,i,a,o,s,c)=>e.createBindGroup({label:`point-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}},{binding:4,resource:{buffer:o}},{binding:5,resource:{buffer:s}},{binding:6,resource:{buffer:c}}]}),ae=(e,t,n)=>{j[0]=n,e.queue.writeBuffer(t,0,j,0,1)},oe=(e,t)=>{let n=e.createShaderModule({label:`tonemap-shader`,code:C}),r=e.createBindGroupLayout({label:`tonemap-bgl`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`unfilterable-float`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]});return{pipeline:e.createRenderPipeline({label:`tonemap-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[r]}),vertex:{module:n,entryPoint:`vs`},fragment:{module:n,entryPoint:`fs`,targets:[{format:t}]},primitive:{topology:`triangle-list`}}),bindGroupLayout:r,paramsBuffer:e.createBuffer({label:`tonemap-params`,size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},se=(e,t,n,r)=>e.createBindGroup({label:`tonemap-bg`,layout:t,entries:[{binding:0,resource:n},{binding:1,resource:{buffer:r}}]});var ce=`// ND → 2D projection compute shader (used only for lasso selection readback)\n//\n// Reads p-dimensional point data from a single concatenated storage buffer\n// (column-major: dim0[0..N], dim1[0..N], ..., dimP[0..N]),\n// normalizes each dimension using per-dim [center, range] params,\n// and projects to 2D using the supplied p×2 basis matrix.\n//\n// Output: N interleaved [x, y] pairs in the projected buffer.\n//\n// IMPORTANT: This must stay mathematically equivalent to the render-path\n// projection in point.wgsl + computeAdjustedBasis() in worker.ts.\n// The render path folds normalization into the basis on CPU (adj_basis, bias)\n// while this shader normalizes per-point on GPU. Both produce identical\n// projected coordinates: ((raw - center) / range) * basis * viewport_scale.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n viewport_scale: f32,\n _pad: f32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n// norm_params[d] = vec2f(center, range) for dimension d\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> projected: array<f32>;\n\n@compute @workgroup_size(256)\nfn project(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let N = params.num_points;\n let p = params.num_dims;\n\n var x = 0.0;\n var y = 0.0;\n\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + i];\n let np = norm_params[d];\n let range = max(np.y, 1e-6);\n let v = (raw - np.x) / range;\n\n x += v * basis[d];\n y += v * basis[p + d];\n }\n\n projected[i * 2u] = x * params.viewport_scale;\n projected[i * 2u + 1u] = y * params.viewport_scale;\n}\n`;const le=e=>{let t=e.createShaderModule({label:`compute-projection`,code:ce}),n=e.createBindGroupLayout({label:`projection-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]});return{pipeline:e.createComputePipeline({label:`projection-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:t,entryPoint:`project`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`projection-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ue=(e,t,n,r,i)=>{let a=new ArrayBuffer(16),o=new Uint32Array(a),s=new Float32Array(a);o[0]=n,o[1]=r,s[2]=i,s[3]=0,e.queue.writeBuffer(t,0,a)},de=(e,t,n)=>({dataBuffer:e.createBuffer({label:`nd-data`,size:t*n*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),normParamsBuffer:e.createBuffer({label:`norm-params`,size:n*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),basisBuffer:e.createBuffer({label:`basis`,size:n*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),projectedBuffer:e.createBuffer({label:`projected`,size:t*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),bindGroup:null}),fe=(e,t,n,r)=>e.createBindGroup({label:`projection-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r.dataBuffer}},{binding:2,resource:{buffer:r.normParamsBuffer}},{binding:3,resource:{buffer:r.basisBuffer}},{binding:4,resource:{buffer:r.projectedBuffer}}]}),pe=(e,t,n,r)=>{let i=e.createCommandEncoder({label:`projection-dispatch`}),a=i.beginComputePass({label:`project-points`});return a.setPipeline(t.pipeline),a.setBindGroup(0,n),a.dispatchWorkgroups(Math.ceil(r/256)),a.end(),i.finish()};var me=`// Residual-PC compute shader — two-pass reduction.\n//\n// Computes the covariance matrix of the residual after projecting out\n// the current p×2 tour basis. The top eigenvector of this covariance\n// is the \"most informative direction not currently visible.\"\n//\n// Pass 1 (reduce_partial): each workgroup reduces its chunk of N points\n// into partial sums for p means + p*(p+1)/2 upper-triangle cross-products\n// of the per-point residuals.\n//\n// Pass 2 (final_reduce): one workgroup sums all partial sums → final\n// mean-corrected covariance. Result layout:\n// [mean_0 .. mean_{p-1}, cov_00, cov_01, ..., cov_{p-1,p-1}]\n// where the covariance entries are the upper triangle packed as:\n// index(d1,d2) = d1*p - d1*(d1-1)/2 + (d2-d1) (d2 >= d1)\n//\n// Power iteration (15 steps) is performed on the CPU after readback;\n// p is always small (≤64) so this is negligible.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> partials: array<f32>;\n@group(0) @binding(5) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 64u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values into registers, then project out the 2D basis.\n var vals: array<f32, 64>;\n if (valid) {\n var dot_x = 0.0;\n var dot_y = 0.0;\n for (var dim = 0u; dim < d; dim++) {\n let raw = data[dim * N + i];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n let norm = (raw - np.x) / range;\n vals[dim] = norm;\n dot_x += norm * basis[dim];\n dot_y += norm * basis[d + dim];\n }\n // Subtract projection onto span{bx, by} → residual is orthogonal to basis\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] -= dot_x * basis[dim] + dot_y * basis[d + dim];\n }\n }\n\n // Reduce mean terms (used for mean-correction in pass 2)\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle cross-products\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + d + cov_idx(d, d1, d2)] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final mean-corrected covariance ─────\n\n@compute @workgroup_size(256)\nfn final_reduce(@builtin(local_invocation_id) lid: vec3u) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n for (var t = 0u; t < num_terms; t++) {\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) { result[t] = wg_reduce[0] / N_f32; }\n workgroupBarrier();\n }\n\n // Mean-corrected covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const he=e=>{let t=e.createShaderModule({label:`compute-residual-pc`,code:me}),n=e.createBindGroupLayout({label:`residual-pc-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),r=e.createPipelineLayout({bindGroupLayouts:[n]});return{partialPipeline:e.createComputePipeline({label:`residual-pc-partial`,layout:r,compute:{module:t,entryPoint:`reduce_partial`}}),finalPipeline:e.createComputePipeline({label:`residual-pc-final`,layout:r,compute:{module:t,entryPoint:`final_reduce`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`residual-pc-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ge=async(e,t,n,r,i,a,o,s)=>{let c=Math.min(s,64),l=c+c*(c+1)/2,u=Math.ceil(o/256),d=new ArrayBuffer(16),f=new Uint32Array(d);f[0]=o,f[1]=c,f[2]=u,f[3]=0,e.queue.writeBuffer(t.paramsBuffer,0,d);let p=e.createBuffer({label:`residual-pc-partials`,size:u*l*4,usage:GPUBufferUsage.STORAGE}),m=e.createBuffer({label:`residual-pc-result`,size:l*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`residual-pc-readback`,size:l*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`residual-pc-bg`,layout:t.bindGroupLayout,entries:[{binding:0,resource:{buffer:t.paramsBuffer}},{binding:1,resource:{buffer:n}},{binding:2,resource:{buffer:r}},{binding:3,resource:{buffer:i}},{binding:4,resource:{buffer:p}},{binding:5,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`residual-pc`}),v=_.beginComputePass({label:`residual-pc-partial`});v.setPipeline(t.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(u),v.end();let y=_.beginComputePass({label:`residual-pc-final`});y.setPipeline(t.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,l*4),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();return h.unmap(),p.destroy(),m.destroy(),h.destroy(),_e(b,c,s,a)},_e=(e,t,n,r)=>{let i=new Float64Array(t*t);for(let n=0;n<t;n++)for(let r=n;r<t;r++){let a=e[t+(n*t-n*(n-1)/2+(r-n))];i[n*t+r]=a,i[r*t+n]=a}let a=new Float64Array(t),o=new Float64Array(t);for(let e=0;e<t;e++)a[e]=r[e],o[e]=r[n+e];let s=new Float64Array(t);for(let e=0;e<t;e++)s[e]=1;N(s,a,o,t),P(s,t);let c=new Float64Array(t);for(let e=0;e<15;e++){for(let e=0;e<t;e++){let n=0;for(let r=0;r<t;r++)n+=i[e*t+r]*s[r];c[e]=n}N(c,a,o,t),P(c,t);let e=s;s=c,c=e}let l=new Float32Array(n);for(let e=0;e<t;e++)l[e]=s[e];return l},N=(e,t,n,r)=>{let i=0,a=0;for(let o=0;o<r;o++)i+=e[o]*t[o],a+=e[o]*n[o];for(let o=0;o<r;o++)e[o]=e[o]-(i*t[o]+a*n[o])},P=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-12)for(let r=0;r<t;r++)e[r]=e[r]/n};let F=null,I=[],L=null;const R=(e,t)=>{self.postMessage(e,t??[])},ve=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=t*r,s=n*r,c=o*s*i/e,l=Math.sqrt(c/Math.PI),u=a*r*.5,d,f;return l>=u?(d=l,f=1):(d=u,f=Math.max(.01,c/(Math.PI*u*u))),{pointSize:2*d/s,opacity:f}},ye=(e,t)=>e*F.dpr/t,be=e=>{let{style:t,numPoints:n,dpr:r}=F;if(t.pointSize!==`auto`&&t.opacity!==`auto`)return{pointSize:ye(t.pointSize,e.height),opacity:t.opacity,color:t.color,scaleOpacityByZoom:!1};let i=ve(n,e.width/r,e.height/r,r,t.fillTarget,t.minPointSize),a=t.opacity===`auto`;return{pointSize:t.pointSize===`auto`?i.pointSize:ye(t.pointSize,e.height),opacity:a?i.opacity:t.opacity,color:t.color,scaleOpacityByZoom:a}},xe=()=>{let{device:e,mainView:t,tonemapPipeline:n}=F,{width:r,height:i}=t.canvas,a=F.mainHdrTexture;if(a&&a.width===r&&a.height===i)return;a?.destroy();let o=e.createTexture({label:`hdr-main`,size:[r,i],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),s=o.createView();F.mainHdrTexture=o,F.mainHdrTextureView=s,F.mainTonemapBindGroup=se(e,n.bindGroupLayout,s,n.paramsBuffer)},Se=()=>{if(!F.previewGpuCanvas)return;let{device:e,tonemapPipeline:t}=F,{width:n,height:r}=F.previewGpuCanvas,i=F.previewHdrTexture;if(i&&i.width===n&&i.height===r)return;i?.destroy();let a=e.createTexture({label:`hdr-preview`,size:[n,r],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=a.createView();F.previewHdrTexture=a,F.previewHdrTextureView=o,F.previewTonemapBindGroup=se(e,t.bindGroupLayout,o,t.paramsBuffer)},Ce=e=>Math.ceil(e/32)*4,we=()=>{if(!F)throw Error(`state not initialized`);let e=Ce(F.numPoints);return(!F.selectionBuffer||F.selectionBuffer.size!==e)&&(F.selectionBuffer?.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST})),F.selectionBuffer};let z=null;const Te=(e,t,n,r,i=2)=>{let a=r*i;(!z||z.length!==a)&&(z=new Float32Array(a));let o=0,s=0,c=0;for(let a=0;a<r;a++){let l=Math.max(n[a],1e-6),u=e[a],d=e[r+a],f=2/l;z[a]=u*f,z[r+a]=d*f;let p=-t[a]/l;if(o+=p*u*2,s+=p*d*2,i===3){let t=e[2*r+a];z[2*r+a]=t*f,c+=p*t*2}}return{weights:z,biasX:o,biasY:s,biasZ:c}},Ee=()=>{if(!F?.normMins||!F?.normRanges)return null;let e=F.numDims,t=new Float32Array(e);if(F.centering===`mean`&&F.normMeans)t.set(F.normMeans);else for(let n=0;n<e;n++)t[n]=F.normMins[n]+F.normRanges[n]*.5;return t},B=()=>{if(!F?.projectionResources||!F.normRanges)return;let e=F.numDims,t=Ee();if(!t)return;let n=new Float32Array(e*2);for(let r=0;r<e;r++)n[r*2]=t[r],n[r*2+1]=F.normRanges[r];F.device.queue.writeBuffer(F.projectionResources.normParamsBuffer,0,n)};let V=null,De=0,H=!0,U=!1;const W=()=>H?(H=!1,U=!1,J(),F.device.queue.onSubmittedWorkDone().then(()=>{H=!0,U&&F&&!V&&(U=!1,W())},()=>{H=!0,R({type:`error`,message:`WebGPU device lost during rendering`})}),!0):(U=!0,!1),Oe=e=>{if(!V||!F?.tour)return;let t=V.prevTime===null?void 0:e-V.prevTime;if(t!==void 0){let e=t/1e3*V.speed*V.direction/20,n=F.tour.position+e;n-=Math.floor(n),F.tour.position=n}V.prevTime=e,F.directBasis=null,W()&&(V.lastRenderedRafTime!==null&&V.frameTimes.push(e-V.lastRenderedRafTime),V.lastRenderedRafTime=e),e-De>=33&&(R({type:`playbackTick`,position:F.tour.position,frameMs:t}),De=e),V.rafId=requestAnimationFrame(Oe)},ke=(e,t)=>{V?(V.speed=e,V.direction=t):(H=!0,V={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},V.rafId=requestAnimationFrame(Oe))},Ae=()=>{if(V){cancelAnimationFrame(V.rafId),F?.tour&&R({type:`playbackTick`,position:F.tour.position});let e=Float64Array.from(V.frameTimes);R({type:`playbackStopped`,frameTimes:e},[e.buffer]),V=null}},G=(e,t,n,r,i,a)=>{if(!F?.projectionResources||!F.adjBasisBuffer||!F.normRanges)return;let{device:c,numPoints:l,numDims:u}=F,d=F.is3dActive&&F.residualPC,f=d?3:2,p;d?(p=new Float32Array(u*3),p.set(e.subarray(0,u*2)),p.set(F.residualPC,u*2)):p=e;let m=Ee();if(!m)return;let{weights:h,biasX:g,biasY:_,biasZ:v}=Te(p,m,F.normRanges,u,f),y=u*f*4;F.adjBasisBuffer.size<y&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=c.createBuffer({label:`adj-basis`,size:y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Y()),c.queue.writeBuffer(F.adjBasisBuffer,0,h);let b=be(t.canvas),x=F.backgroundColor,ee=.2126*x[0]+.7152*x[1]+.0722*x[2],S=F.colorState.mode>0,C=!S&&ee>.5,w,T;S?(w=F.pointPipeline.normalPipeline,T=1):C?(w=F.pointPipeline.subtractivePipeline,T=1):(w=F.pointPipeline.additivePipeline,T=0),M(c,F.pointPipeline.uniformBuffer,b,F.styleFlags,F.colorState,C,l,u,g,_,F.maxPoints,v),ae(c,F.tonemapPipeline.paramsBuffer,T);let E=t.canvas,te=E.width/E.height||1;re(c,F.pointPipeline.cameraBuffer,{...i,aspect:te,viewportHeight:E.height});let D=c.createCommandEncoder({label:`render-frame`});o(D,n,w,a,l,x),s(D,t,F.tonemapPipeline.pipeline,r),c.queue.submit([D.finish()])},je={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},Me=()=>{!F||F.previewGpuCanvas||(F.previewGpuCanvas=new OffscreenCanvas(300,300),F.previewGpuView=i(F.previewGpuCanvas,F.device))};let K=!1;const Ne=(e,t)=>{if(!F?.projectionResources||!F.renderBindGroup)return;let n=F.previewCanvases.get(e);n&&(Me(),Se(),!(!F.previewGpuView||!F.previewHdrTextureView||!F.previewTonemapBindGroup)&&((F.previewGpuCanvas.width!==n.canvas.width||F.previewGpuCanvas.height!==n.canvas.height)&&(F.previewGpuCanvas.width=n.canvas.width,F.previewGpuCanvas.height=n.canvas.height,Se(),!F.previewHdrTextureView||!F.previewTonemapBindGroup)||(G(t,F.previewGpuView,F.previewHdrTextureView,F.previewTonemapBindGroup,je,F.renderBindGroup),n.ctx2d.drawImage(F.previewGpuCanvas,0,0),R({type:`rendered`,viewIndex:e}))))},Pe=()=>{if(!F?.projectionResources||!F.tour)return;let{tour:e,previewCanvases:t}=F;for(let[n]of t)n<e.bases.length&&Ne(n,e.bases[n])},Fe=()=>{K||(K=!0,setTimeout(()=>{K=!1,Pe()},0))},q=()=>{F?.projectionResources&&(J(),Fe())},J=()=>{if(!F?.projectionResources||!F.renderBindGroup||(xe(),!F.mainHdrTextureView||!F.mainTonemapBindGroup))return;if(F.directBasis){G(F.directBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0});return}if(!F.tour)return;let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),G(e.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0})},Y=()=>{if(!F?.projectionResources||!F.adjBasisBuffer)return;let{device:e,projectionPipeline:t,pointPipeline:n,projectionResources:r}=F,i=F.colorLutBuffer??n.defaultColorLutBuffer,a=F.selectionBuffer??n.defaultSelectionBuffer,o=n.defaultCatIndicesBuffer;F.colorState.mode===2&&F.activeCatColumnName&&(o=F.categoricalBuffers.get(F.activeCatColumnName)??o),F.projectionBindGroup=fe(e,t.bindGroupLayout,t.paramsBuffer,r),F.renderBindGroup=ie(e,n.bindGroupLayout,n.uniformBuffer,r.dataBuffer,n.cameraBuffer,i,a,F.adjBasisBuffer,o)},X=()=>{F&&(Y(),(F.tour||F.directBasis)&&F.projectionResources&&q())},Ie=()=>{F&&(F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q())};let Z=0;const Le=e=>{if(!F)return;let{device:t}=F;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==Z)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:a.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,a),F.colorState={mode:1,columnOffset:n*F.numPoints,min:r,range:i,numStops:a.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,X();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==Z)return;let{catColumnName:n,palette:r}=e.data;if(!F.categoricalBuffers.has(n))return;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,r),F.colorState={mode:2,columnOffset:0,min:0,range:1,numStops:r.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=n,X();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==Z)return;let{columnIndexX:n,columnIndexY:r,minX:i,rangeX:a,minY:o,rangeY:s,lut:c,mapIndex:l}=e.data;c&&(F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut-2d`,size:c.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,c)),F.colorState={mode:3,columnOffset:n*F.numPoints,min:i,range:a,numStops:0,columnOffsetV:r*F.numPoints,minV:o,rangeV:s,mapIndex:l},F.activeCatColumnName=null,X();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==Z||!F.projectionResources)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,colorPipelines:a}=F,o=we(),s=t.createBuffer({label:`select-ranges`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(s,0,r),b(t,a.paramsBuffer,i,n*i,r.length/2);let c=y(t,a.bindGroupLayout,F.projectionResources.dataBuffer,s,o,a.paramsBuffer),l=t.createCommandEncoder({label:`select-continuous`});l.clearBuffer(o,0,o.size);let u=l.beginComputePass({label:`select-continuous`});u.setPipeline(a.selectContinuous),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(i/256)),u.end(),t.queue.submit([l.finish()]),s.destroy(),Ie();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==Z)return;let{catColumnName:n,selectedLabels:r}=e.data,i=F.categoricalBuffers.get(n);if(!i)return;let{numPoints:a,colorPipelines:o}=F,s=we(),c=t.createBuffer({label:`selected-labels`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(c,0,r),x(t,o.paramsBuffer,a,r.length);let l=y(t,o.bindGroupLayout,i,c,s,o.paramsBuffer),u=t.createCommandEncoder({label:`select-categorical`});u.clearBuffer(s,0,s.size);let d=u.beginComputePass({label:`select-categorical`});d.setPipeline(o.selectCategorical),d.setBindGroup(0,l),d.dispatchWorkgroups(Math.ceil(a/256)),d.end(),t.queue.submit([u.finish()]),c.destroy(),Ie();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,means:c,categoricalColumns:l}=e.data;if(Z=n,r<2||i===0||a.length<2){R({type:`error`,message:`Need at least 2 dimensions to render`});return}F.projectionResources&&(F.projectionResources.dataBuffer.destroy(),F.projectionResources.normParamsBuffer.destroy(),F.projectionResources.basisBuffer.destroy(),F.projectionResources.projectedBuffer.destroy()),F.adjBasisBuffer&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=null),F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null);for(let e of F.categoricalBuffers.values())e.destroy();F.categoricalBuffers.clear(),F.styleFlags={useSelectionMask:!1},F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,F.is3dActive=!1,F.rotation3d=null,F.residualPC=null,F.camera.use3d=!1,F.camera.rotation=null;let{projectionPipeline:u}=F,d=de(t,i,r);for(let e=0;e<r;e++)t.queue.writeBuffer(d.dataBuffer,e*i*4,a[e]);for(let e of l){let n=t.createBuffer({label:`cat-indices-${e.name}`,size:e.indices.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC});t.queue.writeBuffer(n,0,e.indices),F.categoricalBuffers.set(e.name,n)}if(ue(t,u.paramsBuffer,i,r,2),F.adjBasisBuffer=t.createBuffer({label:`adj-basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.normMins=new Float32Array(o),F.normRanges=new Float32Array(s),F.normMeans=new Float32Array(c),F.projectionResources={...d,bindGroup:null},F.numPoints=i,F.numDims=r,B(),Y(),F.tour&&F.tour.dims===r)q();else{let e=Math.max(1,F.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}F.tour={bases:t,arcLengths:p(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},q()}},Q=(e,t)=>{e.projectionResources&&(e.residualPcPipeline||=he(e.device),e.device.queue.writeBuffer(e.projectionResources.basisBuffer,0,t),ge(e.device,e.residualPcPipeline,e.projectionResources.dataBuffer,e.projectionResources.normParamsBuffer,e.projectionResources.basisBuffer,t,e.numPoints,e.numDims).then(e=>{F?.is3dActive&&(F.residualPC=e,R({type:`residualPC`,residualPC:new Float32Array(e)}),J())}))},$=e=>{if(F){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`,i=p(t,n,r);F.tour={bases:t,arcLengths:i,dims:n,orthonormalize:r,position:F.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},F.projectionResources&&q();return}if(e.type===`setTourPosition`){if(!F.tour)return;F.tour.position=e.position,F.directBasis=null,W();return}if(e.type===`setStyle`){F.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??F.style.minPointSize,fillTarget:e.fillTarget??F.style.fillTarget},(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setCamera`){F.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:F.camera.aspect,viewportHeight:F.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom,use3d:F.camera.use3d,rotation:F.camera.rotation},W();return}if(e.type===`setCentering`){if(F.centering=e.centering,B(),(F.tour||F.directBasis)&&F.projectionResources){if(F.is3dActive){let e=F.directBasis??F.tour?.interpolatedBasis;e&&Q(F,e)}q()}return}if(e.type===`resize`){e.dpr!==void 0&&(F.dpr=e.dpr),e.viewIndex===0&&(F.mainView.canvas.width=e.width,F.mainView.canvas.height=e.height,(F.tour||F.directBasis)&&F.projectionResources&&J());return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;F.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),F.tour&&F.projectionResources&&e.id<F.tour.bases.length&&Ne(e.id,F.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){F.previewCanvases.delete(e.id);return}if(e.type===`resizePreview`){let t=F.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,F.tour&&F.projectionResources&&Fe();return}if(e.type===`render`){(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setDirectBasis`){if(!F.projectionResources||!F.renderBindGroup)return;F.directBasis=e.basis,W(),F.is3dActive&&F.projectionResources&&Q(F,e.basis);return}if(e.type===`clearColors`){F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setBackgroundColor`){F.backgroundColor=e.color,(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setMaxPoints`){F.maxPoints=e.maxPoints,(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setSelectionMask`){let{mask:t}=e;F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.device.queue.writeBuffer(F.selectionBuffer,0,t),F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();let n=new Uint32Array(t);R({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null),F.styleFlags.useSelectionMask=!1,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q(),R({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`enable3d`){if(!F.projectionResources)return;let e=F.directBasis??F.tour?.interpolatedBasis;if(!e)return;if(F.is3dActive=!0,F.camera.use3d=!0,F.adjBasisBuffer){let e=F.numDims*3*4;F.adjBasisBuffer.size<e&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=F.device.createBuffer({label:`adj-basis`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Y())}J(),Q(F,e);return}if(e.type===`disable3d`){F.is3dActive=!1,F.residualPC=null,F.rotation3d=null,F.camera.use3d=!1,F.camera.rotation=null,J();return}if(e.type===`set3dRotation`){F.rotation3d=e.matrix,F.camera.rotation=e.matrix,W();return}if(e.type===`startPlayback`){if(!F.tour)return;ke(e.speed,e.direction);return}if(e.type===`stopPlayback`){Ae();return}if(e.type===`computePCA`){if(!F.projectionResources||F.numDims<2){R({type:`error`,message:`No data loaded for PCA`});return}let{device:e,projectionResources:t,numPoints:i,numDims:a}=F;L||=n(e),r(e,L,t.dataBuffer,t.normParamsBuffer,i,a).then(({eigenvalues:e,eigenvectors:t})=>{R({type:`pcaResult`,eigenvectors:t,eigenvalues:e,numDims:t.length})}).catch(e=>{R({type:`error`,message:`PCA failed: ${e instanceof Error?e.message:String(e)}`})});return}if(e.type===`lassoSelect`){if(!F.projectionResources||!F.projectionBindGroup||F.numPoints===0)return;let{device:t,numPoints:n,projectionPipeline:r,projectionResources:i,camera:a}=F,{polygon:o}=e,s=o.length/2;if(s<3)return;let c=null;if(F.directBasis)c=F.directBasis;else if(F.tour){let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),c=e.interpolatedBasis}if(!c)return;t.queue.writeBuffer(i.basisBuffer,0,c);let l=pe(t,r,F.projectionBindGroup,n);t.queue.submit([l]);let u=F.mainView.canvas,d=u.width/u.height||1,f=a.insetZoom,p=a.zoom*f,m=new Float32Array(o.length);for(let e=0;e<s;e++)m[e*2]=o[e*2]*d/p-a.panX,m[e*2+1]=(o[e*2+1]-a.insetOffsetY)/p-a.panY;let g=n*2*4,_=t.createBuffer({label:`proj-readback`,size:g,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),v=t.createCommandEncoder();v.copyBufferToBuffer(i.projectedBuffer,0,_,0,g),t.queue.submit([v.finish()]),_.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(_.getMappedRange()),r=new Uint32Array(Math.ceil(n/32));for(let t=0;t<n;t++){let n=e[t*2],i=e[t*2+1];if(Ve(n,i,m,s)){let e=t>>5;r[e]=(r[e]??0)|1<<(t&31)}}_.unmap(),_.destroy(),F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=t.createBuffer({label:`selection-mask`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.selectionBuffer,0,r),F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();let i=new Uint32Array(r);R({type:`selectionResult`,mask:i},[i.buffer])});return}if(e.type===`getProjectedPositions`){if(!F.projectionResources||!F.projectionBindGroup||F.numPoints===0){R({type:`projectedPositions`,positions:new Float32Array},[]);return}let{device:e,numPoints:t,projectionPipeline:n,projectionResources:r}=F,i=null;if(F.directBasis)i=F.directBasis;else if(F.tour){let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),i=e.interpolatedBasis}if(!i){R({type:`projectedPositions`,positions:new Float32Array},[]);return}e.queue.writeBuffer(r.basisBuffer,0,i);let a=pe(e,n,F.projectionBindGroup,t);e.queue.submit([a]);let o=t*2*4,s=e.createBuffer({label:`proj-positions-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=e.createCommandEncoder();c.copyBufferToBuffer(r.projectedBuffer,0,s,0,o),e.queue.submit([c.finish()]),s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();s.unmap(),s.destroy(),R({type:`projectedPositions`,positions:e},[e.buffer])});return}if(e.type===`getPointData`){if(!F.projectionResources||F.numPoints===0){R({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{device:t,numPoints:n,numDims:r,projectionResources:i}=F,a=e.pointIndex;if(a<0||a>=n){R({type:`pointData`,pointIndex:a,numericValues:{},categoricalValues:{}});return}let o=r*4,s=t.createBuffer({label:`point-data-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=t.createCommandEncoder();for(let e=0;e<r;e++)c.copyBufferToBuffer(i.dataBuffer,(e*n+a)*4,s,e*4,4);let l=Array.from(F.categoricalBuffers.keys()),u=l.length*4,d=null;if(u>0){d=t.createBuffer({label:`point-cat-readback`,size:u,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});let e=0;for(let t of l){let n=F.categoricalBuffers.get(t);c.copyBufferToBuffer(n,a*4,d,e,4),e+=4}}t.queue.submit([c.finish()]);let f=s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();return s.unmap(),s.destroy(),e}),p=d?d.mapAsync(GPUMapMode.READ).then(()=>{let e=new Uint32Array(d.getMappedRange()).slice();return d.unmap(),d.destroy(),e}):Promise.resolve(new Uint32Array);Promise.all([f,p]).then(([e,t])=>{let n={};for(let t=0;t<r;t++)n[String(t)]=e[t];let i={};for(let e=0;e<l.length;e++)i[l[e]]=t[e];R({type:`pointData`,pointIndex:a,numericValues:n,categoricalValues:i})});return}if(e.type===`benchmark`){Be(e.numFrames);return}if(e.type===`getMetrics`){ze();return}}},Re=()=>{if(!F)return 0;let e=0;if(F.projectionResources){let t=F.projectionResources;e+=t.dataBuffer.size+t.normParamsBuffer.size+t.basisBuffer.size+t.projectedBuffer.size}F.adjBasisBuffer&&(e+=F.adjBasisBuffer.size),F.selectionBuffer&&(e+=F.selectionBuffer.size),F.colorLutBuffer&&(e+=F.colorLutBuffer.size);for(let t of F.categoricalBuffers.values())e+=t.size;F.mainHdrTexture&&(e+=F.mainHdrTexture.width*F.mainHdrTexture.height*16),F.previewHdrTexture&&(e+=F.previewHdrTexture.width*F.previewHdrTexture.height*16);let t=F.pointPipeline;return e+=t.uniformBuffer.size+t.cameraBuffer.size,e+=t.defaultColorLutBuffer.size+t.defaultSelectionBuffer.size+t.defaultCatIndicesBuffer.size,e+=F.projectionPipeline.paramsBuffer.size,e+=F.tonemapPipeline.paramsBuffer.size,e},ze=()=>{if(!F)return;let e=0;if(F.tour){for(let t of F.tour.bases)e+=t.byteLength;e+=F.tour.interpolatedBasis.byteLength}R({type:`metricsResult`,gpuMemoryBytes:Re(),numPoints:F.numPoints,numDims:F.numDims,workerJsHeapBytes:e})},Be=async e=>{if(!F?.tour||!F.renderBindGroup||F.numPoints===0){R({type:`error`,message:`No data/tour loaded for benchmark`});return}let{device:t,numPoints:n,numDims:r,tour:i}=F,a=i.position;F.directBasis=null;for(let e=0;e<5;e++)i.position=e/5,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),xe(),G(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone();let o=new Float64Array(e);for(let n=0;n<e;n++){i.position=n/e,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let r=performance.now();G(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone(),o[n]=performance.now()-r}i.position=a,R({type:`benchmarkResult`,frameTimes:o,numPoints:n,numDims:r},[o.buffer])},Ve=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i};self.onmessage=async e=>{let t=e.data;if(t.type===`init`){try{let{device:e}=await ee(),n=i(t.canvas,e),r=navigator.gpu.getPreferredCanvasFormat(),a=`rgba32float`,o=ne(e,a),s=le(e),c=v(e),l=oe(e,r);F={device:e,mainView:n,previewGpuCanvas:null,previewGpuView:null,previewCanvases:new Map,pointPipeline:o,renderBindGroup:null,projectionPipeline:s,projectionResources:null,projectionBindGroup:null,colorPipelines:c,numPoints:0,numDims:0,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},camera:{panX:0,panY:0,zoom:t.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},colorLutBuffer:null,colorState:{mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},activeCatColumnName:null,selectionBuffer:null,directBasis:null,backgroundColor:[0,0,0],dpr:t.dpr,hdrFormat:a,tonemapPipeline:l,mainHdrTexture:null,mainHdrTextureView:null,mainTonemapBindGroup:null,previewHdrTexture:null,previewHdrTextureView:null,previewTonemapBindGroup:null,maxPoints:0,adjBasisBuffer:null,normMins:null,normRanges:null,normMeans:null,centering:`midrange`,is3dActive:!1,rotation3d:null,residualPC:null,residualPcPipeline:null},t.dataPort.onmessage=Le;let u=I;if(I=null,u)for(let e of u)$(e);R({type:`ready`})}catch(e){R({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(I){I.push(t);return}$(t)};", m = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", p], { type: "text/javascript;charset=utf-8" });
|
|
2631
|
-
function
|
|
2638
|
+
var m = "var e=`// PCA compute shader — two-pass reduction to compute covariance matrix.\n//\n// Pass 1 (reduce_partial): Each workgroup reduces its chunk of points into\n// per-workgroup partial sums for d means + d*(d+1)/2 cross-product terms.\n//\n// Pass 2 (final_reduce): A single workgroup reduces all partial sums into\n// the final means and covariance matrix.\n//\n// Data is normalized identically to the projection shader:\n// v = (raw - center) / range\n\nstruct PcaParams {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: PcaParams;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n@group(0) @binding(3) var<storage, read_write> partials: array<f32>;\n// result layout: [mean_0 .. mean_{d-1}, cov_00, cov_01, ..., cov_{d-1,d-1}]\n// upper-triangle covariance packed as: d1*d - d1*(d1-1)/2 + (d2-d1)\n@group(0) @binding(4) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 32u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn normalize(dim: u32, point_idx: u32, N: u32) -> f32 {\n let raw = data[dim * N + point_idx];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n return (raw - np.x) / range;\n}\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values for this point into registers\n var vals: array<f32, 32>; // MAX_DIMS\n if (valid) {\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] = normalize(dim, i, N);\n }\n }\n\n // Reduce mean terms\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle covariance terms (including diagonal)\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n let ci = cov_idx(d, d1, d2);\n partials[wid.x * num_terms + d + ci] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final means + covariance ────────────\n\n@compute @workgroup_size(256)\nfn final_reduce(\n @builtin(local_invocation_id) lid: vec3u,\n) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n // For each term, reduce across all workgroups\n for (var t = 0u; t < num_terms; t++) {\n // Each thread accumulates a stride of workgroups\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) {\n wg_reduce[lid.x] += wg_reduce[lid.x + s];\n }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n // Store as E[X] or E[XY]\n result[t] = wg_reduce[0] / N_f32;\n }\n workgroupBarrier();\n }\n\n // Correct covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const t=(e,t)=>{let n=e,r=new Float32Array(t*t);for(let e=0;e<t;e++)r[e*t+e]=1;let i=1e-10;for(let e=0;e<50;e++){let e=0;for(let r=0;r<t;r++)for(let i=r+1;i<t;i++)e+=n[r*t+i]*n[r*t+i];if(e<i)break;for(let e=0;e<t;e++)for(let a=e+1;a<t;a++){let o=n[e*t+a];if(Math.abs(o)<i*.01)continue;let s=n[e*t+e],c=n[a*t+a],l=(c-s)/(2*o),u=Math.sign(l)/(Math.abs(l)+Math.sqrt(1+l*l)),d=1/Math.sqrt(1+u*u),f=u*d;n[e*t+e]=s-u*o,n[a*t+a]=c+u*o,n[e*t+a]=0,n[a*t+e]=0;for(let r=0;r<t;r++){if(r===e||r===a)continue;let i=n[r*t+e],o=n[r*t+a];n[r*t+e]=d*i-f*o,n[e*t+r]=d*i-f*o,n[r*t+a]=f*i+d*o,n[a*t+r]=f*i+d*o}for(let n=0;n<t;n++){let i=r[n*t+e],o=r[n*t+a];r[n*t+e]=d*i-f*o,r[n*t+a]=f*i+d*o}}}let a=new Float32Array(t),o=Array.from({length:t},(e,t)=>t);for(let e=0;e<t;e++)a[e]=n[e*t+e];o.sort((e,t)=>a[t]-a[e]);let s=new Float32Array(t),c=[];for(let e=0;e<t;e++){let n=o[e];s[e]=a[n];let i=new Float32Array(t);for(let e=0;e<t;e++)i[e]=r[e*t+n];c.push(i)}return{eigenvalues:s,eigenvectors:c}},n=t=>{let n=t.createShaderModule({label:`compute-pca`,code:e}),r=t.createBindGroupLayout({label:`pca-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),i=t.createPipelineLayout({bindGroupLayouts:[r]});return{partialPipeline:t.createComputePipeline({label:`pca-partial-pipeline`,layout:i,compute:{module:n,entryPoint:`reduce_partial`}}),finalPipeline:t.createComputePipeline({label:`pca-final-pipeline`,layout:i,compute:{module:n,entryPoint:`final_reduce`}}),bindGroupLayout:r,paramsBuffer:t.createBuffer({label:`pca-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},r=async(e,n,r,i,a,o)=>{let s=Math.min(o,32),c=s+s*(s+1)/2,l=Math.ceil(a/256),u=new ArrayBuffer(16),d=new Uint32Array(u);d[0]=a,d[1]=s,d[2]=l,d[3]=0,e.queue.writeBuffer(n.paramsBuffer,0,u);let f=e.createBuffer({label:`pca-partials`,size:l*c*4,usage:GPUBufferUsage.STORAGE}),p=c*4,m=e.createBuffer({label:`pca-result`,size:p,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`pca-readback`,size:p,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`pca-bg`,layout:n.bindGroupLayout,entries:[{binding:0,resource:{buffer:n.paramsBuffer}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`pca-compute`}),v=_.beginComputePass({label:`pca-partial`});v.setPipeline(n.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(l),v.end();let y=_.beginComputePass({label:`pca-final`});y.setPipeline(n.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,p),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();h.unmap(),f.destroy(),m.destroy(),h.destroy();let x=new Float32Array(s*s);for(let e=0;e<s;e++)for(let t=e;t<s;t++){let n=e*s-e*(e-1)/2+(t-e);x[e*s+t]=b[s+n],x[t*s+e]=b[s+n]}return t(x,s)},i=(e,t)=>{let n=e.getContext(`webgpu`);if(!n)throw Error(`Failed to get WebGPU context from canvas. Ensure WebGPU is supported and the canvas is valid.`);let r=navigator.gpu.getPreferredCanvasFormat();return n.configure({device:t,format:r,alphaMode:`premultiplied`}),{canvas:e,context:n,format:r}},a=2e6,o=(e,t,n,r,i,o=[0,0,0])=>{let s=e.beginRenderPass({colorAttachments:[{view:t,clearValue:{r:o[0],g:o[1],b:o[2],a:1},loadOp:`clear`,storeOp:`store`}]});if(i>0){s.setPipeline(n),s.setBindGroup(0,r);for(let e=0;e<i;e+=a){let t=Math.min(a,i-e);s.draw(4,t,0,e)}}s.end()},s=(e,t,n,r)=>{let i=e.beginRenderPass({colorAttachments:[{view:t.context.getCurrentTexture().createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});i.setPipeline(n),i.setBindGroup(0,r),i.draw(3),i.end()},c=1e-10,l=e=>{let t=e[0],n=e[1],r=e[2],i=e[3],a=t*t+r*r,o=t*n+r*i,s=n*n+i*i,l=a+s,u=a*s-o*o,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(o)>c){let e=f-s,t=Math.sqrt(e*e+o*o);_[0]=e/t,_[1]=o/t;let n=p-s,r=Math.sqrt(n*n+o*o);_[2]=n/r,_[3]=o/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>c&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+i*_[1])/m),h>c&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+i*_[3])/h),m<=c&&h>c?(v[0]=-v[3],v[2]=v[1]):h<=c&&m>c?(v[1]=-v[2],v[3]=v[0]):m<=c&&h<=c&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},u=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},d=(e,t,n,r,i,a,o,s=!0)=>{let c=o*o,l=c*o,d=.5*(-o+2*c-l),f=.5*(2-5*c+3*l),p=.5*(o+4*c-3*l),m=.5*(-c+l);for(let o=0;o<a*2;o++)e[o]=d*t[o]+f*n[o]+p*r[o]+m*i[o];return s&&u(e,a),e},f=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=l(r),a=Math.acos(Math.max(-1,Math.min(1,i[0]))),o=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(a*a+o*o)},p=(e,t,n=!0)=>{let r=e.length,i=new Float32Array(r+1);if(i[0]=0,!n){for(let e=1;e<=r;e++)i[e]=e/r;return i}let a=new Float32Array(t*2),o=new Float32Array(t*2);for(let n=0;n<r;n++){let s=(n-1+r)%r,c=n,l=(n+1)%r,u=(n+2)%r,p=0;d(a,e[s],e[c],e[l],e[u],t,0);for(let n=1;n<=8;n++){let r=n/8;d(o,e[s],e[c],e[l],e[u],t,r),p+=f(a,o,t),a.set(o)}i[n+1]=i[n]+p}let s=i[r];if(s>1e-10)for(let e=1;e<=r;e++)i[e]=i[e]/s;return i},m=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},h=(e,t,n,r,i,a=!0)=>{let o=t.length,{segment:s,localT:c}=m(n,i),l=(s-1+o)%o,u=s,f=(s+1)%o,p=(s+2)%o;return d(e,t[l],t[u],t[f],t[p],r,c,a)};var g=`// GPU categorical selection (bit-packed output)\n//\n// For each point, checks if its category index is in the selected set.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n num_labels: u32,\n}\n\n@group(0) @binding(0) var<storage, read> indices: array<u32>;\n@group(0) @binding(1) var<storage, read> selected: array<u32>; // 1 per label: selected or not\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n let idx = indices[i];\n if (idx < params.num_labels && selected[idx] > 0u) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n }\n}\n`,_=`// GPU continuous selection (bit-packed output)\n//\n// For each point, checks if the column value falls within any [lo, hi] range.\n// Output mask must be pre-cleared; bits are set via atomicOr.\n\nstruct Params {\n num_points: u32,\n column_offset: u32, // columnIndex * numPoints\n num_ranges: u32,\n}\n\n@group(0) @binding(0) var<storage, read> data: array<f32>;\n@group(0) @binding(1) var<storage, read> ranges: array<f32>; // [lo0, hi0, lo1, hi1, ...]\n@group(0) @binding(2) var<storage, read_write> mask: array<atomic<u32>>;\n@group(0) @binding(3) var<uniform> params: Params;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let v = data[params.column_offset + i];\n for (var r = 0u; r < params.num_ranges; r++) {\n if (v >= ranges[r * 2u] && v <= ranges[r * 2u + 1u]) {\n atomicOr(&mask[i / 32u], 1u << (i % 32u));\n break;\n }\n }\n}\n`;const v=e=>{let t=e.createBindGroupLayout({label:`color-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}}]}),n=e.createPipelineLayout({bindGroupLayouts:[t]}),r=(t,r)=>e.createComputePipeline({label:t,layout:n,compute:{module:e.createShaderModule({label:t,code:r}),entryPoint:`main`}}),i=e.createBuffer({label:`color-params`,size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return{selectContinuous:r(`select-continuous`,_),selectCategorical:r(`select-categorical`,g),bindGroupLayout:t,paramsBuffer:i}},y=(e,t,n,r,i,a)=>e.createBindGroup({label:`color-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}}]}),b=(e,t,n,r,i)=>{let a=new ArrayBuffer(32),o=new Uint32Array(a);o[0]=n,o[1]=r,o[2]=i,e.queue.writeBuffer(t,0,a)},x=(e,t,n,r)=>{let i=new ArrayBuffer(32),a=new Uint32Array(i);a[0]=n,a[1]=r,e.queue.writeBuffer(t,0,i)},ee=async()=>{if(!navigator.gpu)throw Error(`WebGPU is not supported in this environment. Please use Chrome 113+, Edge 113+, or Firefox Nightly with WebGPU enabled.`);let e=await navigator.gpu.requestAdapter({powerPreference:`high-performance`});if(!e)throw Error(`No WebGPU adapter found. Your GPU may not support WebGPU, or the browser may have blocked access.`);if(!e.features.has(`float32-blendable`))throw Error(`Your GPU does not support float32-blendable, which is required for HDR rendering. Please try a different browser or device with a GPU that supports this WebGPU feature.`);let t=await e.requestDevice({label:`dtour-scatter`,requiredFeatures:[`float32-blendable`],requiredLimits:{maxStorageBufferBindingSize:e.limits.maxStorageBufferBindingSize,maxBufferSize:e.limits.maxBufferSize}});return t.lost.then(e=>{console.error(`WebGPU device lost: ${e.message} (reason: ${e.reason})`)}),{adapter:e,device:t}};var S=`// Point renderer — instanced quads with SDF circle anti-aliasing\n//\n// Projects raw ND data to 2D inline using pre-adjusted basis weights and\n// biases (normalization folded into the basis on CPU). This eliminates the\n// separate compute-projection pass and its GPU barrier.\n//\n// Trade-off: the projection loop runs once per vertex (4x per point) since\n// vertex shaders can't share results across a strip. This is a net win\n// because eliminating the compute dispatch + barrier + projected-buffer\n// read costs more than the redundant ALU, and GPUs are throughput-oriented.\n// For very high dim counts (>200) this balance may shift — profile first.\n//\n// Applies 2D camera transform (pan/zoom/aspect). Each point is rendered as\n// a unit quad (triangle strip, 4 vertices) scaled by point_size (NDC units).\n//\n// Color mapping: instead of a pre-computed N-element color buffer, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n// This eliminates the 20MB color buffer for 5M points and makes color changes\n// instant (just swap the ~100-byte LUT + update uniforms).\n\nstruct Uniforms {\n point_size: f32,\n opacity: f32,\n // Color mode: 0 = uniform color, 1 = continuous, 2 = categorical\n color_mode: u32,\n useSelectionMask: f32,\n color: vec4f,\n useSubtractive: f32,\n num_points: u32,\n num_dims: u32,\n max_points: u32,\n bias: vec2f,\n // Color mapping params (used when color_mode > 0)\n color_column_offset: u32, // columnIndex * num_points (continuous only)\n color_min: f32,\n color_range: f32,\n color_num_stops: u32, // LUT size\n bias_z: f32, // z-axis bias (3D mode only)\n // 2D colormap params (used when color_mode == 3)\n color_column_offset_v: u32, // second column index * num_points\n color_min_v: f32,\n color_range_v: f32,\n color2d_map_index: u32, // 0-5 = LUT-based, 6 = oklab_polar\n scale_opacity_by_zoom: f32, // 1.0 = auto (zoom² density scaling), 0.0 = manual (fixed)\n}\n\nstruct Camera {\n pan_x: f32,\n pan_y: f32,\n zoom: f32,\n aspect: f32,\n viewport_height: f32,\n // NDC-space Y offset applied after zoom — used to shift the viewport\n // down when a toolbar covers the top of the canvas.\n inset_offset_y: f32,\n // Zoom multiplier for the inset — scales content to fit in the visible\n // area below the toolbar (typically (H - toolbar) / H).\n inset_zoom: f32,\n // 3D camera rotation: 0.0 = 2D mode (skip z projection), 1.0 = 3D mode\n use_3d: f32,\n // 3×3 rotation matrix (column-major, each column padded to vec4f for alignment)\n rot_col0: vec3f,\n _pad0: f32,\n rot_col1: vec3f,\n _pad1: f32,\n rot_col2: vec3f,\n _pad2: f32,\n}\n\n@group(0) @binding(0) var<uniform> uni: Uniforms;\n// Raw ND data (column-major): dim0[0..N], dim1[0..N], ..., dimP[0..N]\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<uniform> camera: Camera;\n// Colormap/palette LUT — packed RGBA8 u32 entries (25 for continuous, up to 256 for categorical)\n@group(0) @binding(3) var<storage, read> colorLut: array<u32>;\n// Bit-packed selection mask (1 bit per point, 32 per u32)\n@group(0) @binding(4) var<storage, read> selectionMask: array<u32>;\n// Adjusted basis weights (normalization folded in):\n// first num_dims = x-weights, next num_dims = y-weights\n// adj_basis[d] = basis[d] / range[d] * viewport_scale\n@group(0) @binding(5) var<storage, read> adj_basis: array<f32>;\n// Categorical index buffer (per-point category index, used when color_mode == 2)\n@group(0) @binding(6) var<storage, read> catIndices: array<u32>;\n\nstruct VertOut {\n @builtin(position) clip_pos: vec4f,\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n}\n\n// Triangle strip: 4 vertices forming a unit quad [-1, 1]²\nfn quad_vertex(vi: u32) -> vec2f {\n switch vi {\n case 0u: { return vec2f(-1.0, -1.0); }\n case 1u: { return vec2f( 1.0, -1.0); }\n case 2u: { return vec2f(-1.0, 1.0); }\n default: { return vec2f( 1.0, 1.0); }\n }\n}\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nfn unpackColor(packed: u32) -> vec4f {\n let r = f32(packed & 0xFFu) / 255.0;\n let g = f32((packed >> 8u) & 0xFFu) / 255.0;\n let b = f32((packed >> 16u) & 0xFFu) / 255.0;\n let a = f32((packed >> 24u) & 0xFFu) / 255.0;\n return vec4f(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from instance index.\n// Used for vertex-shader decimation when num_points > max_points.\nfn pcg_hash(input: u32) -> u32 {\n var state = input * 747796405u + 2891336453u;\n let word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfn random_float(seed: u32) -> f32 {\n return f32(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ─── 2D Colormap helpers ──────────────────────────────────────────────────\n\n// Read f32 from the colorLut buffer (which stores u32). Used for 2D colormap LUT curves.\nfn lut_f32(index: u32) -> f32 {\n return bitcast<f32>(colorLut[index]);\n}\n\n// Linearly interpolate a 16-entry LUT curve stored in colorLut at the given base offset.\nfn lut_interp(base: u32, t: f32) -> f32 {\n let pos = t * 15.0;\n let lo = min(u32(floor(pos)), 14u);\n let hi = lo + 1u;\n return mix(lut_f32(base + lo), lut_f32(base + hi), fract(pos));\n}\n\n// Reconstruct a 2D colormap color from SVD rank-1 LUT curves stored in colorLut.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nfn colormap2d_lut(u: f32, v: f32) -> vec3f {\n let r = lut_interp(0u, u) * lut_interp(16u, v);\n let g = lut_interp(32u, u) * lut_interp(48u, v);\n let b = lut_interp(64u, u) * lut_interp(80u, v)\n + lut_interp(96u, u) * lut_interp(112u, v); // rank-2 correction\n return clamp(vec3f(r, g, b), vec3f(0.0), vec3f(1.0));\n}\n\n// Oklab → linear sRGB conversion\nfn oklab_to_linear(L: f32, a: f32, b: f32) -> vec3f {\n let l_ = L + 0.3963377774 * a + 0.2158037573 * b;\n let m_ = L - 0.1055613458 * a - 0.0638541728 * b;\n let s_ = L - 0.0894841775 * a - 1.2914855480 * b;\n let l = l_ * l_ * l_;\n let m = m_ * m_ * m_;\n let s = s_ * s_ * s_;\n return vec3f(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nfn colormap2d_oklab_polar(u: f32, v: f32) -> vec3f {\n let cx = u - 0.5;\n let cy = v - 0.5;\n let radius = min(length(vec2f(cx, cy)) * 2.0, 1.0);\n let angle = atan2(cy, cx);\n let chroma = radius * 0.25;\n let lightness = 0.80 - radius * 0.30;\n let a_val = chroma * cos(angle);\n let b_val = chroma * sin(angle);\n let linear = oklab_to_linear(lightness, a_val, b_val);\n // Linear to sRGB gamma (approximate)\n return pow(clamp(linear, vec3f(0.0), vec3f(1.0)), vec3f(1.0 / 2.2));\n}\n\n// Dispatch 2D colormap by index\nfn colormap2d(map_index: u32, u: f32, v: f32) -> vec3f {\n if map_index == 6u {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\n@vertex\nfn vs_main(\n @builtin(vertex_index) vi: u32,\n @builtin(instance_index) ii: u32,\n) -> VertOut {\n // Vertex-shader decimation: skip expensive projection for excess points.\n // Early exit before the ND projection loop saves ~50 cycles per rejected point.\n if (uni.max_points > 0u && uni.num_points > uni.max_points) {\n let threshold = f32(uni.max_points) / f32(uni.num_points);\n if (random_float(ii) > threshold) {\n var out: VertOut;\n out.clip_pos = vec4f(0.0, 0.0, 0.0, 0.0);\n out.uv = vec2f(0.0);\n out.point_color = vec4f(0.0);\n out.selected = 0u;\n out.effective_opacity = 0.0;\n return out;\n }\n }\n\n // Inline ND → 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n // Must produce the same result as compute-projection.wgsl (used for lasso).\n let N = uni.num_points;\n let p = uni.num_dims;\n var x = uni.bias.x;\n var y = uni.bias.y;\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + ii];\n x += raw * adj_basis[d];\n y += raw * adj_basis[p + d];\n }\n\n // 3D camera rotation: project z-axis, rotate, then discard z (orthographic).\n if (camera.use_3d > 0.5) {\n var z = uni.bias_z;\n for (var d = 0u; d < p; d++) {\n z += data[d * N + ii] * adj_basis[2u * p + d];\n }\n let pos3 = vec3f(x, y, z);\n let rot = mat3x3f(camera.rot_col0, camera.rot_col1, camera.rot_col2);\n let rotated = rot * pos3;\n x = rotated.x;\n y = rotated.y;\n // z discarded — orthographic projection\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n // inset_zoom shrinks the scene to fit below the toolbar;\n // inset_offset_y shifts it down so it's centered in the visible area.\n let iz = camera.inset_zoom;\n let center = vec2f(\n (x + camera.pan_x) * camera.zoom * iz / camera.aspect,\n (y + camera.pan_y) * camera.zoom * iz + camera.inset_offset_y,\n );\n\n let q = quad_vertex(vi);\n // Clamp point size to [2, 32] pixels (physical).\n // min_ndc ensures points are always at least 2px — 1px quads can miss pixel\n // centers entirely depending on sub-pixel alignment, producing no fragments.\n let min_ndc = 4.0 / camera.viewport_height;\n let max_ndc = 64.0 / camera.viewport_height;\n let point_size = clamp(uni.point_size, min_ndc, max_ndc);\n // Aspect-correct the offset so circles stay circular on non-square canvases\n let offset = vec2f(q.x / camera.aspect, q.y) * (point_size * 0.5);\n\n // Scale opacity by zoom² to keep constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n let z = camera.zoom * camera.inset_zoom;\n let zoom_scale = select(1.0, z * z, uni.scale_opacity_by_zoom > 0.5);\n let eff_opacity = uni.opacity * zoom_scale;\n\n // Resolve per-point color from LUT\n var col: vec4f;\n if uni.color_mode == 1u {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n let raw = data[uni.color_column_offset + ii];\n let inv_range = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let t = clamp((raw - uni.color_min) * inv_range, 0.0, 1.0);\n let stops = f32(uni.color_num_stops - 1u);\n let pos = t * stops;\n let idx = min(u32(floor(pos)), uni.color_num_stops - 2u);\n let frac = pos - f32(idx);\n let c0 = unpackColor(colorLut[idx]);\n let c1 = unpackColor(colorLut[idx + 1u]);\n col = mix(c0, c1, frac);\n } else if uni.color_mode == 2u {\n // Categorical: read category index, direct palette lookup\n let catIdx = catIndices[ii];\n col = unpackColor(colorLut[catIdx % uni.color_num_stops]);\n } else if uni.color_mode == 3u {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n let raw_u = data[uni.color_column_offset + ii];\n let raw_v = data[uni.color_column_offset_v + ii];\n let inv_range_u = select(0.0, 1.0 / uni.color_range, uni.color_range > 0.0);\n let inv_range_v = select(0.0, 1.0 / uni.color_range_v, uni.color_range_v > 0.0);\n let u_val = clamp((raw_u - uni.color_min) * inv_range_u, 0.0, 1.0);\n let v_val = clamp((raw_v - uni.color_min_v) * inv_range_v, 0.0, 1.0);\n let rgb = colormap2d(uni.color2d_map_index, u_val, v_val);\n col = vec4f(rgb, 1.0);\n } else {\n col = uni.color;\n }\n\n // Read selection\n var sel: u32 = 1u;\n if uni.useSelectionMask > 0.5 {\n sel = (selectionMask[ii / 32u] >> (ii % 32u)) & 1u;\n }\n\n var out: VertOut;\n out.clip_pos = vec4f(center + offset, 0.0, 1.0);\n out.uv = q;\n out.point_color = col;\n out.selected = sel;\n out.effective_opacity = eff_opacity;\n return out;\n}\n\n// Shared fragment helper — computes edge, selection factor, and intensity.\nfn fragment_intensity(\n uv: vec2f,\n point_alpha: f32,\n selected: u32,\n effective_opacity: f32,\n) -> f32 {\n let dist = length(uv);\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n let edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n var sel_factor = 1.0;\n if uni.useSelectionMask > 0.5 {\n if selected == 0u {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(effective_opacity, 0.01);\n }\n }\n\n return edge * effective_opacity * point_alpha * sel_factor;\n}\n\n// ─── Fragment: single-target (additive / subtractive) ──────────────────────\n\n@fragment\nfn fs_main(\n @location(0) uv: vec2f,\n @location(1) point_color: vec4f,\n @location(2) @interpolate(flat) selected: u32,\n @location(3) @interpolate(flat) effective_opacity: f32,\n) -> @location(0) vec4f {\n let intensity = fragment_intensity(uv, point_color.a, selected, effective_opacity);\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n let rgb = select(point_color.rgb, vec3f(1.0) - point_color.rgb, uni.useSubtractive > 0.5);\n return vec4f(rgb * intensity, intensity);\n}\n`,C=`// Fullscreen tone-map pass — reads an HDR float texture and maps to [0,1]\n// for the canvas. Uses a single oversized triangle (3 vertices, no vertex\n// buffer) to cover the viewport.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n// Values are already bounded; tone mapping is identity.\n\nstruct Params {\n mode: f32,\n}\n\n@group(0) @binding(0) var hdrTexture: texture_2d<f32>;\n@group(0) @binding(1) var<uniform> params: Params;\n\n@vertex\nfn vs(@builtin(vertex_index) vi: u32) -> @builtin(position) vec4f {\n // Oversized triangle covering the full clip space:\n // vi=0 → (-1, -1) vi=1 → (3, -1) vi=2 → (-1, 3)\n let x = f32(i32(vi) / 2) * 4.0 - 1.0;\n let y = f32(i32(vi) % 2) * 4.0 - 1.0;\n return vec4f(x, y, 0.0, 1.0);\n}\n\n@fragment\nfn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f {\n let hdr = textureLoad(hdrTexture, vec2u(pos.xy), 0);\n\n var mapped: vec3f;\n if params.mode < 0.5 {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3f(0.0), vec3f(1.0));\n }\n return vec4f(mapped, 1.0);\n}\n`;const w={pointSize:.012,opacity:.7,color:[.25,.5,.9],scaleOpacityByZoom:!0},T={useSelectionMask:!1},E={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},te={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},D=new ArrayBuffer(96),O=new Float32Array(D),k=new Uint32Array(D),A=new Float32Array(80/4),j=new Float32Array(4),ne=(e,t=`rgba32float`)=>{let n=e.createShaderModule({label:`point-shader`,code:S}),r=e.createBindGroupLayout({label:`point-bgl`,entries:[{binding:0,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.VERTEX,buffer:{type:`uniform`}},{binding:3,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:5,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}},{binding:6,visibility:GPUShaderStage.VERTEX,buffer:{type:`read-only-storage`}}]}),i=e.createPipelineLayout({bindGroupLayouts:[r]}),a=e.createRenderPipeline({label:`point-pipeline-additive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),o=e.createRenderPipeline({label:`point-pipeline-normal`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`}}}]},primitive:{topology:`triangle-strip`}}),s=e.createRenderPipeline({label:`point-pipeline-subtractive`,layout:i,vertex:{module:n,entryPoint:`vs_main`},fragment:{module:n,entryPoint:`fs_main`,targets:[{format:t,blend:{color:{operation:`reverse-subtract`,srcFactor:`one`,dstFactor:`one`},alpha:{srcFactor:`zero`,dstFactor:`one`}}}]},primitive:{topology:`triangle-strip`}}),c=e.createBuffer({label:`point-uniforms`,size:96,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),l=e.createBuffer({label:`camera-uniforms`,size:80,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),u=e.createBuffer({label:`default-color-lut-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),d=e.createBuffer({label:`default-selection-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),f=e.createBuffer({label:`default-cat-indices-buf`,size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});return M(e,c,w,T,E),re(e,l,te),{additivePipeline:a,normalPipeline:o,subtractivePipeline:s,bindGroupLayout:r,uniformBuffer:c,cameraBuffer:l,defaultColorLutBuffer:u,defaultSelectionBuffer:d,defaultCatIndicesBuffer:f}},M=(e,t,n,r=T,i=E,a=!1,o=0,s=0,c=0,l=0,u=0,d=0)=>{O[0]=n.pointSize,O[1]=n.opacity,k[2]=i.mode,O[3]=r.useSelectionMask?1:0,O[4]=n.color[0],O[5]=n.color[1],O[6]=n.color[2],O[7]=1,O[8]=a?1:0,k[9]=o,k[10]=s,k[11]=u,O[12]=c,O[13]=l,k[14]=i.columnOffset,O[15]=i.min,O[16]=i.range,k[17]=i.numStops,O[18]=d,k[19]=i.columnOffsetV,O[20]=i.minV,O[21]=i.rangeV,k[22]=i.mapIndex,O[23]=n.scaleOpacityByZoom?1:0,e.queue.writeBuffer(t,0,D)},re=(e,t,n)=>{A[0]=n.panX,A[1]=n.panY,A[2]=n.zoom,A[3]=n.aspect,A[4]=n.viewportHeight,A[5]=n.insetOffsetY,A[6]=n.insetZoom,A[7]=n.use3d?1:0;let r=n.rotation;A[8]=r?r[0]:1,A[9]=r?r[1]:0,A[10]=r?r[2]:0,A[11]=0,A[12]=r?r[3]:0,A[13]=r?r[4]:1,A[14]=r?r[5]:0,A[15]=0,A[16]=r?r[6]:0,A[17]=r?r[7]:0,A[18]=r?r[8]:1,A[19]=0,e.queue.writeBuffer(t,0,A)},ie=(e,t,n,r,i,a,o,s,c)=>e.createBindGroup({label:`point-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r}},{binding:2,resource:{buffer:i}},{binding:3,resource:{buffer:a}},{binding:4,resource:{buffer:o}},{binding:5,resource:{buffer:s}},{binding:6,resource:{buffer:c}}]}),ae=(e,t,n)=>{j[0]=n,e.queue.writeBuffer(t,0,j,0,1)},oe=(e,t)=>{let n=e.createShaderModule({label:`tonemap-shader`,code:C}),r=e.createBindGroupLayout({label:`tonemap-bgl`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:`unfilterable-float`}},{binding:1,visibility:GPUShaderStage.FRAGMENT,buffer:{type:`uniform`}}]});return{pipeline:e.createRenderPipeline({label:`tonemap-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[r]}),vertex:{module:n,entryPoint:`vs`},fragment:{module:n,entryPoint:`fs`,targets:[{format:t}]},primitive:{topology:`triangle-list`}}),bindGroupLayout:r,paramsBuffer:e.createBuffer({label:`tonemap-params`,size:4,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},se=(e,t,n,r)=>e.createBindGroup({label:`tonemap-bg`,layout:t,entries:[{binding:0,resource:n},{binding:1,resource:{buffer:r}}]});var ce=`// ND → 2D projection compute shader (used only for lasso selection readback)\n//\n// Reads p-dimensional point data from a single concatenated storage buffer\n// (column-major: dim0[0..N], dim1[0..N], ..., dimP[0..N]),\n// normalizes each dimension using per-dim [center, range] params,\n// and projects to 2D using the supplied p×2 basis matrix.\n//\n// Output: N interleaved [x, y] pairs in the projected buffer.\n//\n// IMPORTANT: This must stay mathematically equivalent to the render-path\n// projection in point.wgsl + computeAdjustedBasis() in worker.ts.\n// The render path folds normalization into the basis on CPU (adj_basis, bias)\n// while this shader normalizes per-point on GPU. Both produce identical\n// projected coordinates: ((raw - center) / range) * basis * viewport_scale.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n viewport_scale: f32,\n _pad: f32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n// norm_params[d] = vec2f(center, range) for dimension d\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> projected: array<f32>;\n\n@compute @workgroup_size(256)\nfn project(@builtin(global_invocation_id) gid: vec3u) {\n let i = gid.x;\n if (i >= params.num_points) { return; }\n\n let N = params.num_points;\n let p = params.num_dims;\n\n var x = 0.0;\n var y = 0.0;\n\n for (var d = 0u; d < p; d++) {\n let raw = data[d * N + i];\n let np = norm_params[d];\n let range = max(np.y, 1e-6);\n let v = (raw - np.x) / range;\n\n x += v * basis[d];\n y += v * basis[p + d];\n }\n\n projected[i * 2u] = x * params.viewport_scale;\n projected[i * 2u + 1u] = y * params.viewport_scale;\n}\n`;const le=e=>{let t=e.createShaderModule({label:`compute-projection`,code:ce}),n=e.createBindGroupLayout({label:`projection-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]});return{pipeline:e.createComputePipeline({label:`projection-pipeline`,layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:t,entryPoint:`project`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`projection-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ue=(e,t,n,r,i)=>{let a=new ArrayBuffer(16),o=new Uint32Array(a),s=new Float32Array(a);o[0]=n,o[1]=r,s[2]=i,s[3]=0,e.queue.writeBuffer(t,0,a)},de=(e,t,n)=>({dataBuffer:e.createBuffer({label:`nd-data`,size:t*n*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),normParamsBuffer:e.createBuffer({label:`norm-params`,size:n*8,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),basisBuffer:e.createBuffer({label:`basis`,size:n*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),projectedBuffer:e.createBuffer({label:`projected`,size:t*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC}),bindGroup:null}),fe=(e,t,n,r)=>e.createBindGroup({label:`projection-bg`,layout:t,entries:[{binding:0,resource:{buffer:n}},{binding:1,resource:{buffer:r.dataBuffer}},{binding:2,resource:{buffer:r.normParamsBuffer}},{binding:3,resource:{buffer:r.basisBuffer}},{binding:4,resource:{buffer:r.projectedBuffer}}]}),pe=(e,t,n,r)=>{let i=e.createCommandEncoder({label:`projection-dispatch`}),a=i.beginComputePass({label:`project-points`});return a.setPipeline(t.pipeline),a.setBindGroup(0,n),a.dispatchWorkgroups(Math.ceil(r/256)),a.end(),i.finish()};var me=`// Residual-PC compute shader — two-pass reduction.\n//\n// Computes the covariance matrix of the residual after projecting out\n// the current p×2 tour basis. The top eigenvector of this covariance\n// is the \"most informative direction not currently visible.\"\n//\n// Pass 1 (reduce_partial): each workgroup reduces its chunk of N points\n// into partial sums for p means + p*(p+1)/2 upper-triangle cross-products\n// of the per-point residuals.\n//\n// Pass 2 (final_reduce): one workgroup sums all partial sums → final\n// mean-corrected covariance. Result layout:\n// [mean_0 .. mean_{p-1}, cov_00, cov_01, ..., cov_{p-1,p-1}]\n// where the covariance entries are the upper triangle packed as:\n// index(d1,d2) = d1*p - d1*(d1-1)/2 + (d2-d1) (d2 >= d1)\n//\n// Power iteration (15 steps) is performed on the CPU after readback;\n// p is always small (≤64) so this is negligible.\n\nstruct Params {\n num_points: u32,\n num_dims: u32,\n num_workgroups: u32,\n _pad: u32,\n}\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<f32>;\n@group(0) @binding(2) var<storage, read> norm_params: array<vec2f>;\n// basis: column-major p×2 — first p floats = x-weights, next p = y-weights\n@group(0) @binding(3) var<storage, read> basis: array<f32>;\n@group(0) @binding(4) var<storage, read_write> partials: array<f32>;\n@group(0) @binding(5) var<storage, read_write> result: array<f32>;\n\nconst WG: u32 = 256u;\nconst MAX_DIMS: u32 = 64u;\n\nvar<workgroup> wg_reduce: array<f32, 256>;\n\nfn cov_idx(d: u32, d1: u32, d2: u32) -> u32 {\n return d1 * d - d1 * (d1 - 1u) / 2u + (d2 - d1);\n}\n\n// ─── Pass 1: per-workgroup partial sums ─────────────────────────────────────\n\n@compute @workgroup_size(256)\nfn reduce_partial(\n @builtin(global_invocation_id) gid: vec3u,\n @builtin(local_invocation_id) lid: vec3u,\n @builtin(workgroup_id) wid: vec3u,\n) {\n let N = params.num_points;\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let i = gid.x;\n let valid = i < N;\n\n // Load normalized values into registers, then project out the 2D basis.\n var vals: array<f32, 64>;\n if (valid) {\n var dot_x = 0.0;\n var dot_y = 0.0;\n for (var dim = 0u; dim < d; dim++) {\n let raw = data[dim * N + i];\n let np = norm_params[dim];\n let range = max(np.y, 1e-6);\n let norm = (raw - np.x) / range;\n vals[dim] = norm;\n dot_x += norm * basis[dim];\n dot_y += norm * basis[d + dim];\n }\n // Subtract projection onto span{bx, by} → residual is orthogonal to basis\n for (var dim = 0u; dim < d; dim++) {\n vals[dim] -= dot_x * basis[dim] + dot_y * basis[d + dim];\n }\n }\n\n // Reduce mean terms (used for mean-correction in pass 2)\n for (var dim = 0u; dim < d; dim++) {\n wg_reduce[lid.x] = select(0.0, vals[dim], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + dim] = wg_reduce[0];\n }\n }\n\n // Reduce upper-triangle cross-products\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n wg_reduce[lid.x] = select(0.0, vals[d1] * vals[d2], valid);\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) {\n partials[wid.x * num_terms + d + cov_idx(d, d1, d2)] = wg_reduce[0];\n }\n }\n }\n}\n\n// ─── Pass 2: reduce across workgroups → final mean-corrected covariance ─────\n\n@compute @workgroup_size(256)\nfn final_reduce(@builtin(local_invocation_id) lid: vec3u) {\n let d = min(params.num_dims, MAX_DIMS);\n let num_cov = d * (d + 1u) / 2u;\n let num_terms = d + num_cov;\n let nwg = params.num_workgroups;\n let N_f32 = f32(params.num_points);\n\n for (var t = 0u; t < num_terms; t++) {\n var sum = 0.0;\n var w = lid.x;\n while (w < nwg) {\n sum += partials[w * num_terms + t];\n w += WG;\n }\n wg_reduce[lid.x] = sum;\n workgroupBarrier();\n for (var s = WG / 2u; s > 0u; s >>= 1u) {\n if (lid.x < s) { wg_reduce[lid.x] += wg_reduce[lid.x + s]; }\n workgroupBarrier();\n }\n if (lid.x == 0u) { result[t] = wg_reduce[0] / N_f32; }\n workgroupBarrier();\n }\n\n // Mean-corrected covariance: cov(X,Y) = E[XY] - E[X]*E[Y]\n if (lid.x == 0u) {\n for (var d1 = 0u; d1 < d; d1++) {\n for (var d2 = d1; d2 < d; d2++) {\n let ci = cov_idx(d, d1, d2);\n result[d + ci] -= result[d1] * result[d2];\n }\n }\n }\n}\n`;const he=e=>{let t=e.createShaderModule({label:`compute-residual-pc`,code:me}),n=e.createBindGroupLayout({label:`residual-pc-bgl`,entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:`uniform`}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:`read-only-storage`}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:`storage`}}]}),r=e.createPipelineLayout({bindGroupLayouts:[n]});return{partialPipeline:e.createComputePipeline({label:`residual-pc-partial`,layout:r,compute:{module:t,entryPoint:`reduce_partial`}}),finalPipeline:e.createComputePipeline({label:`residual-pc-final`,layout:r,compute:{module:t,entryPoint:`final_reduce`}}),bindGroupLayout:n,paramsBuffer:e.createBuffer({label:`residual-pc-params`,size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST})}},ge=async(e,t,n,r,i,a,o,s)=>{let c=Math.min(s,64),l=c+c*(c+1)/2,u=Math.ceil(o/256),d=new ArrayBuffer(16),f=new Uint32Array(d);f[0]=o,f[1]=c,f[2]=u,f[3]=0,e.queue.writeBuffer(t.paramsBuffer,0,d);let p=e.createBuffer({label:`residual-pc-partials`,size:u*l*4,usage:GPUBufferUsage.STORAGE}),m=e.createBuffer({label:`residual-pc-result`,size:l*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),h=e.createBuffer({label:`residual-pc-readback`,size:l*4,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),g=e.createBindGroup({label:`residual-pc-bg`,layout:t.bindGroupLayout,entries:[{binding:0,resource:{buffer:t.paramsBuffer}},{binding:1,resource:{buffer:n}},{binding:2,resource:{buffer:r}},{binding:3,resource:{buffer:i}},{binding:4,resource:{buffer:p}},{binding:5,resource:{buffer:m}}]}),_=e.createCommandEncoder({label:`residual-pc`}),v=_.beginComputePass({label:`residual-pc-partial`});v.setPipeline(t.partialPipeline),v.setBindGroup(0,g),v.dispatchWorkgroups(u),v.end();let y=_.beginComputePass({label:`residual-pc-final`});y.setPipeline(t.finalPipeline),y.setBindGroup(0,g),y.dispatchWorkgroups(1),y.end(),_.copyBufferToBuffer(m,0,h,0,l*4),e.queue.submit([_.finish()]),await h.mapAsync(GPUMapMode.READ);let b=new Float32Array(h.getMappedRange()).slice();return h.unmap(),p.destroy(),m.destroy(),h.destroy(),_e(b,c,s,a)},_e=(e,t,n,r)=>{let i=new Float64Array(t*t);for(let n=0;n<t;n++)for(let r=n;r<t;r++){let a=e[t+(n*t-n*(n-1)/2+(r-n))];i[n*t+r]=a,i[r*t+n]=a}let a=new Float64Array(t),o=new Float64Array(t);for(let e=0;e<t;e++)a[e]=r[e],o[e]=r[n+e];let s=new Float64Array(t);for(let e=0;e<t;e++)s[e]=1;N(s,a,o,t),P(s,t);let c=new Float64Array(t);for(let e=0;e<15;e++){for(let e=0;e<t;e++){let n=0;for(let r=0;r<t;r++)n+=i[e*t+r]*s[r];c[e]=n}N(c,a,o,t),P(c,t);let e=s;s=c,c=e}let l=new Float32Array(n);for(let e=0;e<t;e++)l[e]=s[e];return l},N=(e,t,n,r)=>{let i=0,a=0;for(let o=0;o<r;o++)i+=e[o]*t[o],a+=e[o]*n[o];for(let o=0;o<r;o++)e[o]=e[o]-(i*t[o]+a*n[o])},P=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-12)for(let r=0;r<t;r++)e[r]=e[r]/n};let F=null,I=[],L=null;const R=(e,t)=>{self.postMessage(e,t??[])},ve=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=n*r,s=o*o*i/e,c=Math.sqrt(s/Math.PI),l=a*r*.5,u,d;return c>=l?(u=c,d=1):(u=l,d=Math.max(.01,s/(Math.PI*l*l))),{pointSize:2*u/o,opacity:d}},ye=(e,t)=>e*F.dpr/t,be=e=>{let{style:t,numPoints:n,dpr:r}=F;if(t.pointSize!==`auto`&&t.opacity!==`auto`)return{pointSize:ye(t.pointSize,e.height),opacity:t.opacity,color:t.color,scaleOpacityByZoom:!1};let i=ve(n,e.width/r,e.height/r,r,t.fillTarget,t.minPointSize),a=t.opacity===`auto`;return{pointSize:t.pointSize===`auto`?i.pointSize:ye(t.pointSize,e.height),opacity:a?i.opacity:t.opacity,color:t.color,scaleOpacityByZoom:a}},xe=()=>{let{device:e,mainView:t,tonemapPipeline:n}=F,{width:r,height:i}=t.canvas,a=F.mainHdrTexture;if(a&&a.width===r&&a.height===i)return;a?.destroy();let o=e.createTexture({label:`hdr-main`,size:[r,i],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),s=o.createView();F.mainHdrTexture=o,F.mainHdrTextureView=s,F.mainTonemapBindGroup=se(e,n.bindGroupLayout,s,n.paramsBuffer)},Se=()=>{if(!F.previewGpuCanvas)return;let{device:e,tonemapPipeline:t}=F,{width:n,height:r}=F.previewGpuCanvas,i=F.previewHdrTexture;if(i&&i.width===n&&i.height===r)return;i?.destroy();let a=e.createTexture({label:`hdr-preview`,size:[n,r],format:F.hdrFormat,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),o=a.createView();F.previewHdrTexture=a,F.previewHdrTextureView=o,F.previewTonemapBindGroup=se(e,t.bindGroupLayout,o,t.paramsBuffer)},Ce=e=>Math.ceil(e/32)*4,we=()=>{if(!F)throw Error(`state not initialized`);let e=Ce(F.numPoints);return(!F.selectionBuffer||F.selectionBuffer.size!==e)&&(F.selectionBuffer?.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST})),F.selectionBuffer};let z=null;const Te=(e,t,n,r,i=2)=>{let a=r*i;(!z||z.length!==a)&&(z=new Float32Array(a));let o=0,s=0,c=0;for(let a=0;a<r;a++){let l=Math.max(n[a],1e-6),u=e[a],d=e[r+a],f=2/l;z[a]=u*f,z[r+a]=d*f;let p=-t[a]/l;if(o+=p*u*2,s+=p*d*2,i===3){let t=e[2*r+a];z[2*r+a]=t*f,c+=p*t*2}}return{weights:z,biasX:o,biasY:s,biasZ:c}},Ee=()=>{if(!F?.normMins||!F?.normRanges)return null;let e=F.numDims,t=new Float32Array(e);if(F.centering===`mean`&&F.normMeans)t.set(F.normMeans);else for(let n=0;n<e;n++)t[n]=F.normMins[n]+F.normRanges[n]*.5;return t},B=()=>{if(!F?.projectionResources||!F.normRanges)return;let e=F.numDims,t=Ee();if(!t)return;let n=new Float32Array(e*2);for(let r=0;r<e;r++)n[r*2]=t[r],n[r*2+1]=F.normRanges[r];F.device.queue.writeBuffer(F.projectionResources.normParamsBuffer,0,n)};let V=null,De=0,H=!0,U=!1;const W=()=>H?(H=!1,U=!1,J(),F.device.queue.onSubmittedWorkDone().then(()=>{H=!0,U&&F&&!V&&(U=!1,W())},()=>{H=!0,R({type:`error`,message:`WebGPU device lost during rendering`})}),!0):(U=!0,!1),Oe=e=>{if(!V||!F?.tour)return;let t=V.prevTime===null?void 0:e-V.prevTime;if(t!==void 0){let e=t/1e3*V.speed*V.direction/20,n=F.tour.position+e;n-=Math.floor(n),F.tour.position=n}V.prevTime=e,F.directBasis=null,W()&&(V.lastRenderedRafTime!==null&&V.frameTimes.push(e-V.lastRenderedRafTime),V.lastRenderedRafTime=e),e-De>=33&&(R({type:`playbackTick`,position:F.tour.position,frameMs:t}),De=e),V.rafId=requestAnimationFrame(Oe)},ke=(e,t)=>{V?(V.speed=e,V.direction=t):(H=!0,V={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},V.rafId=requestAnimationFrame(Oe))},Ae=()=>{if(V){cancelAnimationFrame(V.rafId),F?.tour&&R({type:`playbackTick`,position:F.tour.position});let e=Float64Array.from(V.frameTimes);R({type:`playbackStopped`,frameTimes:e},[e.buffer]),V=null}},G=(e,t,n,r,i,a)=>{if(!F?.projectionResources||!F.adjBasisBuffer||!F.normRanges)return;let{device:c,numPoints:l,numDims:u}=F,d=F.is3dActive&&F.residualPC,f=d?3:2,p;d?(p=new Float32Array(u*3),p.set(e.subarray(0,u*2)),p.set(F.residualPC,u*2)):p=e;let m=Ee();if(!m)return;let{weights:h,biasX:g,biasY:_,biasZ:v}=Te(p,m,F.normRanges,u,f),y=u*f*4;F.adjBasisBuffer.size<y&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=c.createBuffer({label:`adj-basis`,size:y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Y()),c.queue.writeBuffer(F.adjBasisBuffer,0,h);let b=be(t.canvas),x=F.backgroundColor,ee=.2126*x[0]+.7152*x[1]+.0722*x[2],S=F.colorState.mode>0,C=!S&&ee>.5,w,T;S?(w=F.pointPipeline.normalPipeline,T=1):C?(w=F.pointPipeline.subtractivePipeline,T=1):(w=F.pointPipeline.additivePipeline,T=0),M(c,F.pointPipeline.uniformBuffer,b,F.styleFlags,F.colorState,C,l,u,g,_,F.maxPoints,v),ae(c,F.tonemapPipeline.paramsBuffer,T);let E=t.canvas,te=E.width/E.height||1;re(c,F.pointPipeline.cameraBuffer,{...i,aspect:te,viewportHeight:E.height});let D=c.createCommandEncoder({label:`render-frame`});o(D,n,w,a,l,x),s(D,t,F.tonemapPipeline.pipeline,r),c.queue.submit([D.finish()])},je={panX:0,panY:0,zoom:1,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},Me=()=>{!F||F.previewGpuCanvas||(F.previewGpuCanvas=new OffscreenCanvas(300,300),F.previewGpuView=i(F.previewGpuCanvas,F.device))};let K=!1;const Ne=(e,t)=>{if(!F?.projectionResources||!F.renderBindGroup)return;let n=F.previewCanvases.get(e);n&&(Me(),Se(),!(!F.previewGpuView||!F.previewHdrTextureView||!F.previewTonemapBindGroup)&&((F.previewGpuCanvas.width!==n.canvas.width||F.previewGpuCanvas.height!==n.canvas.height)&&(F.previewGpuCanvas.width=n.canvas.width,F.previewGpuCanvas.height=n.canvas.height,Se(),!F.previewHdrTextureView||!F.previewTonemapBindGroup)||(G(t,F.previewGpuView,F.previewHdrTextureView,F.previewTonemapBindGroup,je,F.renderBindGroup),n.ctx2d.drawImage(F.previewGpuCanvas,0,0),R({type:`rendered`,viewIndex:e}))))},Pe=()=>{if(!F?.projectionResources||!F.tour)return;let{tour:e,previewCanvases:t}=F;for(let[n]of t)n<e.bases.length&&Ne(n,e.bases[n])},Fe=()=>{K||(K=!0,setTimeout(()=>{K=!1,Pe()},0))},q=()=>{F?.projectionResources&&(J(),Fe())},J=()=>{if(!F?.projectionResources||!F.renderBindGroup||(xe(),!F.mainHdrTextureView||!F.mainTonemapBindGroup))return;if(F.directBasis){G(F.directBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0});return}if(!F.tour)return;let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),G(e.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),R({type:`rendered`,viewIndex:0})},Y=()=>{if(!F?.projectionResources||!F.adjBasisBuffer)return;let{device:e,projectionPipeline:t,pointPipeline:n,projectionResources:r}=F,i=F.colorLutBuffer??n.defaultColorLutBuffer,a=F.selectionBuffer??n.defaultSelectionBuffer,o=n.defaultCatIndicesBuffer;F.colorState.mode===2&&F.activeCatColumnName&&(o=F.categoricalBuffers.get(F.activeCatColumnName)??o),F.projectionBindGroup=fe(e,t.bindGroupLayout,t.paramsBuffer,r),F.renderBindGroup=ie(e,n.bindGroupLayout,n.uniformBuffer,r.dataBuffer,n.cameraBuffer,i,a,F.adjBasisBuffer,o)},X=()=>{F&&(Y(),(F.tour||F.directBasis)&&F.projectionResources&&q())},Ie=()=>{F&&(F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q())};let Z=0;const Le=e=>{if(!F)return;let{device:t}=F;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==Z)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:a.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,a),F.colorState={mode:1,columnOffset:n*F.numPoints,min:r,range:i,numStops:a.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,X();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==Z)return;let{catColumnName:n,palette:r}=e.data;if(!F.categoricalBuffers.has(n))return;F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,r),F.colorState={mode:2,columnOffset:0,min:0,range:1,numStops:r.length,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=n,X();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==Z)return;let{columnIndexX:n,columnIndexY:r,minX:i,rangeX:a,minY:o,rangeY:s,lut:c,mapIndex:l}=e.data;c&&(F.colorLutBuffer?.destroy(),F.colorLutBuffer=t.createBuffer({label:`color-lut-2d`,size:c.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.colorLutBuffer,0,c)),F.colorState={mode:3,columnOffset:n*F.numPoints,min:i,range:a,numStops:0,columnOffsetV:r*F.numPoints,minV:o,rangeV:s,mapIndex:l},F.activeCatColumnName=null,X();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==Z||!F.projectionResources)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,colorPipelines:a}=F,o=we(),s=t.createBuffer({label:`select-ranges`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(s,0,r),b(t,a.paramsBuffer,i,n*i,r.length/2);let c=y(t,a.bindGroupLayout,F.projectionResources.dataBuffer,s,o,a.paramsBuffer),l=t.createCommandEncoder({label:`select-continuous`});l.clearBuffer(o,0,o.size);let u=l.beginComputePass({label:`select-continuous`});u.setPipeline(a.selectContinuous),u.setBindGroup(0,c),u.dispatchWorkgroups(Math.ceil(i/256)),u.end(),t.queue.submit([l.finish()]),s.destroy(),Ie();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==Z)return;let{catColumnName:n,selectedLabels:r}=e.data,i=F.categoricalBuffers.get(n);if(!i)return;let{numPoints:a,colorPipelines:o}=F,s=we(),c=t.createBuffer({label:`selected-labels`,size:Math.max(r.byteLength,4),usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.queue.writeBuffer(c,0,r),x(t,o.paramsBuffer,a,r.length);let l=y(t,o.bindGroupLayout,i,c,s,o.paramsBuffer),u=t.createCommandEncoder({label:`select-categorical`});u.clearBuffer(s,0,s.size);let d=u.beginComputePass({label:`select-categorical`});d.setPipeline(o.selectCategorical),d.setBindGroup(0,l),d.dispatchWorkgroups(Math.ceil(a/256)),d.end(),t.queue.submit([u.finish()]),c.destroy(),Ie();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,means:c,categoricalColumns:l}=e.data;if(Z=n,r<2||i===0||a.length<2){R({type:`error`,message:`Need at least 2 dimensions to render`});return}F.projectionResources&&(F.projectionResources.dataBuffer.destroy(),F.projectionResources.normParamsBuffer.destroy(),F.projectionResources.basisBuffer.destroy(),F.projectionResources.projectedBuffer.destroy()),F.adjBasisBuffer&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=null),F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null);for(let e of F.categoricalBuffers.values())e.destroy();F.categoricalBuffers.clear(),F.styleFlags={useSelectionMask:!1},F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,F.is3dActive=!1,F.rotation3d=null,F.residualPC=null,F.camera.use3d=!1,F.camera.rotation=null;let{projectionPipeline:u}=F,d=de(t,i,r);for(let e=0;e<r;e++)t.queue.writeBuffer(d.dataBuffer,e*i*4,a[e]);for(let e of l){let n=t.createBuffer({label:`cat-indices-${e.name}`,size:e.indices.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST|GPUBufferUsage.COPY_SRC});t.queue.writeBuffer(n,0,e.indices),F.categoricalBuffers.set(e.name,n)}if(ue(t,u.paramsBuffer,i,r,2),F.adjBasisBuffer=t.createBuffer({label:`adj-basis`,size:r*2*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.normMins=new Float32Array(o),F.normRanges=new Float32Array(s),F.normMeans=new Float32Array(c),F.projectionResources={...d,bindGroup:null},F.numPoints=i,F.numDims=r,B(),Y(),F.tour&&F.tour.dims===r)q();else{let e=Math.max(1,F.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}F.tour={bases:t,arcLengths:p(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},q()}},Q=(e,t)=>{e.projectionResources&&(e.residualPcPipeline||=he(e.device),e.device.queue.writeBuffer(e.projectionResources.basisBuffer,0,t),ge(e.device,e.residualPcPipeline,e.projectionResources.dataBuffer,e.projectionResources.normParamsBuffer,e.projectionResources.basisBuffer,t,e.numPoints,e.numDims).then(e=>{F?.is3dActive&&(F.residualPC=e,R({type:`residualPC`,residualPC:new Float32Array(e)}),J())}))},$=e=>{if(F){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`,i=p(t,n,r);F.tour={bases:t,arcLengths:i,dims:n,orthonormalize:r,position:F.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},F.projectionResources&&q();return}if(e.type===`setTourPosition`){if(!F.tour)return;F.tour.position=e.position,F.directBasis=null,W();return}if(e.type===`setStyle`){F.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??F.style.minPointSize,fillTarget:e.fillTarget??F.style.fillTarget},(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setCamera`){F.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:F.camera.aspect,viewportHeight:F.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom,use3d:F.camera.use3d,rotation:F.camera.rotation},W();return}if(e.type===`setCentering`){if(F.centering=e.centering,B(),(F.tour||F.directBasis)&&F.projectionResources){if(F.is3dActive){let e=F.directBasis??F.tour?.interpolatedBasis;e&&Q(F,e)}q()}return}if(e.type===`resize`){e.dpr!==void 0&&(F.dpr=e.dpr),e.viewIndex===0&&(F.mainView.canvas.width=e.width,F.mainView.canvas.height=e.height,(F.tour||F.directBasis)&&F.projectionResources&&J());return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;F.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),F.tour&&F.projectionResources&&e.id<F.tour.bases.length&&Ne(e.id,F.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){F.previewCanvases.delete(e.id);return}if(e.type===`resizePreview`){let t=F.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,F.tour&&F.projectionResources&&Fe();return}if(e.type===`render`){(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setDirectBasis`){if(!F.projectionResources||!F.renderBindGroup)return;F.directBasis=e.basis,W(),F.is3dActive&&F.projectionResources&&Q(F,e.basis);return}if(e.type===`clearColors`){F.colorLutBuffer&&(F.colorLutBuffer.destroy(),F.colorLutBuffer=null),F.colorState={mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},F.activeCatColumnName=null,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setBackgroundColor`){F.backgroundColor=e.color,(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setMaxPoints`){F.maxPoints=e.maxPoints,(F.tour||F.directBasis)&&F.projectionResources&&q();return}if(e.type===`setSelectionMask`){let{mask:t}=e;F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=F.device.createBuffer({label:`selection-mask`,size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),F.device.queue.writeBuffer(F.selectionBuffer,0,t),F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();let n=new Uint32Array(t);R({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){F.selectionBuffer&&(F.selectionBuffer.destroy(),F.selectionBuffer=null),F.styleFlags.useSelectionMask=!1,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q(),R({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`enable3d`){if(!F.projectionResources)return;let e=F.directBasis??F.tour?.interpolatedBasis;if(!e)return;if(F.is3dActive=!0,F.camera.use3d=!0,F.adjBasisBuffer){let e=F.numDims*3*4;F.adjBasisBuffer.size<e&&(F.adjBasisBuffer.destroy(),F.adjBasisBuffer=F.device.createBuffer({label:`adj-basis`,size:e,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),Y())}J(),Q(F,e);return}if(e.type===`disable3d`){F.is3dActive=!1,F.residualPC=null,F.rotation3d=null,F.camera.use3d=!1,F.camera.rotation=null,J();return}if(e.type===`set3dRotation`){F.rotation3d=e.matrix,F.camera.rotation=e.matrix,W();return}if(e.type===`startPlayback`){if(!F.tour)return;ke(e.speed,e.direction);return}if(e.type===`stopPlayback`){Ae();return}if(e.type===`computePCA`){if(!F.projectionResources||F.numDims<2){R({type:`error`,message:`No data loaded for PCA`});return}let{device:e,projectionResources:t,numPoints:i,numDims:a}=F;L||=n(e),r(e,L,t.dataBuffer,t.normParamsBuffer,i,a).then(({eigenvalues:e,eigenvectors:t})=>{R({type:`pcaResult`,eigenvectors:t,eigenvalues:e,numDims:t.length})}).catch(e=>{R({type:`error`,message:`PCA failed: ${e instanceof Error?e.message:String(e)}`})});return}if(e.type===`lassoSelect`){if(!F.projectionResources||!F.projectionBindGroup||F.numPoints===0)return;let{device:t,numPoints:n,projectionPipeline:r,projectionResources:i,camera:a}=F,{polygon:o}=e,s=o.length/2;if(s<3)return;let c=null;if(F.directBasis)c=F.directBasis;else if(F.tour){let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),c=e.interpolatedBasis}if(!c)return;t.queue.writeBuffer(i.basisBuffer,0,c);let l=pe(t,r,F.projectionBindGroup,n);t.queue.submit([l]);let u=F.mainView.canvas,d=u.width/u.height||1,f=a.insetZoom,p=a.zoom*f,m=new Float32Array(o.length);for(let e=0;e<s;e++)m[e*2]=o[e*2]*d/p-a.panX,m[e*2+1]=(o[e*2+1]-a.insetOffsetY)/p-a.panY;let g=n*2*4,_=t.createBuffer({label:`proj-readback`,size:g,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),v=t.createCommandEncoder();v.copyBufferToBuffer(i.projectedBuffer,0,_,0,g),t.queue.submit([v.finish()]),_.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(_.getMappedRange()),r=new Uint32Array(Math.ceil(n/32));for(let t=0;t<n;t++){let n=e[t*2],i=e[t*2+1];if(Ve(n,i,m,s)){let e=t>>5;r[e]=(r[e]??0)|1<<(t&31)}}_.unmap(),_.destroy(),F.selectionBuffer&&F.selectionBuffer.destroy(),F.selectionBuffer=t.createBuffer({label:`selection-mask`,size:r.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),t.queue.writeBuffer(F.selectionBuffer,0,r),F.styleFlags.useSelectionMask=!0,Y(),(F.tour||F.directBasis)&&F.projectionResources&&q();let i=new Uint32Array(r);R({type:`selectionResult`,mask:i},[i.buffer])});return}if(e.type===`getProjectedPositions`){if(!F.projectionResources||!F.projectionBindGroup||F.numPoints===0){R({type:`projectedPositions`,positions:new Float32Array},[]);return}let{device:e,numPoints:t,projectionPipeline:n,projectionResources:r}=F,i=null;if(F.directBasis)i=F.directBasis;else if(F.tour){let{tour:e}=F;h(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),i=e.interpolatedBasis}if(!i){R({type:`projectedPositions`,positions:new Float32Array},[]);return}e.queue.writeBuffer(r.basisBuffer,0,i);let a=pe(e,n,F.projectionBindGroup,t);e.queue.submit([a]);let o=t*2*4,s=e.createBuffer({label:`proj-positions-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=e.createCommandEncoder();c.copyBufferToBuffer(r.projectedBuffer,0,s,0,o),e.queue.submit([c.finish()]),s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();s.unmap(),s.destroy(),R({type:`projectedPositions`,positions:e},[e.buffer])});return}if(e.type===`getPointData`){if(!F.projectionResources||F.numPoints===0){R({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{device:t,numPoints:n,numDims:r,projectionResources:i}=F,a=e.pointIndex;if(a<0||a>=n){R({type:`pointData`,pointIndex:a,numericValues:{},categoricalValues:{}});return}let o=r*4,s=t.createBuffer({label:`point-data-readback`,size:o,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),c=t.createCommandEncoder();for(let e=0;e<r;e++)c.copyBufferToBuffer(i.dataBuffer,(e*n+a)*4,s,e*4,4);let l=Array.from(F.categoricalBuffers.keys()),u=l.length*4,d=null;if(u>0){d=t.createBuffer({label:`point-cat-readback`,size:u,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});let e=0;for(let t of l){let n=F.categoricalBuffers.get(t);c.copyBufferToBuffer(n,a*4,d,e,4),e+=4}}t.queue.submit([c.finish()]);let f=s.mapAsync(GPUMapMode.READ).then(()=>{let e=new Float32Array(s.getMappedRange()).slice();return s.unmap(),s.destroy(),e}),p=d?d.mapAsync(GPUMapMode.READ).then(()=>{let e=new Uint32Array(d.getMappedRange()).slice();return d.unmap(),d.destroy(),e}):Promise.resolve(new Uint32Array);Promise.all([f,p]).then(([e,t])=>{let n={};for(let t=0;t<r;t++)n[String(t)]=e[t];let i={};for(let e=0;e<l.length;e++)i[l[e]]=t[e];R({type:`pointData`,pointIndex:a,numericValues:n,categoricalValues:i})});return}if(e.type===`benchmark`){Be(e.numFrames);return}if(e.type===`getMetrics`){ze();return}}},Re=()=>{if(!F)return 0;let e=0;if(F.projectionResources){let t=F.projectionResources;e+=t.dataBuffer.size+t.normParamsBuffer.size+t.basisBuffer.size+t.projectedBuffer.size}F.adjBasisBuffer&&(e+=F.adjBasisBuffer.size),F.selectionBuffer&&(e+=F.selectionBuffer.size),F.colorLutBuffer&&(e+=F.colorLutBuffer.size);for(let t of F.categoricalBuffers.values())e+=t.size;F.mainHdrTexture&&(e+=F.mainHdrTexture.width*F.mainHdrTexture.height*16),F.previewHdrTexture&&(e+=F.previewHdrTexture.width*F.previewHdrTexture.height*16);let t=F.pointPipeline;return e+=t.uniformBuffer.size+t.cameraBuffer.size,e+=t.defaultColorLutBuffer.size+t.defaultSelectionBuffer.size+t.defaultCatIndicesBuffer.size,e+=F.projectionPipeline.paramsBuffer.size,e+=F.tonemapPipeline.paramsBuffer.size,e},ze=()=>{if(!F)return;let e=0;if(F.tour){for(let t of F.tour.bases)e+=t.byteLength;e+=F.tour.interpolatedBasis.byteLength}R({type:`metricsResult`,gpuMemoryBytes:Re(),numPoints:F.numPoints,numDims:F.numDims,workerJsHeapBytes:e})},Be=async e=>{if(!F?.tour||!F.renderBindGroup||F.numPoints===0){R({type:`error`,message:`No data/tour loaded for benchmark`});return}let{device:t,numPoints:n,numDims:r,tour:i}=F,a=i.position;F.directBasis=null;for(let e=0;e<5;e++)i.position=e/5,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),xe(),G(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone();let o=new Float64Array(e);for(let n=0;n<e;n++){i.position=n/e,h(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let r=performance.now();G(i.interpolatedBasis,F.mainView,F.mainHdrTextureView,F.mainTonemapBindGroup,F.camera,F.renderBindGroup),await t.queue.onSubmittedWorkDone(),o[n]=performance.now()-r}i.position=a,R({type:`benchmarkResult`,frameTimes:o,numPoints:n,numDims:r},[o.buffer])},Ve=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i};self.onmessage=async e=>{let t=e.data;if(t.type===`init`){try{let{device:e}=await ee(),n=i(t.canvas,e),r=navigator.gpu.getPreferredCanvasFormat(),a=`rgba32float`,o=ne(e,a),s=le(e),c=v(e),l=oe(e,r);F={device:e,mainView:n,previewGpuCanvas:null,previewGpuView:null,previewCanvases:new Map,pointPipeline:o,renderBindGroup:null,projectionPipeline:s,projectionResources:null,projectionBindGroup:null,colorPipelines:c,numPoints:0,numDims:0,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},camera:{panX:0,panY:0,zoom:t.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1,use3d:!1,rotation:null},colorLutBuffer:null,colorState:{mode:0,columnOffset:0,min:0,range:1,numStops:0,columnOffsetV:0,minV:0,rangeV:1,mapIndex:0},activeCatColumnName:null,selectionBuffer:null,directBasis:null,backgroundColor:[0,0,0],dpr:t.dpr,hdrFormat:a,tonemapPipeline:l,mainHdrTexture:null,mainHdrTextureView:null,mainTonemapBindGroup:null,previewHdrTexture:null,previewHdrTextureView:null,previewTonemapBindGroup:null,maxPoints:0,adjBasisBuffer:null,normMins:null,normRanges:null,normMeans:null,centering:`midrange`,is3dActive:!1,rotation3d:null,residualPC:null,residualPcPipeline:null},t.dataPort.onmessage=Le;let u=I;if(I=null,u)for(let e of u)$(e);R({type:`ready`})}catch(e){R({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(I){I.push(t);return}$(t)};", h = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", m], { type: "text/javascript;charset=utf-8" });
|
|
2639
|
+
function g(e) {
|
|
2632
2640
|
let t;
|
|
2633
2641
|
try {
|
|
2634
|
-
if (t =
|
|
2642
|
+
if (t = h && (self.URL || self.webkitURL).createObjectURL(h), !t) throw "";
|
|
2635
2643
|
let n = new Worker(t, {
|
|
2636
2644
|
type: "module",
|
|
2637
2645
|
name: e?.name
|
|
@@ -2640,7 +2648,7 @@ function h(e) {
|
|
|
2640
2648
|
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
2641
2649
|
}), n;
|
|
2642
2650
|
} catch {
|
|
2643
|
-
return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(
|
|
2651
|
+
return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(m), {
|
|
2644
2652
|
type: "module",
|
|
2645
2653
|
name: e?.name
|
|
2646
2654
|
});
|
|
@@ -2648,7 +2656,7 @@ function h(e) {
|
|
|
2648
2656
|
}
|
|
2649
2657
|
//#endregion
|
|
2650
2658
|
//#region src/gpu/client.ts
|
|
2651
|
-
var
|
|
2659
|
+
var _ = (e) => {
|
|
2652
2660
|
let t = e.reduce((e, t) => e + t, 0) / e.length, n = Float64Array.from(e).sort();
|
|
2653
2661
|
return {
|
|
2654
2662
|
avgMs: t,
|
|
@@ -2658,12 +2666,12 @@ var g = (e) => {
|
|
|
2658
2666
|
minMs: n[0],
|
|
2659
2667
|
maxMs: n[e.length - 1]
|
|
2660
2668
|
};
|
|
2661
|
-
}, _ = (e, t, n) => {
|
|
2662
|
-
e.postMessage(t, n ?? []);
|
|
2663
2669
|
}, v = (e, t, n) => {
|
|
2664
2670
|
e.postMessage(t, n ?? []);
|
|
2665
|
-
}, y = (e) => {
|
|
2666
|
-
|
|
2671
|
+
}, y = (e, t, n) => {
|
|
2672
|
+
e.postMessage(t, n ?? []);
|
|
2673
|
+
}, b = (e) => {
|
|
2674
|
+
let { canvas: t, zoom: n = 1, dpr: r = typeof self < "u" && "devicePixelRatio" in self ? self.devicePixelRatio : 1 } = e, i = new g(), a = new p(), o = new MessageChannel(), s = /* @__PURE__ */ new Set(), c = (e) => {
|
|
2667
2675
|
for (let t of s) t(e);
|
|
2668
2676
|
};
|
|
2669
2677
|
i.onmessage = (e) => {
|
|
@@ -2672,7 +2680,7 @@ var g = (e) => {
|
|
|
2672
2680
|
let e = t.frameTimes;
|
|
2673
2681
|
c({
|
|
2674
2682
|
...t,
|
|
2675
|
-
stats:
|
|
2683
|
+
stats: _(e)
|
|
2676
2684
|
});
|
|
2677
2685
|
return;
|
|
2678
2686
|
}
|
|
@@ -2694,10 +2702,10 @@ var g = (e) => {
|
|
|
2694
2702
|
});
|
|
2695
2703
|
};
|
|
2696
2704
|
let l = t.transferControlToOffscreen();
|
|
2697
|
-
|
|
2705
|
+
y(a, {
|
|
2698
2706
|
type: "init",
|
|
2699
2707
|
gpuPort: o.port1
|
|
2700
|
-
}, [o.port1]),
|
|
2708
|
+
}, [o.port1]), v(i, {
|
|
2701
2709
|
type: "init",
|
|
2702
2710
|
canvas: l,
|
|
2703
2711
|
dataPort: o.port2,
|
|
@@ -2719,20 +2727,20 @@ var g = (e) => {
|
|
|
2719
2727
|
zoom: n,
|
|
2720
2728
|
insetOffsetY: 0,
|
|
2721
2729
|
insetZoom: 1
|
|
2722
|
-
},
|
|
2723
|
-
|
|
2730
|
+
}, f = (e) => {
|
|
2731
|
+
y(a, {
|
|
2724
2732
|
type: "load",
|
|
2725
2733
|
buffer: e
|
|
2726
2734
|
}, [e]);
|
|
2727
2735
|
}, m = (e, t) => {
|
|
2728
2736
|
let n = e.map((e) => e.buffer);
|
|
2729
|
-
|
|
2737
|
+
v(i, {
|
|
2730
2738
|
type: "setBases",
|
|
2731
2739
|
bases: e,
|
|
2732
2740
|
tourFamily: t
|
|
2733
2741
|
}, n);
|
|
2734
|
-
},
|
|
2735
|
-
|
|
2742
|
+
}, h = (e) => {
|
|
2743
|
+
v(i, {
|
|
2736
2744
|
type: "setTourPosition",
|
|
2737
2745
|
position: e
|
|
2738
2746
|
});
|
|
@@ -2740,7 +2748,7 @@ var g = (e) => {
|
|
|
2740
2748
|
u = {
|
|
2741
2749
|
...u,
|
|
2742
2750
|
...e
|
|
2743
|
-
},
|
|
2751
|
+
}, v(i, {
|
|
2744
2752
|
type: "setStyle",
|
|
2745
2753
|
pointSize: u.pointSize,
|
|
2746
2754
|
opacity: u.opacity,
|
|
@@ -2752,7 +2760,7 @@ var g = (e) => {
|
|
|
2752
2760
|
d = {
|
|
2753
2761
|
...d,
|
|
2754
2762
|
...e
|
|
2755
|
-
},
|
|
2763
|
+
}, v(i, {
|
|
2756
2764
|
type: "setCamera",
|
|
2757
2765
|
pan: d.pan,
|
|
2758
2766
|
zoom: d.zoom,
|
|
@@ -2760,12 +2768,12 @@ var g = (e) => {
|
|
|
2760
2768
|
insetZoom: d.insetZoom
|
|
2761
2769
|
});
|
|
2762
2770
|
}, S = (e) => {
|
|
2763
|
-
|
|
2771
|
+
v(i, {
|
|
2764
2772
|
type: "setCentering",
|
|
2765
2773
|
centering: e
|
|
2766
2774
|
});
|
|
2767
2775
|
}, C = (e, t, n, r) => {
|
|
2768
|
-
|
|
2776
|
+
v(i, {
|
|
2769
2777
|
type: "resize",
|
|
2770
2778
|
viewIndex: e,
|
|
2771
2779
|
width: t,
|
|
@@ -2773,14 +2781,14 @@ var g = (e) => {
|
|
|
2773
2781
|
dpr: r
|
|
2774
2782
|
});
|
|
2775
2783
|
}, w = () => {
|
|
2776
|
-
|
|
2784
|
+
v(i, { type: "render" });
|
|
2777
2785
|
}, T = (e) => {
|
|
2778
|
-
|
|
2786
|
+
v(i, {
|
|
2779
2787
|
type: "setDirectBasis",
|
|
2780
2788
|
basis: e
|
|
2781
2789
|
}, [e.buffer]);
|
|
2782
2790
|
}, E = (e, t, n, r) => {
|
|
2783
|
-
|
|
2791
|
+
y(a, {
|
|
2784
2792
|
type: "encodeColor",
|
|
2785
2793
|
column: e,
|
|
2786
2794
|
...t ? { palette: t } : {},
|
|
@@ -2788,60 +2796,60 @@ var g = (e) => {
|
|
|
2788
2796
|
...r ? { colorMap: r } : {}
|
|
2789
2797
|
});
|
|
2790
2798
|
}, D = (e, t, n = "schumann") => {
|
|
2791
|
-
|
|
2799
|
+
y(a, {
|
|
2792
2800
|
type: "encodeColor2D",
|
|
2793
2801
|
columnX: e,
|
|
2794
2802
|
columnY: t,
|
|
2795
2803
|
colormap: n
|
|
2796
2804
|
});
|
|
2797
2805
|
}, O = (e) => {
|
|
2798
|
-
|
|
2806
|
+
v(i, {
|
|
2799
2807
|
type: "setBackgroundColor",
|
|
2800
2808
|
color: e
|
|
2801
2809
|
});
|
|
2802
2810
|
}, k = () => {
|
|
2803
|
-
|
|
2811
|
+
v(i, { type: "clearColors" });
|
|
2804
2812
|
}, A = (e, t) => {
|
|
2805
2813
|
let n = t.valueRanges ? new Float32Array(t.valueRanges) : void 0, r = [];
|
|
2806
|
-
n && r.push(n.buffer),
|
|
2814
|
+
n && r.push(n.buffer), y(a, {
|
|
2807
2815
|
type: "selectByColumn",
|
|
2808
2816
|
column: e,
|
|
2809
2817
|
labelIndices: t.labelIndices,
|
|
2810
2818
|
valueRanges: n
|
|
2811
2819
|
}, r);
|
|
2812
2820
|
}, j = (e) => {
|
|
2813
|
-
|
|
2821
|
+
v(i, {
|
|
2814
2822
|
type: "setSelectionMask",
|
|
2815
2823
|
mask: e
|
|
2816
2824
|
}, [e.buffer]);
|
|
2817
2825
|
}, M = (e) => {
|
|
2818
|
-
|
|
2826
|
+
v(i, {
|
|
2819
2827
|
type: "lassoSelect",
|
|
2820
2828
|
polygon: e
|
|
2821
2829
|
}, [e.buffer]);
|
|
2822
2830
|
}, N = () => {
|
|
2823
|
-
|
|
2831
|
+
v(i, { type: "clearSelectionMask" });
|
|
2824
2832
|
}, P = () => {
|
|
2825
|
-
|
|
2833
|
+
v(i, { type: "computePCA" });
|
|
2826
2834
|
}, F = (e, t) => {
|
|
2827
|
-
|
|
2835
|
+
v(i, {
|
|
2828
2836
|
type: "startPlayback",
|
|
2829
2837
|
speed: e,
|
|
2830
2838
|
direction: t
|
|
2831
2839
|
});
|
|
2832
2840
|
}, I = () => {
|
|
2833
|
-
|
|
2841
|
+
v(i, { type: "stopPlayback" });
|
|
2834
2842
|
}, L = (e) => {
|
|
2835
|
-
|
|
2843
|
+
v(i, {
|
|
2836
2844
|
type: "setMaxPoints",
|
|
2837
2845
|
maxPoints: e
|
|
2838
2846
|
});
|
|
2839
2847
|
}, R = () => {
|
|
2840
|
-
|
|
2848
|
+
v(i, { type: "enable3d" });
|
|
2841
2849
|
}, z = () => {
|
|
2842
|
-
|
|
2850
|
+
v(i, { type: "disable3d" });
|
|
2843
2851
|
}, B = (e) => {
|
|
2844
|
-
|
|
2852
|
+
v(i, {
|
|
2845
2853
|
type: "set3dRotation",
|
|
2846
2854
|
matrix: e
|
|
2847
2855
|
});
|
|
@@ -2849,7 +2857,7 @@ var g = (e) => {
|
|
|
2849
2857
|
let n = U((e) => {
|
|
2850
2858
|
e.type === "benchmarkResult" && (n(), t(e));
|
|
2851
2859
|
});
|
|
2852
|
-
|
|
2860
|
+
v(i, {
|
|
2853
2861
|
type: "benchmark",
|
|
2854
2862
|
numFrames: e
|
|
2855
2863
|
});
|
|
@@ -2864,12 +2872,12 @@ var g = (e) => {
|
|
|
2864
2872
|
workerJsHeapUsedBytes: a
|
|
2865
2873
|
});
|
|
2866
2874
|
});
|
|
2867
|
-
|
|
2875
|
+
v(i, { type: "getMetrics" });
|
|
2868
2876
|
}), U = (e) => (s.add(e), () => s.delete(e)), W;
|
|
2869
2877
|
return {
|
|
2870
|
-
loadData:
|
|
2878
|
+
loadData: f,
|
|
2871
2879
|
setBases: m,
|
|
2872
|
-
setTourPosition:
|
|
2880
|
+
setTourPosition: h,
|
|
2873
2881
|
setStyle: b,
|
|
2874
2882
|
setCamera: x,
|
|
2875
2883
|
setCentering: S,
|
|
@@ -2888,13 +2896,13 @@ var g = (e) => {
|
|
|
2888
2896
|
let t = U((n) => {
|
|
2889
2897
|
n.type === "projectedPositions" && (t(), W = void 0, e(n.positions));
|
|
2890
2898
|
});
|
|
2891
|
-
W = { unsub: t },
|
|
2899
|
+
W = { unsub: t }, v(i, { type: "getProjectedPositions" });
|
|
2892
2900
|
})),
|
|
2893
2901
|
getPointData: (e) => new Promise((t) => {
|
|
2894
2902
|
let n = U((r) => {
|
|
2895
2903
|
r.type !== "pointData" || r.pointIndex !== e || (n(), t(r));
|
|
2896
2904
|
});
|
|
2897
|
-
|
|
2905
|
+
v(i, {
|
|
2898
2906
|
type: "getPointData",
|
|
2899
2907
|
pointIndex: e
|
|
2900
2908
|
});
|
|
@@ -2910,20 +2918,20 @@ var g = (e) => {
|
|
|
2910
2918
|
getMetrics: H,
|
|
2911
2919
|
addPreviewCanvas: (e, t) => {
|
|
2912
2920
|
let n = t.transferControlToOffscreen();
|
|
2913
|
-
|
|
2921
|
+
v(i, {
|
|
2914
2922
|
type: "addPreviewCanvas",
|
|
2915
2923
|
id: e,
|
|
2916
2924
|
canvas: n
|
|
2917
2925
|
}, [n]);
|
|
2918
2926
|
},
|
|
2919
2927
|
removePreviewCanvas: (e) => {
|
|
2920
|
-
|
|
2928
|
+
v(i, {
|
|
2921
2929
|
type: "removePreviewCanvas",
|
|
2922
2930
|
id: e
|
|
2923
2931
|
});
|
|
2924
2932
|
},
|
|
2925
2933
|
resizePreview: (e, t, n) => {
|
|
2926
|
-
|
|
2934
|
+
v(i, {
|
|
2927
2935
|
type: "resizePreview",
|
|
2928
2936
|
id: e,
|
|
2929
2937
|
width: t,
|
|
@@ -2935,7 +2943,7 @@ var g = (e) => {
|
|
|
2935
2943
|
i.terminate(), a.terminate(), s.clear();
|
|
2936
2944
|
}
|
|
2937
2945
|
};
|
|
2938
|
-
},
|
|
2946
|
+
}, x = (e, t) => {
|
|
2939
2947
|
let n = new Uint32Array(Math.ceil(t / 32));
|
|
2940
2948
|
for (let r = 0; r < e.length; r++) {
|
|
2941
2949
|
let i = e[r];
|
|
@@ -2945,21 +2953,21 @@ var g = (e) => {
|
|
|
2945
2953
|
}
|
|
2946
2954
|
}
|
|
2947
2955
|
return n;
|
|
2948
|
-
},
|
|
2956
|
+
}, S = 1e-10, C = (e) => {
|
|
2949
2957
|
let t = e[0], n = e[1], r = e[2], i = e[3], a = t * t + r * r, o = t * n + r * i, s = n * n + i * i, c = a + s, l = a * s - o * o, u = Math.sqrt(Math.max(0, c * c * .25 - l)), d = c * .5 + u, f = c * .5 - u, p = Math.sqrt(Math.max(0, d)), m = Math.sqrt(Math.max(0, f)), h = new Float32Array([p, m]), g = new Float32Array(4);
|
|
2950
|
-
if (Math.abs(o) >
|
|
2958
|
+
if (Math.abs(o) > S) {
|
|
2951
2959
|
let e = d - s, t = Math.sqrt(e * e + o * o);
|
|
2952
2960
|
g[0] = e / t, g[1] = o / t;
|
|
2953
2961
|
let n = f - s, r = Math.sqrt(n * n + o * o);
|
|
2954
2962
|
g[2] = n / r, g[3] = o / r;
|
|
2955
2963
|
} else g[0] = 1, g[1] = 0, g[2] = 0, g[3] = 1;
|
|
2956
2964
|
let _ = new Float32Array(4);
|
|
2957
|
-
return p >
|
|
2965
|
+
return p > S && (_[0] = (t * g[0] + n * g[1]) / p, _[2] = (r * g[0] + i * g[1]) / p), m > S && (_[1] = (t * g[2] + n * g[3]) / m, _[3] = (r * g[2] + i * g[3]) / m), p <= S && m > S ? (_[0] = -_[3], _[2] = _[1]) : m <= S && p > S ? (_[1] = -_[2], _[3] = _[0]) : p <= S && m <= S && (_[0] = 1, _[1] = 0, _[2] = 0, _[3] = 1), {
|
|
2958
2966
|
U: _,
|
|
2959
2967
|
S: h,
|
|
2960
2968
|
V: g
|
|
2961
2969
|
};
|
|
2962
|
-
},
|
|
2970
|
+
}, w = (e, t) => {
|
|
2963
2971
|
let n = 0;
|
|
2964
2972
|
for (let r = 0; r < t; r++) n += e[r] * e[r];
|
|
2965
2973
|
if (n = Math.sqrt(n), n > 1e-10) for (let r = 0; r < t; r++) e[r] = e[r] / n;
|
|
@@ -2969,20 +2977,20 @@ var g = (e) => {
|
|
|
2969
2977
|
let i = 0;
|
|
2970
2978
|
for (let n = 0; n < t; n++) i += e[t + n] * e[t + n];
|
|
2971
2979
|
if (i = Math.sqrt(i), i > 1e-10) for (let n = 0; n < t; n++) e[t + n] = e[t + n] / i;
|
|
2972
|
-
},
|
|
2980
|
+
}, T = (e, t, n, r, i, a, o, s = !0) => {
|
|
2973
2981
|
let c = o * o, l = c * o, u = .5 * (-o + 2 * c - l), d = .5 * (2 - 5 * c + 3 * l), f = .5 * (o + 4 * c - 3 * l), p = .5 * (-c + l);
|
|
2974
2982
|
for (let o = 0; o < a * 2; o++) e[o] = u * t[o] + d * n[o] + f * r[o] + p * i[o];
|
|
2975
|
-
return s &&
|
|
2976
|
-
},
|
|
2983
|
+
return s && w(e, a), e;
|
|
2984
|
+
}, E = (e, t, n) => {
|
|
2977
2985
|
let r = new Float32Array(4);
|
|
2978
2986
|
for (let i = 0; i < 2; i++) for (let a = 0; a < 2; a++) {
|
|
2979
2987
|
let o = 0;
|
|
2980
2988
|
for (let r = 0; r < n; r++) o += e[i * n + r] * t[a * n + r];
|
|
2981
2989
|
r[i * 2 + a] = o;
|
|
2982
2990
|
}
|
|
2983
|
-
let { S: i } =
|
|
2991
|
+
let { S: i } = C(r), a = Math.acos(Math.max(-1, Math.min(1, i[0]))), o = Math.acos(Math.max(-1, Math.min(1, i[1])));
|
|
2984
2992
|
return Math.sqrt(a * a + o * o);
|
|
2985
|
-
},
|
|
2993
|
+
}, D = 8, O = (e, t, n = !0) => {
|
|
2986
2994
|
let r = e.length, i = new Float32Array(r + 1);
|
|
2987
2995
|
if (i[0] = 0, !n) {
|
|
2988
2996
|
for (let e = 1; e <= r; e++) i[e] = e / r;
|
|
@@ -2991,17 +2999,17 @@ var g = (e) => {
|
|
|
2991
2999
|
let a = new Float32Array(t * 2), o = new Float32Array(t * 2);
|
|
2992
3000
|
for (let n = 0; n < r; n++) {
|
|
2993
3001
|
let s = (n - 1 + r) % r, c = n, l = (n + 1) % r, u = (n + 2) % r, d = 0;
|
|
2994
|
-
|
|
2995
|
-
for (let n = 1; n <=
|
|
2996
|
-
let r = n /
|
|
2997
|
-
|
|
3002
|
+
T(a, e[s], e[c], e[l], e[u], t, 0);
|
|
3003
|
+
for (let n = 1; n <= D; n++) {
|
|
3004
|
+
let r = n / D;
|
|
3005
|
+
T(o, e[s], e[c], e[l], e[u], t, r), d += E(a, o, t), a.set(o);
|
|
2998
3006
|
}
|
|
2999
3007
|
i[n + 1] = i[n] + d;
|
|
3000
3008
|
}
|
|
3001
3009
|
let s = i[r];
|
|
3002
3010
|
if (s > 1e-10) for (let e = 1; e <= r; e++) i[e] = i[e] / s;
|
|
3003
3011
|
return i;
|
|
3004
|
-
},
|
|
3012
|
+
}, k = (e, t) => {
|
|
3005
3013
|
let n = e.length - 1, r = Math.max(0, Math.min(1, t)), i = 0, a = n - 1;
|
|
3006
3014
|
for (; i < a;) {
|
|
3007
3015
|
let t = i + a >>> 1;
|
|
@@ -3012,14 +3020,14 @@ var g = (e) => {
|
|
|
3012
3020
|
segment: i,
|
|
3013
3021
|
localT: c
|
|
3014
3022
|
};
|
|
3015
|
-
},
|
|
3016
|
-
let o = t.length, { segment: s, localT: c } =
|
|
3017
|
-
return
|
|
3018
|
-
}, A = "var e=`#version 300 es\n// Point fragment shader — SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl fs_main. Uses gl_PointCoord for the\n// SDF distance (maps [0,1] in gl.POINTS, remap to [-1,1]).\n\nprecision highp float;\nprecision highp int;\n\nflat in float v_effOpacity;\nflat in vec4 v_color;\nflat in uint v_selected;\nflat in float v_useSubtractive;\nflat in float v_useSelectionMask;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n // gl_PointCoord is [0,1], remap to [-1,1] for SDF\n vec2 uv = gl_PointCoord * 2.0 - 1.0;\n float dist = length(uv);\n\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n float edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n float sel_factor = 1.0;\n if (v_useSelectionMask > 0.5) {\n if (v_selected == 0u) {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(v_effOpacity, 0.01);\n }\n }\n\n float intensity = edge * v_effOpacity * v_color.a * sel_factor;\n\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n vec3 rgb = v_color.rgb;\n if (v_useSubtractive > 0.5) {\n rgb = vec3(1.0) - rgb;\n }\n\n fragColor = vec4(rgb * intensity, intensity);\n}\n`,t=`#version 300 es\n// Point renderer — gl.POINTS with SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl. Projects raw ND data to 2D inline using\n// pre-adjusted basis weights and biases (normalization folded into the basis\n// on CPU). Uses gl.POINTS with gl_PointSize for native point expansion —\n// 1 vertex per point instead of 4 (instanced quads in WebGPU).\n//\n// Data is stored in a tiled R32F texture to handle point counts exceeding\n// MAX_TEXTURE_SIZE. Layout: width=texWidth, height=numDims*tileRows.\n// For point idx: col = idx % texWidth, row = d * tileRows + idx / texWidth.\n//\n// Color mapping: instead of a pre-computed N-element color texture, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\n\n// Raw ND data (column-major, tiled).\n// R32F texture: width = texWidth, height = numDims * tileRows.\nuniform sampler2D u_data;\n\n// Adjusted basis weights (normalization folded in).\n// Max 128 dims — for higher, fall back to a basis texture.\nuniform float u_adjBasisX[128];\nuniform float u_adjBasisY[128];\nuniform vec2 u_bias;\n\n// Style\nuniform float u_pointSize; // NDC units\nuniform float u_opacity;\nuniform vec4 u_color; // uniform point color (RGBA 0-1)\nuniform float u_useSubtractive;\nuniform float u_scaleOpacityByZoom; // 1.0 = auto (zoom² density scaling), 0.0 = manual\n\n// Camera\nuniform vec2 u_pan;\nuniform float u_zoom;\nuniform float u_aspect;\nuniform float u_viewportHeight;\nuniform float u_insetOffsetY;\nuniform float u_insetZoom;\n\n// Data dimensions\nuniform int u_numPoints;\nuniform int u_numDims;\n\n// Decimation: 0 = disabled\nuniform int u_maxPoints;\n\n// Tiling: texture width (min(numPoints, MAX_TEXTURE_SIZE))\nuniform int u_texWidth;\n\n// Color mapping — tiny LUT replaces N-element packed color texture\n// 0 = uniform color, 1 = continuous, 2 = categorical, 3 = 2D colormap\nuniform int u_colorMode;\nuniform int u_colorColumnIndex; // which data column to read (continuous only)\nuniform float u_colorMin;\nuniform float u_colorRange;\nuniform int u_colorNumStops; // LUT size\nuniform usampler2D u_colorLutTex; // packed RGBA u32 LUT (width=numStops, height=1)\nuniform usampler2D u_catIndexTex; // categorical indices (R32UI, tiled like data tex)\n\n// 2D colormap params (used when u_colorMode == 3)\nuniform int u_colorColumnIndexV; // second data column\nuniform float u_colorMinV;\nuniform float u_colorRangeV;\nuniform int u_color2dMapIndex; // 0-5 = LUT-based, 6 = oklab_polar\nuniform float u_color2dLut[128]; // SVD rank-1 LUT curves (8 × 16 entries)\n\n// Selection mask (bit-packed u32 in R32UI texture, width = ceil(N/32), height = 1)\nuniform float u_useSelectionMask;\nuniform usampler2D u_selectionTex;\n\nflat out float v_effOpacity;\nflat out vec4 v_color;\nflat out uint v_selected;\nflat out float v_useSubtractive;\nflat out float v_useSelectionMask;\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nvec4 unpackColor(uint packed) {\n float r = float(packed & 0xFFu) / 255.0;\n float g = float((packed >> 8u) & 0xFFu) / 255.0;\n float b = float((packed >> 16u) & 0xFFu) / 255.0;\n float a = float((packed >> 24u) & 0xFFu) / 255.0;\n return vec4(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from vertex index.\n// Used for vertex-shader decimation when numPoints > maxPoints.\nuint pcg_hash(uint v) {\n uint state = v * 747796405u + 2891336453u;\n uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfloat random_float(uint seed) {\n return float(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ── 2D colormap helpers ──\n\n// Linearly interpolate within a 16-entry LUT curve starting at base offset.\nfloat lut2d_interp(int base, float t) {\n float pos = t * 15.0;\n int lo = min(int(floor(pos)), 14);\n int hi = lo + 1;\n return mix(u_color2dLut[base + lo], u_color2dLut[base + hi], fract(pos));\n}\n\n// Reconstruct 2D color from SVD rank-1 LUT curves.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nvec3 colormap2d_lut(float u, float v) {\n float r = lut2d_interp(0, u) * lut2d_interp(16, v);\n float g = lut2d_interp(32, u) * lut2d_interp(48, v);\n float b = lut2d_interp(64, u) * lut2d_interp(80, v)\n + lut2d_interp(96, u) * lut2d_interp(112, v);\n return clamp(vec3(r, g, b), vec3(0.0), vec3(1.0));\n}\n\n// Oklab → linear sRGB conversion\nvec3 oklabToLinear(vec3 lab) {\n float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n float s_ = lab.x - 0.0894841775 * lab.y - 1.2914855480 * lab.z;\n float l = l_ * l_ * l_;\n float m = m_ * m_ * m_;\n float s = s_ * s_ * s_;\n return vec3(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nvec3 colormap2d_oklab_polar(float u, float v) {\n float cx = u - 0.5;\n float cy = v - 0.5;\n float radius = min(length(vec2(cx, cy)) * 2.0, 1.0);\n float angle = atan(cy, cx);\n float chroma = radius * 0.25;\n float L = mix(0.3, 0.85, 1.0 - radius);\n float a = chroma * cos(angle);\n float b = chroma * sin(angle);\n vec3 linear = oklabToLinear(vec3(L, a, b));\n return pow(clamp(linear, vec3(0.0), vec3(1.0)), vec3(1.0 / 2.2));\n}\n\nvec3 colormap2d(int mapIndex, float u, float v) {\n if (mapIndex == 6) {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\nvoid main() {\n int idx = gl_VertexID;\n\n // Vertex-shader decimation: skip expensive projection for excess points.\n if (u_maxPoints > 0 && u_numPoints > u_maxPoints) {\n float threshold = float(u_maxPoints) / float(u_numPoints);\n if (random_float(uint(idx)) > threshold) {\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n gl_PointSize = 0.0;\n v_effOpacity = 0.0;\n v_color = vec4(0.0);\n v_selected = 0u;\n v_useSubtractive = 0.0;\n v_useSelectionMask = 0.0;\n return;\n }\n }\n\n // Tiled texture coordinates: col = idx % texWidth, tileRow = idx / texWidth\n int tileRows = (u_numPoints + u_texWidth - 1) / u_texWidth;\n int tx = idx % u_texWidth;\n int tileRow = idx / u_texWidth;\n\n // Inline ND -> 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n float x = u_bias.x;\n float y = u_bias.y;\n for (int d = 0; d < u_numDims; d++) {\n float raw = texelFetch(u_data, ivec2(tx, d * tileRows + tileRow), 0).r;\n x += raw * u_adjBasisX[d];\n y += raw * u_adjBasisY[d];\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n float iz = u_insetZoom;\n vec2 center = vec2(\n (x + u_pan.x) * u_zoom * iz / u_aspect,\n (y + u_pan.y) * u_zoom * iz + u_insetOffsetY\n );\n\n gl_Position = vec4(center, 0.0, 1.0);\n\n // Point size: clamp to [2, 32] physical pixels (same as WGSL)\n float min_ndc = 4.0 / u_viewportHeight;\n float max_ndc = 64.0 / u_viewportHeight;\n float ps = clamp(u_pointSize, min_ndc, max_ndc);\n // gl_PointSize is in physical pixels, convert from NDC\n gl_PointSize = ps * u_viewportHeight * 0.5;\n\n // Scale opacity by zoom^2 for constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n float z = u_zoom * u_insetZoom;\n float zoomScale = u_scaleOpacityByZoom > 0.5 ? z * z : 1.0;\n v_effOpacity = u_opacity * zoomScale;\n\n // Resolve per-point color from LUT\n if (u_colorMode == 1) {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n float raw = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float invRange = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float t = clamp((raw - u_colorMin) * invRange, 0.0, 1.0);\n float stops = float(u_colorNumStops - 1);\n float pos = t * stops;\n int idx0 = min(int(floor(pos)), u_colorNumStops - 2);\n float frac = pos - float(idx0);\n vec4 c0 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0, 0), 0).r);\n vec4 c1 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0 + 1, 0), 0).r);\n v_color = mix(c0, c1, frac);\n } else if (u_colorMode == 2) {\n // Categorical: read category index from tiled texture, direct palette lookup\n uint catIdx = texelFetch(u_catIndexTex, ivec2(tx, tileRow), 0).r;\n int lutIdx = int(catIdx) % u_colorNumStops;\n v_color = unpackColor(texelFetch(u_colorLutTex, ivec2(lutIdx, 0), 0).r);\n } else if (u_colorMode == 3) {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n float rawU = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float rawV = texelFetch(u_data, ivec2(tx, u_colorColumnIndexV * tileRows + tileRow), 0).r;\n float invRangeU = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float invRangeV = u_colorRangeV > 0.0 ? 1.0 / u_colorRangeV : 0.0;\n float uVal = clamp((rawU - u_colorMin) * invRangeU, 0.0, 1.0);\n float vVal = clamp((rawV - u_colorMinV) * invRangeV, 0.0, 1.0);\n vec3 rgb2d = colormap2d(u_color2dMapIndex, uVal, vVal);\n v_color = vec4(rgb2d, 1.0);\n } else {\n v_color = u_color;\n }\n\n // Read selection bit (not tiled — bit-packed width is small)\n v_selected = 1u;\n if (u_useSelectionMask > 0.5) {\n int word_idx = idx / 32;\n uint word = texelFetch(u_selectionTex, ivec2(word_idx, 0), 0).r;\n v_selected = (word >> uint(idx % 32)) & 1u;\n }\n\n v_useSubtractive = u_useSubtractive;\n v_useSelectionMask = u_useSelectionMask;\n}\n`,n=`#version 300 es\n// Fullscreen tone-map pass — reads HDR float texture and maps to [0,1].\n// Same logic as tonemap.wgsl.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n\nprecision highp float;\n\nuniform sampler2D u_hdrTexture;\nuniform float u_mode;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n vec4 hdr = texelFetch(u_hdrTexture, ivec2(gl_FragCoord.xy), 0);\n\n vec3 mapped;\n if (u_mode < 0.5) {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3(0.0), vec3(1.0));\n }\n fragColor = vec4(mapped, 1.0);\n}\n`,r=`#version 300 es\n// Fullscreen tone-map pass — oversized triangle (3 vertices, no vertex buffer).\n// Same geometry as tonemap.wgsl.\n\nvoid main() {\n // Oversized triangle covering the full clip space:\n // vi=0 -> (-1, -1) vi=1 -> (3, -1) vi=2 -> (-1, 3)\n float x = float(gl_VertexID / 2) * 4.0 - 1.0;\n float y = float(gl_VertexID % 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}\n`;const i=1e-10,a=e=>{let t=e[0],n=e[1],r=e[2],a=e[3],o=t*t+r*r,s=t*n+r*a,c=n*n+a*a,l=o+c,u=o*c-s*s,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(s)>i){let e=f-c,t=Math.sqrt(e*e+s*s);_[0]=e/t,_[1]=s/t;let n=p-c,r=Math.sqrt(n*n+s*s);_[2]=n/r,_[3]=s/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>i&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+a*_[1])/m),h>i&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+a*_[3])/h),m<=i&&h>i?(v[0]=-v[3],v[2]=v[1]):h<=i&&m>i?(v[1]=-v[2],v[3]=v[0]):m<=i&&h<=i&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},o=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},s=(e,t,n,r,i,a,s,c=!0)=>{let l=s*s,u=l*s,d=.5*(-s+2*l-u),f=.5*(2-5*l+3*u),p=.5*(s+4*l-3*u),m=.5*(-l+u);for(let o=0;o<a*2;o++)e[o]=d*t[o]+f*n[o]+p*r[o]+m*i[o];return c&&o(e,a),e},c=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=a(r),o=Math.acos(Math.max(-1,Math.min(1,i[0]))),s=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(o*o+s*s)},l=(e,t,n=!0)=>{let r=e.length,i=new Float32Array(r+1);if(i[0]=0,!n){for(let e=1;e<=r;e++)i[e]=e/r;return i}let a=new Float32Array(t*2),o=new Float32Array(t*2);for(let n=0;n<r;n++){let l=(n-1+r)%r,u=n,d=(n+1)%r,f=(n+2)%r,p=0;s(a,e[l],e[u],e[d],e[f],t,0);for(let n=1;n<=8;n++){let r=n/8;s(o,e[l],e[u],e[d],e[f],t,r),p+=c(a,o,t),a.set(o)}i[n+1]=i[n]+p}let l=i[r];if(l>1e-10)for(let e=1;e<=r;e++)i[e]=i[e]/l;return i},u=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},d=(e,t,n,r,i,a=!0)=>{let o=t.length,{segment:c,localT:l}=u(n,i),d=(c-1+o)%o,f=c,p=(c+1)%o,m=(c+2)%o;return s(e,t[d],t[f],t[p],t[m],r,l,a)};let f=null,p=[];const m=(e,t)=>{self.postMessage(e,t??[])},h=(e,t,n)=>{let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r);throw e.deleteShader(r),Error(`Shader compile error: ${t}`)}return r},g=(e,t,n)=>{let r=h(e,e.VERTEX_SHADER,t),i=h(e,e.FRAGMENT_SHADER,n),a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,i),e.linkProgram(a),!e.getProgramParameter(a,e.LINK_STATUS)){let t=e.getProgramInfoLog(a);throw e.deleteProgram(a),Error(`Program link error: ${t}`)}return e.deleteShader(r),e.deleteShader(i),a},_=(e,t,n)=>e.getUniformLocation(t,n),v=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=t*r,s=n*r,c=o*s*i/e,l=Math.sqrt(c/Math.PI),u=a*r*.5,d,f;return l>=u?(d=l,f=1):(d=u,f=Math.max(.01,c/(Math.PI*u*u))),{pointSize:2*d/s,opacity:f}},y=(e,t)=>e*f.dpr/t,b=(e,t)=>{let{style:n,numPoints:r,dpr:i}=f;if(n.pointSize!==`auto`&&n.opacity!==`auto`)return{pointSize:y(n.pointSize,t),opacity:n.opacity,color:n.color,scaleOpacityByZoom:!1};let a=v(r,e/i,t/i,i,n.fillTarget,n.minPointSize),o=n.opacity===`auto`;return{pointSize:n.pointSize===`auto`?a.pointSize:y(n.pointSize,t),opacity:o?a.opacity:n.opacity,color:n.color,scaleOpacityByZoom:o}};let x=null;const S=(e,t,n,r)=>{(!x||x.length!==r*2)&&(x=new Float32Array(r*2));let i=0,a=0;for(let o=0;o<r;o++){let s=Math.max(n[o],1e-6),c=e[o],l=e[r+o],u=2/s;x[o]=c*u,x[r+o]=l*u;let d=-t[o]/s;i+=d*c*2,a+=d*l*2}return{weights:x,biasX:i,biasY:a}},C=()=>{if(!f?.normMins||!f.normRanges)return null;let e=f.numDims,t=new Float32Array(e);if(f.centering===`mean`&&f.normMeans)t.set(f.normMeans);else for(let n=0;n<e;n++)t[n]=f.normMins[n]+f.normRanges[n]*.5;return t},w=(e,t,n)=>{if(!f)return;let{hdrFbos:r,hdrTextures:i,hdrSizes:a}=f,o=f.mainView.gl,s=a[e];if(s&&s[0]===t&&s[1]===n)return;r[e]&&o.deleteFramebuffer(r[e]),i[e]&&o.deleteTexture(i[e]);let c=o.createTexture();o.bindTexture(o.TEXTURE_2D,c),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,t,n,0,o.RGBA,o.FLOAT,null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE);let l=o.createFramebuffer();o.bindFramebuffer(o.FRAMEBUFFER,l),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,c,0),o.bindFramebuffer(o.FRAMEBUFFER,null),o.bindTexture(o.TEXTURE_2D,null),f.hdrFbos[e]=l,f.hdrTextures[e]=c,f.hdrSizes[e]=[t,n]},T=(e,t)=>{if(!f)return;let n=f.blitSize;if(n&&n[0]===e&&n[1]===t)return;let r=f.mainView.gl;f.blitFbo&&r.deleteFramebuffer(f.blitFbo),f.blitTexture&&r.deleteTexture(f.blitTexture);let i=r.createTexture();r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,r.RGBA8,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,i,0),r.bindFramebuffer(r.FRAMEBUFFER,null),r.bindTexture(r.TEXTURE_2D,null),f.blitFbo=a,f.blitTexture=i,f.blitSize=[e,t]};let E=null,D=0,O=null,k=!1,A=null;const j=()=>{if(!O||!f)return!0;let e=f.mainView.gl;return e.clientWaitSync(O,0,0)===e.TIMEOUT_EXPIRED?!1:(e.deleteSync(O),O=null,!0)},M=()=>{if(!j())return k=!0,A||=setTimeout(function(){A=null,k&&f&&!E&&M()},2),!1;if(k=!1,U(),f){let e=f.mainView.gl;O=e.fenceSync(e.SYNC_GPU_COMMANDS_COMPLETE,0),e.flush()}return!0},N=e=>{if(!E||!f?.tour)return;let t=E.prevTime===null?void 0:e-E.prevTime;if(t!==void 0){let e=t/1e3*E.speed*E.direction/20,n=f.tour.position+e;n-=Math.floor(n),f.tour.position=n}E.prevTime=e,f.directBasis=null,M()&&(E.lastRenderedRafTime!==null&&E.frameTimes.push(e-E.lastRenderedRafTime),E.lastRenderedRafTime=e),e-D>=33&&(m({type:`playbackTick`,position:f.tour.position,frameMs:t}),D=e),E.rafId=requestAnimationFrame(N)},P=(e,t)=>{E?(E.speed=e,E.direction=t):(O=null,k=!1,E={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},E.rafId=requestAnimationFrame(N))},ee=()=>{if(E){cancelAnimationFrame(E.rafId),f?.tour&&m({type:`playbackTick`,position:f.tour.position});let e=Float64Array.from(E.frameTimes);m({type:`playbackStopped`,frameTimes:e},[e.buffer]),E=null}},F=(e,t,n,r,i,a)=>{if(!f?.dataTexture||!f.normRanges)return;let{numPoints:o,numDims:s,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d}=f,p=f.mainView.gl,m=C();if(!m)return;let{weights:h,biasX:g,biasY:_}=S(e,m,f.normRanges,s),v=b(t,n),y=f.backgroundColor,x=.2126*y[0]+.7152*y[1]+.0722*y[2],T=f.colorMode>0,E=!T&&x>.5,D;D=T||E?1:0;let O=t/n||1;if(w(r,t,n),p.bindFramebuffer(p.FRAMEBUFFER,f.hdrFbos[r]),p.viewport(0,0,t,n),p.clearColor(y[0],y[1],y[2],1),p.clear(p.COLOR_BUFFER_BIT),o>0){if(p.useProgram(c),p.enable(p.BLEND),T?(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE_MINUS_SRC_ALPHA)):E?(p.blendEquationSeparate(p.FUNC_REVERSE_SUBTRACT,p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)):(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.dataTexture),p.uniform1i(l.u_data,0),p.activeTexture(p.TEXTURE1),f.colorLutTexture&&p.bindTexture(p.TEXTURE_2D,f.colorLutTexture),p.uniform1i(l.u_colorLutTex,1),p.activeTexture(p.TEXTURE2),f.selectionTexture&&p.bindTexture(p.TEXTURE_2D,f.selectionTexture),p.uniform1i(l.u_selectionTex,2),p.activeTexture(p.TEXTURE3),f.colorMode===2&&f.activeCatColumnName){let e=f.catIndexTextures.get(f.activeCatColumnName);e&&p.bindTexture(p.TEXTURE_2D,e)}p.uniform1i(l.u_catIndexTex,3);let e=new Float32Array(128),t=new Float32Array(128);for(let n=0;n<s&&n<128;n++)e[n]=h[n],t[n]=h[s+n];p.uniform1fv(l.u_adjBasisX,e),p.uniform1fv(l.u_adjBasisY,t),p.uniform2f(l.u_bias,g,_),p.uniform1f(l.u_pointSize,v.pointSize),p.uniform1f(l.u_opacity,v.opacity),p.uniform4f(l.u_color,v.color[0],v.color[1],v.color[2],1),p.uniform1f(l.u_useSubtractive,E?1:0),p.uniform1f(l.u_scaleOpacityByZoom,v.scaleOpacityByZoom?1:0),p.uniform2f(l.u_pan,i.panX,i.panY),p.uniform1f(l.u_zoom,i.zoom),p.uniform1f(l.u_aspect,O),p.uniform1f(l.u_viewportHeight,n),p.uniform1f(l.u_insetOffsetY,i.insetOffsetY),p.uniform1f(l.u_insetZoom,i.insetZoom),p.uniform1i(l.u_numPoints,o),p.uniform1i(l.u_numDims,s),p.uniform1i(l.u_maxPoints,f.maxPoints),p.uniform1i(l.u_texWidth,f.texWidth),p.uniform1i(l.u_colorMode,f.colorMode),p.uniform1i(l.u_colorColumnIndex,f.colorColumnIndex),p.uniform1f(l.u_colorMin,f.colorMin),p.uniform1f(l.u_colorRange,f.colorRange),p.uniform1i(l.u_colorNumStops,f.colorNumStops),p.uniform1i(l.u_colorColumnIndexV,f.colorColumnIndexV),p.uniform1f(l.u_colorMinV,f.colorMinV),p.uniform1f(l.u_colorRangeV,f.colorRangeV),p.uniform1i(l.u_color2dMapIndex,f.color2dMapIndex),p.uniform1fv(l.u_color2dLut,f.color2dLut),p.uniform1f(l.u_useSelectionMask,f.styleFlags.useSelectionMask?1:0),p.drawArrays(p.POINTS,0,o),p.disable(p.BLEND)}p.bindFramebuffer(p.FRAMEBUFFER,a??null),p.viewport(0,0,t,n),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.useProgram(u),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.hdrTextures[r]),p.uniform1i(d.u_hdrTexture,0),p.uniform1f(d.u_mode,D),p.drawArrays(p.TRIANGLES,0,3),p.finish()};let I=!1,L=null,R=null;const z=(e,t)=>{if(!f?.dataTexture)return;let n=f.previewCanvases.get(e);if(!n){m({type:`rendered`,viewIndex:e});return}let r=n.canvas.width,i=n.canvas.height;if(r===0||i===0){m({type:`rendered`,viewIndex:e});return}let a=f.mainView.gl;T(r,i),F(t,r,i,1,{panX:0,panY:0,zoom:1,aspect:1,viewportHeight:i,insetOffsetY:0,insetZoom:1},f.blitFbo);let o=r*i*4,s=r*4;(!L||L.length<o)&&(L=new Uint8Array(o)),(!R||R.length<s)&&(R=new Uint8Array(s)),a.bindFramebuffer(a.FRAMEBUFFER,f.blitFbo),a.readPixels(0,0,r,i,a.RGBA,a.UNSIGNED_BYTE,L),a.bindFramebuffer(a.FRAMEBUFFER,null);for(let e=0;e<i>>1;e++){let t=e*s,n=(i-1-e)*s;R.set(L.subarray(t,t+s)),L.copyWithin(t,n,n+s),L.set(R,n)}let c=new ImageData(new Uint8ClampedArray(L.buffer,0,o),r,i);n.ctx2d.putImageData(c,0,0),m({type:`rendered`,viewIndex:e})},B=()=>{if(!f?.dataTexture||!f.tour)return;let{tour:e}=f;for(let[t]of f.previewCanvases)t>=e.bases.length||z(t,e.bases[t])},V=()=>{I||(I=!0,setTimeout(()=>{I=!1,B()},0))},H=()=>{f?.dataTexture&&(U(),V())},U=()=>{if(!f?.dataTexture)return;let{canvas:e}=f.mainView;if(f.directBasis){F(f.directBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(!f.tour)return;let{tour:t}=f;d(t.interpolatedBasis,t.bases,t.arcLengths,t.dims,t.position,t.orthonormalize),F(t.interpolatedBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0})},W=()=>{f&&(f.tour||f.directBasis)&&f.dataTexture&&H()},G=()=>{f&&(f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H())};let K=0;const q=e=>{if(!f)return;let t=f.mainView.gl;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,a),f.colorMode=1,f.colorColumnIndex=n,f.colorMin=r,f.colorRange=i,f.colorNumStops=a.length,f.activeCatColumnName=null,W();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,palette:r}=e.data;if(!f.catIndexTextures.has(n))return;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,r),f.colorMode=2,f.colorNumStops=r.length,f.activeCatColumnName=n,W();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==K)return;let{columnIndexX:t,columnIndexY:n,minX:r,rangeX:i,minY:a,rangeY:o,lut:s,mapIndex:c}=e.data;f.colorMode=3,f.colorColumnIndex=t,f.colorMin=r,f.colorRange=i,f.colorColumnIndexV=n,f.colorMinV=a,f.colorRangeV=o,f.color2dMapIndex=c,f.activeCatColumnName=null,s&&f.color2dLut.set(s.subarray(0,128)),W();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,dataBuffers:a}=f,o=a[n];if(!o)return;let s=new Uint32Array(Math.ceil(i/32)),c=r.length/2;for(let e=0;e<i;e++){let t=o[e],n=!1;for(let e=0;e<c;e++)if(t>=r[e*2]&&t<=r[e*2+1]){n=!0;break}n&&(s[e>>5]=s[e>>5]|0|1<<(e&31))}X(t,s),G();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,selectedLabels:r}=e.data,i=f.categoricalBuffers.get(n);if(!i)return;let{numPoints:a}=f,o=new Uint32Array(Math.ceil(a/32));for(let e=0;e<a;e++){let t=i[e];t<r.length&&r[t]>0&&(o[e>>5]=o[e>>5]|0|1<<(e&31))}X(t,o),G();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,means:c,categoricalColumns:u}=e.data;if(K=n,r<2||i===0||a.length<2){m({type:`error`,message:`Need at least 2 dimensions to render`});return}f.dataTexture&&(t.deleteTexture(f.dataTexture),f.dataTexture=null),f.colorLutTexture&&(t.deleteTexture(f.colorLutTexture),f.colorLutTexture=null);for(let e of f.catIndexTextures.values())t.deleteTexture(e);f.catIndexTextures.clear(),f.selectionTexture&&(t.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags={useSelectionMask:!1},f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,f.categoricalBuffers.clear(),f.dataBuffers=a,f.normMins=new Float32Array(o),f.normRanges=new Float32Array(s),f.normMeans=new Float32Array(c),f.numPoints=i,f.numDims=r;let d=t.getParameter(t.MAX_TEXTURE_SIZE),p=Math.min(i,d),h=Math.ceil(i/p);f.texWidth=p;let g=t.createTexture();t.bindTexture(t.TEXTURE_2D,g);let _=r*h,v=new Float32Array(p*_);for(let e=0;e<r;e++){let t=a[e],n=e*h;for(let e=0;e<i;e++){let r=e%p,i=n+Math.floor(e/p);v[i*p+r]=t[e]}}t.texImage2D(t.TEXTURE_2D,0,t.R32F,p,_,0,t.RED,t.FLOAT,v),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.bindTexture(t.TEXTURE_2D,null),f.dataTexture=g;for(let e of u)f.categoricalBuffers.set(e.name,e.indices),f.catIndexTextures.set(e.name,Y(t,e.indices,i,p));if(f.tour&&f.tour.dims===r)H();else{let e=Math.max(1,f.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}f.tour={bases:t,arcLengths:l(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},H()}},J=(e,t)=>{let n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n},Y=(e,t,n,r)=>{let i=Math.ceil(n/r),a;if(i===1)a=t;else{a=new Uint32Array(r*i);for(let e=0;e<n;e++){let n=e%r,i=Math.floor(e/r);a[i*r+n]=t[e]}}let o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,r,i,0,e.RED_INTEGER,e.UNSIGNED_INT,a),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),o},X=(e,t)=>{if(!f)return;f.selectionTexture&&e.deleteTexture(f.selectionTexture);let n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),f.selectionTexture=n},Z=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i},Q=e=>{if(!f?.normRanges||f.numPoints===0)return;let{numPoints:t,numDims:n,dataBuffers:r,camera:i}=f,a=e.length/2;if(a<3)return;let o=null;if(f.directBasis)o=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),o=e.interpolatedBasis}if(!o)return;let s=C();if(!s)return;let{weights:c,biasX:l,biasY:u}=S(o,s,f.normRanges,n),p=f.mainView.canvas,h=p.width/p.height||1,g=i.insetZoom,_=i.zoom*g,v=new Float32Array(e.length);for(let t=0;t<a;t++)v[t*2]=e[t*2]*h/_-i.panX,v[t*2+1]=(e[t*2+1]-i.insetOffsetY)/_-i.panY;let y=new Uint32Array(Math.ceil(t/32));for(let e=0;e<t;e++){let t=l,i=u;for(let a=0;a<n;a++){let o=r[a][e];t+=o*c[a],i+=o*c[n+a]}Z(t,i,v,a)&&(y[e>>5]=y[e>>5]|0|1<<(e&31))}let b=f.mainView.gl;X(b,y),G();let x=new Uint32Array(y);m({type:`selectionResult`,mask:x},[x.buffer])},te=()=>{if(!f)return 0;let e=0;if(f.dataTexture){let t=Math.ceil(f.numPoints/f.texWidth);e+=f.texWidth*f.numDims*t*4}for(let t=0;t<f.hdrSizes.length;t++){let n=f.hdrSizes[t];n&&(e+=n[0]*n[1]*16)}f.blitSize&&(e+=f.blitSize[0]*f.blitSize[1]*4),f.colorLutTexture&&(e+=f.colorNumStops*4);for(let t of f.categoricalBuffers.values())e+=t.byteLength;return f.selectionTexture&&(e+=Math.ceil(f.numPoints/32)*4),e},ne=()=>{if(!f)return;let e=0;for(let t of f.dataBuffers)e+=t.byteLength;for(let t of f.categoricalBuffers.values())e+=t.byteLength;if(f.normMins&&(e+=f.normMins.byteLength),f.normRanges&&(e+=f.normRanges.byteLength),f.tour){for(let t of f.tour.bases)e+=t.byteLength;e+=f.tour.interpolatedBasis.byteLength}m({type:`metricsResult`,gpuMemoryBytes:te(),numPoints:f.numPoints,numDims:f.numDims,workerJsHeapBytes:e})},re=e=>{if(!f?.tour||!f.dataTexture||f.numPoints===0){m({type:`error`,message:`No data/tour loaded for benchmark`});return}let t=f.mainView.gl,{numPoints:n,numDims:r,tour:i}=f,a=i.position;f.directBasis=null;let o=new Uint8Array(4),s=()=>{t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,o)};for(let e=0;e<5;e++)i.position=e/5,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s();let c=new Float64Array(e);for(let t=0;t<e;t++){i.position=t/e,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let n=performance.now();F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s(),c[t]=performance.now()-n}i.position=a,m({type:`benchmarkResult`,frameTimes:c,numPoints:n,numDims:r},[c.buffer])},$=e=>{if(f){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`;f.tour={bases:t,arcLengths:l(t,n,r),dims:n,orthonormalize:r,position:f.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},f.dataTexture&&H();return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;f.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&z(e.id,f.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){f.previewCanvases.delete(e.id);return}if(e.type===`resizePreview`){let t=f.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&V();return}if(e.type===`setTourPosition`){if(!f.tour)return;f.tour.position=e.position,f.directBasis=null,M();return}if(e.type===`setStyle`){f.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??f.style.minPointSize,fillTarget:e.fillTarget??f.style.fillTarget},(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setCamera`){f.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:f.camera.aspect,viewportHeight:f.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom},U();return}if(e.type===`setCentering`){f.centering=e.centering,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`resize`){e.dpr!==void 0&&(f.dpr=e.dpr),e.viewIndex===0&&(f.mainView.canvas.width=e.width,f.mainView.canvas.height=e.height,(f.tour||f.directBasis)&&f.dataTexture&&U());return}if(e.type===`render`){(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setDirectBasis`){if(!f.dataTexture)return;f.directBasis=e.basis,F(e.basis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(e.type===`clearColors`){f.colorLutTexture&&(f.mainView.gl.deleteTexture(f.colorLutTexture),f.colorLutTexture=null),f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setBackgroundColor`){f.backgroundColor=e.color,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setMaxPoints`){f.maxPoints=e.maxPoints,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setSelectionMask`){let t=f.mainView.gl;X(t,e.mask),f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H();let n=new Uint32Array(e.mask);m({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){f.selectionTexture&&(f.mainView.gl.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags.useSelectionMask=!1,(f.tour||f.directBasis)&&f.dataTexture&&H(),m({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`startPlayback`){if(!f.tour)return;P(e.speed,e.direction);return}if(e.type===`stopPlayback`){ee();return}if(e.type===`computePCA`){m({type:`error`,message:`PCA not yet implemented in WebGL backend`});return}if(e.type===`lassoSelect`){Q(e.polygon);return}if(e.type===`getProjectedPositions`){if(!f?.normRanges||f.numPoints===0){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{numPoints:e,numDims:t,dataBuffers:n}=f,r=null;if(f.directBasis)r=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),r=e.interpolatedBasis}if(!r){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let i=C();if(!i){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{weights:a,biasX:o,biasY:s}=S(r,i,f.normRanges,t),c=new Float32Array(e*2);for(let r=0;r<e;r++){let e=o,i=s;for(let o=0;o<t;o++){let s=n[o][r];e+=s*a[o],i+=s*a[t+o]}c[r*2]=e,c[r*2+1]=i}m({type:`projectedPositions`,positions:c},[c.buffer]);return}if(e.type===`getPointData`){if(!f||f.numPoints===0){m({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{numDims:t,dataBuffers:n}=f,r=e.pointIndex;if(r<0||r>=f.numPoints){m({type:`pointData`,pointIndex:r,numericValues:{},categoricalValues:{}});return}let i={};for(let e=0;e<t;e++)i[String(e)]=n[e][r];let a={};for(let[e,t]of f.categoricalBuffers)a[e]=t[r];m({type:`pointData`,pointIndex:r,numericValues:i,categoricalValues:a});return}if(e.type===`benchmark`){re(e.numFrames);return}if(e.type===`getMetrics`){ne();return}}};self.onmessage=i=>{let a=i.data;if(a.type===`init`){try{let i=a.canvas,o=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});if(!o)throw Error(`WebGL2 not supported`);o.getExtension(`EXT_color_buffer_float`)||console.warn(`EXT_color_buffer_float not available — HDR rendering may fail`),o.getExtension(`OES_texture_float_linear`);let s=o,c=g(s,t,e),l={u_data:_(s,c,`u_data`),u_adjBasisX:_(s,c,`u_adjBasisX`),u_adjBasisY:_(s,c,`u_adjBasisY`),u_bias:_(s,c,`u_bias`),u_pointSize:_(s,c,`u_pointSize`),u_opacity:_(s,c,`u_opacity`),u_color:_(s,c,`u_color`),u_useSubtractive:_(s,c,`u_useSubtractive`),u_pan:_(s,c,`u_pan`),u_zoom:_(s,c,`u_zoom`),u_aspect:_(s,c,`u_aspect`),u_viewportHeight:_(s,c,`u_viewportHeight`),u_insetOffsetY:_(s,c,`u_insetOffsetY`),u_insetZoom:_(s,c,`u_insetZoom`),u_numPoints:_(s,c,`u_numPoints`),u_numDims:_(s,c,`u_numDims`),u_maxPoints:_(s,c,`u_maxPoints`),u_texWidth:_(s,c,`u_texWidth`),u_colorMode:_(s,c,`u_colorMode`),u_colorColumnIndex:_(s,c,`u_colorColumnIndex`),u_colorMin:_(s,c,`u_colorMin`),u_colorRange:_(s,c,`u_colorRange`),u_colorNumStops:_(s,c,`u_colorNumStops`),u_colorLutTex:_(s,c,`u_colorLutTex`),u_catIndexTex:_(s,c,`u_catIndexTex`),u_useSelectionMask:_(s,c,`u_useSelectionMask`),u_selectionTex:_(s,c,`u_selectionTex`),u_colorColumnIndexV:_(s,c,`u_colorColumnIndexV`),u_colorMinV:_(s,c,`u_colorMinV`),u_colorRangeV:_(s,c,`u_colorRangeV`),u_color2dMapIndex:_(s,c,`u_color2dMapIndex`),u_color2dLut:_(s,c,`u_color2dLut`),u_scaleOpacityByZoom:_(s,c,`u_scaleOpacityByZoom`)},u=g(s,r,n),d={u_hdrTexture:_(s,u,`u_hdrTexture`),u_mode:_(s,u,`u_mode`)};f={mainView:{canvas:i,gl:o},previewCanvases:new Map,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d,hdrFbos:[],hdrTextures:[],hdrSizes:[],blitFbo:null,blitTexture:null,blitSize:null,dataTexture:null,colorLutTexture:null,catIndexTextures:new Map,selectionTexture:null,numPoints:0,numDims:0,dataBuffers:[],normMins:null,normRanges:null,normMeans:null,centering:`midrange`,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},colorMode:0,colorColumnIndex:0,colorMin:0,colorRange:1,colorNumStops:0,activeCatColumnName:null,colorColumnIndexV:0,colorMinV:0,colorRangeV:1,color2dMapIndex:0,color2dLut:new Float32Array(128),camera:{panX:0,panY:0,zoom:a.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1},directBasis:null,backgroundColor:[0,0,0],dpr:a.dpr,maxPoints:0,texWidth:0},a.dataPort.onmessage=q;let h=p;if(p=null,h)for(let e of h)$(e);m({type:`ready`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(p){p.push(a);return}$(a)};", j = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", A], { type: "text/javascript;charset=utf-8" });
|
|
3019
|
-
function
|
|
3023
|
+
}, A = (e, t, n, r, i, a = !0) => {
|
|
3024
|
+
let o = t.length, { segment: s, localT: c } = k(n, i), l = (s - 1 + o) % o, u = s, d = (s + 1) % o, f = (s + 2) % o;
|
|
3025
|
+
return T(e, t[l], t[u], t[d], t[f], r, c, a);
|
|
3026
|
+
}, j = "var e=`#version 300 es\n// Point fragment shader — SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl fs_main. Uses gl_PointCoord for the\n// SDF distance (maps [0,1] in gl.POINTS, remap to [-1,1]).\n\nprecision highp float;\nprecision highp int;\n\nflat in float v_effOpacity;\nflat in vec4 v_color;\nflat in uint v_selected;\nflat in float v_useSubtractive;\nflat in float v_useSelectionMask;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n // gl_PointCoord is [0,1], remap to [-1,1] for SDF\n vec2 uv = gl_PointCoord * 2.0 - 1.0;\n float dist = length(uv);\n\n // Smooth anti-aliased edge — naturally 0 for dist >= 1.0, so no discard needed.\n // Avoiding discard preserves early-Z and SIMD wavefront occupancy.\n float edge = 1.0 - smoothstep(0.75, 1.0, dist);\n\n // Selection: boost selected, dim unselected\n float sel_factor = 1.0;\n if (v_useSelectionMask > 0.5) {\n if (v_selected == 0u) {\n sel_factor = 0.1;\n } else {\n sel_factor = 1.0 / max(v_effOpacity, 0.01);\n }\n }\n\n float intensity = edge * v_effOpacity * v_color.a * sel_factor;\n\n // Subtractive mode (Reusser): output complement color so that\n // reverse-subtract blend (dst - src) on a white bg yields the correct hue.\n vec3 rgb = v_color.rgb;\n if (v_useSubtractive > 0.5) {\n rgb = vec3(1.0) - rgb;\n }\n\n fragColor = vec4(rgb * intensity, intensity);\n}\n`,t=`#version 300 es\n// Point renderer — gl.POINTS with SDF circle anti-aliasing\n//\n// WebGL2 equivalent of point.wgsl. Projects raw ND data to 2D inline using\n// pre-adjusted basis weights and biases (normalization folded into the basis\n// on CPU). Uses gl.POINTS with gl_PointSize for native point expansion —\n// 1 vertex per point instead of 4 (instanced quads in WebGPU).\n//\n// Data is stored in a tiled R32F texture to handle point counts exceeding\n// MAX_TEXTURE_SIZE. Layout: width=texWidth, height=numDims*tileRows.\n// For point idx: col = idx % texWidth, row = d * tileRows + idx / texWidth.\n//\n// Color mapping: instead of a pre-computed N-element color texture, the shader\n// reads raw data values and looks up colors from a tiny LUT at render time.\n\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp usampler2D;\n\n// Raw ND data (column-major, tiled).\n// R32F texture: width = texWidth, height = numDims * tileRows.\nuniform sampler2D u_data;\n\n// Adjusted basis weights (normalization folded in).\n// Max 128 dims — for higher, fall back to a basis texture.\nuniform float u_adjBasisX[128];\nuniform float u_adjBasisY[128];\nuniform vec2 u_bias;\n\n// Style\nuniform float u_pointSize; // NDC units\nuniform float u_opacity;\nuniform vec4 u_color; // uniform point color (RGBA 0-1)\nuniform float u_useSubtractive;\nuniform float u_scaleOpacityByZoom; // 1.0 = auto (zoom² density scaling), 0.0 = manual\n\n// Camera\nuniform vec2 u_pan;\nuniform float u_zoom;\nuniform float u_aspect;\nuniform float u_viewportHeight;\nuniform float u_insetOffsetY;\nuniform float u_insetZoom;\n\n// Data dimensions\nuniform int u_numPoints;\nuniform int u_numDims;\n\n// Decimation: 0 = disabled\nuniform int u_maxPoints;\n\n// Tiling: texture width (min(numPoints, MAX_TEXTURE_SIZE))\nuniform int u_texWidth;\n\n// Color mapping — tiny LUT replaces N-element packed color texture\n// 0 = uniform color, 1 = continuous, 2 = categorical, 3 = 2D colormap\nuniform int u_colorMode;\nuniform int u_colorColumnIndex; // which data column to read (continuous only)\nuniform float u_colorMin;\nuniform float u_colorRange;\nuniform int u_colorNumStops; // LUT size\nuniform usampler2D u_colorLutTex; // packed RGBA u32 LUT (width=numStops, height=1)\nuniform usampler2D u_catIndexTex; // categorical indices (R32UI, tiled like data tex)\n\n// 2D colormap params (used when u_colorMode == 3)\nuniform int u_colorColumnIndexV; // second data column\nuniform float u_colorMinV;\nuniform float u_colorRangeV;\nuniform int u_color2dMapIndex; // 0-5 = LUT-based, 6 = oklab_polar\nuniform float u_color2dLut[128]; // SVD rank-1 LUT curves (8 × 16 entries)\n\n// Selection mask (bit-packed u32 in R32UI texture, width = ceil(N/32), height = 1)\nuniform float u_useSelectionMask;\nuniform usampler2D u_selectionTex;\n\nflat out float v_effOpacity;\nflat out vec4 v_color;\nflat out uint v_selected;\nflat out float v_useSubtractive;\nflat out float v_useSelectionMask;\n\n// Unpack RGBA8 from u32 (0xAABBGGRR little-endian)\nvec4 unpackColor(uint packed) {\n float r = float(packed & 0xFFu) / 255.0;\n float g = float((packed >> 8u) & 0xFFu) / 255.0;\n float b = float((packed >> 16u) & 0xFFu) / 255.0;\n float a = float((packed >> 24u) & 0xFFu) / 255.0;\n return vec4(r, g, b, a);\n}\n\n// PCG hash — fast, high-quality deterministic random from vertex index.\n// Used for vertex-shader decimation when numPoints > maxPoints.\nuint pcg_hash(uint v) {\n uint state = v * 747796405u + 2891336453u;\n uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n return (word >> 22u) ^ word;\n}\n\nfloat random_float(uint seed) {\n return float(pcg_hash(seed)) / 4294967295.0;\n}\n\n// ── 2D colormap helpers ──\n\n// Linearly interpolate within a 16-entry LUT curve starting at base offset.\nfloat lut2d_interp(int base, float t) {\n float pos = t * 15.0;\n int lo = min(int(floor(pos)), 14);\n int hi = lo + 1;\n return mix(u_color2dLut[base + lo], u_color2dLut[base + hi], fract(pos));\n}\n\n// Reconstruct 2D color from SVD rank-1 LUT curves.\n// Layout: R_X[16] R_Y[16] G_X[16] G_Y[16] B_X[16] B_Y[16] B_X2[16] B_Y2[16]\nvec3 colormap2d_lut(float u, float v) {\n float r = lut2d_interp(0, u) * lut2d_interp(16, v);\n float g = lut2d_interp(32, u) * lut2d_interp(48, v);\n float b = lut2d_interp(64, u) * lut2d_interp(80, v)\n + lut2d_interp(96, u) * lut2d_interp(112, v);\n return clamp(vec3(r, g, b), vec3(0.0), vec3(1.0));\n}\n\n// Oklab → linear sRGB conversion\nvec3 oklabToLinear(vec3 lab) {\n float l_ = lab.x + 0.3963377774 * lab.y + 0.2158037573 * lab.z;\n float m_ = lab.x - 0.1055613458 * lab.y - 0.0638541728 * lab.z;\n float s_ = lab.x - 0.0894841775 * lab.y - 1.2914855480 * lab.z;\n float l = l_ * l_ * l_;\n float m = m_ * m_ * m_;\n float s = s_ * s_ * s_;\n return vec3(\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s\n );\n}\n\n// Oklab polar 2D colormap: hue = angle, chroma = radius, lightness varies\nvec3 colormap2d_oklab_polar(float u, float v) {\n float cx = u - 0.5;\n float cy = v - 0.5;\n float radius = min(length(vec2(cx, cy)) * 2.0, 1.0);\n float angle = atan(cy, cx);\n float chroma = radius * 0.25;\n float L = mix(0.3, 0.85, 1.0 - radius);\n float a = chroma * cos(angle);\n float b = chroma * sin(angle);\n vec3 linear = oklabToLinear(vec3(L, a, b));\n return pow(clamp(linear, vec3(0.0), vec3(1.0)), vec3(1.0 / 2.2));\n}\n\nvec3 colormap2d(int mapIndex, float u, float v) {\n if (mapIndex == 6) {\n return colormap2d_oklab_polar(u, v);\n }\n return colormap2d_lut(u, v);\n}\n\nvoid main() {\n int idx = gl_VertexID;\n\n // Vertex-shader decimation: skip expensive projection for excess points.\n if (u_maxPoints > 0 && u_numPoints > u_maxPoints) {\n float threshold = float(u_maxPoints) / float(u_numPoints);\n if (random_float(uint(idx)) > threshold) {\n gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n gl_PointSize = 0.0;\n v_effOpacity = 0.0;\n v_color = vec4(0.0);\n v_selected = 0u;\n v_useSubtractive = 0.0;\n v_useSelectionMask = 0.0;\n return;\n }\n }\n\n // Tiled texture coordinates: col = idx % texWidth, tileRow = idx / texWidth\n int tileRows = (u_numPoints + u_texWidth - 1) / u_texWidth;\n int tx = idx % u_texWidth;\n int tileRow = idx / u_texWidth;\n\n // Inline ND -> 2D projection with pre-adjusted basis.\n // CPU folds normalization into the basis weights and biases so the\n // hot loop is just: x += raw * adjBasisX[d], y += raw * adjBasisY[d]\n float x = u_bias.x;\n float y = u_bias.y;\n for (int d = 0; d < u_numDims; d++) {\n float raw = texelFetch(u_data, ivec2(tx, d * tileRows + tileRow), 0).r;\n x += raw * u_adjBasisX[d];\n y += raw * u_adjBasisY[d];\n }\n\n // Apply camera: translate then scale, with aspect correction on x.\n float iz = u_insetZoom;\n vec2 center = vec2(\n (x + u_pan.x) * u_zoom * iz / u_aspect,\n (y + u_pan.y) * u_zoom * iz + u_insetOffsetY\n );\n\n gl_Position = vec4(center, 0.0, 1.0);\n\n // Point size: clamp to [2, 32] physical pixels (same as WGSL)\n float min_ndc = 4.0 / u_viewportHeight;\n float max_ndc = 64.0 / u_viewportHeight;\n float ps = clamp(u_pointSize, min_ndc, max_ndc);\n // gl_PointSize is in physical pixels, convert from NDC\n gl_PointSize = ps * u_viewportHeight * 0.5;\n\n // Scale opacity by zoom^2 for constant visual fill density (Reusser).\n // Only applied for auto-computed opacity; manual values are used as-is.\n float z = u_zoom * u_insetZoom;\n float zoomScale = u_scaleOpacityByZoom > 0.5 ? z * z : 1.0;\n v_effOpacity = u_opacity * zoomScale;\n\n // Resolve per-point color from LUT\n if (u_colorMode == 1) {\n // Continuous: read raw value from color column, normalize, interpolate LUT\n float raw = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float invRange = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float t = clamp((raw - u_colorMin) * invRange, 0.0, 1.0);\n float stops = float(u_colorNumStops - 1);\n float pos = t * stops;\n int idx0 = min(int(floor(pos)), u_colorNumStops - 2);\n float frac = pos - float(idx0);\n vec4 c0 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0, 0), 0).r);\n vec4 c1 = unpackColor(texelFetch(u_colorLutTex, ivec2(idx0 + 1, 0), 0).r);\n v_color = mix(c0, c1, frac);\n } else if (u_colorMode == 2) {\n // Categorical: read category index from tiled texture, direct palette lookup\n uint catIdx = texelFetch(u_catIndexTex, ivec2(tx, tileRow), 0).r;\n int lutIdx = int(catIdx) % u_colorNumStops;\n v_color = unpackColor(texelFetch(u_colorLutTex, ivec2(lutIdx, 0), 0).r);\n } else if (u_colorMode == 3) {\n // 2D colormap: read two columns, normalize to UV, look up from 2D colormap\n float rawU = texelFetch(u_data, ivec2(tx, u_colorColumnIndex * tileRows + tileRow), 0).r;\n float rawV = texelFetch(u_data, ivec2(tx, u_colorColumnIndexV * tileRows + tileRow), 0).r;\n float invRangeU = u_colorRange > 0.0 ? 1.0 / u_colorRange : 0.0;\n float invRangeV = u_colorRangeV > 0.0 ? 1.0 / u_colorRangeV : 0.0;\n float uVal = clamp((rawU - u_colorMin) * invRangeU, 0.0, 1.0);\n float vVal = clamp((rawV - u_colorMinV) * invRangeV, 0.0, 1.0);\n vec3 rgb2d = colormap2d(u_color2dMapIndex, uVal, vVal);\n v_color = vec4(rgb2d, 1.0);\n } else {\n v_color = u_color;\n }\n\n // Read selection bit (not tiled — bit-packed width is small)\n v_selected = 1u;\n if (u_useSelectionMask > 0.5) {\n int word_idx = idx / 32;\n uint word = texelFetch(u_selectionTex, ivec2(word_idx, 0), 0).r;\n v_selected = (word >> uint(idx % 32)) & 1u;\n }\n\n v_useSubtractive = u_useSubtractive;\n v_useSelectionMask = u_useSelectionMask;\n}\n`,n=`#version 300 es\n// Fullscreen tone-map pass — reads HDR float texture and maps to [0,1].\n// Same logic as tonemap.wgsl.\n//\n// Mode 0 (additive): per-channel exponential compression 1-exp(-x).\n// Preserves hue ratios, dense regions desaturate toward white.\n// Mode 1 (normal / subtractive): simple clamp to [0,1].\n\nprecision highp float;\n\nuniform sampler2D u_hdrTexture;\nuniform float u_mode;\n\nlayout(location = 0) out vec4 fragColor;\n\nvoid main() {\n vec4 hdr = texelFetch(u_hdrTexture, ivec2(gl_FragCoord.xy), 0);\n\n vec3 mapped;\n if (u_mode < 0.5) {\n // Additive: exponential compression preserving density structure\n mapped = 1.0 - exp(-hdr.rgb);\n } else {\n // Normal / Subtractive: values already in [0,1], just clamp\n mapped = clamp(hdr.rgb, vec3(0.0), vec3(1.0));\n }\n fragColor = vec4(mapped, 1.0);\n}\n`,r=`#version 300 es\n// Fullscreen tone-map pass — oversized triangle (3 vertices, no vertex buffer).\n// Same geometry as tonemap.wgsl.\n\nvoid main() {\n // Oversized triangle covering the full clip space:\n // vi=0 -> (-1, -1) vi=1 -> (3, -1) vi=2 -> (-1, 3)\n float x = float(gl_VertexID / 2) * 4.0 - 1.0;\n float y = float(gl_VertexID % 2) * 4.0 - 1.0;\n gl_Position = vec4(x, y, 0.0, 1.0);\n}\n`;const i=1e-10,a=e=>{let t=e[0],n=e[1],r=e[2],a=e[3],o=t*t+r*r,s=t*n+r*a,c=n*n+a*a,l=o+c,u=o*c-s*s,d=Math.sqrt(Math.max(0,l*l*.25-u)),f=l*.5+d,p=l*.5-d,m=Math.sqrt(Math.max(0,f)),h=Math.sqrt(Math.max(0,p)),g=new Float32Array([m,h]),_=new Float32Array(4);if(Math.abs(s)>i){let e=f-c,t=Math.sqrt(e*e+s*s);_[0]=e/t,_[1]=s/t;let n=p-c,r=Math.sqrt(n*n+s*s);_[2]=n/r,_[3]=s/r}else _[0]=1,_[1]=0,_[2]=0,_[3]=1;let v=new Float32Array(4);return m>i&&(v[0]=(t*_[0]+n*_[1])/m,v[2]=(r*_[0]+a*_[1])/m),h>i&&(v[1]=(t*_[2]+n*_[3])/h,v[3]=(r*_[2]+a*_[3])/h),m<=i&&h>i?(v[0]=-v[3],v[2]=v[1]):h<=i&&m>i?(v[1]=-v[2],v[3]=v[0]):m<=i&&h<=i&&(v[0]=1,v[1]=0,v[2]=0,v[3]=1),{U:v,S:g,V:_}},o=(e,t)=>{let n=0;for(let r=0;r<t;r++)n+=e[r]*e[r];if(n=Math.sqrt(n),n>1e-10)for(let r=0;r<t;r++)e[r]=e[r]/n;let r=0;for(let n=0;n<t;n++)r+=e[n]*e[t+n];for(let n=0;n<t;n++)e[t+n]=e[t+n]-r*e[n];let i=0;for(let n=0;n<t;n++)i+=e[t+n]*e[t+n];if(i=Math.sqrt(i),i>1e-10)for(let n=0;n<t;n++)e[t+n]=e[t+n]/i},s=(e,t,n,r,i,a,s,c=!0)=>{let l=s*s,u=l*s,d=.5*(-s+2*l-u),f=.5*(2-5*l+3*u),p=.5*(s+4*l-3*u),m=.5*(-l+u);for(let o=0;o<a*2;o++)e[o]=d*t[o]+f*n[o]+p*r[o]+m*i[o];return c&&o(e,a),e},c=(e,t,n)=>{let r=new Float32Array(4);for(let i=0;i<2;i++)for(let a=0;a<2;a++){let o=0;for(let r=0;r<n;r++)o+=e[i*n+r]*t[a*n+r];r[i*2+a]=o}let{S:i}=a(r),o=Math.acos(Math.max(-1,Math.min(1,i[0]))),s=Math.acos(Math.max(-1,Math.min(1,i[1])));return Math.sqrt(o*o+s*s)},l=(e,t,n=!0)=>{let r=e.length,i=new Float32Array(r+1);if(i[0]=0,!n){for(let e=1;e<=r;e++)i[e]=e/r;return i}let a=new Float32Array(t*2),o=new Float32Array(t*2);for(let n=0;n<r;n++){let l=(n-1+r)%r,u=n,d=(n+1)%r,f=(n+2)%r,p=0;s(a,e[l],e[u],e[d],e[f],t,0);for(let n=1;n<=8;n++){let r=n/8;s(o,e[l],e[u],e[d],e[f],t,r),p+=c(a,o,t),a.set(o)}i[n+1]=i[n]+p}let l=i[r];if(l>1e-10)for(let e=1;e<=r;e++)i[e]=i[e]/l;return i},u=(e,t)=>{let n=e.length-1,r=Math.max(0,Math.min(1,t)),i=0,a=n-1;for(;i<a;){let t=i+a>>>1;e[t+1]<=r?i=t+1:a=t}let o=e[i],s=e[i+1]-o,c=s>1e-10?(r-o)/s:0;return{segment:i,localT:c}},d=(e,t,n,r,i,a=!0)=>{let o=t.length,{segment:c,localT:l}=u(n,i),d=(c-1+o)%o,f=c,p=(c+1)%o,m=(c+2)%o;return s(e,t[d],t[f],t[p],t[m],r,l,a)};let f=null,p=[];const m=(e,t)=>{self.postMessage(e,t??[])},h=(e,t,n)=>{let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS)){let t=e.getShaderInfoLog(r);throw e.deleteShader(r),Error(`Shader compile error: ${t}`)}return r},g=(e,t,n)=>{let r=h(e,e.VERTEX_SHADER,t),i=h(e,e.FRAGMENT_SHADER,n),a=e.createProgram();if(e.attachShader(a,r),e.attachShader(a,i),e.linkProgram(a),!e.getProgramParameter(a,e.LINK_STATUS)){let t=e.getProgramInfoLog(a);throw e.deleteProgram(a),Error(`Program link error: ${t}`)}return e.deleteShader(r),e.deleteShader(i),a},_=(e,t,n)=>e.getUniformLocation(t,n),v=(e,t,n,r,i,a)=>{if(e===0||t===0||n===0)return{pointSize:.012,opacity:.7};let o=n*r,s=o*o*i/e,c=Math.sqrt(s/Math.PI),l=a*r*.5,u,d;return c>=l?(u=c,d=1):(u=l,d=Math.max(.01,s/(Math.PI*l*l))),{pointSize:2*u/o,opacity:d}},y=(e,t)=>e*f.dpr/t,b=(e,t)=>{let{style:n,numPoints:r,dpr:i}=f;if(n.pointSize!==`auto`&&n.opacity!==`auto`)return{pointSize:y(n.pointSize,t),opacity:n.opacity,color:n.color,scaleOpacityByZoom:!1};let a=v(r,e/i,t/i,i,n.fillTarget,n.minPointSize),o=n.opacity===`auto`;return{pointSize:n.pointSize===`auto`?a.pointSize:y(n.pointSize,t),opacity:o?a.opacity:n.opacity,color:n.color,scaleOpacityByZoom:o}};let x=null;const S=(e,t,n,r)=>{(!x||x.length!==r*2)&&(x=new Float32Array(r*2));let i=0,a=0;for(let o=0;o<r;o++){let s=Math.max(n[o],1e-6),c=e[o],l=e[r+o],u=2/s;x[o]=c*u,x[r+o]=l*u;let d=-t[o]/s;i+=d*c*2,a+=d*l*2}return{weights:x,biasX:i,biasY:a}},C=()=>{if(!f?.normMins||!f.normRanges)return null;let e=f.numDims,t=new Float32Array(e);if(f.centering===`mean`&&f.normMeans)t.set(f.normMeans);else for(let n=0;n<e;n++)t[n]=f.normMins[n]+f.normRanges[n]*.5;return t},w=(e,t,n)=>{if(!f)return;let{hdrFbos:r,hdrTextures:i,hdrSizes:a}=f,o=f.mainView.gl,s=a[e];if(s&&s[0]===t&&s[1]===n)return;r[e]&&o.deleteFramebuffer(r[e]),i[e]&&o.deleteTexture(i[e]);let c=o.createTexture();o.bindTexture(o.TEXTURE_2D,c),o.texImage2D(o.TEXTURE_2D,0,o.RGBA32F,t,n,0,o.RGBA,o.FLOAT,null),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MIN_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_MAG_FILTER,o.NEAREST),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_S,o.CLAMP_TO_EDGE),o.texParameteri(o.TEXTURE_2D,o.TEXTURE_WRAP_T,o.CLAMP_TO_EDGE);let l=o.createFramebuffer();o.bindFramebuffer(o.FRAMEBUFFER,l),o.framebufferTexture2D(o.FRAMEBUFFER,o.COLOR_ATTACHMENT0,o.TEXTURE_2D,c,0),o.bindFramebuffer(o.FRAMEBUFFER,null),o.bindTexture(o.TEXTURE_2D,null),f.hdrFbos[e]=l,f.hdrTextures[e]=c,f.hdrSizes[e]=[t,n]},T=(e,t)=>{if(!f)return;let n=f.blitSize;if(n&&n[0]===e&&n[1]===t)return;let r=f.mainView.gl;f.blitFbo&&r.deleteFramebuffer(f.blitFbo),f.blitTexture&&r.deleteTexture(f.blitTexture);let i=r.createTexture();r.bindTexture(r.TEXTURE_2D,i),r.texImage2D(r.TEXTURE_2D,0,r.RGBA8,e,t,0,r.RGBA,r.UNSIGNED_BYTE,null),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST);let a=r.createFramebuffer();r.bindFramebuffer(r.FRAMEBUFFER,a),r.framebufferTexture2D(r.FRAMEBUFFER,r.COLOR_ATTACHMENT0,r.TEXTURE_2D,i,0),r.bindFramebuffer(r.FRAMEBUFFER,null),r.bindTexture(r.TEXTURE_2D,null),f.blitFbo=a,f.blitTexture=i,f.blitSize=[e,t]};let E=null,D=0,O=null,k=!1,A=null;const j=()=>{if(!O||!f)return!0;let e=f.mainView.gl;return e.clientWaitSync(O,0,0)===e.TIMEOUT_EXPIRED?!1:(e.deleteSync(O),O=null,!0)},M=()=>{if(!j())return k=!0,A||=setTimeout(function(){A=null,k&&f&&!E&&M()},2),!1;if(k=!1,U(),f){let e=f.mainView.gl;O=e.fenceSync(e.SYNC_GPU_COMMANDS_COMPLETE,0),e.flush()}return!0},N=e=>{if(!E||!f?.tour)return;let t=E.prevTime===null?void 0:e-E.prevTime;if(t!==void 0){let e=t/1e3*E.speed*E.direction/20,n=f.tour.position+e;n-=Math.floor(n),f.tour.position=n}E.prevTime=e,f.directBasis=null,M()&&(E.lastRenderedRafTime!==null&&E.frameTimes.push(e-E.lastRenderedRafTime),E.lastRenderedRafTime=e),e-D>=33&&(m({type:`playbackTick`,position:f.tour.position,frameMs:t}),D=e),E.rafId=requestAnimationFrame(N)},P=(e,t)=>{E?(E.speed=e,E.direction=t):(O=null,k=!1,E={speed:e,direction:t,prevTime:null,rafId:0,frameTimes:[],lastRenderedRafTime:null},E.rafId=requestAnimationFrame(N))},ee=()=>{if(E){cancelAnimationFrame(E.rafId),f?.tour&&m({type:`playbackTick`,position:f.tour.position});let e=Float64Array.from(E.frameTimes);m({type:`playbackStopped`,frameTimes:e},[e.buffer]),E=null}},F=(e,t,n,r,i,a)=>{if(!f?.dataTexture||!f.normRanges)return;let{numPoints:o,numDims:s,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d}=f,p=f.mainView.gl,m=C();if(!m)return;let{weights:h,biasX:g,biasY:_}=S(e,m,f.normRanges,s),v=b(t,n),y=f.backgroundColor,x=.2126*y[0]+.7152*y[1]+.0722*y[2],T=f.colorMode>0,E=!T&&x>.5,D;D=T||E?1:0;let O=t/n||1;if(w(r,t,n),p.bindFramebuffer(p.FRAMEBUFFER,f.hdrFbos[r]),p.viewport(0,0,t,n),p.clearColor(y[0],y[1],y[2],1),p.clear(p.COLOR_BUFFER_BIT),o>0){if(p.useProgram(c),p.enable(p.BLEND),T?(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE_MINUS_SRC_ALPHA)):E?(p.blendEquationSeparate(p.FUNC_REVERSE_SUBTRACT,p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)):(p.blendEquation(p.FUNC_ADD),p.blendFunc(p.ONE,p.ONE)),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.dataTexture),p.uniform1i(l.u_data,0),p.activeTexture(p.TEXTURE1),f.colorLutTexture&&p.bindTexture(p.TEXTURE_2D,f.colorLutTexture),p.uniform1i(l.u_colorLutTex,1),p.activeTexture(p.TEXTURE2),f.selectionTexture&&p.bindTexture(p.TEXTURE_2D,f.selectionTexture),p.uniform1i(l.u_selectionTex,2),p.activeTexture(p.TEXTURE3),f.colorMode===2&&f.activeCatColumnName){let e=f.catIndexTextures.get(f.activeCatColumnName);e&&p.bindTexture(p.TEXTURE_2D,e)}p.uniform1i(l.u_catIndexTex,3);let e=new Float32Array(128),t=new Float32Array(128);for(let n=0;n<s&&n<128;n++)e[n]=h[n],t[n]=h[s+n];p.uniform1fv(l.u_adjBasisX,e),p.uniform1fv(l.u_adjBasisY,t),p.uniform2f(l.u_bias,g,_),p.uniform1f(l.u_pointSize,v.pointSize),p.uniform1f(l.u_opacity,v.opacity),p.uniform4f(l.u_color,v.color[0],v.color[1],v.color[2],1),p.uniform1f(l.u_useSubtractive,E?1:0),p.uniform1f(l.u_scaleOpacityByZoom,v.scaleOpacityByZoom?1:0),p.uniform2f(l.u_pan,i.panX,i.panY),p.uniform1f(l.u_zoom,i.zoom),p.uniform1f(l.u_aspect,O),p.uniform1f(l.u_viewportHeight,n),p.uniform1f(l.u_insetOffsetY,i.insetOffsetY),p.uniform1f(l.u_insetZoom,i.insetZoom),p.uniform1i(l.u_numPoints,o),p.uniform1i(l.u_numDims,s),p.uniform1i(l.u_maxPoints,f.maxPoints),p.uniform1i(l.u_texWidth,f.texWidth),p.uniform1i(l.u_colorMode,f.colorMode),p.uniform1i(l.u_colorColumnIndex,f.colorColumnIndex),p.uniform1f(l.u_colorMin,f.colorMin),p.uniform1f(l.u_colorRange,f.colorRange),p.uniform1i(l.u_colorNumStops,f.colorNumStops),p.uniform1i(l.u_colorColumnIndexV,f.colorColumnIndexV),p.uniform1f(l.u_colorMinV,f.colorMinV),p.uniform1f(l.u_colorRangeV,f.colorRangeV),p.uniform1i(l.u_color2dMapIndex,f.color2dMapIndex),p.uniform1fv(l.u_color2dLut,f.color2dLut),p.uniform1f(l.u_useSelectionMask,f.styleFlags.useSelectionMask?1:0),p.drawArrays(p.POINTS,0,o),p.disable(p.BLEND)}p.bindFramebuffer(p.FRAMEBUFFER,a??null),p.viewport(0,0,t,n),p.clearColor(0,0,0,1),p.clear(p.COLOR_BUFFER_BIT),p.useProgram(u),p.activeTexture(p.TEXTURE0),p.bindTexture(p.TEXTURE_2D,f.hdrTextures[r]),p.uniform1i(d.u_hdrTexture,0),p.uniform1f(d.u_mode,D),p.drawArrays(p.TRIANGLES,0,3),p.finish()};let I=!1,L=null,R=null;const z=(e,t)=>{if(!f?.dataTexture)return;let n=f.previewCanvases.get(e);if(!n){m({type:`rendered`,viewIndex:e});return}let r=n.canvas.width,i=n.canvas.height;if(r===0||i===0){m({type:`rendered`,viewIndex:e});return}let a=f.mainView.gl;T(r,i),F(t,r,i,1,{panX:0,panY:0,zoom:1,aspect:1,viewportHeight:i,insetOffsetY:0,insetZoom:1},f.blitFbo);let o=r*i*4,s=r*4;(!L||L.length<o)&&(L=new Uint8Array(o)),(!R||R.length<s)&&(R=new Uint8Array(s)),a.bindFramebuffer(a.FRAMEBUFFER,f.blitFbo),a.readPixels(0,0,r,i,a.RGBA,a.UNSIGNED_BYTE,L),a.bindFramebuffer(a.FRAMEBUFFER,null);for(let e=0;e<i>>1;e++){let t=e*s,n=(i-1-e)*s;R.set(L.subarray(t,t+s)),L.copyWithin(t,n,n+s),L.set(R,n)}let c=new ImageData(new Uint8ClampedArray(L.buffer,0,o),r,i);n.ctx2d.putImageData(c,0,0),m({type:`rendered`,viewIndex:e})},B=()=>{if(!f?.dataTexture||!f.tour)return;let{tour:e}=f;for(let[t]of f.previewCanvases)t>=e.bases.length||z(t,e.bases[t])},V=()=>{I||(I=!0,setTimeout(()=>{I=!1,B()},0))},H=()=>{f?.dataTexture&&(U(),V())},U=()=>{if(!f?.dataTexture)return;let{canvas:e}=f.mainView;if(f.directBasis){F(f.directBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(!f.tour)return;let{tour:t}=f;d(t.interpolatedBasis,t.bases,t.arcLengths,t.dims,t.position,t.orthonormalize),F(t.interpolatedBasis,e.width,e.height,0,f.camera),m({type:`rendered`,viewIndex:0})},W=()=>{f&&(f.tour||f.directBasis)&&f.dataTexture&&H()},G=()=>{f&&(f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H())};let K=0;const q=e=>{if(!f)return;let t=f.mainView.gl;if(e.data.type===`setColorContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,min:r,range:i,colormap:a}=e.data;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,a),f.colorMode=1,f.colorColumnIndex=n,f.colorMin=r,f.colorRange=i,f.colorNumStops=a.length,f.activeCatColumnName=null,W();return}if(e.data.type===`setColorCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,palette:r}=e.data;if(!f.catIndexTextures.has(n))return;f.colorLutTexture&&t.deleteTexture(f.colorLutTexture),f.colorLutTexture=J(t,r),f.colorMode=2,f.colorNumStops=r.length,f.activeCatColumnName=n,W();return}if(e.data.type===`setColor2D`){if(e.data.dataVersion!==K)return;let{columnIndexX:t,columnIndexY:n,minX:r,rangeX:i,minY:a,rangeY:o,lut:s,mapIndex:c}=e.data;f.colorMode=3,f.colorColumnIndex=t,f.colorMin=r,f.colorRange=i,f.colorColumnIndexV=n,f.colorMinV=a,f.colorRangeV=o,f.color2dMapIndex=c,f.activeCatColumnName=null,s&&f.color2dLut.set(s.subarray(0,128)),W();return}if(e.data.type===`selectContinuous`){if(e.data.dataVersion!==K)return;let{columnIndex:n,ranges:r}=e.data,{numPoints:i,dataBuffers:a}=f,o=a[n];if(!o)return;let s=new Uint32Array(Math.ceil(i/32)),c=r.length/2;for(let e=0;e<i;e++){let t=o[e],n=!1;for(let e=0;e<c;e++)if(t>=r[e*2]&&t<=r[e*2+1]){n=!0;break}n&&(s[e>>5]=s[e>>5]|0|1<<(e&31))}X(t,s),G();return}if(e.data.type===`selectCategorical`){if(e.data.dataVersion!==K)return;let{catColumnName:n,selectedLabels:r}=e.data,i=f.categoricalBuffers.get(n);if(!i)return;let{numPoints:a}=f,o=new Uint32Array(Math.ceil(a/32));for(let e=0;e<a;e++){let t=i[e];t<r.length&&r[t]>0&&(o[e>>5]=o[e>>5]|0|1<<(e&31))}X(t,o),G();return}if(e.data.type!==`data`)return;let{dataVersion:n,dims:r,rows:i,buffers:a,mins:o,ranges:s,means:c,categoricalColumns:u}=e.data;if(K=n,r<2||i===0||a.length<2){m({type:`error`,message:`Need at least 2 dimensions to render`});return}f.dataTexture&&(t.deleteTexture(f.dataTexture),f.dataTexture=null),f.colorLutTexture&&(t.deleteTexture(f.colorLutTexture),f.colorLutTexture=null);for(let e of f.catIndexTextures.values())t.deleteTexture(e);f.catIndexTextures.clear(),f.selectionTexture&&(t.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags={useSelectionMask:!1},f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,f.categoricalBuffers.clear(),f.dataBuffers=a,f.normMins=new Float32Array(o),f.normRanges=new Float32Array(s),f.normMeans=new Float32Array(c),f.numPoints=i,f.numDims=r;let d=t.getParameter(t.MAX_TEXTURE_SIZE),p=Math.min(i,d),h=Math.ceil(i/p);f.texWidth=p;let g=t.createTexture();t.bindTexture(t.TEXTURE_2D,g);let _=r*h,v=new Float32Array(p*_);for(let e=0;e<r;e++){let t=a[e],n=e*h;for(let e=0;e<i;e++){let r=e%p,i=n+Math.floor(e/p);v[i*p+r]=t[e]}}t.texImage2D(t.TEXTURE_2D,0,t.R32F,p,_,0,t.RED,t.FLOAT,v),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.bindTexture(t.TEXTURE_2D,null),f.dataTexture=g;for(let e of u)f.categoricalBuffers.set(e.name,e.indices),f.catIndexTextures.set(e.name,Y(t,e.indices,i,p));if(f.tour&&f.tour.dims===r)H();else{let e=Math.max(1,f.previewCanvases.size),t=[];for(let n=0;n<e;n++){let i=new Float32Array(r*2),a=Math.floor(n/e*r);i[a]=1,i[r+(a+1)%r]=1,t.push(i)}f.tour={bases:t,arcLengths:l(t,r),dims:r,orthonormalize:!0,position:0,interpolatedBasis:new Float32Array(r*2)},H()}},J=(e,t)=>{let n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),n},Y=(e,t,n,r)=>{let i=Math.ceil(n/r),a;if(i===1)a=t;else{a=new Uint32Array(r*i);for(let e=0;e<n;e++){let n=e%r,i=Math.floor(e/r);a[i*r+n]=t[e]}}let o=e.createTexture();return e.bindTexture(e.TEXTURE_2D,o),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,r,i,0,e.RED_INTEGER,e.UNSIGNED_INT,a),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),o},X=(e,t)=>{if(!f)return;f.selectionTexture&&e.deleteTexture(f.selectionTexture);let n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.R32UI,t.length,1,0,e.RED_INTEGER,e.UNSIGNED_INT,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.bindTexture(e.TEXTURE_2D,null),f.selectionTexture=n},Z=(e,t,n,r)=>{let i=!1;for(let a=0,o=r-1;a<r;o=a++){let r=n[a*2],s=n[a*2+1],c=n[o*2],l=n[o*2+1];s>t!=l>t&&e<(c-r)*(t-s)/(l-s)+r&&(i=!i)}return i},Q=e=>{if(!f?.normRanges||f.numPoints===0)return;let{numPoints:t,numDims:n,dataBuffers:r,camera:i}=f,a=e.length/2;if(a<3)return;let o=null;if(f.directBasis)o=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),o=e.interpolatedBasis}if(!o)return;let s=C();if(!s)return;let{weights:c,biasX:l,biasY:u}=S(o,s,f.normRanges,n),p=f.mainView.canvas,h=p.width/p.height||1,g=i.insetZoom,_=i.zoom*g,v=new Float32Array(e.length);for(let t=0;t<a;t++)v[t*2]=e[t*2]*h/_-i.panX,v[t*2+1]=(e[t*2+1]-i.insetOffsetY)/_-i.panY;let y=new Uint32Array(Math.ceil(t/32));for(let e=0;e<t;e++){let t=l,i=u;for(let a=0;a<n;a++){let o=r[a][e];t+=o*c[a],i+=o*c[n+a]}Z(t,i,v,a)&&(y[e>>5]=y[e>>5]|0|1<<(e&31))}let b=f.mainView.gl;X(b,y),G();let x=new Uint32Array(y);m({type:`selectionResult`,mask:x},[x.buffer])},te=()=>{if(!f)return 0;let e=0;if(f.dataTexture){let t=Math.ceil(f.numPoints/f.texWidth);e+=f.texWidth*f.numDims*t*4}for(let t=0;t<f.hdrSizes.length;t++){let n=f.hdrSizes[t];n&&(e+=n[0]*n[1]*16)}f.blitSize&&(e+=f.blitSize[0]*f.blitSize[1]*4),f.colorLutTexture&&(e+=f.colorNumStops*4);for(let t of f.categoricalBuffers.values())e+=t.byteLength;return f.selectionTexture&&(e+=Math.ceil(f.numPoints/32)*4),e},ne=()=>{if(!f)return;let e=0;for(let t of f.dataBuffers)e+=t.byteLength;for(let t of f.categoricalBuffers.values())e+=t.byteLength;if(f.normMins&&(e+=f.normMins.byteLength),f.normRanges&&(e+=f.normRanges.byteLength),f.tour){for(let t of f.tour.bases)e+=t.byteLength;e+=f.tour.interpolatedBasis.byteLength}m({type:`metricsResult`,gpuMemoryBytes:te(),numPoints:f.numPoints,numDims:f.numDims,workerJsHeapBytes:e})},re=e=>{if(!f?.tour||!f.dataTexture||f.numPoints===0){m({type:`error`,message:`No data/tour loaded for benchmark`});return}let t=f.mainView.gl,{numPoints:n,numDims:r,tour:i}=f,a=i.position;f.directBasis=null;let o=new Uint8Array(4),s=()=>{t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,o)};for(let e=0;e<5;e++)i.position=e/5,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize),F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s();let c=new Float64Array(e);for(let t=0;t<e;t++){i.position=t/e,d(i.interpolatedBasis,i.bases,i.arcLengths,i.dims,i.position,i.orthonormalize);let n=performance.now();F(i.interpolatedBasis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),s(),c[t]=performance.now()-n}i.position=a,m({type:`benchmarkResult`,frameTimes:c,numPoints:n,numDims:r},[c.buffer])},$=e=>{if(f){if(e.type===`setBases`){let{bases:t}=e;if(t.length===0)return;let n=t[0].length/2,r=e.tourFamily!==`sequential`;f.tour={bases:t,arcLengths:l(t,n,r),dims:n,orthonormalize:r,position:f.tour?.position??0,interpolatedBasis:new Float32Array(n*2)},f.dataTexture&&H();return}if(e.type===`addPreviewCanvas`){let t=e.canvas.getContext(`2d`);if(!t)return;f.previewCanvases.set(e.id,{canvas:e.canvas,ctx2d:t}),f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&z(e.id,f.tour.bases[e.id]);return}if(e.type===`removePreviewCanvas`){f.previewCanvases.delete(e.id);return}if(e.type===`resizePreview`){let t=f.previewCanvases.get(e.id);if(!t)return;t.canvas.width=e.width,t.canvas.height=e.height,f.dataTexture&&f.tour&&e.id<f.tour.bases.length&&V();return}if(e.type===`setTourPosition`){if(!f.tour)return;f.tour.position=e.position,f.directBasis=null,M();return}if(e.type===`setStyle`){f.style={pointSize:e.pointSize,opacity:e.opacity,color:e.color,minPointSize:e.minPointSize??f.style.minPointSize,fillTarget:e.fillTarget??f.style.fillTarget},(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setCamera`){f.camera={panX:e.pan[0],panY:e.pan[1],zoom:e.zoom,aspect:f.camera.aspect,viewportHeight:f.camera.viewportHeight,insetOffsetY:e.insetOffsetY,insetZoom:e.insetZoom},U();return}if(e.type===`setCentering`){f.centering=e.centering,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`resize`){e.dpr!==void 0&&(f.dpr=e.dpr),e.viewIndex===0&&(f.mainView.canvas.width=e.width,f.mainView.canvas.height=e.height,(f.tour||f.directBasis)&&f.dataTexture&&U());return}if(e.type===`render`){(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setDirectBasis`){if(!f.dataTexture)return;f.directBasis=e.basis,F(e.basis,f.mainView.canvas.width,f.mainView.canvas.height,0,f.camera),m({type:`rendered`,viewIndex:0});return}if(e.type===`clearColors`){f.colorLutTexture&&(f.mainView.gl.deleteTexture(f.colorLutTexture),f.colorLutTexture=null),f.colorMode=0,f.colorColumnIndex=0,f.colorMin=0,f.colorRange=1,f.colorNumStops=0,f.activeCatColumnName=null,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setBackgroundColor`){f.backgroundColor=e.color,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setMaxPoints`){f.maxPoints=e.maxPoints,(f.tour||f.directBasis)&&f.dataTexture&&H();return}if(e.type===`setSelectionMask`){let t=f.mainView.gl;X(t,e.mask),f.styleFlags.useSelectionMask=!0,(f.tour||f.directBasis)&&f.dataTexture&&H();let n=new Uint32Array(e.mask);m({type:`selectionResult`,mask:n},[n.buffer]);return}if(e.type===`clearSelectionMask`){f.selectionTexture&&(f.mainView.gl.deleteTexture(f.selectionTexture),f.selectionTexture=null),f.styleFlags.useSelectionMask=!1,(f.tour||f.directBasis)&&f.dataTexture&&H(),m({type:`selectionResult`,mask:new Uint32Array});return}if(e.type===`startPlayback`){if(!f.tour)return;P(e.speed,e.direction);return}if(e.type===`stopPlayback`){ee();return}if(e.type===`computePCA`){m({type:`error`,message:`PCA not yet implemented in WebGL backend`});return}if(e.type===`lassoSelect`){Q(e.polygon);return}if(e.type===`getProjectedPositions`){if(!f?.normRanges||f.numPoints===0){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{numPoints:e,numDims:t,dataBuffers:n}=f,r=null;if(f.directBasis)r=f.directBasis;else if(f.tour){let{tour:e}=f;d(e.interpolatedBasis,e.bases,e.arcLengths,e.dims,e.position,e.orthonormalize),r=e.interpolatedBasis}if(!r){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let i=C();if(!i){m({type:`projectedPositions`,positions:new Float32Array},[]);return}let{weights:a,biasX:o,biasY:s}=S(r,i,f.normRanges,t),c=new Float32Array(e*2);for(let r=0;r<e;r++){let e=o,i=s;for(let o=0;o<t;o++){let s=n[o][r];e+=s*a[o],i+=s*a[t+o]}c[r*2]=e,c[r*2+1]=i}m({type:`projectedPositions`,positions:c},[c.buffer]);return}if(e.type===`getPointData`){if(!f||f.numPoints===0){m({type:`pointData`,pointIndex:e.pointIndex,numericValues:{},categoricalValues:{}});return}let{numDims:t,dataBuffers:n}=f,r=e.pointIndex;if(r<0||r>=f.numPoints){m({type:`pointData`,pointIndex:r,numericValues:{},categoricalValues:{}});return}let i={};for(let e=0;e<t;e++)i[String(e)]=n[e][r];let a={};for(let[e,t]of f.categoricalBuffers)a[e]=t[r];m({type:`pointData`,pointIndex:r,numericValues:i,categoricalValues:a});return}if(e.type===`benchmark`){re(e.numFrames);return}if(e.type===`getMetrics`){ne();return}}};self.onmessage=i=>{let a=i.data;if(a.type===`init`){try{let i=a.canvas,o=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,preserveDrawingBuffer:!1});if(!o)throw Error(`WebGL2 not supported`);o.getExtension(`EXT_color_buffer_float`)||console.warn(`EXT_color_buffer_float not available — HDR rendering may fail`),o.getExtension(`OES_texture_float_linear`),o.getExtension(`EXT_float_blend`);let s=o,c=g(s,t,e),l={u_data:_(s,c,`u_data`),u_adjBasisX:_(s,c,`u_adjBasisX`),u_adjBasisY:_(s,c,`u_adjBasisY`),u_bias:_(s,c,`u_bias`),u_pointSize:_(s,c,`u_pointSize`),u_opacity:_(s,c,`u_opacity`),u_color:_(s,c,`u_color`),u_useSubtractive:_(s,c,`u_useSubtractive`),u_pan:_(s,c,`u_pan`),u_zoom:_(s,c,`u_zoom`),u_aspect:_(s,c,`u_aspect`),u_viewportHeight:_(s,c,`u_viewportHeight`),u_insetOffsetY:_(s,c,`u_insetOffsetY`),u_insetZoom:_(s,c,`u_insetZoom`),u_numPoints:_(s,c,`u_numPoints`),u_numDims:_(s,c,`u_numDims`),u_maxPoints:_(s,c,`u_maxPoints`),u_texWidth:_(s,c,`u_texWidth`),u_colorMode:_(s,c,`u_colorMode`),u_colorColumnIndex:_(s,c,`u_colorColumnIndex`),u_colorMin:_(s,c,`u_colorMin`),u_colorRange:_(s,c,`u_colorRange`),u_colorNumStops:_(s,c,`u_colorNumStops`),u_colorLutTex:_(s,c,`u_colorLutTex`),u_catIndexTex:_(s,c,`u_catIndexTex`),u_useSelectionMask:_(s,c,`u_useSelectionMask`),u_selectionTex:_(s,c,`u_selectionTex`),u_colorColumnIndexV:_(s,c,`u_colorColumnIndexV`),u_colorMinV:_(s,c,`u_colorMinV`),u_colorRangeV:_(s,c,`u_colorRangeV`),u_color2dMapIndex:_(s,c,`u_color2dMapIndex`),u_color2dLut:_(s,c,`u_color2dLut`),u_scaleOpacityByZoom:_(s,c,`u_scaleOpacityByZoom`)},u=g(s,r,n),d={u_hdrTexture:_(s,u,`u_hdrTexture`),u_mode:_(s,u,`u_mode`)};f={mainView:{canvas:i,gl:o},previewCanvases:new Map,pointProgram:c,pointLocs:l,tonemapProgram:u,tonemapLocs:d,hdrFbos:[],hdrTextures:[],hdrSizes:[],blitFbo:null,blitTexture:null,blitSize:null,dataTexture:null,colorLutTexture:null,catIndexTextures:new Map,selectionTexture:null,numPoints:0,numDims:0,dataBuffers:[],normMins:null,normRanges:null,normMeans:null,centering:`midrange`,categoricalBuffers:new Map,tour:null,style:{pointSize:`auto`,opacity:`auto`,color:[.25,.5,.9],minPointSize:2,fillTarget:.5},styleFlags:{useSelectionMask:!1},colorMode:0,colorColumnIndex:0,colorMin:0,colorRange:1,colorNumStops:0,activeCatColumnName:null,colorColumnIndexV:0,colorMinV:0,colorRangeV:1,color2dMapIndex:0,color2dLut:new Float32Array(128),camera:{panX:0,panY:0,zoom:a.zoom,aspect:1,viewportHeight:1,insetOffsetY:0,insetZoom:1},directBasis:null,backgroundColor:[0,0,0],dpr:a.dpr,maxPoints:0,texWidth:0},a.dataPort.onmessage=q;let h=p;if(p=null,h)for(let e of h)$(e);m({type:`ready`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:String(e)})}return}if(p){p.push(a);return}$(a)};", M = typeof self < "u" && self.Blob && new Blob(["URL.revokeObjectURL(import.meta.url);", j], { type: "text/javascript;charset=utf-8" });
|
|
3027
|
+
function N(e) {
|
|
3020
3028
|
let t;
|
|
3021
3029
|
try {
|
|
3022
|
-
if (t =
|
|
3030
|
+
if (t = M && (self.URL || self.webkitURL).createObjectURL(M), !t) throw "";
|
|
3023
3031
|
let n = new Worker(t, {
|
|
3024
3032
|
type: "module",
|
|
3025
3033
|
name: e?.name
|
|
@@ -3028,7 +3036,7 @@ function M(e) {
|
|
|
3028
3036
|
(self.URL || self.webkitURL).revokeObjectURL(t);
|
|
3029
3037
|
}), n;
|
|
3030
3038
|
} catch {
|
|
3031
|
-
return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(
|
|
3039
|
+
return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(j), {
|
|
3032
3040
|
type: "module",
|
|
3033
3041
|
name: e?.name
|
|
3034
3042
|
});
|
|
@@ -3036,12 +3044,12 @@ function M(e) {
|
|
|
3036
3044
|
}
|
|
3037
3045
|
//#endregion
|
|
3038
3046
|
//#region src/webgl/client.ts
|
|
3039
|
-
var
|
|
3047
|
+
var P = (e, t, n) => {
|
|
3040
3048
|
e.postMessage(t, n ?? []);
|
|
3041
|
-
},
|
|
3049
|
+
}, F = (e, t, n) => {
|
|
3042
3050
|
e.postMessage(t, n ?? []);
|
|
3043
|
-
},
|
|
3044
|
-
let { canvas: t, zoom: n = 1, dpr: r = typeof self < "u" && "devicePixelRatio" in self ? self.devicePixelRatio : 1 } = e, i = new
|
|
3051
|
+
}, I = (e) => {
|
|
3052
|
+
let { canvas: t, zoom: n = 1, dpr: r = typeof self < "u" && "devicePixelRatio" in self ? self.devicePixelRatio : 1 } = e, i = new N(), a = new p(), o = new MessageChannel(), s = /* @__PURE__ */ new Set(), c = (e) => {
|
|
3045
3053
|
for (let t of s) t(e);
|
|
3046
3054
|
};
|
|
3047
3055
|
i.onmessage = (e) => {
|
|
@@ -3079,10 +3087,10 @@ var N = (e, t, n) => {
|
|
|
3079
3087
|
});
|
|
3080
3088
|
};
|
|
3081
3089
|
let l = t.transferControlToOffscreen();
|
|
3082
|
-
|
|
3090
|
+
F(a, {
|
|
3083
3091
|
type: "init",
|
|
3084
3092
|
gpuPort: o.port1
|
|
3085
|
-
}, [o.port1]),
|
|
3093
|
+
}, [o.port1]), P(i, {
|
|
3086
3094
|
type: "init",
|
|
3087
3095
|
canvas: l,
|
|
3088
3096
|
dataPort: o.port2,
|
|
@@ -3104,20 +3112,20 @@ var N = (e, t, n) => {
|
|
|
3104
3112
|
zoom: n,
|
|
3105
3113
|
insetOffsetY: 0,
|
|
3106
3114
|
insetZoom: 1
|
|
3107
|
-
},
|
|
3108
|
-
|
|
3115
|
+
}, f = (e) => {
|
|
3116
|
+
F(a, {
|
|
3109
3117
|
type: "load",
|
|
3110
3118
|
buffer: e
|
|
3111
3119
|
}, [e]);
|
|
3112
3120
|
}, m = (e, t) => {
|
|
3113
3121
|
let n = e.map((e) => e.buffer);
|
|
3114
|
-
|
|
3122
|
+
P(i, {
|
|
3115
3123
|
type: "setBases",
|
|
3116
3124
|
bases: e,
|
|
3117
3125
|
tourFamily: t
|
|
3118
3126
|
}, n);
|
|
3119
3127
|
}, h = (e) => {
|
|
3120
|
-
|
|
3128
|
+
P(i, {
|
|
3121
3129
|
type: "setTourPosition",
|
|
3122
3130
|
position: e
|
|
3123
3131
|
});
|
|
@@ -3125,7 +3133,7 @@ var N = (e, t, n) => {
|
|
|
3125
3133
|
u = {
|
|
3126
3134
|
...u,
|
|
3127
3135
|
...e
|
|
3128
|
-
},
|
|
3136
|
+
}, P(i, {
|
|
3129
3137
|
type: "setStyle",
|
|
3130
3138
|
pointSize: u.pointSize,
|
|
3131
3139
|
opacity: u.opacity,
|
|
@@ -3137,7 +3145,7 @@ var N = (e, t, n) => {
|
|
|
3137
3145
|
d = {
|
|
3138
3146
|
...d,
|
|
3139
3147
|
...e
|
|
3140
|
-
},
|
|
3148
|
+
}, P(i, {
|
|
3141
3149
|
type: "setCamera",
|
|
3142
3150
|
pan: d.pan,
|
|
3143
3151
|
zoom: d.zoom,
|
|
@@ -3145,12 +3153,12 @@ var N = (e, t, n) => {
|
|
|
3145
3153
|
insetZoom: d.insetZoom
|
|
3146
3154
|
});
|
|
3147
3155
|
}, v = (e) => {
|
|
3148
|
-
|
|
3156
|
+
P(i, {
|
|
3149
3157
|
type: "setCentering",
|
|
3150
3158
|
centering: e
|
|
3151
3159
|
});
|
|
3152
3160
|
}, y = (e, t, n, r) => {
|
|
3153
|
-
|
|
3161
|
+
P(i, {
|
|
3154
3162
|
type: "resize",
|
|
3155
3163
|
viewIndex: e,
|
|
3156
3164
|
width: t,
|
|
@@ -3158,14 +3166,14 @@ var N = (e, t, n) => {
|
|
|
3158
3166
|
dpr: r
|
|
3159
3167
|
});
|
|
3160
3168
|
}, b = () => {
|
|
3161
|
-
|
|
3169
|
+
P(i, { type: "render" });
|
|
3162
3170
|
}, x = (e) => {
|
|
3163
|
-
|
|
3171
|
+
P(i, {
|
|
3164
3172
|
type: "setDirectBasis",
|
|
3165
3173
|
basis: e
|
|
3166
3174
|
}, [e.buffer]);
|
|
3167
3175
|
}, S = (e, t, n, r) => {
|
|
3168
|
-
|
|
3176
|
+
F(a, {
|
|
3169
3177
|
type: "encodeColor",
|
|
3170
3178
|
column: e,
|
|
3171
3179
|
...t ? { palette: t } : {},
|
|
@@ -3173,63 +3181,63 @@ var N = (e, t, n) => {
|
|
|
3173
3181
|
...r ? { colorMap: r } : {}
|
|
3174
3182
|
});
|
|
3175
3183
|
}, C = (e, t, n = "schumann") => {
|
|
3176
|
-
|
|
3184
|
+
F(a, {
|
|
3177
3185
|
type: "encodeColor2D",
|
|
3178
3186
|
columnX: e,
|
|
3179
3187
|
columnY: t,
|
|
3180
3188
|
colormap: n
|
|
3181
3189
|
});
|
|
3182
3190
|
}, w = (e) => {
|
|
3183
|
-
|
|
3191
|
+
P(i, {
|
|
3184
3192
|
type: "setBackgroundColor",
|
|
3185
3193
|
color: e
|
|
3186
3194
|
});
|
|
3187
3195
|
}, T = () => {
|
|
3188
|
-
|
|
3196
|
+
P(i, { type: "clearColors" });
|
|
3189
3197
|
}, E = (e, t) => {
|
|
3190
3198
|
let n = t.valueRanges ? new Float32Array(t.valueRanges) : void 0, r = [];
|
|
3191
|
-
n && r.push(n.buffer),
|
|
3199
|
+
n && r.push(n.buffer), F(a, {
|
|
3192
3200
|
type: "selectByColumn",
|
|
3193
3201
|
column: e,
|
|
3194
3202
|
labelIndices: t.labelIndices,
|
|
3195
3203
|
valueRanges: n
|
|
3196
3204
|
}, r);
|
|
3197
3205
|
}, D = (e) => {
|
|
3198
|
-
|
|
3206
|
+
P(i, {
|
|
3199
3207
|
type: "setSelectionMask",
|
|
3200
3208
|
mask: e
|
|
3201
3209
|
}, [e.buffer]);
|
|
3202
3210
|
}, O = (e) => {
|
|
3203
|
-
|
|
3211
|
+
P(i, {
|
|
3204
3212
|
type: "lassoSelect",
|
|
3205
3213
|
polygon: e
|
|
3206
3214
|
}, [e.buffer]);
|
|
3207
3215
|
}, k = () => {
|
|
3208
|
-
|
|
3216
|
+
P(i, { type: "clearSelectionMask" });
|
|
3209
3217
|
}, A = () => {
|
|
3210
|
-
|
|
3218
|
+
P(i, { type: "computePCA" });
|
|
3211
3219
|
}, j = (e, t) => {
|
|
3212
|
-
|
|
3220
|
+
P(i, {
|
|
3213
3221
|
type: "startPlayback",
|
|
3214
3222
|
speed: e,
|
|
3215
3223
|
direction: t
|
|
3216
3224
|
});
|
|
3217
|
-
},
|
|
3218
|
-
|
|
3225
|
+
}, M = () => {
|
|
3226
|
+
P(i, { type: "stopPlayback" });
|
|
3219
3227
|
}, I = (e) => {
|
|
3220
|
-
|
|
3228
|
+
P(i, {
|
|
3221
3229
|
type: "setMaxPoints",
|
|
3222
3230
|
maxPoints: e
|
|
3223
3231
|
});
|
|
3224
3232
|
}, L = (e, t) => {
|
|
3225
3233
|
let n = t.transferControlToOffscreen();
|
|
3226
|
-
|
|
3234
|
+
P(i, {
|
|
3227
3235
|
type: "addPreviewCanvas",
|
|
3228
3236
|
id: e,
|
|
3229
3237
|
canvas: n
|
|
3230
3238
|
}, [n]);
|
|
3231
3239
|
}, R = (e) => {
|
|
3232
|
-
|
|
3240
|
+
P(i, {
|
|
3233
3241
|
type: "removePreviewCanvas",
|
|
3234
3242
|
id: e
|
|
3235
3243
|
});
|
|
@@ -3237,7 +3245,7 @@ var N = (e, t, n) => {
|
|
|
3237
3245
|
let n = W((e) => {
|
|
3238
3246
|
e.type === "benchmarkResult" && (n(), t(e));
|
|
3239
3247
|
});
|
|
3240
|
-
|
|
3248
|
+
P(i, {
|
|
3241
3249
|
type: "benchmark",
|
|
3242
3250
|
numFrames: e
|
|
3243
3251
|
});
|
|
@@ -3252,10 +3260,10 @@ var N = (e, t, n) => {
|
|
|
3252
3260
|
workerJsHeapUsedBytes: a
|
|
3253
3261
|
});
|
|
3254
3262
|
});
|
|
3255
|
-
|
|
3263
|
+
P(i, { type: "getMetrics" });
|
|
3256
3264
|
}), W = (e) => (s.add(e), () => s.delete(e)), G;
|
|
3257
3265
|
return {
|
|
3258
|
-
loadData:
|
|
3266
|
+
loadData: f,
|
|
3259
3267
|
setBases: m,
|
|
3260
3268
|
setTourPosition: h,
|
|
3261
3269
|
setStyle: g,
|
|
@@ -3276,25 +3284,25 @@ var N = (e, t, n) => {
|
|
|
3276
3284
|
let t = W((n) => {
|
|
3277
3285
|
n.type === "projectedPositions" && (t(), G = void 0, e(n.positions));
|
|
3278
3286
|
});
|
|
3279
|
-
G = { unsub: t },
|
|
3287
|
+
G = { unsub: t }, P(i, { type: "getProjectedPositions" });
|
|
3280
3288
|
})),
|
|
3281
3289
|
getPointData: (e) => new Promise((t) => {
|
|
3282
3290
|
let n = W((r) => {
|
|
3283
3291
|
r.type !== "pointData" || r.pointIndex !== e || (n(), t(r));
|
|
3284
3292
|
});
|
|
3285
|
-
|
|
3293
|
+
P(i, {
|
|
3286
3294
|
type: "getPointData",
|
|
3287
3295
|
pointIndex: e
|
|
3288
3296
|
});
|
|
3289
3297
|
}),
|
|
3290
3298
|
computePCA: A,
|
|
3291
3299
|
startPlayback: j,
|
|
3292
|
-
stopPlayback:
|
|
3300
|
+
stopPlayback: M,
|
|
3293
3301
|
setMaxPoints: I,
|
|
3294
3302
|
addPreviewCanvas: L,
|
|
3295
3303
|
removePreviewCanvas: R,
|
|
3296
3304
|
resizePreview: (e, t, n) => {
|
|
3297
|
-
|
|
3305
|
+
P(i, {
|
|
3298
3306
|
type: "resizePreview",
|
|
3299
3307
|
id: e,
|
|
3300
3308
|
width: t,
|
|
@@ -3313,4 +3321,4 @@ var N = (e, t, n) => {
|
|
|
3313
3321
|
};
|
|
3314
3322
|
};
|
|
3315
3323
|
//#endregion
|
|
3316
|
-
export { n as COLORMAP_2D_INDEX, t as COLORMAP_2D_NAMES, o as GLASBEY_DARK, s as GLASBEY_LIGHT, l as MAGMA_25, a as OKABE_ITO, c as VIRIDIS_25,
|
|
3324
|
+
export { n as COLORMAP_2D_INDEX, t as COLORMAP_2D_NAMES, o as GLASBEY_DARK, s as GLASBEY_LIGHT, l as MAGMA_25, a as OKABE_ITO, c as VIRIDIS_25, x as bitPackIndices, O as computeArcLengths, b as createScatter, I as createScatterWebGL, u as detectBackend, A as interpolateAtPosition, i as packColormap2DLut };
|